// DO NOTHING
}
-Stage StageGenerator::generate(const graph::operation::Conv2DNode &node)
+void StageGenerator::visit(const graph::operation::Conv2DNode &node)
{
using graph::operation::Conv2DNode;
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto ofm_alloc = tensors->at(param.ofm_index).get();
auto ifm_alloc = tensors->at(param.ifm_index).get();
auto ker_alloc = tensors->at(param.ker_index).get();
builder.append(std::move(fn));
ActivationBuilder{builder}.append(param.activation, ofm_alloc);
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::MaxPool2DNode &node)
+void StageGenerator::visit(const graph::operation::MaxPool2DNode &node)
{
const auto ofm_index{node.getOutputs().at(0)};
const auto ifm_index{node.getInputs().at(graph::operation::MaxPool2DNode::Input::INPUT)};
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto ofm_alloc = tensors->at(param.ofm_index).get();
auto ifm_alloc = tensors->at(param.ifm_index).get();
fn->configure(ifm_alloc, ofm_alloc, info);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::AvgPool2DNode &node)
+void StageGenerator::visit(const graph::operation::AvgPool2DNode &node)
{
const auto ofm_index{node.getOutputs().at(0)};
const auto ifm_index{node.getInputs().at(graph::operation::AvgPool2DNode::Input::INPUT)};
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto ofm_alloc = tensors->at(param.ofm_index).get();
auto ifm_alloc = tensors->at(param.ifm_index).get();
fn->configure(ifm_alloc, ofm_alloc, info);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::ConcatNode &node)
+void StageGenerator::visit(const graph::operation::ConcatNode &node)
{
const auto ofm_index{node.getOutputs().at(0)};
const auto axis_index{node.param().axis_index};
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
// If tensor allocator allocate as subtensor
bool canEliminate = true;
for (auto ifm_ind : param.input_indexes)
fn->configure(input_allocs, param.axis, output_alloc);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::FullyConnectedNode &node)
+void StageGenerator::visit(const graph::operation::FullyConnectedNode &node)
{
using graph::operation::FullyConnectedNode;
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto output_alloc = tensors->at(param.output_index).get();
auto input_alloc = tensors->at(param.input_index).get();
auto weight_alloc = tensors->at(param.weight_index).get();
builder.append(std::move(fn));
ActivationBuilder{builder}.append(param.activation, output_alloc);
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::ReshapeNode &node)
+void StageGenerator::visit(const graph::operation::ReshapeNode &node)
{
const auto output_index{node.getOutputs().at(0)};
const auto input_index{node.getInputs().at(graph::operation::ReshapeNode::Input::INPUT)};
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto output_alloc = tensors->at(param.output_index).get();
auto input_alloc = tensors->at(param.input_index).get();
fn->configure(input_alloc, output_alloc);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::SoftmaxNode &node)
+void StageGenerator::visit(const graph::operation::SoftmaxNode &node)
{
const auto output_index{node.getOutputs().at(0)};
const auto input_index{node.getInputs().at(graph::operation::SoftmaxNode::Input::INPUT)};
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto output_alloc = tensors->at(param.output_index).get();
auto input_alloc = tensors->at(param.input_index).get();
fn->configure(input_alloc, output_alloc, param.scale);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::NOPNode & /* node */)
+void StageGenerator::visit(const graph::operation::NOPNode & /* node */)
{
// DO NOTHING
- return nullptr;
+ returnStage(nullptr);
}
-Stage StageGenerator::generate(const graph::operation::PermuteNode & /* node */)
+void StageGenerator::visit(const graph::operation::PermuteNode & /* node */)
{
throw "Unsupported";
}
-Stage StageGenerator::generate(const graph::operation::AddNode &)
+void StageGenerator::visit(const graph::operation::AddNode &)
{
VERBOSE(Add) << "generate CPU Add" << std::endl;
virtual std::shared_ptr<ITensorBuilder> tensor_builder() override { return _tensor_builder; }
- virtual Stage generate(const graph::operation::Conv2DNode &node) override;
- virtual Stage generate(const graph::operation::MaxPool2DNode &node) override;
- virtual Stage generate(const graph::operation::AvgPool2DNode &node) override;
- virtual Stage generate(const graph::operation::ConcatNode &node) override;
- virtual Stage generate(const graph::operation::FullyConnectedNode &node) override;
- virtual Stage generate(const graph::operation::ReshapeNode &node) override;
- virtual Stage generate(const graph::operation::SoftmaxNode &node) override;
- virtual Stage generate(const graph::operation::NOPNode &node) override;
- virtual Stage generate(const graph::operation::PermuteNode &node) override;
- virtual Stage generate(const graph::operation::AddNode &node) override;
+ virtual void visit(const graph::operation::Conv2DNode &node) override;
+ virtual void visit(const graph::operation::MaxPool2DNode &node) override;
+ virtual void visit(const graph::operation::AvgPool2DNode &node) override;
+ virtual void visit(const graph::operation::ConcatNode &node) override;
+ virtual void visit(const graph::operation::FullyConnectedNode &node) override;
+ virtual void visit(const graph::operation::ReshapeNode &node) override;
+ virtual void visit(const graph::operation::SoftmaxNode &node) override;
+ virtual void visit(const graph::operation::NOPNode &node) override;
+ virtual void visit(const graph::operation::PermuteNode &node) override;
+ virtual void visit(const graph::operation::AddNode &node) override;
private:
const neurun::graph::operand::Set &_ctx;
// DO NOTHING
}
-Stage StageGenerator::generate(const graph::operation::Conv2DNode &node)
+void StageGenerator::visit(const graph::operation::Conv2DNode &node)
{
using graph::operation::Conv2DNode;
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto ofm_alloc = tensors->at(param.ofm_index);
auto ifm_alloc = tensors->at(param.ifm_index);
auto ker_alloc = tensors->at(param.ker_index);
param.stride.vertical, param.activation, ofm_alloc->buffer(), param.ofm_shape);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::MaxPool2DNode &node)
+void StageGenerator::visit(const graph::operation::MaxPool2DNode &node)
{
VERBOSE(MaxPool2D) << "generate CPU MaxPool2D" << std::endl;
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto ofm_alloc = tensors->at(param.ofm_index).get();
auto ifm_alloc = tensors->at(param.ifm_index).get();
param.ofm_shape);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::AvgPool2DNode &node)
+void StageGenerator::visit(const graph::operation::AvgPool2DNode &node)
{
VERBOSE(AvgPool2D) << "generate CPU AvgPool2D" << std::endl;
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto ofm_alloc = tensors->at(param.ofm_index).get();
auto ifm_alloc = tensors->at(param.ifm_index).get();
param.ofm_shape);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::ConcatNode &node)
+void StageGenerator::visit(const graph::operation::ConcatNode &node)
{
VERBOSE(Concat) << "generate CPU Concat" << std::endl;
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto output_alloc = tensors->at(param.output_index).get();
std::vector<const uint8_t *> input_buffers;
param.ofm_shape);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::FullyConnectedNode &node)
+void StageGenerator::visit(const graph::operation::FullyConnectedNode &node)
{
VERBOSE(FullyConnected) << "generate CPU FullyConnected" << std::endl;
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto output_alloc = tensors->at(param.output_index).get();
auto input_alloc = tensors->at(param.input_index).get();
auto weight_alloc = tensors->at(param.weight_index).get();
output_alloc->buffer(), param.ofm_shape);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::ReshapeNode &node)
+void StageGenerator::visit(const graph::operation::ReshapeNode &node)
{
const auto output_index{node.getOutputs().at(0)};
const auto input_index{node.getInputs().at(graph::operation::ReshapeNode::Input::INPUT)};
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto output_alloc = tensors->at(param.output_index).get();
auto input_alloc = tensors->at(param.input_index).get();
fn->configure(input_alloc->buffer(), param.ifm_shape, output_alloc->buffer(), param.ofm_shape);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::SoftmaxNode &node)
+void StageGenerator::visit(const graph::operation::SoftmaxNode &node)
{
VERBOSE(Softmax) << "generate CPU Softmax" << std::endl;
auto tensors = _tensor_builder;
- return [tensors, param](IExecutionBuilder &builder) {
+ returnStage([tensors, param](IExecutionBuilder &builder) {
auto output_alloc = tensors->at(param.output_index).get();
auto input_alloc = tensors->at(param.input_index).get();
param.ofm_shape);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::NOPNode & /* node */)
+void StageGenerator::visit(const graph::operation::NOPNode & /* node */)
{
// DO NOTHING
- return nullptr;
+ returnStage(nullptr);
}
-Stage StageGenerator::generate(const graph::operation::PermuteNode &node)
+void StageGenerator::visit(const graph::operation::PermuteNode &node)
{
VERBOSE(Permute) << "generate CPU Permute" << std::endl;
const auto input_tensors = input_backend->tensor_builder();
const auto output_tensors = output_backend->tensor_builder();
- return [input_tensors, output_tensors, param](IExecutionBuilder &builder) {
+ returnStage([input_tensors, output_tensors, param](IExecutionBuilder &builder) {
auto output_alloc = output_tensors->tensorAt(param.output_index).get();
auto input_alloc = input_tensors->tensorAt(param.input_index).get();
fn->configure(input_alloc, output_alloc, param.shape, param.type);
builder.append(std::move(fn));
- };
+ });
}
-Stage StageGenerator::generate(const graph::operation::AddNode &)
+void StageGenerator::visit(const graph::operation::AddNode &)
{
VERBOSE(Add) << "generate CPU Add" << std::endl;
virtual std::shared_ptr<ITensorBuilder> tensor_builder() override { return _tensor_builder; }
- virtual Stage generate(const graph::operation::Conv2DNode &node) override;
- virtual Stage generate(const graph::operation::MaxPool2DNode &node) override;
- virtual Stage generate(const graph::operation::AvgPool2DNode &node) override;
- virtual Stage generate(const graph::operation::ConcatNode &node) override;
- virtual Stage generate(const graph::operation::FullyConnectedNode &node) override;
- virtual Stage generate(const graph::operation::ReshapeNode &node) override;
- virtual Stage generate(const graph::operation::SoftmaxNode &node) override;
- virtual Stage generate(const graph::operation::NOPNode &node) override;
- virtual Stage generate(const graph::operation::PermuteNode &node) override;
- virtual Stage generate(const graph::operation::AddNode &node) override;
+ virtual void visit(const graph::operation::Conv2DNode &node) override;
+ virtual void visit(const graph::operation::MaxPool2DNode &node) override;
+ virtual void visit(const graph::operation::AvgPool2DNode &node) override;
+ virtual void visit(const graph::operation::ConcatNode &node) override;
+ virtual void visit(const graph::operation::FullyConnectedNode &node) override;
+ virtual void visit(const graph::operation::ReshapeNode &node) override;
+ virtual void visit(const graph::operation::SoftmaxNode &node) override;
+ virtual void visit(const graph::operation::NOPNode &node) override;
+ virtual void visit(const graph::operation::PermuteNode &node) override;
+ virtual void visit(const graph::operation::AddNode &node) override;
private:
const neurun::graph::operand::Set &_ctx;
#include <arm_compute/runtime/IFunction.h>
#include "backend/interface/ITensorBuilder.h"
-#include "graph/operation/Conv2D.h"
-#include "graph/operation/MaxPool2D.h"
-#include "graph/operation/AvgPool2D.h"
-#include "graph/operation/Concat.h"
-#include "graph/operation/FullyConnected.h"
-#include "graph/operation/Reshape.h"
-#include "graph/operation/Softmax.h"
-#include "graph/operation/NOP.h"
-#include "graph/operation/Permute.h"
-#include "graph/operation/Add.h"
+#include "graph/operation/NodeVisitor.h"
struct IExecutionBuilder
{
namespace backend
{
-struct IStageGenerator
+class IStageGenerator : graph::operation::NodeVisitor
{
+public:
virtual ~IStageGenerator() = default;
virtual std::shared_ptr<ITensorBuilder> tensor_builder() = 0;
- virtual Stage generate(const graph::operation::Conv2DNode &node) = 0;
- virtual Stage generate(const graph::operation::MaxPool2DNode &node) = 0;
- virtual Stage generate(const graph::operation::AvgPool2DNode &node) = 0;
- virtual Stage generate(const graph::operation::ConcatNode &node) = 0;
- virtual Stage generate(const graph::operation::FullyConnectedNode &node) = 0;
- virtual Stage generate(const graph::operation::ReshapeNode &node) = 0;
- virtual Stage generate(const graph::operation::SoftmaxNode &node) = 0;
- virtual Stage generate(const graph::operation::NOPNode &node) = 0;
- virtual Stage generate(const graph::operation::PermuteNode &node) = 0;
- virtual Stage generate(const graph::operation::AddNode &node) = 0;
+protected:
+ virtual void visit(const graph::operation::Conv2DNode &) override {}
+ virtual void visit(const graph::operation::MaxPool2DNode &) override {}
+ virtual void visit(const graph::operation::AvgPool2DNode &) override {}
+ virtual void visit(const graph::operation::ConcatNode &) override {}
+ virtual void visit(const graph::operation::FullyConnectedNode &) override {}
+ virtual void visit(const graph::operation::ReshapeNode &) override {}
+ virtual void visit(const graph::operation::SoftmaxNode &) override {}
+ virtual void visit(const graph::operation::NOPNode &) override {}
+ virtual void visit(const graph::operation::PermuteNode &) override {}
+ virtual void visit(const graph::operation::AddNode &) override {}
+
+protected:
+ void returnStage(const Stage &stage) { _return = stage; }
+
+public:
+ Stage generate(const graph::operation::Node &node)
+ {
+ node.accept(std::move(*this));
+ return _return;
+ }
+
+private:
+ Stage _return = nullptr;
};
} // namespace backend