20#include "kernel/PermuteLayer.h"
29 const std::shared_ptr<TensorRegistry> &tensor_reg,
30 const std::shared_ptr<ExternalContext> &external_context)
31 : basic::KernelGeneratorBase{graph}, _dyn_tensor_manager{dyn_tensor_manager},
32 _tensor_reg{tensor_reg}, _tensor_registries{}, _executors{nullptr}, _model_index{},
33 _external_context{external_context}
40 assert(_dyn_tensor_manager);
43 auto ret = std::make_unique<exec::FunctionSequence>();
46 auto dyn_ctx = std::make_shared<exec::FunctionSequence::DynamicTensorCtx>();
49 dyn_ctx->dynamic_shape_inferer = std::make_unique<exec::DynamicShapeInferer>(_tensor_reg);
51 ret->dynamic_tensor_ctx(dyn_ctx);
66 std::vector<backend::IPortableTensor *> input_tensors;
67 for (
const auto &input_index : node.getInputs())
69 auto input_tensor = getPortableTensor(input_index);
70 input_tensors.emplace_back(input_tensor);
73 std::vector<backend::IPortableTensor *> output_tensors;
74 for (
const auto &output_index : node.getOutputs())
76 auto output_tensor = getPortableTensor(output_index);
77 output_tensors.emplace_back(output_tensor);
82 const auto cond_tensor = input_tensors.front();
83 input_tensors.erase(input_tensors.begin());
84 auto fn = std::make_unique<::onert::backend::builtin::kernel::IfLayer>(
85 cond_tensor, input_tensors, output_tensors, then_subg_index, else_subg_index, _executors,
86 _model_index, _external_context);
91void KernelGenerator::visit(
const ir::operation::Permute &node)
93 const auto output_index{node.getOutputs().at(0)};
97 std::vector<ITensor *> output_tensors{getTensor(output_index)};
98 std::vector<ITensor *> input_tensors{getTensor(input_index)};
99 std::vector<ir::PermuteType> permute_types;
102 for (uint32_t i = 0; i < input_tensors.size(); i++)
105 auto fn = std::make_unique<kernel::PermuteLayer>(input_tensors, output_tensors, permute_types,
110void KernelGenerator::visit(
const ir::operation::While &node)
112 const auto cond_subg_index = node.param().cond_subg_index;
113 const auto body_subg_index = node.param().body_subg_index;
117 std::vector<backend::IPortableTensor *> input_tensors;
118 for (
const auto &input_index : node.getInputs())
120 auto input_tensor = getPortableTensor(input_index);
121 input_tensors.emplace_back(input_tensor);
124 std::vector<backend::IPortableTensor *> output_tensors;
125 for (
const auto &output_index : node.getOutputs())
128 output_tensors.emplace_back(output_tensor);
133 auto fn = std::make_unique<::onert::backend::builtin::kernel::WhileLayer>(
134 input_tensors, output_tensors, cond_subg_index, body_subg_index, _executors, _model_index,
143 auto ret = _tensor_registries.
getITensor(index);
144 assert(ret !=
nullptr);
148backend::IPortableTensor *KernelGenerator::getPortableTensor(
const ir::OperandIndex &index)
150 auto ret = _tensor_reg->getPortableTensor(index);
151 assert(ret !=
nullptr);
Class to manage dynamic tensor and its memory.
std::shared_ptr< DynamicMemoryManager > dynamic_mem_mgr()
std::unique_ptr< exec::IFunction > _return_fn
KernelGenerator(const ir::Graph &graph, DynamicTensorManager *dyn_tensor_manager, const std::shared_ptr< TensorRegistry > &tensor_reg, const std::shared_ptr< ExternalContext > &external_context)
std::unique_ptr< exec::FunctionSequence > generate(ir::OperationIndex ind) override
backend::ITensor * getITensor(ir::OperandIndex ind) const
const Operations & operations() const override
const Param & param() const
const Object & at(const Index &index) const
Get the object that is associated with the given index.
::onert::util::Index< uint32_t, OperandIndexTag > OperandIndex
SubgraphIndex then_subg_index
SubgraphIndex else_subg_index