Enable L2Pool2D op for ACL neon (#7134)
author장지섭/On-Device Lab(SR)/Engineer/삼성전자 <jiseob.jang@samsung.com>
Tue, 3 Sep 2019 11:24:57 +0000 (20:24 +0900)
committer오형석/On-Device Lab(SR)/Staff Engineer/삼성전자 <hseok82.oh@samsung.com>
Tue, 3 Sep 2019 11:24:57 +0000 (20:24 +0900)
This commit enables to support L2Pool2D 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
tests/scripts/neurun_frameworktest_list.armv7l.acl_neon.txt

index 01d8da6..2947d02 100644 (file)
@@ -619,6 +619,43 @@ void KernelGenerator::visit(const model::operation::L2NormalizationNode &node)
   _execution_builder->append(std::move(acl_fn));
 }
 
+void KernelGenerator::visit(const model::operation::L2Pool2DNode &node)
+{
+  const auto ofm_index{node.getOutputs().at(0)};
+  const auto ifm_index{node.getInputs().at(model::operation::L2Pool2DNode::Input::INPUT)};
+
+  const auto ifm_shape = _ctx.at(ifm_index).shape().asFeature(_current_subg_layout);
+  const auto ofm_shape = _ctx.at(ofm_index).shape().asFeature(_current_subg_layout);
+
+  uint32_t kw = node.param().kw;
+  uint32_t kh = node.param().kh;
+  const auto stride = node.param().stride;
+  const auto padding =
+      neurun::util::calculatePadding(node.param().padding, ifm_shape, ofm_shape, stride, kw, kh);
+  const auto activation = node.param().activation;
+
+  auto ofm_alloc = _tensor_builder->at(ofm_index).get();
+  auto ifm_alloc = _tensor_builder->at(ifm_index).get();
+
+  ::arm_compute::PoolingLayerInfo info{
+      ::arm_compute::PoolingType::L2, ::arm_compute::Size2D{kw, kh},
+      ::neurun::backend::acl_common::asPadStrideInfo(padding, stride)};
+
+  std::unique_ptr<::arm_compute::IFunction> fn;
+
+  auto l = nnfw::cpp14::make_unique<::arm_compute::NEPoolingLayer>();
+
+  l->configure(ifm_alloc->handle(), ofm_alloc->handle(), info);
+
+  fn = std::move(l);
+
+  auto acl_fn = asAclFunction(std::move(fn));
+
+  _execution_builder->append(std::move(acl_fn));
+
+  ActivationBuilder{*_execution_builder}.append(activation, ofm_alloc->handle());
+}
+
 void KernelGenerator::visit(const model::operation::MulNode &node)
 {
   const auto ofm_index{node.getOutputs().at(0)};
index 5f37e5a..4a2855b 100644 (file)
@@ -46,6 +46,7 @@ public:
   void visit(const model::operation::FloorNode &) override;
   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::MulNode &) override;
   void visit(const model::operation::ReLUNode &) override;
   void visit(const model::operation::ReLU1Node &) override;
index b4df517..3c4b753 100644 (file)
@@ -98,6 +98,8 @@ void ShapeFixer::visit(const model::operation::FullyConnectedNode &node)
 
 void ShapeFixer::visit(const model::operation::L2NormalizationNode &) { /* DO NOTHING */}
 
+void ShapeFixer::visit(const model::operation::L2Pool2DNode &) { /* DO NOTHING */}
+
 void ShapeFixer::visit(const model::operation::MulNode &node)
 {
   const auto lhs_index{node.getInputs().at(model::operation::MulNode::Input::LHS)};
index 37181fc..f377a44 100644 (file)
@@ -48,6 +48,7 @@ public:
   void visit(const model::operation::FloorNode &) override;
   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::MulNode &) override;
   void visit(const model::operation::ReLUNode &) override;
   void visit(const model::operation::ReLU1Node &) override;
index 629b15a..57819cf 100644 (file)
@@ -11,7 +11,6 @@ GeneratedTests.embedding_lookup_2d_nnfw
 GeneratedTests.embedding_lookup_4d_nnfw
 GeneratedTests.greater_equal_ex*
 GeneratedTests.hashtable_lookup*
-GeneratedTests.l2_pool*
 GeneratedTests.local_response_norm*
 GeneratedTests.logical_and_ex*
 GeneratedTests.logical_or_ex*