[neurun] Hold Backend objects as pointer (#2768)
author이한종/동작제어Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Wed, 19 Sep 2018 05:14:13 +0000 (14:14 +0900)
committer박세희/동작제어Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Wed, 19 Sep 2018 05:14:13 +0000 (14:14 +0900)
* [neurun] Hold Backend objects as pointer

Make `BackendManager` to return backend's pointer so it does not make
many duplicated objects of `Backend`.

Signed-off-by: Hanjoung Lee <hanjoung.lee@samsung.com>
* [neurun] BackendResolver as Graph member

Now that we have Backend as pointer, there is an issue on the scope of
BackendResolver.

Signed-off-by: Hanjoung Lee <hanjoung.lee@samsung.com>
runtimes/neurun/src/backend/BackendManager.cc
runtimes/neurun/src/backend/BackendManager.h
runtimes/neurun/src/codegen/BackendResolver.h
runtimes/neurun/src/codegen/Planner.cc
runtimes/neurun/src/graph/Graph.cc
runtimes/neurun/src/graph/Graph.h
runtimes/neurun/src/graph/operation/LowerInfo.cc
runtimes/neurun/src/graph/operation/LowerInfo.h
runtimes/neurun/src/linear/Linear.cc

index 312a1e9..02f0b8b 100644 (file)
@@ -84,7 +84,7 @@ BackendManager::BackendManager(const neurun::graph::operand::Set &operands)
   }
 }
 
-Backend BackendManager::get(const std::string &key) { return _gen_map.at(key); }
+Backend *BackendManager::get(const std::string &key) { return &_gen_map.at(key); }
 
 } // namespace backend
 } // namespace neurun
index 6f862ff..f69b632 100644 (file)
@@ -61,7 +61,7 @@ class BackendManager
 public:
   BackendManager(const neurun::graph::operand::Set &operands);
 
-  Backend get(const std::string &key);
+  Backend *get(const std::string &key);
 
 private:
   std::map<std::string, Backend> _gen_map;
index 02f22b2..0d628af 100644 (file)
@@ -69,10 +69,15 @@ public:
   }
 
 public:
-  const backend::Backend &getBackend(const std::type_index &type) { return _gen_map[type]; }
+  const backend::Backend *getBackend(const std::type_index &type) { return _gen_map[type]; }
+  const backend::Backend *getDefaultBackend()
+  {
+    static backend::Backend *default_backend = _backend_manager->get("cpu");
+    return default_backend;
+  }
 
 private:
-  std::unordered_map<std::type_index, backend::Backend> _gen_map;
+  std::unordered_map<std::type_index, backend::Backend *> _gen_map;
   std::shared_ptr<backend::BackendManager> _backend_manager;
 };
 
index 1add3ac..4c11e5d 100644 (file)
@@ -53,12 +53,12 @@ void Planner::visit(const graph::operation::Conv2D::Implicit::Node &node)
   auto backend = node.lower_info()->backend();
 
   // Generate Initializers
-  auto init_gen = backend.initializer_gen();
+  auto init_gen = backend->initializer_gen();
   _builder.addInitializer(ker_index, init_gen->generateWeight(node));
   _builder.addInitializer(bias_index, init_gen->generateBias(node));
 
   // Generate Stage
-  auto stage_gen = backend.stage_gen();
+  auto stage_gen = backend->stage_gen();
   _builder.addStage(stage_gen->generate(node));
 }
 
@@ -78,7 +78,7 @@ void Planner::visit(const graph::operation::MaxPool2D::Implicit::Node &node)
   auto backend = node.lower_info()->backend();
 
   // Generate Stage
-  auto stage_gen = backend.stage_gen();
+  auto stage_gen = backend->stage_gen();
   _builder.addStage(stage_gen->generate(node));
 }
 
@@ -98,7 +98,7 @@ void Planner::visit(const graph::operation::AvgPool2D::Implicit::Node &node)
   auto backend = node.lower_info()->backend();
 
   // Generate Stage
-  auto stage_gen = backend.stage_gen();
+  auto stage_gen = backend->stage_gen();
   _builder.addStage(stage_gen->generate(node));
 }
 
@@ -130,7 +130,7 @@ void Planner::visit(const graph::operation::Concat::Node &node)
   auto backend = node.lower_info()->backend();
 
   // Generate Stage
-  auto stage_gen = backend.stage_gen();
+  auto stage_gen = backend->stage_gen();
   _builder.addStage(stage_gen->generate(node));
 }
 
@@ -171,12 +171,12 @@ void Planner::visit(const graph::operation::FullyConnected::Node &node)
   auto backend = node.lower_info()->backend();
 
   // Generate Initializers
-  auto init_gen = backend.initializer_gen();
+  auto init_gen = backend->initializer_gen();
   _builder.addInitializer(weight_index, init_gen->generateWeight(node));
   _builder.addInitializer(bias_index, init_gen->generateBias(node));
 
   // Generate Stage
-  auto stage_gen = backend.stage_gen();
+  auto stage_gen = backend->stage_gen();
   _builder.addStage(stage_gen->generate(node));
 }
 
@@ -209,7 +209,7 @@ void Planner::visit(const graph::operation::Reshape::Node &node)
   auto backend = node.lower_info()->backend();
 
   // Generate Stage
-  auto stage_gen = backend.stage_gen();
+  auto stage_gen = backend->stage_gen();
   _builder.addStage(stage_gen->generate(node));
 }
 
@@ -237,7 +237,7 @@ void Planner::visit(const graph::operation::Softmax::Node &node)
   auto backend = node.lower_info()->backend();
 
   // Generate Stage
-  auto stage_gen = backend.stage_gen();
+  auto stage_gen = backend->stage_gen();
   _builder.addStage(stage_gen->generate(node));
 }
 
index 07194ff..dca74c3 100644 (file)
@@ -34,6 +34,10 @@ namespace neurun
 namespace graph
 {
 
+Graph::Graph(void) = default;
+
+Graph::~Graph(void) = default;
+
 operand::Index Graph::addOperand(const operand::Shape &shape, const operand::TypeInfo &type)
 {
   return _operands.append(shape, type);
@@ -155,10 +159,10 @@ void Graph::lower(void)
           nnfw::make_unique<operand::LowerInfo>(operand::asShape4D(object.shape()));
     });
 
-    auto _backend_resolver = codegen::BackendResolver(_operands);
+    _backend_resolver = nnfw::make_unique<codegen::BackendResolver>(_operands);
 
     _operations.iterate([&](const operation::Index &, operation::Node &node) {
-      auto backend = _backend_resolver.getBackend(typeid(node));
+      auto backend = _backend_resolver->getBackend(typeid(node));
 
       // Operation LowerInfo
       node.lower_info(nnfw::make_unique<operation::LowerInfo>(backend));
@@ -167,12 +171,12 @@ void Graph::lower(void)
       for (auto operand : node.getInputs())
       {
         auto &&lower_info = operands_lower_info.at(operand);
-        lower_info->addUseLayout(backend.config()->getOperandLayout());
+        lower_info->addUseLayout(backend->config()->getOperandLayout());
       }
       for (auto operand : node.getOutputs())
       {
         auto &&lower_info = operands_lower_info.at(operand);
-        lower_info->addDefLayout(backend.config()->getOperandLayout());
+        lower_info->addDefLayout(backend->config()->getOperandLayout());
       }
     });
 
index dd1489a..6f903e3 100644 (file)
@@ -34,6 +34,14 @@ class Linear;
 
 namespace neurun
 {
+namespace codegen
+{
+class BackendResolver;
+} // namespace linear
+} // namespace neurun
+
+namespace neurun
+{
 namespace graph
 {
 
@@ -87,7 +95,8 @@ public:
   using PostDfsConstIterator = PostDfsIterator<true>;
 
 public:
-  Graph(void) = default;
+  Graph(void);
+  ~Graph(void);
 
   // Graph Building
 public:
@@ -121,6 +130,10 @@ private:
   operand::Set _operands;
   operand::IndexSet _inputs;
   operand::IndexSet _outputs;
+
+  // For LOWERED phase
+private:
+  std::unique_ptr<codegen::BackendResolver> _backend_resolver;
 };
 
 } // namespace graph
index 2998b19..7862fd0 100644 (file)
@@ -23,7 +23,7 @@ namespace graph
 namespace operation
 {
 
-LowerInfo::LowerInfo(const backend::Backend &backend) : _backend(backend)
+LowerInfo::LowerInfo(const backend::Backend *backend) : _backend(backend)
 {
   // DO NOTHING
 }
index f3fbbf1..e920b0e 100644 (file)
@@ -31,11 +31,11 @@ namespace operation
 class LowerInfo
 {
 public:
-  LowerInfo(const backend::Backend &backend);
-  const backend::Backend &backend() const { return _backend; }
+  LowerInfo(const backend::Backend *backend);
+  const backend::Backend *backend() const { return _backend; }
 
 private:
-  backend::Backend _backend;
+  const backend::Backend *_backend;
 };
 
 } // namespace operation
index 2ffcbdb..5d0adfd 100644 (file)
@@ -54,7 +54,7 @@ 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();
+    const auto tensor_builder = op->lower_info()->backend()->stage_gen()->tensor_builder();
     for (const auto &ind : op->getInputs())
     {
       tensor_builder->mark(ind);