From c30177cb2cdcfd8279cb705fa6c1a67a6a2c68d5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EC=9E=A5=EC=A7=80=EC=84=AD/On-Device=20Lab=28SR=29/Enginee?= =?utf8?q?r/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Thu, 5 Sep 2019 15:15:21 +0900 Subject: [PATCH] Enable Pad op for ACL neon (#7205) This commit enables to support Pad op for ACL neon. Signed-off-by: jiseob.jang --- .../neurun/backend/acl_neon/KernelGenerator.cc | 40 ++++++++++++++++++++++ runtimes/neurun/backend/acl_neon/KernelGenerator.h | 1 + runtimes/neurun/backend/acl_neon/ShapeFixer.cc | 8 +++++ runtimes/neurun/backend/acl_neon/ShapeFixer.h | 1 + tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon | 1 - .../neurun_frameworktest_list.armv7l.acl_neon.txt | 3 ++ 6 files changed, 53 insertions(+), 1 deletion(-) diff --git a/runtimes/neurun/backend/acl_neon/KernelGenerator.cc b/runtimes/neurun/backend/acl_neon/KernelGenerator.cc index 8587eb4..836b99c 100644 --- a/runtimes/neurun/backend/acl_neon/KernelGenerator.cc +++ b/runtimes/neurun/backend/acl_neon/KernelGenerator.cc @@ -922,6 +922,46 @@ void KernelGenerator::visit(const model::operation::MulNode &node) ActivationBuilder{*_execution_builder}.append(activation, ofm_alloc->handle()); } +void KernelGenerator::visit(const model::operation::PadNode &node) +{ + const auto input_index{node.getInputs().at(model::operation::PadNode::Input::INPUT)}; + const auto pad_index{node.getInputs().at(model::operation::PadNode::Input::PAD)}; + const auto output_index{node.getOutputs().at(0)}; + assert(_ctx.at(pad_index).isConstant()); + + auto rank = _ctx.at(pad_index).shape().dim(0); + auto pad_base = _ctx.at(pad_index).data().base(); + + auto input = _tensor_builder->at(input_index).get()->handle(); + auto output = _tensor_builder->at(output_index).get()->handle(); + + ::arm_compute::PaddingList padding_list; + padding_list.resize(rank); + for (int32_t n = 0; n < rank; ++n) + { + const int32_t *from = reinterpret_cast(pad_base) + (n * 2); + + const auto frontend_layout = _current_subg_layout; + const auto backend_layout = _tensor_builder->at(input_index).get()->layout(); + const auto axis = + acl_common::ToARMComputeAxis(rank, n, frontend_layout, backend_layout).value(); + padding_list[axis] = ::arm_compute::PaddingInfo{from[0], from[1]}; + } + + const auto input_type = _ctx.at(input_index).typeInfo(); + UNUSED_RELEASE(input_type); + assert(input->info()->data_type() == acl_common::asDataType(input_type.type())); + assert(input->info()->quantization_info() == + ::arm_compute::QuantizationInfo(input_type.scale(), input_type.offset())); + const auto pixel_value = + ::arm_compute::PixelValue(0, input->info()->data_type(), input->info()->quantization_info()); + + auto fn = nnfw::cpp14::make_unique<::arm_compute::NEPadLayer>(); + fn->configure(input, output, padding_list, pixel_value); + + _execution_builder->append(asAclFunction(std::move(fn))); +} + void KernelGenerator::visit(const model::operation::ReLUNode &node) { const auto output_index{node.getOutputs().at(0)}; diff --git a/runtimes/neurun/backend/acl_neon/KernelGenerator.h b/runtimes/neurun/backend/acl_neon/KernelGenerator.h index 5554d0a..a3cc5c2 100644 --- a/runtimes/neurun/backend/acl_neon/KernelGenerator.h +++ b/runtimes/neurun/backend/acl_neon/KernelGenerator.h @@ -52,6 +52,7 @@ public: void visit(const model::operation::LogisticNode &) override; void visit(const model::operation::LSTMNode &) override; void visit(const model::operation::MulNode &) override; + void visit(const model::operation::PadNode &) override; void visit(const model::operation::ReLUNode &) override; void visit(const model::operation::ReLU1Node &) override; void visit(const model::operation::ReLU6Node &) override; diff --git a/runtimes/neurun/backend/acl_neon/ShapeFixer.cc b/runtimes/neurun/backend/acl_neon/ShapeFixer.cc index 6c23123..e155cf2 100644 --- a/runtimes/neurun/backend/acl_neon/ShapeFixer.cc +++ b/runtimes/neurun/backend/acl_neon/ShapeFixer.cc @@ -108,6 +108,14 @@ void ShapeFixer::visit(const model::operation::LogisticNode &) { /* DO NOTHING * void ShapeFixer::visit(const model::operation::LSTMNode &) { /* DO NOTHING */} +void ShapeFixer::visit(const model::operation::PadNode &node) +{ + const auto input_index{node.getInputs().at(model::operation::PadNode::Input::INPUT)}; + const auto output_index{node.getOutputs().at(0)}; + _tensor_builder->dimCorrection(input_index, false); + _tensor_builder->dimCorrection(output_index, false); +} + void ShapeFixer::visit(const model::operation::MulNode &node) { const auto lhs_index{node.getInputs().at(model::operation::MulNode::Input::LHS)}; diff --git a/runtimes/neurun/backend/acl_neon/ShapeFixer.h b/runtimes/neurun/backend/acl_neon/ShapeFixer.h index b37478c..3baff3d 100644 --- a/runtimes/neurun/backend/acl_neon/ShapeFixer.h +++ b/runtimes/neurun/backend/acl_neon/ShapeFixer.h @@ -54,6 +54,7 @@ public: void visit(const model::operation::LogisticNode &) override; void visit(const model::operation::LSTMNode &) override; void visit(const model::operation::MulNode &) override; + void visit(const model::operation::PadNode &) override; void visit(const model::operation::ReLUNode &) override; void visit(const model::operation::ReLU1Node &) override; void visit(const model::operation::ReLU6Node &) override; diff --git a/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon b/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon index 758a609..cefc10f 100644 --- a/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon +++ b/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon @@ -19,7 +19,6 @@ GeneratedTests.neg* GeneratedTests.notequal* GeneratedTests.prelu_ex* GeneratedTests.reduce_min* -GeneratedTests.pad* GeneratedTests.space_to_depth* GeneratedTests.svdf* GeneratedTests.tanh_ diff --git a/tests/scripts/neurun_frameworktest_list.armv7l.acl_neon.txt b/tests/scripts/neurun_frameworktest_list.armv7l.acl_neon.txt index df6fe90..a6e0ce7 100644 --- a/tests/scripts/neurun_frameworktest_list.armv7l.acl_neon.txt +++ b/tests/scripts/neurun_frameworktest_list.armv7l.acl_neon.txt @@ -8,6 +8,9 @@ fullyconnected/fc1 l2_pool_2d logistic max_pool_2d +pad/4D_2D +pad/pad1 +pad/pad2 relu relu6 reshape -- 2.7.4