Enable Floor op for ACL neon (#7100)
author장지섭/On-Device Lab(SR)/Engineer/삼성전자 <jiseob.jang@samsung.com>
Mon, 2 Sep 2019 08:25:52 +0000 (17:25 +0900)
committer오형석/On-Device Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Mon, 2 Sep 2019 08:25:52 +0000 (17:25 +0900)
This commit enables to support Floor op for ACL neon.

Signed-off-by: jiseob.jang <jiseob.jang@samsung.com>
runtimes/neurun/backend/acl_neon/KernelGenerator.cc
runtimes/neurun/backend/acl_neon/KernelGenerator.h
runtimes/neurun/backend/acl_neon/ShapeFixer.cc
runtimes/neurun/backend/acl_neon/ShapeFixer.h
runtimes/neurun/core/src/compiler/OperationValidator.cc
runtimes/neurun/core/src/compiler/OperationValidator.h
tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon

index d2cd2e5..9da0139 100644 (file)
@@ -29,6 +29,7 @@
 #include <arm_compute/runtime/NEON/functions/NEReduceMeanEx.h>
 #include <arm_compute/runtime/NEON/functions/NEReshapeLayer.h>
 #include <arm_compute/runtime/NEON/functions/NEStridedSlice.h>
+#include <arm_compute/runtime/NEON/functions/NEFloor.h>
 #include <arm_compute/runtime/NEON/functions/NEFullyConnectedLayer.h>
 #include <arm_compute/runtime/NEON/functions/NEFullyConnectedReshapingLayer.h>
 #include <arm_compute/runtime/NEON/functions/NETransposeConvLayer.h>
@@ -508,6 +509,27 @@ void KernelGenerator::visit(const model::operation::ConcatNode &node)
   _execution_builder->append(std::move(acl_fn));
 }
 
+void KernelGenerator::visit(const model::operation::FloorNode &node)
+{
+  const auto ofm_index{node.getOutputs().at(0)};
+  const auto ifm_index{node.getInputs().at(model::operation::FloorNode::Input::INPUT)};
+
+  auto ofm_alloc = _tensor_builder->at(ofm_index).get();
+  auto ifm_alloc = _tensor_builder->at(ifm_index).get();
+
+  std::unique_ptr<::arm_compute::IFunction> fn;
+
+  auto l = nnfw::cpp14::make_unique<::arm_compute::NEFloor>();
+
+  l->configure(ifm_alloc->handle(), ofm_alloc->handle());
+
+  fn = std::move(l);
+
+  auto acl_fn = asAclFunction(std::move(fn));
+
+  _execution_builder->append(std::move(acl_fn));
+}
+
 void KernelGenerator::visit(const model::operation::FullyConnectedNode &node)
 {
   using model::operation::FullyConnectedNode;
index 32d32a1..984f2a6 100644 (file)
@@ -43,6 +43,7 @@ public:
   void visit(const model::operation::MeanNode &) override;
   void visit(const model::operation::AvgPool2DNode &) override;
   void visit(const model::operation::ConcatNode &) override;
+  void visit(const model::operation::FloorNode &) override;
   void visit(const model::operation::FullyConnectedNode &) override;
   void visit(const model::operation::MulNode &) override;
   void visit(const model::operation::ReLUNode &) override;
index 96a3520..90753c6 100644 (file)
@@ -81,6 +81,8 @@ void ShapeFixer::visit(const model::operation::ConcatNode &node)
 
 void ShapeFixer::visit(const model::operation::ExpNode &) { /* DO NOTHING */}
 
+void ShapeFixer::visit(const model::operation::FloorNode &) { /* DO NOTHING */}
+
 void ShapeFixer::visit(const model::operation::FullyConnectedNode &node)
 {
   using model::operation::FullyConnectedNode;
index 336179c..4cd8fc4 100644 (file)
@@ -45,6 +45,7 @@ public:
   void visit(const model::operation::AvgPool2DNode &) override;
   void visit(const model::operation::ConcatNode &) override;
   void visit(const model::operation::ExpNode &) override;
+  void visit(const model::operation::FloorNode &) override;
   void visit(const model::operation::FullyConnectedNode &) override;
   void visit(const model::operation::MulNode &) override;
   void visit(const model::operation::ReLUNode &) override;
index 2677157..0be6809 100644 (file)
@@ -350,6 +350,18 @@ void OperationValidator::visit(const model::operation::ExpNode &node)
   assert(_ctx.at(output_index).typeInfo().type() == _ctx.at(input_index).typeInfo().type());
 }
 
+void OperationValidator::visit(const model::operation::FloorNode &node)
+{
+  const auto output_index{node.getOutputs().at(0)};
+  const auto input_index{node.getInputs().at(model::operation::FloorNode::Input::INPUT)};
+
+  UNUSED_RELEASE(output_index);
+  UNUSED_RELEASE(input_index);
+
+  assert(_ctx.at(output_index).shape() == _ctx.at(input_index).shape());
+  assert(_ctx.at(output_index).typeInfo().type() == _ctx.at(input_index).typeInfo().type());
+}
+
 void OperationValidator::visit(const model::operation::HashtableLookupNode &node)
 {
   const auto output_index{
index f9a96a3..76774da 100644 (file)
@@ -54,6 +54,7 @@ public:
   void visit(const model::operation::SpaceToDepthNode &node) override;
   void visit(const model::operation::EmbeddingLookupNode &node) override;
   void visit(const model::operation::ExpNode &node) override;
+  void visit(const model::operation::FloorNode &node) override;
   void visit(const model::operation::HashtableLookupNode &node) override;
   void visit(const model::operation::TransposeConvNode &node) override;
   void visit(const model::operation::GatherNode &node) override;
index 143108e..86daa12 100644 (file)
@@ -9,7 +9,6 @@ GeneratedTests.dequantize
 GeneratedTests.embedding_lookup
 GeneratedTests.embedding_lookup_2d_nnfw
 GeneratedTests.embedding_lookup_4d_nnfw
-GeneratedTests.floor_
 GeneratedTests.greater_equal_ex*
 GeneratedTests.hashtable_lookup*
 GeneratedTests.l2_normalization*