[neurun] Remove Planner implementation (#3560)
author이한종/동작제어Lab(SR)/Engineer/삼성전자 <hanjoung.lee@samsung.com>
Tue, 13 Nov 2018 09:34:26 +0000 (18:34 +0900)
committer이춘석/동작제어Lab(SR)/Staff Engineer/삼성전자 <chunseok.lee@samsung.com>
Tue, 13 Nov 2018 09:34:26 +0000 (18:34 +0900)
Now that we are able to have uniform planning procedure for all Nodes,
We do not need Planner class anymore. The planning procedure is now
unified and moved to `compilation.cc` but Planner class is left for
assertion checks which will be renamed as `OperationAsserter` later.

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

index addab58..a3e494c 100644 (file)
@@ -20,7 +20,6 @@
 
 #include "internal/Convert.h"
 #include "graph/operand/Set.h"
-#include "codegen/IPlanBuilder.h"
 #include "graph/operation/LowerInfo.h"
 
 #include "logging.h"
@@ -30,65 +29,40 @@ namespace neurun
 namespace codegen
 {
 
-void Planner::visit(const graph::operation::Conv2DNode &node)
+void Planner::visit(const graph::operation::Conv2DNode &)
 {
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
+  // DO NOTHING
 }
 
-void Planner::visit(const graph::operation::MaxPool2DNode &node)
+void Planner::visit(const graph::operation::MaxPool2DNode &)
 {
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
+  // DO NOTHING
 }
 
-void Planner::visit(const graph::operation::AvgPool2DNode &node)
+void Planner::visit(const graph::operation::AvgPool2DNode &)
 {
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
+  // DO NOTHING
 }
 
 void Planner::visit(const graph::operation::ConcatNode &node)
 {
+  (void)node; // NOTE To prevent from unused variable warning
+
   // NOTE This implementation assumes concat over feature depth
   // TODO Remove this assumption
   assert(_ctx.at(::neurun::graph::operand::Index{node.param().axis_index}).asScalar<int32_t>() ==
          3);
-
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const graph::operation::FullyConnectedNode &node)
+void Planner::visit(const graph::operation::FullyConnectedNode &)
 {
-  VERBOSE(FullyConnected) << "Configure FULLY_CONNECTED operation" << std::endl;
-
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
+  // DO NOTHING
 }
 
 void Planner::visit(const graph::operation::ReshapeNode &node)
 {
+  (void)node; // NOTE To prevent from unused variable warning
+
   const auto output_index{node.getOutputs().at(0)};
   const auto input_index{node.getInputs().at(0)};
 
@@ -107,17 +81,12 @@ void Planner::visit(const graph::operation::ReshapeNode &node)
   // input(4D)'s C * H * W == output(2D)'s W
   assert((_ctx.at(input_index).shape().dim(3) * _ctx.at(input_index).shape().dim(1) *
           _ctx.at(input_index).shape().dim(2)) == _ctx.at(output_index).shape().dim(1));
-
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
 }
 
 void Planner::visit(const graph::operation::SoftmaxNode &node)
 {
+  (void)node; // NOTE To prevent from unused variable warning
+
   VERBOSE(Softmax) << "Configure SOFTMAX operation" << std::endl;
 
   const auto output_index{node.getOutputs().at(0)};
@@ -130,52 +99,28 @@ void Planner::visit(const graph::operation::SoftmaxNode &node)
   assert(_ctx.at(input_index).shape().dim(0) == 1);
   assert(_ctx.at(input_index).shape().dim(0) == _ctx.at(output_index).shape().dim(0));
   assert(_ctx.at(input_index).shape().dim(1) == _ctx.at(output_index).shape().dim(1));
-
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const graph::operation::NOPNode &node)
+void Planner::visit(const graph::operation::NOPNode &)
 {
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
+  // DO NOTHING
 }
 
 void Planner::visit(const graph::operation::PermuteNode &node)
 {
+  (void)node; // NOTE To prevent from unused variable warning
+
   VERBOSE(Permute) << "Configure Permute operation" << std::endl;
 
   const auto output_index{node.getOutputs().at(0)};
   const auto input_index{node.getInputs().at(0)};
 
   assert(_ctx.at(output_index).shape().rank() == _ctx.at(input_index).shape().rank());
-
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
 }
 
-void Planner::visit(const graph::operation::AddNode &node)
+void Planner::visit(const graph::operation::AddNode &)
 {
-  VERBOSE(Add) << "Configure Add operation" << std::endl;
-
-  // backend
-  auto backend = node.lower_info()->backend();
-
-  // Generate Stage
-  auto stage_gen = backend->stage_gen();
-  _builder.addStage(stage_gen->generate(node));
+  // DO NOTHING
 }
 
 } // namespace codegen
index 1b96c17..d97aeed 100644 (file)
@@ -35,15 +35,11 @@ namespace neurun
 namespace codegen
 {
 
-class IPlanBuilder;
-
+// FIXME Rename Planner to OperationAsserter
 class Planner : public graph::operation::NodeVisitor
 {
 public:
-  Planner(const neurun::graph::operand::Set &ctx, neurun::codegen::IPlanBuilder &builder)
-      : _ctx{ctx}, _builder{builder}
-  {
-  }
+  Planner(const neurun::graph::operand::Set &ctx) : _ctx{ctx} {}
 
 public:
   virtual void visit(const graph::operation::Conv2DNode &) override;
@@ -59,7 +55,6 @@ public:
 
 private:
   const neurun::graph::operand::Set &_ctx;
-  neurun::codegen::IPlanBuilder &_builder;
 };
 
 } // namespace codegen
index 13f4fda..45700e5 100644 (file)
@@ -24,6 +24,7 @@
 #include "codegen/PlanBuilder.h"
 #include "middleend/SubTensorAnalyzer.h"
 #include "codegen/ConstantInitializer.h"
+#include "graph/operation/LowerInfo.h"
 
 #include "linear/Linear.h"
 #include "util/EnvVar.h"
@@ -66,7 +67,17 @@ int ANeuralNetworksCompilation::finish()
 
   neurun::codegen::PlanBuilder plan_builder{plan};
 
-  linear->accept(neurun::codegen::Planner{operands, plan_builder});
+  // NOTE This is actually an Asserter. Will be renamed
+  linear->accept(neurun::codegen::Planner{operands});
+
+  // Plan building
+  linear->iterate([&](const neurun::graph::operation::Node *node) {
+    auto backend = node->lower_info()->backend();
+
+    // Generate Stage
+    auto stage_gen = backend->stage_gen();
+    plan_builder.addStage(stage_gen->generate(*node));
+  });
 
   auto tensor_builders = linear->planTensors();