[neurun] Do not use addTensorBuilder (#2573)
author이한종/동작제어Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Wed, 5 Sep 2018 04:14:12 +0000 (13:14 +0900)
committer박세희/동작제어Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Wed, 5 Sep 2018 04:14:12 +0000 (13:14 +0900)
PR #2563 has introduced `IPlanBuilder::addTensorBuilder`. However
adding a call to `addTensorBuilder` for all nodes from Planner is an
overhead for development. So this commit revises to remove the calls.

However with this commit, `Linear::markTensor` method returns
`TensorBuilderSet` and passes it to `PlanBuilder::finalize`. Still
need to enhance this structure, so TODO comments are left.

Signed-off-by: Hanjoung Lee <hanjoung.lee@samsung.com>
runtimes/neurun/src/backend/ITensorBuilder.h
runtimes/neurun/src/codegen/IPlanBuilder.h
runtimes/neurun/src/codegen/PlanBuilder.cc
runtimes/neurun/src/codegen/PlanBuilder.h
runtimes/neurun/src/codegen/Planner.cc
runtimes/neurun/src/frontend/wrapper/compilation.cc
runtimes/neurun/src/linear/Linear.cc
runtimes/neurun/src/linear/Linear.h

index 8884ae3..e3aa200 100644 (file)
@@ -25,4 +25,17 @@ struct ITensorBuilder
 } // namespace backend
 } // namespace neurun
 
+#include <set>
+#include <memory>
+
+namespace neurun
+{
+namespace backend
+{
+
+using TensorBuilderSet = std::set<std::shared_ptr<backend::ITensorBuilder>>;
+
+} // namespace backend
+} // namespace neurun
+
 #endif // __INTERNAL_ITENSOR_BUILDER_H__
index 1a6dd9d..fc9cc36 100644 (file)
@@ -16,7 +16,6 @@ struct IPlanBuilder
 
   virtual void addShapeConstr(const ::neurun::graph::operand::Index &ind,
                               const ::arm_compute::TensorInfo &info) = 0;
-  virtual void addTensorBuilder(std::shared_ptr<backend::ITensorBuilder> tensor_builder) = 0;
   virtual void addInitializer(const ::neurun::graph::operand::Index &ind,
                               const Initializer &initializer) = 0;
   virtual void addStage(const Stage &) = 0;
index cba9046..2435f71 100644 (file)
@@ -11,11 +11,6 @@ void PlanBuilder::addShapeConstr(const ::neurun::graph::operand::Index &ind,
   _tensor_info_ctx[ind.asInt()] = info;
 }
 
-void PlanBuilder::addTensorBuilder(std::shared_ptr<backend::ITensorBuilder> tensor_builder)
-{
-  _tensor_builders.insert(tensor_builder);
-}
-
 void PlanBuilder::addInitializer(const ::neurun::graph::operand::Index &ind,
                                  const Initializer &initializer)
 {
@@ -24,10 +19,10 @@ void PlanBuilder::addInitializer(const ::neurun::graph::operand::Index &ind,
 
 void PlanBuilder::addStage(const Stage &stage) { _stages.emplace_back(stage); }
 
-void PlanBuilder::finalize()
+void PlanBuilder::finalize(const backend::TensorBuilderSet &tensor_builders)
 {
   // Prepare tensors
-  for (auto &tensor_builder : _tensor_builders)
+  for (auto &tensor_builder : tensor_builders)
   {
     tensor_builder->prepare(_plan, _tensor_info_ctx);
   }
@@ -42,7 +37,7 @@ void PlanBuilder::finalize()
 
   // TODO Add code for CPU/ACL tensor allocation
   // Allocate Tensor Memory for cl_tensors
-  for (auto &tensor_builder : _tensor_builders)
+  for (auto &tensor_builder : tensor_builders)
   {
     tensor_builder->allocate();
   }
index d074abf..72f2b43 100644 (file)
@@ -43,9 +43,6 @@ public:
                       const ::arm_compute::TensorInfo &info) override;
 
 public:
-  void addTensorBuilder(std::shared_ptr<backend::ITensorBuilder> tensor_builder) override;
-
-public:
   void addInitializer(const ::neurun::graph::operand::Index &ind,
                       const Initializer &initializer) override;
 
@@ -53,7 +50,8 @@ public:
   void addStage(const Stage &stage) override;
 
 public:
-  void finalize();
+  // TODO Remove the argument `tensor_builders`
+  void finalize(const backend::TensorBuilderSet &tensor_builders);
 
 public:
   const std::map<int, ::arm_compute::TensorInfo> &tensor_info_ctx() { return _tensor_info_ctx; }
@@ -64,7 +62,6 @@ private:
 private:
   std::map<int, ::arm_compute::TensorInfo> _tensor_info_ctx;
   std::map<int, Initializer> _initializer_ctx;
-  std::set<std::shared_ptr<backend::ITensorBuilder>> _tensor_builders;
   std::vector<Stage> _stages;
 };
 
index 8d0bf3a..477b575 100644 (file)
@@ -43,10 +43,6 @@ void Planner::visit(const graph::operation::Conv2D::Implicit::Node &node)
   // Generate Stage
   auto stage_gen = backend.stage_gen();
   _builder.addStage(stage_gen->generate(node));
-
-  // Generate TensorBuilder
-  auto tensor_builder = backend.tensor_builder();
-  _builder.addTensorBuilder(tensor_builder);
 }
 
 void Planner::visit(const graph::operation::MaxPool2D::Implicit::Node &node)
@@ -67,10 +63,6 @@ void Planner::visit(const graph::operation::MaxPool2D::Implicit::Node &node)
   // Generate Stage
   auto stage_gen = backend.stage_gen();
   _builder.addStage(stage_gen->generate(node));
-
-  // Generate TensorBuilder
-  auto tensor_builder = backend.tensor_builder();
-  _builder.addTensorBuilder(tensor_builder);
 }
 
 void Planner::visit(const graph::operation::AvgPool2D::Implicit::Node &node)
@@ -91,10 +83,6 @@ void Planner::visit(const graph::operation::AvgPool2D::Implicit::Node &node)
   // Generate Stage
   auto stage_gen = backend.stage_gen();
   _builder.addStage(stage_gen->generate(node));
-
-  // Generate TensorBuilder
-  auto tensor_builder = backend.tensor_builder();
-  _builder.addTensorBuilder(tensor_builder);
 }
 
 void Planner::visit(const graph::operation::Concat::Node &node)
@@ -127,10 +115,6 @@ void Planner::visit(const graph::operation::Concat::Node &node)
   // Generate Stage
   auto stage_gen = backend.stage_gen();
   _builder.addStage(stage_gen->generate(node));
-
-  // Generate TensorBuilder
-  auto tensor_builder = backend.tensor_builder();
-  _builder.addTensorBuilder(tensor_builder);
 }
 
 void Planner::visit(const graph::operation::FullyConnected::Node &node)
@@ -177,10 +161,6 @@ void Planner::visit(const graph::operation::FullyConnected::Node &node)
   // Generate Stage
   auto stage_gen = backend.stage_gen();
   _builder.addStage(stage_gen->generate(node));
-
-  // Generate TensorBuilder
-  auto tensor_builder = backend.tensor_builder();
-  _builder.addTensorBuilder(tensor_builder);
 }
 
 void Planner::visit(const graph::operation::Reshape::Node &node)
@@ -214,10 +194,6 @@ void Planner::visit(const graph::operation::Reshape::Node &node)
   // Generate Stage
   auto stage_gen = backend.stage_gen();
   _builder.addStage(stage_gen->generate(node));
-
-  // Generate TensorBuilder
-  auto tensor_builder = backend.tensor_builder();
-  _builder.addTensorBuilder(tensor_builder);
 }
 
 void Planner::visit(const graph::operation::Softmax::Node &node)
@@ -246,10 +222,6 @@ void Planner::visit(const graph::operation::Softmax::Node &node)
   // Generate Stage
   auto stage_gen = backend.stage_gen();
   _builder.addStage(stage_gen->generate(node));
-
-  // Generate TensorBuilder
-  auto tensor_builder = backend.tensor_builder();
-  _builder.addTensorBuilder(tensor_builder);
 }
 
 void Planner::visit(const graph::operation::NOP::Node & /* node */)
index 1e1cf3f..8fa7a39 100644 (file)
@@ -40,12 +40,12 @@ int ANeuralNetworksCompilation::finish()
 
   neurun::codegen::PlanBuilder plan_builder{plan};
 
-  linear->markTensors();
+  auto tensor_builders = linear->markTensors();
 
   linear->accept(neurun::codegen::Planner{operands, plan_builder});
 
   // TODO Add optimization passes
-  plan_builder.finalize();
+  plan_builder.finalize(tensor_builders);
 
   return ANEURALNETWORKS_NO_ERROR;
 }
index e898b73..3d43ef7 100644 (file)
@@ -33,20 +33,24 @@ void Linear::accept(graph::operation::NodeVisitor &&visitor) const
   }
 }
 
-void Linear::markTensors() const
+backend::TensorBuilderSet Linear::markTensors() const
 {
+  backend::TensorBuilderSet tensor_builders;
   for (const auto op : _operations)
   {
     const auto tensor_builder = op->lower_info()->backend().stage_gen()->tensor_builder();
     for (const auto &ind : op->getInputs())
     {
       tensor_builder->mark(ind);
+      tensor_builders.insert(tensor_builder);
     }
     for (const auto &ind : op->getOutputs())
     {
       tensor_builder->mark(ind);
+      tensor_builders.insert(tensor_builder);
     }
   }
+  return tensor_builders;
 }
 
 } // namespace linear
index 574a29b..9e379d3 100644 (file)
@@ -4,6 +4,7 @@
 #include <vector>
 
 #include "graph/operation/Node.h"
+#include "backend/ITensorBuilder.h"
 
 namespace neurun
 {
@@ -48,8 +49,8 @@ public:
 public:
   void accept(graph::operation::NodeVisitor &&visitor) const;
 
-  // TODO Remove this since tensor marking will be replaced with another way
-  virtual void markTensors() const;
+  // TODO Should not return TensorBuilderSet
+  virtual backend::TensorBuilderSet markTensors() const;
 
 public:
 private: