From fff32a058703e1e43ad8f30a0b23f9859141b6ae 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: Mon, 14 Oct 2019 20:24:19 +0900 Subject: [PATCH] Make to support BatchToSpaceND op for acl neon (#7986) This commit makes to support BatchToSpaceND op for acl neon. Signed-off-by: jiseob.jang --- .../neurun/backend/acl_neon/ConstantInitializer.cc | 26 ++++++++++++++++++++++ .../neurun/backend/acl_neon/ConstantInitializer.h | 1 + .../neurun/backend/acl_neon/KernelGenerator.cc | 22 ++++++++++++++++++ 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 - 7 files changed, 59 insertions(+), 1 deletion(-) diff --git a/runtimes/neurun/backend/acl_neon/ConstantInitializer.cc b/runtimes/neurun/backend/acl_neon/ConstantInitializer.cc index c506bad..15a5d9c 100644 --- a/runtimes/neurun/backend/acl_neon/ConstantInitializer.cc +++ b/runtimes/neurun/backend/acl_neon/ConstantInitializer.cc @@ -45,6 +45,32 @@ void ConstantInitializer::run() _init_map.clear(); } +void ConstantInitializer::visit(const model::operation::BatchToSpaceNDNode &node) +{ + const auto &block_size_index = + node.getInputs().at(model::operation::BatchToSpaceNDNode::BLOCK_SIZE); + const auto &block_size_obj = _operands.at(block_size_index); + + if (block_size_obj.isConstant()) + { + _init_map[block_size_index] = [](const model::Operand &model_obj, + backend::operand::IObject &obj) { + const auto &shape = model_obj.shape(); + const auto base = reinterpret_cast(model_obj.data().base()); + assert(model_obj.shape().rank() == 1); + obj.access([&](::neurun::backend::operand::ITensor &tensor) { + for (size_t i = 0; i < shape.num_elements(); ++i) + { + const int32_t value = base[shape.num_elements() - i - 1]; + int32_t *into = reinterpret_cast(tensor.buffer() + + tensor.calcOffset({static_cast(i)})); + *into = value; + } + }); + }; + } +} + void ConstantInitializer::visit(const model::operation::Conv2DNode &node) { const auto &kernel_index = node.getInputs().at(model::operation::Conv2DNode::KERNEL); diff --git a/runtimes/neurun/backend/acl_neon/ConstantInitializer.h b/runtimes/neurun/backend/acl_neon/ConstantInitializer.h index d0599e4..797c1b4 100644 --- a/runtimes/neurun/backend/acl_neon/ConstantInitializer.h +++ b/runtimes/neurun/backend/acl_neon/ConstantInitializer.h @@ -38,6 +38,7 @@ public: void run() override; public: + void visit(const model::operation::BatchToSpaceNDNode &) override; void visit(const model::operation::Conv2DNode &) override; void visit(const model::operation::DepthwiseConv2DNode &) override; void visit(const model::operation::FullyConnectedNode &) override; diff --git a/runtimes/neurun/backend/acl_neon/KernelGenerator.cc b/runtimes/neurun/backend/acl_neon/KernelGenerator.cc index 1543052..94dfb09 100644 --- a/runtimes/neurun/backend/acl_neon/KernelGenerator.cc +++ b/runtimes/neurun/backend/acl_neon/KernelGenerator.cc @@ -226,6 +226,28 @@ void KernelGenerator::visit(const model::operation::ArgMaxNode &node) _execution_builder->append(std::move(acl_fn)); } +void KernelGenerator::visit(const model::operation::BatchToSpaceNDNode &node) +{ + const auto ofm_index{node.getOutputs().at(0)}; + const auto ifm_index{node.getInputs().at(model::operation::BatchToSpaceNDNode::Input::INPUT)}; + const auto block_size_index{ + node.getInputs().at(model::operation::BatchToSpaceNDNode::Input::BLOCK_SIZE)}; + + auto ofm_alloc = _tensor_builder->at(ofm_index).get(); + auto ifm_alloc = _tensor_builder->at(ifm_index).get(); + auto block_size_alloc = _tensor_builder->at(block_size_index).get(); + + assert(_ctx.at(block_size_index).isConstant()); + + auto fn = nnfw::cpp14::make_unique<::arm_compute::NEBatchToSpaceLayer>(); + + fn->configure(ifm_alloc->handle(), block_size_alloc->handle(), ofm_alloc->handle()); + + auto acl_fn = asAclFunction(std::move(fn)); + + _execution_builder->append(std::move(acl_fn)); +} + void KernelGenerator::visit(const model::operation::CastNode &node) { const auto ofm_index{node.getOutputs().at(0)}; diff --git a/runtimes/neurun/backend/acl_neon/KernelGenerator.h b/runtimes/neurun/backend/acl_neon/KernelGenerator.h index 621e200..82f4f20 100644 --- a/runtimes/neurun/backend/acl_neon/KernelGenerator.h +++ b/runtimes/neurun/backend/acl_neon/KernelGenerator.h @@ -38,6 +38,7 @@ public: void visit(const model::Subgraph &) override; void visit(const model::operation::AbsNode &) override; void visit(const model::operation::ArgMaxNode &) override; + void visit(const model::operation::BatchToSpaceNDNode &) override; void visit(const model::operation::CastNode &) override; void visit(const model::operation::Conv2DNode &) override; void visit(const model::operation::DepthToSpaceNode &) override; diff --git a/runtimes/neurun/backend/acl_neon/ShapeFixer.cc b/runtimes/neurun/backend/acl_neon/ShapeFixer.cc index c7cd721..0874d82 100644 --- a/runtimes/neurun/backend/acl_neon/ShapeFixer.cc +++ b/runtimes/neurun/backend/acl_neon/ShapeFixer.cc @@ -63,6 +63,14 @@ void ShapeFixer::visit(const model::operation::AbsNode &) { /* DO NOTHING */} void ShapeFixer::visit(const model::operation::ArgMaxNode &) { /* DO NOTHING */} +void ShapeFixer::visit(const model::operation::BatchToSpaceNDNode &node) +{ + const auto ofm_index{node.getOutputs().at(0)}; + const auto ifm_index{node.getInputs().at(model::operation::BatchToSpaceNDNode::Input::INPUT)}; + _tensor_builder->dimCorrection(ofm_index, false); + _tensor_builder->dimCorrection(ifm_index, false); +} + void ShapeFixer::visit(const model::operation::CastNode &) { /* DO NOTHING */} void ShapeFixer::visit(const model::operation::Conv2DNode &) { /* DO NOTHING */} diff --git a/runtimes/neurun/backend/acl_neon/ShapeFixer.h b/runtimes/neurun/backend/acl_neon/ShapeFixer.h index 8f79abf..6a1aeef 100644 --- a/runtimes/neurun/backend/acl_neon/ShapeFixer.h +++ b/runtimes/neurun/backend/acl_neon/ShapeFixer.h @@ -39,6 +39,7 @@ public: void visit(const model::operation::AbsNode &) override; void visit(const model::operation::ArgMaxNode &) override; + void visit(const model::operation::BatchToSpaceNDNode &) override; void visit(const model::operation::CastNode &) override; void visit(const model::operation::Conv2DNode &) override; void visit(const model::operation::DepthToSpaceNode &) override; diff --git a/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon b/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon index 37cf639..e455107 100644 --- a/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon +++ b/tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon @@ -5,7 +5,6 @@ GeneratedTests.lsh_projection* GeneratedTests.mobilenet* GeneratedTests.svdf* -GeneratedTests.batch_to_space* GeneratedTests.topk_v2* # Unexpected result GeneratedTests.pack* -- 2.7.4