19#include "ops/ConvolutionLayer.h"
20#include "ops/DepthwiseConvolutionLayer.h"
21#include "ops/FullyConnectedLayer.h"
40 const ir::Graph &graph,
const std::shared_ptr<TensorBuilder> &tensor_builder,
41 const std::shared_ptr<basic::TensorRegistry> &tensor_reg,
42 const std::shared_ptr<backend::custom::IKernelBuilder> &kernel_builder,
43 const std::shared_ptr<ExternalContext> &external_context)
44 : basic::KernelGeneratorBase{
graph}, _ctx(
graph.operands()), _operations_ctx{
graph.operations()},
45 _tensor_builder(tensor_builder), _tensor_reg{tensor_reg}, _kernel_builder(kernel_builder),
46 _external_context(external_context)
53 auto ret = std::make_unique<exec::FunctionSequence>();
55 assert(_tensor_builder->dynamicTensorManager());
59 auto dyn_ctx = std::make_shared<exec::FunctionSequence::DynamicTensorCtx>();
61 dyn_ctx->op = &_operations_ctx.at(ind);
62 dyn_ctx->dynamic_shape_inferer = std::make_shared<exec::DynamicShapeInferer>(_tensor_reg);
64 ret->dynamic_tensor_ctx(dyn_ctx);
66 auto &op = _graph.operations().at(ind);
69 ret->append(std::move(_return_fn));
71 for (
auto &&ind : (op.getInputs() | ir::Remove::UNDEFINED) + op.getOutputs())
73 auto tensor = _tensor_reg->getNativeTensor(ind);
76 tensor->increase_ref();
87 const auto ifm_index{node.
getInputs().
at(Conv2D::Input::INPUT)};
88 const auto ker_index{node.
getInputs().
at(Conv2D::Input::KERNEL)};
89 const auto bias_index{node.
getInputs().
at(Conv2D::Input::BIAS)};
91 auto ofm_tensor = _tensor_reg->getPortableTensor(ofm_index);
92 auto ifm_tensor = _tensor_reg->getPortableTensor(ifm_index);
93 auto ker_tensor = _tensor_reg->getPortableTensor(ker_index);
94 auto bias_tensor = _tensor_reg->getPortableTensor(bias_index);
100 auto fn = std::make_unique<ops::ConvolutionLayer>(_external_context);
102 const auto ifm_shape = _ctx.at(ifm_index).shape().asFeature();
103 const auto ofm_shape = _ctx.at(ofm_index).shape().asFeature();
105 const auto &ker_shape = _ctx.at(ker_index).shape();
106 const auto ker_height = ker_shape.dim(1);
107 const auto ker_width = ker_shape.dim(2);
110 ir::calculatePadding(param_padding, ifm_shape, ofm_shape, stride, ker_width, ker_height,
111 dilation.width_factor, dilation.height_factor);
113 fn->configure(ifm_tensor, ker_tensor, bias_tensor, param_padding.type, padding.left,
114 padding.right, padding.top, padding.bottom, stride.horizontal, stride.vertical,
115 dilation.width_factor, dilation.height_factor, activation, ofm_tensor);
117 _return_fn = std::move(fn);
120void KernelGenerator::visit(
const ir::operation::DepthwiseConv2D &node)
122 using ir::operation::DepthwiseConv2D;
124 const auto ofm_index{node.getOutputs().at(0)};
125 const auto ifm_index{node.getInputs().at(DepthwiseConv2D::Input::INPUT)};
126 const auto ker_index{node.getInputs().at(DepthwiseConv2D::Input::KERNEL)};
127 const auto bias_index{node.getInputs().at(DepthwiseConv2D::Input::BIAS)};
129 const auto stride = node.param().stride;
130 const auto ifm_shape = _ctx.at(ifm_index).shape().asFeature();
131 const auto ofm_shape = _ctx.at(ofm_index).shape().asFeature();
133 const auto &ker_shape = _ctx.at(ker_index).shape();
134 const auto ker_height = ker_shape.dim(1);
135 const auto ker_width = ker_shape.dim(2);
136 const auto dilation_width = node.param().dilation.width_factor;
137 const auto dilation_height = node.param().dilation.height_factor;
138 const auto ¶m_padding = node.param().padding;
139 const auto padding = ir::calculatePadding(param_padding, ifm_shape, ofm_shape, stride, ker_width,
140 ker_height, dilation_width, dilation_height);
141 const auto multiplier = node.param().multiplier;
142 const auto activation = node.param().activation;
144 auto ofm_tensor = _tensor_reg->getPortableTensor(ofm_index);
145 auto ifm_tensor = _tensor_reg->getPortableTensor(ifm_index);
146 auto ker_tensor = _tensor_reg->getPortableTensor(ker_index);
147 auto bias_tensor = _tensor_reg->getPortableTensor(bias_index);
149 auto fn = std::make_unique<ops::DepthwiseConvolutionLayer>(_external_context);
151 fn->configure(ifm_tensor, ker_tensor, bias_tensor, param_padding.type, padding.left,
152 padding.right, padding.top, padding.bottom, stride.horizontal, stride.vertical,
153 multiplier, dilation_width, dilation_height, activation, ofm_tensor);
155 _return_fn = std::move(fn);
158void KernelGenerator::visit(
const ir::operation::FullyConnected &node)
160 using ir::operation::FullyConnected;
162 const auto output_index{node.getOutputs().at(0)};
163 const auto input_index{node.getInputs().at(FullyConnected::Input::INPUT)};
164 const auto weight_index{node.getInputs().at(FullyConnected::Input::WEIGHT)};
165 const auto bias_index{node.getInputs().at(FullyConnected::Input::BIAS)};
166 const auto activation = node.param().activation;
168 auto output_tensor = _tensor_reg->getPortableTensor(output_index);
169 auto input_tensor = _tensor_reg->getPortableTensor(input_index);
170 auto weight_tensor = _tensor_reg->getPortableTensor(weight_index);
171 auto bias_tensor = bias_index.undefined() ? nullptr : _tensor_reg->getPortableTensor(bias_index);
173 auto fn = std::make_unique<ops::FullyConnectedLayer>(_external_context);
175 fn->configure(input_tensor, weight_tensor, bias_tensor, activation, output_tensor);
177 _return_fn = std::move(fn);
KernelGenerator(const ir::Graph &graph, const std::shared_ptr< TensorBuilder > &tensor_builder, const std::shared_ptr< basic::TensorRegistry > &tensor_reg, const std::shared_ptr< custom::IKernelBuilder > &kernel_builder, const std::shared_ptr< ExternalContext > &external_context)
const OperandIndex & at(IOIndex set_index) const
const OperandIndexSequence & getOutputs() const override
OperandIndexSequence & getInputs()
const Param & param() const
This file contains utility macro.