[neurun] Eliminate OperandIndex in Split::Param (#8917)
authorSergei Barannikov/AI Tools Lab /SRR/Engineer/Samsung Electronics <s.barannikov@samsung.com>
Thu, 14 Nov 2019 06:51:07 +0000 (09:51 +0300)
committer이한종/On-Device Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Thu, 14 Nov 2019 06:51:07 +0000 (15:51 +0900)
Make `axis` and `num_splits` static attributes of the operation.

Signed-off-by: Sergei Barannikov <s.barannikov@samsung.com>
runtime/neurun/backend/acl_cl/KernelGenerator.cc
runtime/neurun/backend/acl_neon/KernelGenerator.cc
runtime/neurun/core/include/model/operation/Split.h
runtime/neurun/frontend/nnapi/wrapper/OperationFactory.cc

index a7efc3c..7138e62 100644 (file)
@@ -2048,10 +2048,8 @@ void KernelGenerator::visit(const model::operation::ReduceMin &node)
 void KernelGenerator::visit(const model::operation::Split &node)
 {
   const auto ifm_index{node.getInputs().at(model::operation::Split::Input::INPUT)};
-  const auto axis_index{node.param().axis_index};
-  const auto num_of_splits_index{node.param().num_of_splits_index};
 
-  assert(_ctx.at(num_of_splits_index).asScalar<unsigned int>() == node.getOutputs().size());
+  assert(node.param().num_splits == static_cast<int>(node.getOutputs().size()));
 
   const auto ifm_rank = _ctx.at(ifm_index).shape().rank();
   std::vector<model::OperandIndex> output_indexes;
@@ -2065,7 +2063,7 @@ void KernelGenerator::visit(const model::operation::Split &node)
 
   const auto frontend_layout = _current_subg_layout;
   const auto backend_layout = ifm_alloc->layout();
-  auto axis = _ctx.at(axis_index).asScalar<int32_t>();
+  auto axis = node.param().axis;
   if (axis < 0)
     axis += ifm_rank;
   axis = acl_common::ToARMComputeAxis(ifm_rank, axis, frontend_layout, backend_layout).value();
@@ -2074,9 +2072,7 @@ void KernelGenerator::visit(const model::operation::Split &node)
 
   fn->configure(ifm_alloc->handle(), output_allocs, axis);
 
-  auto acl_fn = asAclFunction(std::move(fn));
-
-  _execution_builder->append(std::move(acl_fn));
+  _execution_builder->append(asAclFunction(std::move(fn)));
 }
 
 void KernelGenerator::visit(const model::operation::Unpack &node)
index 850213f..b6c7fe4 100644 (file)
@@ -1743,10 +1743,8 @@ void KernelGenerator::visit(const model::operation::Split &node)
 {
   // TODO Support this op by SubTensor
   const auto ifm_index{node.getInputs().at(model::operation::Split::Input::INPUT)};
-  const auto axis_index{node.param().axis_index};
-  const auto num_of_splits_index{node.param().num_of_splits_index};
 
-  assert(_ctx.at(num_of_splits_index).asScalar<unsigned int>() == node.getOutputs().size());
+  assert(node.param().num_splits == static_cast<int>(node.getOutputs().size()));
 
   const auto ifm_rank = _ctx.at(ifm_index).shape().rank();
   std::vector<model::OperandIndex> output_indexes;
@@ -1760,7 +1758,7 @@ void KernelGenerator::visit(const model::operation::Split &node)
 
   const auto frontend_layout = _current_subg_layout;
   const auto backend_layout = ifm_alloc->layout();
-  auto axis = _ctx.at(axis_index).asScalar<int32_t>();
+  auto axis = node.param().axis;
   if (axis < 0)
     axis += ifm_rank;
   axis = acl_common::ToARMComputeAxis(ifm_rank, axis, frontend_layout, backend_layout).value();
@@ -1769,9 +1767,7 @@ void KernelGenerator::visit(const model::operation::Split &node)
 
   fn->configure(ifm_alloc->handle(), output_allocs, axis);
 
-  auto acl_fn = asAclFunction(std::move(fn));
-
-  _execution_builder->append(std::move(acl_fn));
+  _execution_builder->append(asAclFunction(std::move(fn)));
 }
 
 void KernelGenerator::visit(const model::operation::SQRT &node)
index 1ff2d81..b6d5929 100644 (file)
@@ -34,8 +34,8 @@ public:
 
   struct Param
   {
-    OperandIndex axis_index;
-    OperandIndex num_of_splits_index;
+    int axis;
+    int num_splits;
   };
 
 public:
index 40e1446..98ead3b 100644 (file)
@@ -1526,7 +1526,7 @@ OperationFactory::OperationFactory()
   };
 
   _map[ANEURALNETWORKS_SPLIT_EX] = [](const OperationFactory::Param &init_param,
-                                      neurun::model::Operands &) {
+                                      neurun::model::Operands &operands) {
     assert(init_param.input_count == 3);
     assert(init_param.output_count >= 1); // At least one output tensor and axis
 
@@ -1538,8 +1538,8 @@ OperationFactory::OperationFactory()
     }
 
     operation::Split::Param param;
-    param.axis_index = OperandIndex{init_param.inputs[1]};
-    param.num_of_splits_index = OperandIndex{init_param.inputs[2]};
+    param.axis = operands.at(OperandIndex{init_param.inputs[1]}).asScalar<std::int32_t>();
+    param.num_splits = operands.at(OperandIndex{init_param.inputs[2]}).asScalar<std::int32_t>();
 
     return new operation::Split{inputs, outputs, param};
   };