} // 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__
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;
_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)
{
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);
}
// 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();
}
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;
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; }
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;
};
// 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)
// 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)
// 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)
// 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)
// 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)
// 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)
// 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 */)
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;
}
}
}
-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
#include <vector>
#include "graph/operation/Node.h"
+#include "backend/ITensorBuilder.h"
namespace neurun
{
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: