From b8fd3caef7ad036f87ed629c342d60d7d3f2e176 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: Wed, 4 Sep 2019 14:57:29 +0900 Subject: [PATCH] Enable Transpose op for ACL neon (#7155) This commit enables to support Transpose op for ACL neon. Signed-off-by: jiseob.jang --- .../neurun/backend/acl_neon/KernelGenerator.cc | 49 +++++++++++++++++++++- runtimes/neurun/backend/acl_neon/ShapeFixer.cc | 2 + 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 | 1 + 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/runtimes/neurun/backend/acl_neon/KernelGenerator.cc b/runtimes/neurun/backend/acl_neon/KernelGenerator.cc index f892ee9..3e4f09e 100644 --- a/runtimes/neurun/backend/acl_neon/KernelGenerator.cc +++ b/runtimes/neurun/backend/acl_neon/KernelGenerator.cc @@ -1119,8 +1119,53 @@ void KernelGenerator::visit(const model::operation::TransposeConvNode &node) void KernelGenerator::visit(const model::operation::TransposeNode &node) { - (void)node; - throw std::runtime_error("Not supported, yet"); + const auto ofm_idx{node.getOutputs().at(0)}; + const auto ifm_idx{node.getInputs().at(model::operation::TransposeNode::Input::INPUT)}; + const auto perm{node.param().perm}; + + const auto rank = _ctx.at(ifm_idx).shape().rank(); + std::vector pv; + const auto perm_base = _ctx.at(perm).data().base(); + const int perm_size = _ctx.at(perm).shape().num_elements(); + + assert(perm_base != nullptr); + for (int32_t n = 0; n < perm_size; ++n) + { + const int32_t perm_value = *(reinterpret_cast(perm_base) + n); + assert(perm_value < rank); + pv.emplace_back(perm_value); + } + + auto ofm_alloc = _tensor_builder->at(ofm_idx).get(); + const auto ifm_alloc = _tensor_builder->at(ifm_idx).get(); + const auto frontend_layout = _current_subg_layout; + const auto backend_layout = ifm_alloc->layout(); + + auto backend_pv = ::neurun::backend::acl_common::getARMComputePermutationVector( + rank, pv, frontend_layout, backend_layout); + + std::unique_ptr<::arm_compute::IFunction> fn; + + if (ifm_alloc->num_dimensions() <= 2 && ofm_alloc->num_dimensions() <= 2) + { + auto l = nnfw::cpp14::make_unique<::arm_compute::NETranspose>(); + + l->configure(ifm_alloc->handle(), ofm_alloc->handle()); + + fn = std::move(l); + } + else + { + auto l = nnfw::cpp14::make_unique<::arm_compute::NEPermute>(); + + l->configure(ifm_alloc->handle(), ofm_alloc->handle(), backend_pv); + + fn = std::move(l); + } + + auto acl_fn = asAclFunction(std::move(fn)); + + _execution_builder->append(std::move(acl_fn)); } void KernelGenerator::visit(const model::operation::AddNode &node) diff --git a/runtimes/neurun/backend/acl_neon/ShapeFixer.cc b/runtimes/neurun/backend/acl_neon/ShapeFixer.cc index 046a18a..1ef911d 100644 --- a/runtimes/neurun/backend/acl_neon/ShapeFixer.cc +++ b/runtimes/neurun/backend/acl_neon/ShapeFixer.cc @@ -206,6 +206,8 @@ void ShapeFixer::visit(const model::operation::SubNode &node) void ShapeFixer::visit(const model::operation::TransposeConvNode &) { /* DO NOTHING */} +void ShapeFixer::visit(const model::operation::TransposeNode &) { /* DO NOTHING */} + void ShapeFixer::visit(const model::operation::AddNode &node) { const auto lhs_index{node.getInputs().at(model::operation::AddNode::Input::LHS)}; diff --git a/runtimes/neurun/backend/acl_neon/ShapeFixer.h b/runtimes/neurun/backend/acl_neon/ShapeFixer.h index 2c3987d..ee0f4f7 100644 --- a/runtimes/neurun/backend/acl_neon/ShapeFixer.h +++ b/runtimes/neurun/backend/acl_neon/ShapeFixer.h @@ -65,6 +65,7 @@ public: void visit(const model::operation::SubNode &) override; void visit(const model::operation::StridedSliceNode &) override; void visit(const model::operation::TransposeConvNode &) override; + void visit(const model::operation::TransposeNode &) override; void visit(const model::operation::AddNode &) override; void visit(const model::operation::DivNode &) override; void visit(const model::operation::ComparisonNode &) override; diff --git a/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon b/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon index 97792df..f94f078 100644 --- a/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon +++ b/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon @@ -28,7 +28,6 @@ GeneratedTests.svdf* GeneratedTests.tanh_ GeneratedTests.batch_to_space* GeneratedTests.space_to_batch* -GeneratedTests.transpose* GeneratedTests.cast_ex* GeneratedTests.gather_ex* GeneratedTests.strided_slice_ex* diff --git a/tests/scripts/neurun_frameworktest_list.armv7l.acl_neon.txt b/tests/scripts/neurun_frameworktest_list.armv7l.acl_neon.txt index d5c1149..6b4e210 100644 --- a/tests/scripts/neurun_frameworktest_list.armv7l.acl_neon.txt +++ b/tests/scripts/neurun_frameworktest_list.armv7l.acl_neon.txt @@ -14,6 +14,7 @@ reshape softmax sqrt tanh +transpose transpose_conv MODELS/inception_module MODELS/mobilenet -- 2.7.4