From 2f612599852dadcd458dcb9fa8db86f063358352 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EC=9D=B4=ED=95=9C=EC=A2=85/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Engineer/=EC=82=BC=EC=84=B1=EC=A0=84?= =?utf8?q?=EC=9E=90?= Date: Wed, 19 Sep 2018 14:14:13 +0900 Subject: [PATCH] [neurun] Hold Backend objects as pointer (#2768) * [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 * [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 --- runtimes/neurun/src/backend/BackendManager.cc | 2 +- runtimes/neurun/src/backend/BackendManager.h | 2 +- runtimes/neurun/src/codegen/BackendResolver.h | 9 +++++++-- runtimes/neurun/src/codegen/Planner.cc | 18 +++++++++--------- runtimes/neurun/src/graph/Graph.cc | 12 ++++++++---- runtimes/neurun/src/graph/Graph.h | 15 ++++++++++++++- runtimes/neurun/src/graph/operation/LowerInfo.cc | 2 +- runtimes/neurun/src/graph/operation/LowerInfo.h | 6 +++--- runtimes/neurun/src/linear/Linear.cc | 2 +- 9 files changed, 45 insertions(+), 23 deletions(-) diff --git a/runtimes/neurun/src/backend/BackendManager.cc b/runtimes/neurun/src/backend/BackendManager.cc index 312a1e9..02f0b8b 100644 --- a/runtimes/neurun/src/backend/BackendManager.cc +++ b/runtimes/neurun/src/backend/BackendManager.cc @@ -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 diff --git a/runtimes/neurun/src/backend/BackendManager.h b/runtimes/neurun/src/backend/BackendManager.h index 6f862ff..f69b632 100644 --- a/runtimes/neurun/src/backend/BackendManager.h +++ b/runtimes/neurun/src/backend/BackendManager.h @@ -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 _gen_map; diff --git a/runtimes/neurun/src/codegen/BackendResolver.h b/runtimes/neurun/src/codegen/BackendResolver.h index 02f22b2..0d628af 100644 --- a/runtimes/neurun/src/codegen/BackendResolver.h +++ b/runtimes/neurun/src/codegen/BackendResolver.h @@ -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 _gen_map; + std::unordered_map _gen_map; std::shared_ptr _backend_manager; }; diff --git a/runtimes/neurun/src/codegen/Planner.cc b/runtimes/neurun/src/codegen/Planner.cc index 1add3ac..4c11e5d 100644 --- a/runtimes/neurun/src/codegen/Planner.cc +++ b/runtimes/neurun/src/codegen/Planner.cc @@ -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)); } diff --git a/runtimes/neurun/src/graph/Graph.cc b/runtimes/neurun/src/graph/Graph.cc index 07194ff..dca74c3 100644 --- a/runtimes/neurun/src/graph/Graph.cc +++ b/runtimes/neurun/src/graph/Graph.cc @@ -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::asShape4D(object.shape())); }); - auto _backend_resolver = codegen::BackendResolver(_operands); + _backend_resolver = nnfw::make_unique(_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(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()); } }); diff --git a/runtimes/neurun/src/graph/Graph.h b/runtimes/neurun/src/graph/Graph.h index dd1489a..6f903e3 100644 --- a/runtimes/neurun/src/graph/Graph.h +++ b/runtimes/neurun/src/graph/Graph.h @@ -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; 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 _backend_resolver; }; } // namespace graph diff --git a/runtimes/neurun/src/graph/operation/LowerInfo.cc b/runtimes/neurun/src/graph/operation/LowerInfo.cc index 2998b19..7862fd0 100644 --- a/runtimes/neurun/src/graph/operation/LowerInfo.cc +++ b/runtimes/neurun/src/graph/operation/LowerInfo.cc @@ -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 } diff --git a/runtimes/neurun/src/graph/operation/LowerInfo.h b/runtimes/neurun/src/graph/operation/LowerInfo.h index f3fbbf1..e920b0e 100644 --- a/runtimes/neurun/src/graph/operation/LowerInfo.h +++ b/runtimes/neurun/src/graph/operation/LowerInfo.h @@ -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 diff --git a/runtimes/neurun/src/linear/Linear.cc b/runtimes/neurun/src/linear/Linear.cc index 2ffcbdb..5d0adfd 100644 --- a/runtimes/neurun/src/linear/Linear.cc +++ b/runtimes/neurun/src/linear/Linear.cc @@ -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); -- 2.7.4