Enable LogicalNot op for ACL neon (#7159)
author장지섭/On-Device Lab(SR)/Engineer/삼성전자 <jiseob.jang@samsung.com>
Wed, 4 Sep 2019 09:24:22 +0000 (18:24 +0900)
committer오형석/On-Device Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Wed, 4 Sep 2019 09:24:22 +0000 (18:24 +0900)
This commit enables to support LogicalNot 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
tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon

index 48e4658..456ac5b 100644 (file)
@@ -656,6 +656,27 @@ void KernelGenerator::visit(const model::operation::L2Pool2DNode &node)
   ActivationBuilder{*_execution_builder}.append(activation, ofm_alloc->handle());
 }
 
+void KernelGenerator::visit(const model::operation::LogicalNotNode &node)
+{
+  const auto output_index{node.getOutputs().at(0)};
+  const auto input_index{node.getInputs().at(model::operation::LogicalNotNode::Input::INPUT)};
+
+  auto output_alloc = _tensor_builder->at(output_index).get();
+  auto input_alloc = _tensor_builder->at(input_index).get();
+
+  std::unique_ptr<::arm_compute::IFunction> fn;
+
+  auto l = nnfw::cpp14::make_unique<::arm_compute::NEBitwiseNot>();
+
+  l->configure(input_alloc->handle(), output_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::LogisticNode &node)
 {
   const auto ofm_index{node.getOutputs().at(0)};
index b03a8c7..ba65c55 100644 (file)
@@ -47,6 +47,7 @@ public:
   void visit(const model::operation::FullyConnectedNode &) override;
   void visit(const model::operation::L2NormalizationNode &) override;
   void visit(const model::operation::L2Pool2DNode &) override;
+  void visit(const model::operation::LogicalNotNode &) override;
   void visit(const model::operation::LogisticNode &) override;
   void visit(const model::operation::MulNode &) override;
   void visit(const model::operation::ReLUNode &) override;
index b642580..1630d4c 100644 (file)
@@ -100,6 +100,8 @@ void ShapeFixer::visit(const model::operation::L2NormalizationNode &) { /* DO NO
 
 void ShapeFixer::visit(const model::operation::L2Pool2DNode &) { /* DO NOTHING */}
 
+void ShapeFixer::visit(const model::operation::LogicalNotNode &) { /* DO NOTHING */}
+
 void ShapeFixer::visit(const model::operation::LogisticNode &) { /* DO NOTHING */}
 
 void ShapeFixer::visit(const model::operation::MulNode &node)
index abfb4fd..938501e 100644 (file)
@@ -49,6 +49,7 @@ public:
   void visit(const model::operation::FullyConnectedNode &) override;
   void visit(const model::operation::L2NormalizationNode &) override;
   void visit(const model::operation::L2Pool2DNode &) override;
+  void visit(const model::operation::LogicalNotNode &) override;
   void visit(const model::operation::LogisticNode &) override;
   void visit(const model::operation::MulNode &) override;
   void visit(const model::operation::ReLUNode &) override;
index dbe43cf..50991d9 100644 (file)
@@ -37,10 +37,6 @@ GeneratedTests.topk_v2*
 # Unexpected result
 GeneratedTests.split*
 GeneratedTests.pack*
-generatedtests.logical_not_ex*
-# Need to be fixed
-GeneratedTests.logical_not_ex_1D
-GeneratedTests.logical_not_ex_4D
 # Float error
 GeneratedTests.exp_ex_1D_float
 GeneratedTests.exp_ex_2D_float