ONE - On-device Neural Engine
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
onert_micro::execute Namespace Reference

Namespaces

namespace  pal
 
namespace  testing
 

Data Structures

class  KernelBuiltinExecuteRegistry
 
class  KernelCustomExecuteRegistry
 
struct  OMExecuteArgs
 
struct  OMKernelExecute
 
class  OMRuntimeKernel
 

Typedefs

using KernelExecuteFunc = OMStatus(const OMExecuteArgs &)
 

Functions

OMStatus execute_arg_common (const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::OMRuntimeShape &input1_shape, const float *input1_data, const int *input2_data, const core::OMRuntimeShape &output_shape, int *output_data)> &f_float)
 
template<typename T >
void readDataKernel (OMRuntimeKernel *runtime_kernel, const T *&cast_input_data1, const T *&cast_input_data2, bool *&cast_output_data, core::OMRuntimeShape &input1_shape_ref, core::OMRuntimeShape &input2_shape_ref, core::OMRuntimeShape &output_shape_ref)
 
template<typename T >
void evalComparisonGeneric (OMRuntimeKernel *runtime_kernel, bool F(T, T))
 
template<typename T , typename AccType >
void evalQuantizedComparisonGeneric (OMRuntimeKernel *runtime_kernel, bool F(AccType, AccType))
 
OMStatus createConvParams (core::ConvQuant &params, const circle::Tensor *input, const circle::Tensor *filter, const circle::Tensor *output, circle::ActivationFunctionType act_type)
 
OMStatus execute_math_common (const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::OMRuntimeShape &input_shape, const float *input_data, const core::OMRuntimeShape &output_shape, float *output_data)> &f_float)
 
OMStatus execute_pooling_common (const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const float *input_data, const core::OMRuntimeShape &output_shape, float *output_data)> &f_float, const std::function< OMStatus(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const int8_t *input_data, const core::OMRuntimeShape &output_shape, int8_t *output_data)> &f_int8)
 
OMStatus readKernelDataTISO (const OMExecuteArgs &execute_args, uint8_t *&input_data1, uint8_t *&input_data2, uint8_t *&output_data, core::OMRuntimeShape &input1_shape_ref, core::OMRuntimeShape &input2_shape_ref, core::OMRuntimeShape &output_shape_ref, circle::TensorType &tensor_type)
 
OMStatus execute_relu_common (const OMExecuteArgs &execute_args, bool is_relu_6)
 
OMStatus execute_reshape_common (const OMExecuteArgs &execute_args)
 
OMStatus execute_spaces_batches_nd_common (const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::OMRuntimeShape &unextended_input1_shape, const float *input1_data, const core::OMRuntimeShape &unextended_input2_shape, const int32_t *block_shape_data, const core::OMRuntimeShape &unextended_input3_shape, const int32_t *crops_data, const core::OMRuntimeShape &unextended_output_shape, float *output_data)> &f)
 
void readQuantParams (const circle::Tensor *tensor, long &zero_point, float &scale)
 
template<typename T >
OMStatus calculateActivationRange (circle::ActivationFunctionType activation, T *activation_min, T *activation_max)
 
double getQuantizedConvolutionMultipler (float input_scale, float filter_scale, float output_scale)
 
void quantizeMultiplier (double double_multiplier, int32_t *quantized_multiplier, int *shift)
 
void quantizeMultiplierSmallerThanOneExp (double double_multiplier, int32_t *quantized_multiplier, int *left_shift)
 
std::vector< double > getQuantizedConvolutionMultiplers (float input_scale, const flatbuffers::Vector< float > *filter_scale, float output_scale)
 
OMStatus calculateActivationRangeQuantized (circle::ActivationFunctionType activation, int32_t output_zero_point, float output_scale, circle::TensorType data_type, int32_t *activation_min, int32_t *activation_max)
 
int computeOutSize (circle::Padding padding, int image_size, int filter_size, int stride, int dilation_rate=1)
 
int computePadding (int32_t stride, int32_t dilation_rate, int32_t in_size, int32_t filter_size, int32_t out_size)
 
void computePaddingHeightWidth (int32_t stride_height, int32_t stride_width, int32_t dilation_rate_height, int32_t dilation_rate_width, int32_t in_height, int32_t in_width, int32_t filter_height, int32_t filter_width, circle::Padding padding, int32_t *padding_h, int32_t *padding_w)
 
void calculateQuantParams (core::ArithmeticQuantParams &params, const circle::Tensor *input1, const circle::Tensor *input2, const circle::Tensor *output, circle::ActivationFunctionType act)
 
OMStatus SISOHeader (const OMExecuteArgs &execute_args, const circle::Tensor **input, const circle::Tensor **output, uint8_t **input_data, uint8_t **output_data)
 
OMStatus TISOHeader (const OMExecuteArgs &execute_args, const circle::Tensor **input1, const circle::Tensor **input2, const circle::Tensor **output, OMRuntimeKernel *runtime_kernel)
 
int calculateInputRadius (int input_integer_bits, int input_left_shift, int total_signed_bits)
 
OMStatus execute_kernel_CircleAbs (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleAdd (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleAddN (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleArgMax (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleArgMin (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleAveragePool2D (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleBatchToSpaceND (const onert_micro::execute::OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleCast (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleCeil (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleConcatenation (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleConv2D (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleCos (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleDepthwiseConv2D (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleDequantize (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleDiv (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleElu (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleEqual (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleExp (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleExpandDims (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleFill (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleFloor (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleFloorDiv (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleFloorMod (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleFullyConnected (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleGather (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleGatherND (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleGreater (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleGreaterEqual (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleGRU (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleL2Normalize (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleL2Pool2D (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleLeakyRelu (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleLess (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleLessEqual (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleLog (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleLogistic (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleLogSoftmax (const OMExecuteArgs &execute_args)
 
OMStatus execute_math_common (const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::OMRuntimeShape &, const float *, const core::OMRuntimeShape &, float *)> &f_float)
 
OMStatus execute_kernel_CircleMaximum (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleMaxPool2D (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleMean (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleMinimum (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleMul (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleNeg (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleNotEqual (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CirclePack (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CirclePad (const OMExecuteArgs &execute_args)
 
OMStatus execute_pooling_common (const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::Pool2DParams &, const core::OMRuntimeShape &, const float *, const core::OMRuntimeShape &, float *)> &f_float, const std::function< OMStatus(const core::Pool2DParams &, const core::OMRuntimeShape &, const int8_t *, const core::OMRuntimeShape &, int8_t *)> &f_int8)
 
OMStatus execute_kernel_CircleQuantize (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleReduceProd (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleRelu (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleRelu6 (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleReshape (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleRound (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleRsqrt (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSelectV2 (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleShape (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSin (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSlice (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSoftmax (const OMExecuteArgs &execute_args)
 
OMStatus execute_spaces_batches_nd_common (const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::OMRuntimeShape &unextended_input1_shape, const float *input1_data, const core::OMRuntimeShape &unextended_input2_shape, const int32_t *block_shape_data, const core::OMRuntimeShape &unextended_input3_shape, const int32_t *crops_data, const core::OMRuntimeShape &unextended_output_shape, float *output_data)> &func)
 
OMStatus execute_kernel_CircleSpaceToBatchND (const onert_micro::execute::OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSpaceToDepth (const onert_micro::execute::OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSplit (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSplitV (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSqrt (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSquare (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSquaredDifference (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleStridedSlice (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSub (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSum (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleSVDF (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleTanh (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleTranspose (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleTransposeConv (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleUnpack (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleWhile (const OMExecuteArgs &execute_args)
 
OMStatus execute_kernel_CircleZerosLike (const OMExecuteArgs &execute_args)
 

Variables

constexpr KernelBuiltinExecuteRegistry kernel_builtin_execute
 
constexpr KernelCustomExecuteRegistry kernel_custom_execute
 

Typedef Documentation

◆ KernelExecuteFunc

Definition at line 31 of file OMKernelExecutionBuilder.h.

Function Documentation

◆ calculateActivationRange()

template<typename T >
OMStatus onert_micro::execute::calculateActivationRange ( circle::ActivationFunctionType  activation,
T *  activation_min,
T *  activation_max 
)

Definition at line 36 of file OMUtils.h.

38{
39 switch (activation)
40 {
41 case circle::ActivationFunctionType::ActivationFunctionType_NONE:
42 *activation_min = std::numeric_limits<T>::lowest();
43 *activation_max = std::numeric_limits<T>::max();
44 break;
45 case circle::ActivationFunctionType::ActivationFunctionType_RELU:
46 *activation_min = 0;
47 *activation_max = std::numeric_limits<T>::max();
48 break;
49 case circle::ActivationFunctionType::ActivationFunctionType_RELU_N1_TO_1:
50 *activation_min = -1;
51 *activation_max = 1;
52 break;
53 case circle::ActivationFunctionType::ActivationFunctionType_RELU6:
54 *activation_min = 0;
55 *activation_max = 6;
56 break;
57 default:
58 assert(false && "Unsupported activation.");
60 }
61
62 return Ok;
63}
@ UnsupportedActivation
Definition OMStatus.h:28

References onert_micro::Ok, and onert_micro::UnsupportedActivation.

Referenced by execute_kernel_CircleAdd(), execute_kernel_CircleConv2D(), execute_kernel_CircleDepthwiseConv2D(), execute_kernel_CircleDiv(), execute_kernel_CircleFullyConnected(), execute_kernel_CircleMul(), execute_kernel_CircleSquaredDifference(), execute_kernel_CircleSub(), execute_kernel_CircleTransposeConv(), and execute_pooling_common().

◆ calculateActivationRangeQuantized()

OMStatus onert_micro::execute::calculateActivationRangeQuantized ( circle::ActivationFunctionType  activation,
int32_t  output_zero_point,
float  output_scale,
circle::TensorType  data_type,
int32_t *  activation_min,
int32_t *  activation_max 
)

Definition at line 112 of file OMUtils.cpp.

115{
116 int32_t qmin;
117 int32_t qmax;
118 switch (data_type)
119 {
120 case circle::TensorType_UINT8:
121 qmin = 0;
122 qmax = std::numeric_limits<uint8_t>::max();
123 break;
124 case circle::TensorType_INT8:
125 qmin = std::numeric_limits<int8_t>::min();
126 qmax = std::numeric_limits<int8_t>::max();
127 break;
128 case circle::TensorType_INT16:
129 // For now, assume that signed int16 type implies signed symmetric quantization.
130 assert(output_zero_point == 0);
131 qmin = std::numeric_limits<int16_t>::min();
132 qmax = std::numeric_limits<int16_t>::max();
133 break;
134 default:
135 assert(false && "Unsupported type.");
136 return UnsupportedType;
137 }
138
139 return calculateActivationRangeQuantizedImpl(activation, qmin, qmax, output_zero_point,
140 output_scale, activation_min, activation_max);
141}
@ UnsupportedType
Definition OMStatus.h:26

References onert_micro::UnsupportedType.

Referenced by calculateQuantParams(), createConvParams(), and execute_pooling_common().

◆ calculateInputRadius()

int onert_micro::execute::calculateInputRadius ( int  input_integer_bits,
int  input_left_shift,
int  total_signed_bits 
)
inline

Definition at line 170 of file OMUtils.h.

171{
172 const double max_input_rescaled = 1.0 * ((1 << input_integer_bits) - 1) *
173 (1LL << (total_signed_bits - input_integer_bits)) /
174 (1LL << input_left_shift);
175 // Tighten bound using floor. Suppose that we could use the exact value.
176 // After scaling the difference, the result would be at the maximum. Thus we
177 // must ensure that our value has lower magnitude.
178 return static_cast<int>(std::floor(max_input_rescaled));
179}

Referenced by execute_kernel_CircleSoftmax().

◆ calculateQuantParams()

void onert_micro::execute::calculateQuantParams ( core::ArithmeticQuantParams params,
const circle::Tensor *  input1,
const circle::Tensor *  input2,
const circle::Tensor *  output,
circle::ActivationFunctionType  act 
)

Definition at line 194 of file OMUtils.cpp.

199{
200 long input1_zp;
201 long input2_zp;
202 long output_zp;
203
204 float input1_scale;
205 float input2_scale;
206 float output_scale;
207
208 // Read input1 quant params
209 readQuantParams(input1, input1_zp, input1_scale);
210 // Read input2 quant params
211 readQuantParams(input2, input2_zp, input2_scale);
212 // Read output quant params
213 readQuantParams(output, output_zp, output_scale);
214
215 params.input1_offset = -static_cast<int32_t>(input1_zp);
216 params.input2_offset = -static_cast<int32_t>(input2_zp);
217 params.output_offset = static_cast<int32_t>(output_zp);
218 params.left_shift = (output->type() == circle::TensorType_INT16) ? 15 : 20;
219 const double twice_max_input_scale =
220 2 * static_cast<double>(std::max(input1_scale, input2_scale));
221 const double real_input1_multiplier = static_cast<double>(input1_scale) / twice_max_input_scale;
222 const double real_input2_multiplier = static_cast<double>(input2_scale) / twice_max_input_scale;
223 const double real_output_multiplier =
224 twice_max_input_scale / ((1 << params.left_shift) * static_cast<double>(output_scale));
225
226 quantizeMultiplierSmallerThanOneExp(real_input1_multiplier, &params.input1_multiplier,
227 &params.input1_shift);
228
229 quantizeMultiplierSmallerThanOneExp(real_input2_multiplier, &params.input2_multiplier,
230 &params.input2_shift);
231
232 quantizeMultiplierSmallerThanOneExp(real_output_multiplier, &params.output_multiplier,
233 &params.output_shift);
234
235 calculateActivationRangeQuantized(act, output_zp, output_scale, output->type(),
238}
void readQuantParams(const circle::Tensor *tensor, long &zero_point, float &scale)
Definition OMUtils.cpp:143
OMStatus calculateActivationRangeQuantized(circle::ActivationFunctionType activation, int32_t output_zero_point, float output_scale, circle::TensorType data_type, int32_t *activation_min, int32_t *activation_max)
Definition OMUtils.cpp:112
void quantizeMultiplierSmallerThanOneExp(double double_multiplier, int32_t *quantized_multiplier, int *left_shift)
Definition OMUtils.cpp:60

References calculateActivationRangeQuantized(), onert_micro::core::ArithmeticQuantParams::input1_multiplier, onert_micro::core::ArithmeticQuantParams::input1_offset, onert_micro::core::ArithmeticQuantParams::input1_shift, onert_micro::core::ArithmeticQuantParams::input2_multiplier, onert_micro::core::ArithmeticQuantParams::input2_offset, onert_micro::core::ArithmeticQuantParams::input2_shift, onert_micro::core::ArithmeticQuantParams::left_shift, onert_micro::core::ArithmeticQuantParams::output_multiplier, onert_micro::core::ArithmeticQuantParams::output_offset, onert_micro::core::ArithmeticQuantParams::output_shift, onert_micro::core::ArithmeticQuantParams::quantized_activation_max, onert_micro::core::ArithmeticQuantParams::quantized_activation_min, quantizeMultiplierSmallerThanOneExp(), and readQuantParams().

Referenced by execute_kernel_CircleAdd(), and execute_kernel_CircleSub().

◆ computeOutSize()

int onert_micro::execute::computeOutSize ( circle::Padding  padding,
int  image_size,
int  filter_size,
int  stride,
int  dilation_rate = 1 
)
inline

Definition at line 114 of file OMUtils.h.

116{
117 int effective_filter_size = (filter_size - 1) * dilation_rate + 1;
118
119 if (stride == 0)
120 return 0;
121
122 switch (padding)
123 {
124 case circle::Padding_SAME:
125 return (image_size + stride - 1) / stride;
126 case circle::Padding_VALID:
127 return (image_size + stride - effective_filter_size) / stride;
128 default:
129 return 0;
130 }
131}

Referenced by computePaddingHeightWidth().

◆ computePadding()

int onert_micro::execute::computePadding ( int32_t  stride,
int32_t  dilation_rate,
int32_t  in_size,
int32_t  filter_size,
int32_t  out_size 
)
inline

Definition at line 133 of file OMUtils.h.

135{
136 int32_t effective_filter_size = (filter_size - 1) * dilation_rate + 1;
137 int32_t padding = ((out_size - 1) * stride + effective_filter_size - in_size) / 2;
138 return padding > 0 ? padding : 0;
139}

Referenced by computePaddingHeightWidth().

◆ computePaddingHeightWidth()

void onert_micro::execute::computePaddingHeightWidth ( int32_t  stride_height,
int32_t  stride_width,
int32_t  dilation_rate_height,
int32_t  dilation_rate_width,
int32_t  in_height,
int32_t  in_width,
int32_t  filter_height,
int32_t  filter_width,
circle::Padding  padding,
int32_t *  padding_h,
int32_t *  padding_w 
)
inline

Definition at line 141 of file OMUtils.h.

146{
147
148 int out_width =
149 computeOutSize(padding, in_width, filter_width, stride_width, dilation_rate_width);
150 int out_height =
151 computeOutSize(padding, in_height, filter_height, stride_height, dilation_rate_height);
152
153 *padding_h =
154 computePadding(stride_height, dilation_rate_height, in_height, filter_height, out_height);
155
156 *padding_w = computePadding(stride_width, dilation_rate_width, in_width, filter_width, out_width);
157}
uint32_t computeOutSize(uint32_t imageSize, uint32_t filterSize, uint32_t stride, uint32_t paddingHead, uint32_t paddingTail)
Definition Spatial.h:23

References computeOutSize(), and computePadding().

Referenced by execute_kernel_CircleConv2D(), execute_kernel_CircleDepthwiseConv2D(), execute_kernel_CircleTransposeConv(), and execute_pooling_common().

◆ createConvParams()

OMStatus onert_micro::execute::createConvParams ( core::ConvQuant params,
const circle::Tensor *  input,
const circle::Tensor *  filter,
const circle::Tensor *  output,
circle::ActivationFunctionType  act_type 
)

Definition at line 28 of file ConvolutionCommon.cpp.

31{
32 assert(input->quantization() != nullptr); // Fix caller
33 assert(filter->quantization() != nullptr); // Fix caller
34 assert(output->quantization() != nullptr); // Fix caller
35
36 const auto *input_scales = input->quantization()->scale();
37 const auto *filter_scales = filter->quantization()->scale();
38 const auto *output_scales = output->quantization()->scale();
39
40 assert(input_scales != nullptr); // Fix caller
41 assert(filter_scales != nullptr); // Fix caller
42 assert(output_scales != nullptr); // Fix caller
43
44 assert(input_scales->size() != 0); // Fix caller
45 assert(filter_scales->size() != 0); // Fix caller
46 assert(output_scales->size() != 0); // Fix caller
47
48 const auto input_zero_points = input->quantization()->zero_point();
49 const auto filter_zero_points = filter->quantization()->zero_point();
50 const auto output_zero_points = output->quantization()->zero_point();
51
52 assert(input_zero_points != nullptr); // Fix caller
53 assert(filter_zero_points != nullptr); // Fix caller
54 assert(output_zero_points != nullptr); // Fix caller
55
56 assert(input_zero_points->size() != 0); // Fix caller
57 assert(filter_zero_points->size() != 0); // Fix caller
58 assert(output_zero_points->size() != 0); // Fix caller
59
60 const auto input_zp = input_zero_points->operator[](0);
61 const auto filter_zp = filter_zero_points->operator[](0);
62 const auto output_zp = output_zero_points->operator[](0);
63
64 const auto output_scale = output_scales->operator[](0);
65
66 int32_t activation_min{};
67 int32_t activation_max{};
69 act_type, static_cast<int32_t>(output_zp), output_scale, output->type(), &activation_min,
70 &activation_max);
71 assert(status == Ok);
72 if (status != Ok)
73 return status;
74
75 // The kernel expects input and filter zero points to be negated.
76 params.input_offset = -static_cast<int32_t>(input_zp); // Note the '-'.
77 params.weights_offset = -static_cast<int32_t>(filter_zp); // Note the '-'.
78 params.output_offset = static_cast<int32_t>(output_zp);
79 params.quantized_activation_min = activation_min;
80 params.quantized_activation_max = activation_max;
81
82 assert(filter_scales->size() > 1); // Support only channel-wise quantization
83 // Channel-wise quantization
84 const auto input_scale = input_scales->operator[](0);
85 const std::vector<double> effective_output_scale =
86 execute::getQuantizedConvolutionMultiplers(input_scale, filter_scales, output_scale);
87
88 size_t n = effective_output_scale.size();
89 params.per_channel_output_shift.resize(n);
90 params.per_channel_output_multiplier.resize(n);
91 for (size_t i = 0; i < n; ++i)
92 {
93 execute::quantizeMultiplier(effective_output_scale[i], &params.per_channel_output_multiplier[i],
94 &params.per_channel_output_shift[i]);
95 }
96
97 return Ok;
98}
void quantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, int *shift)
Definition OMUtils.cpp:23
std::vector< double > getQuantizedConvolutionMultiplers(float input_scale, const flatbuffers::Vector< float > *filter_scale, float output_scale)
Definition OMUtils.h:95
std::vector< int > per_channel_output_shift
std::vector< int32_t > per_channel_output_multiplier

References calculateActivationRangeQuantized(), getQuantizedConvolutionMultiplers(), onert_micro::core::ConvQuant::input_offset, onert_micro::Ok, onert_micro::core::ConvQuant::output_offset, onert_micro::core::ConvQuant::per_channel_output_multiplier, onert_micro::core::ConvQuant::per_channel_output_shift, onert_micro::core::ConvQuant::quantized_activation_max, onert_micro::core::ConvQuant::quantized_activation_min, quantizeMultiplier(), and onert_micro::core::ConvQuant::weights_offset.

Referenced by execute_kernel_CircleConv2D(), and execute_kernel_CircleDepthwiseConv2D().

◆ evalComparisonGeneric()

template<typename T >
void onert_micro::execute::evalComparisonGeneric ( OMRuntimeKernel runtime_kernel,
bool   FT, T 
)

Definition at line 82 of file ComparisonCommon.h.

83{
84
85 const T *cast_input_data1 = nullptr;
86 const T *cast_input_data2 = nullptr;
87 bool *cast_output_data = nullptr;
88
89 core::OMRuntimeShape input1_shape;
90 core::OMRuntimeShape input2_shape;
92
93 readDataKernel(runtime_kernel, cast_input_data1, cast_input_data2, cast_output_data, input1_shape,
94 input2_shape, output_shape);
95
97 op_params.is_broadcast = input1_shape.flatSize() != input2_shape.flatSize();
98
99 if (op_params.is_broadcast)
100 {
101 onert_micro::execute::pal::BroadcastComparison4DSlowNoScaling<T>(
102 op_params, input1_shape, cast_input_data1, input2_shape, cast_input_data2, output_shape,
103 cast_output_data, F);
104 }
105 else
106 {
107 const int64_t flat_size = input1_shape.flatSize();
108 onert_micro::execute::pal::ComparisonNoScaling<T>(flat_size, cast_input_data1, cast_input_data2,
109 cast_output_data, F);
110 }
111}
const luci_interpreter::RuntimeShape output_shape
void readDataKernel(OMRuntimeKernel *runtime_kernel, const T *&cast_input_data1, const T *&cast_input_data2, bool *&cast_output_data, core::OMRuntimeShape &input1_shape_ref, core::OMRuntimeShape &input2_shape_ref, core::OMRuntimeShape &output_shape_ref)

References onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::core::ComparisonParams::is_broadcast, output_shape, and readDataKernel().

◆ evalQuantizedComparisonGeneric()

template<typename T , typename AccType >
void onert_micro::execute::evalQuantizedComparisonGeneric ( OMRuntimeKernel runtime_kernel,
bool   FAccType, AccType 
)

Definition at line 114 of file ComparisonCommon.h.

115{
116 const circle::Tensor *input1 = nullptr;
117 const circle::Tensor *input2 = nullptr;
118 const circle::Tensor *output = nullptr;
119
120 input1 = runtime_kernel->inputs[input1TensorIdx];
121 input2 = runtime_kernel->inputs[input2TensorIdx];
122 output = runtime_kernel->outputs[outputTensorIdx];
123
124 assert(input1 != nullptr);
125 assert(input2 != nullptr);
126 assert(output != nullptr);
127
128 const T *cast_input_data1 = nullptr;
129 const T *cast_input_data2 = nullptr;
130 bool *cast_output_data = nullptr;
131
132 core::OMRuntimeShape input1_shape;
133 core::OMRuntimeShape input2_shape;
135
136 readDataKernel(runtime_kernel, cast_input_data1, cast_input_data2, cast_output_data, input1_shape,
137 input2_shape, output_shape);
138
139 assert(input1->quantization() != nullptr);
140 assert(input1->quantization()->scale() != nullptr);
141 assert(input1->quantization()->scale()->size() == 1);
142 assert(input1->quantization()->zero_point() != nullptr);
143 assert(input1->quantization()->zero_point()->size() == 1);
144
145 auto input1_scale = *input1->quantization()->scale()->begin();
146 auto input2_scale = *input2->quantization()->scale()->begin();
147
148 auto input1_zero_point = *input1->quantization()->zero_point()->begin();
149 auto input2_zero_point = *input2->quantization()->zero_point()->begin();
150
151 int32_t x_multiplier;
152 int x_shift;
153
154 int32_t y_multiplier;
155 int y_shift;
156
157 onert_micro::execute::quantizeMultiplierSmallerThanOneExp(input1_scale, &x_multiplier, &x_shift);
158 onert_micro::execute::quantizeMultiplierSmallerThanOneExp(input2_scale, &y_multiplier, &y_shift);
159
161 op_params.left_shift = 8;
162 op_params.input1_offset = -input1_zero_point; // Note the '-'
163 op_params.input1_shift = x_shift;
164 op_params.input1_multiplier = x_multiplier;
165 op_params.input2_offset = -input2_zero_point; // Note the '-'
166 op_params.input2_shift = y_shift;
167 op_params.input2_multiplier = y_multiplier;
168 op_params.is_broadcast = input1_shape.flatSize() != input2_shape.flatSize();
169 ;
170
171 if (op_params.is_broadcast)
172 {
173 onert_micro::execute::pal::BroadcastComparison4DSlowWithScaling<T>(
174 op_params, input1_shape, cast_input_data1, input2_shape, cast_input_data2, output_shape,
175 cast_output_data, F);
176 }
177 else
178 {
179 const int64_t flat_size = input1_shape.flatSize();
180 onert_micro::execute::pal::ComparisonWithScaling<T>(op_params, flat_size, cast_input_data1,
181 cast_input_data2, cast_output_data, F);
182 }
183}
const circle::Tensor * outputs[maxOutputSize]
const circle::Tensor * inputs[maxInputSize]

References onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::core::ComparisonParams::input1_multiplier, onert_micro::core::ComparisonParams::input1_offset, onert_micro::core::ComparisonParams::input1_shift, onert_micro::core::ComparisonParams::input2_multiplier, onert_micro::core::ComparisonParams::input2_offset, onert_micro::core::ComparisonParams::input2_shift, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::core::ComparisonParams::is_broadcast, onert_micro::core::ComparisonParams::left_shift, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, quantizeMultiplierSmallerThanOneExp(), and readDataKernel().

◆ execute_arg_common()

OMStatus onert_micro::execute::execute_arg_common ( const OMExecuteArgs execute_args,
const std::function< OMStatus(const core::OMRuntimeShape &input1_shape, const float *input1_data, const int *input2_data, const core::OMRuntimeShape &output_shape, int *output_data)> &  f_float 
)

Definition at line 37 of file ArgCommon.cpp.

42{
43 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
44 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
45 uint16_t op_index = execute_args.kernel_index;
46 const circle::Tensor *output;
47 const circle::Tensor *input1;
48 const circle::Tensor *input2;
49
50 uint8_t *output_data;
51 uint8_t *input_data;
52 uint8_t *axis_data;
53
54 // Read kernel
55 execute::OMRuntimeKernel runtime_kernel;
56 runtime_kernel.readKernel(op_index, runtime_context);
57
58 output = runtime_kernel.outputs[outputTensorIdx];
59 assert(output != nullptr);
60
61 input1 = runtime_kernel.inputs[input1TensorIdx];
62 assert(input1 != nullptr);
63
64 input2 = runtime_kernel.inputs[input2TensorIdx];
65 assert(input2 != nullptr);
66
67 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
68
69 output_data = runtime_kernel.outputs_data[outputTensorIdx];
70 assert(output_data != nullptr);
71
72 input_data = runtime_kernel.inputs_data[input1TensorIdx];
73 assert(input_data != nullptr);
74
75 axis_data = runtime_kernel.inputs_data[input2TensorIdx];
76 assert(axis_data != nullptr);
77
78 OMStatus status;
79 const core::OMRuntimeShape input1_shape(input1);
81 switch (input1->type())
82 {
83#ifndef DIS_FLOAT
84 case circle::TensorType_FLOAT32:
85 {
86 status = f_float(input1_shape, reinterpret_cast<const float *>(input_data),
87 reinterpret_cast<const int *>(axis_data), output_shape,
88 reinterpret_cast<int *>(output_data));
89 }
90 break;
91#endif // DIS_FLOAT
92 default:
93 {
94 status = UnsupportedType;
95 assert(false && "Unsupported type.");
96 }
97 }
98 return status;
99}
uint8_t * outputs_data[maxOutputSize]
OMStatus getDataFromStorage(uint16_t op_index, core::OMRuntimeStorage &storage, core::OMRuntimeContext &context)
OMStatus readKernel(uint16_t op_index, core::OMRuntimeContext &runtime_context)
core::OMRuntimeContext & runtime_context
core::OMRuntimeStorage & runtime_storage

References onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

Referenced by execute_kernel_CircleArgMax(), and execute_kernel_CircleArgMin().

◆ execute_kernel_CircleAbs()

OMStatus onert_micro::execute::execute_kernel_CircleAbs ( const OMExecuteArgs execute_args)

Definition at line 29 of file Abs.cpp.

30{
31 auto abs_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 assert(input_shape == output_shape);
34 return pal::Abs(input_shape, input_data, output_data);
35 };
36
37 return execute_math_common(execute_args, abs_float_lambda);
38}
OMStatus Abs(const core::OMRuntimeShape &shape, const T *input_data, T *output_data)
Definition PALAbs.h:33
OMStatus execute_math_common(const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::OMRuntimeShape &input_shape, const float *input_data, const core::OMRuntimeShape &output_shape, float *output_data)> &f_float)

References onert_micro::execute::pal::Abs(), execute_math_common(), and output_shape.

◆ execute_kernel_CircleAdd()

OMStatus onert_micro::execute::execute_kernel_CircleAdd ( const OMExecuteArgs execute_args)

Definition at line 45 of file Add.cpp.

46{
47 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
48 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
49 uint16_t op_index = execute_args.kernel_index;
50
51 const circle::Tensor *input1;
52 const circle::Tensor *input2;
53 const circle::Tensor *output;
54
55 uint8_t *input1_data;
56 uint8_t *input2_data;
57 uint8_t *output_data;
58
59 uint16_t input1_index = 0;
60 uint16_t input2_index = 0;
61
62 const circle::AddOptions *options;
63 // Read kernel
64 {
65 execute::OMRuntimeKernel runtime_kernel;
66 runtime_kernel.readKernel(op_index, runtime_context);
67
68 input1 = runtime_kernel.inputs[input1TensorIdx];
69 input2 = runtime_kernel.inputs[input2TensorIdx];
70 output = runtime_kernel.outputs[outputTensorIdx];
71 assert(input1 != nullptr);
72 assert(input2 != nullptr);
73 assert(output != nullptr);
74
75 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
76
77 input1_data = runtime_kernel.inputs_data[input1TensorIdx];
78 input2_data = runtime_kernel.inputs_data[input2TensorIdx];
79 output_data = runtime_kernel.outputs_data[outputTensorIdx];
80 assert(input1_data != nullptr);
81 assert(input2_data != nullptr);
82 assert(output_data != nullptr);
83
84 options = runtime_kernel.first_operator->builtin_options_as_AddOptions();
85
86 input1_index = runtime_kernel.inputs_index[input1TensorIdx];
87 input2_index = runtime_kernel.inputs_index[input2TensorIdx];
88 }
89
90 OMStatus status;
91
92 core::OMRuntimeShape input1_shape(input1);
93 core::OMRuntimeShape input2_shape(input2);
95
96#ifndef DIS_DYN_SHAPES
97 // Check dynamic shapes
98 {
99 auto input_1_dynamic_shape = runtime_storage.getDynamicRuntimeShape(input1_index);
100 if (input_1_dynamic_shape.flatSize() != 0)
101 input1_shape = input_1_dynamic_shape;
102
103 auto input_2_dynamic_shape = runtime_storage.getDynamicRuntimeShape(input2_index);
104 if (input_2_dynamic_shape.flatSize() != 0)
105 input2_shape = input_2_dynamic_shape;
106 }
107#endif // DIS_DYN_SHAPES
108
109 // Check broadcast property
111 const bool need_broadcast = pal::processBroadcastShapes(input1_shape, input2_shape, &params);
112 switch (input1->type())
113 {
114#ifndef DIS_FLOAT
115 case circle::TensorType_FLOAT32:
116 {
117 execute::calculateActivationRange(options->fused_activation_function(),
118 &params.float_activation_min, &params.float_activation_max);
119 if (need_broadcast)
120 {
122 params, input1_shape, core::utils::castInputData<float>(input1_data), input2_shape,
123 core::utils::castInputData<float>(input2_data), output_shape,
124 core::utils::castOutputData<float>(output_data));
125 }
126 else
127 {
128 status =
129 pal::Add(params, output_shape.flatSize(), core::utils::castInputData<float>(input1_data),
130 core::utils::castInputData<float>(input2_data),
131 core::utils::castOutputData<float>(output_data));
132 }
133 }
134 break;
135#endif // DIS_FLOAT
136 case circle::TensorType_INT64:
137 {
138 execute::calculateActivationRange(options->fused_activation_function(),
139 &params.int64_activation_min, &params.int64_activation_max);
140
141 if (need_broadcast)
142 {
144 params, input1_shape, core::utils::castInputData<int64_t>(input1_data), input2_shape,
145 core::utils::castInputData<int64_t>(input2_data), output_shape,
146 core::utils::castOutputData<int64_t>(output_data));
147 }
148 else
149 {
150 status = pal::Add(params, input1_shape.flatSize(),
151 core::utils::castInputData<int64_t>(input1_data),
152 core::utils::castInputData<int64_t>(input2_data),
153 core::utils::castOutputData<int64_t>(output_data));
154 }
155 }
156 break;
157 case circle::TensorType_INT32:
158 {
159 execute::calculateActivationRange(options->fused_activation_function(),
160 &params.int32_activation_min, &params.int32_activation_max);
161
162 if (need_broadcast)
163 {
165 params, input1_shape, core::utils::castInputData<int32_t>(input1_data), input2_shape,
166 core::utils::castInputData<int32_t>(input2_data), output_shape,
167 core::utils::castOutputData<int32_t>(output_data));
168 }
169 else
170 {
171 status = pal::Add(params, input1_shape.flatSize(),
172 core::utils::castInputData<int32_t>(input1_data),
173 core::utils::castInputData<int32_t>(input2_data),
174 core::utils::castOutputData<int32_t>(output_data));
175 }
176 }
177 break;
178#ifndef DIS_QUANT
179 case circle::TensorType_INT8:
180 {
181 core::ArithmeticQuantParams add_params{};
182
183 calculateQuantParams(add_params, input1, input2, output,
184 options->fused_activation_function());
185
186 if (need_broadcast)
187 {
189 add_params, input1_shape, core::utils::castInputData<int8_t>(input1_data), input2_shape,
190 core::utils::castInputData<int8_t>(input2_data), output_shape,
191 core::utils::castOutputData<int8_t>(output_data));
192 }
193 else
194 {
195 status = pal::Add(add_params, input1_shape.flatSize(),
196 core::utils::castInputData<int8_t>(input1_data),
197 core::utils::castInputData<int8_t>(input2_data),
198 core::utils::castOutputData<int8_t>(output_data));
199 }
200 }
201 break;
202#endif // DIF_QUANT
203 default:
204 {
205 status = UnsupportedType;
206 assert(false && "Unsupported type.");
207 }
208 }
209
210 return status;
211}
OMRuntimeShape getDynamicRuntimeShape(uint16_t tensor_index)
const circle::Operator * first_operator
OMStatus BroadcastAdd4DSlow(const core::BinaryArithmeticBroadcastParams &params, const core::OMRuntimeShape &input1_shape, const T *input1_data, const core::OMRuntimeShape &input2_shape, const T *input2_data, const core::OMRuntimeShape &output_shape, T *output_data)
bool processBroadcastShapes(const core::OMRuntimeShape &shape0, const core::OMRuntimeShape &shape1, core::BinaryArithmeticBroadcastParams *params)
OMStatus Add(const core::ArithmeticQuantParams &params, const uint32_t flat_size, const int8_t *input1_data, const int8_t *input2_data, int8_t *output_data)
Definition PALAdd.h:33
void calculateQuantParams(core::ArithmeticQuantParams &params, const circle::Tensor *input1, const circle::Tensor *input2, const circle::Tensor *output, circle::ActivationFunctionType act)
Definition OMUtils.cpp:194
OMStatus calculateActivationRange(circle::ActivationFunctionType activation, T *activation_min, T *activation_max)
Definition OMUtils.h:36

References onert_micro::execute::pal::Add(), onert_micro::execute::pal::BroadcastAdd4DSlow(), calculateActivationRange(), calculateQuantParams(), onert_micro::execute::OMRuntimeKernel::first_operator, luci_interpreter::RuntimeShape::flatSize(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::core::OMRuntimeStorage::getDynamicRuntimeShape(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMRuntimeKernel::inputs_index, onert_micro::execute::OMExecuteArgs::kernel_index, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::pal::processBroadcastShapes(), onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleAddN()

OMStatus onert_micro::execute::execute_kernel_CircleAddN ( const OMExecuteArgs execute_args)

Definition at line 37 of file AddN.cpp.

38{
39 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
40 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
41 uint16_t op_index = execute_args.kernel_index;
42 const circle::Tensor *output;
43
44 uint8_t *output_data;
45
46 // Read kernel
47 execute::OMRuntimeKernel runtime_kernel;
48 runtime_kernel.readKernel(op_index, runtime_context);
49
50 output = runtime_kernel.outputs[outputTensorIdx];
51 assert(output != nullptr);
52
53 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
54 output_data = runtime_kernel.outputs_data[outputTensorIdx];
55 assert(output_data != nullptr);
56
57 OMStatus status;
58
60 switch (output->type())
61 {
62#ifndef DIS_FLOAT
63 case circle::TensorType_FLOAT32:
64 {
65 status = onert_micro::execute::pal::AddN<float>(
66 output_shape.flatSize(), runtime_kernel.inputs_num,
67 reinterpret_cast<const float *const *>(runtime_kernel.inputs_data),
68 reinterpret_cast<float *>(output_data));
69 }
70 break;
71#endif // DIS_FLOAT
72 default:
73 {
74 status = UnsupportedType;
75 assert(false && "Unsupported type.");
76 }
77 }
78 return status;
79}

References luci_interpreter::RuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMRuntimeKernel::inputs_num, onert_micro::execute::OMExecuteArgs::kernel_index, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleArgMax()

OMStatus onert_micro::execute::execute_kernel_CircleArgMax ( const OMExecuteArgs execute_args)

Definition at line 28 of file ArgMax.cpp.

29{
30 auto arg_max_float_lambda = [](const core::OMRuntimeShape &input1_shape, const float *input1_data,
31 const int *input2_data, const core::OMRuntimeShape &output_shape,
32 int *output_data) {
33 return onert_micro::execute::pal::ArgMax(input1_shape, input1_data, input2_data, output_shape,
34 output_data);
35 };
36
37 return execute_arg_common(execute_args, arg_max_float_lambda);
38}
OMStatus ArgMax(const core::OMRuntimeShape &input1_shape, const T1 *input1_data, const T3 *input2_data, const core::OMRuntimeShape &output_shape, T2 *output_data)
Definition PALArgMax.h:30
OMStatus execute_arg_common(const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::OMRuntimeShape &input1_shape, const float *input1_data, const int *input2_data, const core::OMRuntimeShape &output_shape, int *output_data)> &f_float)
Definition ArgCommon.cpp:37

References onert_micro::execute::pal::ArgMax(), execute_arg_common(), and output_shape.

◆ execute_kernel_CircleArgMin()

OMStatus onert_micro::execute::execute_kernel_CircleArgMin ( const OMExecuteArgs execute_args)

Definition at line 28 of file ArgMin.cpp.

29{
30 auto arg_max_float_lambda = [](const core::OMRuntimeShape &input1_shape, const float *input1_data,
31 const int *input2_data, const core::OMRuntimeShape &output_shape,
32 int *output_data) {
33 return onert_micro::execute::pal::ArgMin(input1_shape, input1_data, input2_data, output_shape,
34 output_data);
35 };
36
37 return execute_arg_common(execute_args, arg_max_float_lambda);
38}
OMStatus ArgMin(const core::OMRuntimeShape &input1_shape, const T1 *input1_data, const T3 *input2_data, const core::OMRuntimeShape &output_shape, T2 *output_data)
Definition PALArgMin.h:30

References onert_micro::execute::pal::ArgMin(), execute_arg_common(), and output_shape.

◆ execute_kernel_CircleAveragePool2D()

OMStatus onert_micro::execute::execute_kernel_CircleAveragePool2D ( const OMExecuteArgs execute_args)

Definition at line 29 of file AveragePool2D.cpp.

30{
31 auto avg_pool_float_lambda = [](const core::Pool2DParams &params,
32 const core::OMRuntimeShape &input_shape, const float *input_data,
33 const core::OMRuntimeShape &output_shape, float *output_data) {
34 return pal::AveragePool(params, input_shape, input_data, output_shape, output_data);
35 };
36
37#ifndef DIS_QUANT
38 auto avg_pool_int8_lambda = [](const core::Pool2DParams &params,
39 const core::OMRuntimeShape &input_shape, const int8_t *input_data,
40 const core::OMRuntimeShape &output_shape, int8_t *output_data) {
41 return pal::AveragePool(params, input_shape, input_data, output_shape, output_data);
42 };
43#else
44 auto avg_pool_int8_lambda = [](const core::Pool2DParams &params,
45 const core::OMRuntimeShape &input_shape, const int8_t *input_data,
47 int8_t *output_data) { return UnsupportedType; };
48#endif // DIS_QUANT
49
50 return execute_pooling_common(execute_args, avg_pool_float_lambda, avg_pool_int8_lambda);
51}
OMStatus AveragePool(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const int8_t *input_data, const core::OMRuntimeShape &output_shape, int8_t *output_data)
OMStatus execute_pooling_common(const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const float *input_data, const core::OMRuntimeShape &output_shape, float *output_data)> &f_float, const std::function< OMStatus(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const int8_t *input_data, const core::OMRuntimeShape &output_shape, int8_t *output_data)> &f_int8)

References onert_micro::execute::pal::AveragePool(), execute_pooling_common(), output_shape, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleBatchToSpaceND()

OMStatus onert_micro::execute::execute_kernel_CircleBatchToSpaceND ( const onert_micro::execute::OMExecuteArgs execute_args)

Definition at line 29 of file BatchToSpaceND.cpp.

30{
31 auto batch_to_space_float_lambda =
32 [](const core::OMRuntimeShape &input1_shape, const float *input1_data,
33 const core::OMRuntimeShape &input2_shape, const int32_t *block_shape_data,
34 const core::OMRuntimeShape &input3_shape, const int32_t *crops_data,
35 const core::OMRuntimeShape &output_shape, float *output_data) {
36 return pal::BatchToSpaceND<float>(input1_shape, input1_data, input2_shape, block_shape_data,
37 input3_shape, crops_data, output_shape, output_data);
38 };
39
40 return execute_spaces_batches_nd_common(execute_args, batch_to_space_float_lambda);
41}
OMStatus execute_spaces_batches_nd_common(const OMExecuteArgs &execute_args, const std::function< OMStatus(const core::OMRuntimeShape &unextended_input1_shape, const float *input1_data, const core::OMRuntimeShape &unextended_input2_shape, const int32_t *block_shape_data, const core::OMRuntimeShape &unextended_input3_shape, const int32_t *crops_data, const core::OMRuntimeShape &unextended_output_shape, float *output_data)> &f)

References execute_spaces_batches_nd_common(), and output_shape.

◆ execute_kernel_CircleCast()

OMStatus onert_micro::execute::execute_kernel_CircleCast ( const OMExecuteArgs execute_args)

Definition at line 46 of file Cast.cpp.

47{
48 const circle::Tensor *input = nullptr;
49 const circle::Tensor *output = nullptr;
50
51 uint8_t *input_data = nullptr;
52 uint8_t *output_data = nullptr;
53
54 SISOHeader(execute_args, &input, &output, &input_data, &output_data);
55
56 OMStatus status;
57
58 switch (input->type())
59 {
60#ifndef DIS_FLOAT
61 case circle::TensorType_FLOAT32:
62 {
63 switch (output->type())
64 {
65 case circle::TensorType_INT32:
66 {
67 status = pal::Cast(
68 core::OMRuntimeShape(input), core::utils::castInputData<float>(input_data),
69 core::OMRuntimeShape(output), core::utils::castOutputData<int32_t>(output_data));
70 break;
71 }
72 case circle::TensorType_INT8:
73 {
74 status = pal::Cast(
75 core::OMRuntimeShape(input), core::utils::castInputData<float>(input_data),
76 core::OMRuntimeShape(output), core::utils::castOutputData<int8_t>(output_data));
77 break;
78 }
79 case circle::TensorType_INT16:
80 {
81 status = pal::Cast(
82 core::OMRuntimeShape(input), core::utils::castInputData<float>(input_data),
83 core::OMRuntimeShape(output), core::utils::castOutputData<int16_t>(output_data));
84 break;
85 }
86 default:
87 {
88 status = UnsupportedType;
89 assert(false && "Unsupported type.");
90 break;
91 }
92 }
93 }
94 break;
95#endif // DIS_FLOAT
96 default:
97 {
98 status = UnsupportedType;
99 assert(false && "Unsupported type.");
100 break;
101 }
102 }
103
104 return status;
105}
OMStatus Cast(const core::OMRuntimeShape &input_shape, const FromT *input_data, const core::OMRuntimeShape &output_shape, ToT *output_data)
Definition PALCast.h:34
OMStatus SISOHeader(const OMExecuteArgs &execute_args, const circle::Tensor **input, const circle::Tensor **output, uint8_t **input_data, uint8_t **output_data)
Definition OMUtils.cpp:159

References onert_micro::execute::pal::Cast(), SISOHeader(), and onert_micro::UnsupportedType.

◆ execute_kernel_CircleCeil()

OMStatus onert_micro::execute::execute_kernel_CircleCeil ( const OMExecuteArgs execute_args)

Definition at line 29 of file Ceil.cpp.

30{
31 auto ceil_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Ceil(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, ceil_float_lambda);
37}
OMStatus Ceil(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)
Definition PALCeil.h:34

References onert_micro::execute::pal::Ceil(), execute_math_common(), and output_shape.

◆ execute_kernel_CircleConcatenation()

OMStatus onert_micro::execute::execute_kernel_CircleConcatenation ( const OMExecuteArgs execute_args)

Definition at line 81 of file Concatenation.cpp.

82{
83 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
84 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
85 uint16_t op_index = execute_args.kernel_index;
86
87 execute::OMRuntimeKernel runtime_kernel;
88 runtime_kernel.readKernel(op_index, runtime_context);
89
90 const auto *t0 = runtime_kernel.inputs[0];
91 OMStatus status = Ok;
92
93 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
94
95 if (status != Ok)
96 return status;
97
98 switch (t0->type())
99 {
100#ifndef DIS_FLOAT
101 case circle::TensorType_FLOAT32:
102 status = evalGeneric<float>(runtime_kernel);
103 break;
104#endif // DIS_FLOAT
105#ifndef DIS_QUANT
106 case circle::TensorType_INT8:
107 status = evalGeneric<int8_t>(runtime_kernel);
108 break;
109#endif // DIS_QUANT
110 case circle::TensorType_INT32:
111 status = evalGeneric<int32_t>(runtime_kernel);
112 break;
113 case circle::TensorType_INT64:
114 status = evalGeneric<int64_t>(runtime_kernel);
115 break;
116 default:
117 assert(false && "Unsupported type.");
118 status = UnsupportedType;
119 }
120
121 return status;
122}

References onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleConv2D()

OMStatus onert_micro::execute::execute_kernel_CircleConv2D ( const OMExecuteArgs execute_args)

Definition at line 50 of file Conv2D.cpp.

51{
52 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
53 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
54 uint16_t op_index = execute_args.kernel_index;
55
56 const circle::Tensor *input;
57 const circle::Tensor *weight;
58 const circle::Tensor *output;
59
60 uint8_t *input_data;
61 uint8_t *weight_data;
62 uint8_t *bias_data;
63 uint8_t *output_data;
64
65 const circle::Conv2DOptions *options;
66 // Read kernel
67 {
68 execute::OMRuntimeKernel runtime_kernel;
69 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
70 if (status != Ok)
71 return status;
72
73 input = runtime_kernel.inputs[inputTensorIdx];
74 weight = runtime_kernel.inputs[weightTensorIdx];
75 output = runtime_kernel.outputs[outputTensorIdx];
76 assert(input != nullptr);
77 assert(weight != nullptr);
78 // Bias can be nullptr
79 assert(output != nullptr);
80
81 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
82 if (status != Ok)
83 return status;
84
85 input_data = runtime_kernel.inputs_data[inputTensorIdx];
86 weight_data = runtime_kernel.inputs_data[weightTensorIdx];
87 bias_data = runtime_kernel.inputs_data[biasTensorIdx];
88 output_data = runtime_kernel.outputs_data[outputTensorIdx];
89 assert(input_data != nullptr);
90 assert(weight_data != nullptr);
91 // Bias can be nullptr
92 assert(output_data != nullptr);
93
94 options = runtime_kernel.first_operator->builtin_options_as_Conv2DOptions();
95 }
96
97 OMStatus status;
98
99 int32_t padding_h = 0;
100 int32_t padding_w = 0;
101
102 OMRuntimeShape weight_shape(weight);
103 OMRuntimeShape input_shape(input);
105
106 const int input_width = input_shape.dims(2);
107 const int input_height = input_shape.dims(1);
108 const int weight_width = weight_shape.dims(2);
109 const int weight_height = weight_shape.dims(1);
110 execute::computePaddingHeightWidth(options->stride_h(), options->stride_w(),
111 options->dilation_h_factor(), options->dilation_w_factor(),
112 input_height, input_width, weight_height, weight_width,
113 options->padding(), &padding_h, &padding_w);
114
115 switch (input->type())
116 {
117#ifndef DIS_FLOAT
118 case circle::TensorType_FLOAT32:
119 {
120 FloatConv2D params{};
121 status = calculateActivationRange(options->fused_activation_function(),
122 &params.activation_min, &params.activation_max);
123 params.stride_w = options->stride_w();
124 params.stride_h = options->stride_h();
125 params.dilation_width_factor = options->dilation_w_factor();
126 params.dilation_height_factor = options->dilation_h_factor();
127 params.pad_h = padding_h;
128 params.pad_w = padding_w;
129
130 if (status != Ok)
131 return status;
132
133 status = pal::ConvFloat(&params, input_shape, core::utils::castInputData<float>(input_data),
134 weight_shape, core::utils::castInputData<float>(weight_data),
135 core::utils::castInputData<float>(bias_data), output_shape,
136 core::utils::castOutputData<float>(output_data));
137 assert(status == Ok);
138 }
139 break;
140#endif // DIS_FLOAT
141#ifndef DIS_QUANT
142 case circle::TensorType_INT8:
143 {
144 ConvQuant params{};
145 params.pad_h = padding_h;
146 params.pad_w = padding_w;
147
148 const auto padding = options->padding();
149 const auto stride_height = options->stride_h();
150 const auto stride_width = options->stride_w();
151 const auto dilation_height_factor = options->dilation_h_factor();
152 const auto dilation_width_factor = options->dilation_h_factor();
153
154 params.stride_height = stride_height;
155 params.stride_width = stride_width;
156 params.dilation_height_factor = dilation_height_factor;
157 params.dilation_width_factor = dilation_width_factor;
158
159 status =
160 createConvParams(params, input, weight, output, options->fused_activation_function());
161 assert(status == Ok);
162 if (status != Ok)
163 return status;
164
165 status =
166 pal::ConvPerChannel(params, input_shape, core::utils::castInputData<int8_t>(input_data),
167 weight_shape, core::utils::castInputData<int8_t>(weight_data),
168 core::utils::castInputData<int32_t>(bias_data), output_shape,
169 core::utils::castOutputData<int8_t>(output_data));
170 }
171 break;
172#endif // DIS_QUANT
173 default:
174 {
175 status = UnsupportedActivation;
176 assert(false && "Unsupported type.");
177 }
178 }
179
180 return status;
181}
OMStatus ConvPerChannel(const core::ConvQuant &params, const core::OMRuntimeShape &input_shape, const int8_t *input_data, const core::OMRuntimeShape &filter_shape, const int8_t *filter_data, const int32_t *bias_data, const core::OMRuntimeShape &output_shape, int8_t *output_data)
Definition PALConv2D.h:36
OMStatus ConvFloat(const core::FloatConv2D *params, const core::OMRuntimeShape &input_shape, const float *input_data, const core::OMRuntimeShape &filter_shape, const float *filter_data, const float *bias_data, const core::OMRuntimeShape &output_shape, float *output_data)
OMStatus createConvParams(core::ConvQuant &params, const circle::Tensor *input, const circle::Tensor *filter, const circle::Tensor *output, circle::ActivationFunctionType act_type)
void computePaddingHeightWidth(int32_t stride_height, int32_t stride_width, int32_t dilation_rate_height, int32_t dilation_rate_width, int32_t in_height, int32_t in_width, int32_t filter_height, int32_t filter_width, circle::Padding padding, int32_t *padding_h, int32_t *padding_w)
Definition OMUtils.h:141

References calculateActivationRange(), computePaddingHeightWidth(), onert_micro::execute::pal::ConvFloat(), onert_micro::execute::pal::ConvPerChannel(), createConvParams(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::core::ConvQuant::pad_h, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleCos()

OMStatus onert_micro::execute::execute_kernel_CircleCos ( const OMExecuteArgs execute_args)

Definition at line 29 of file Cos.cpp.

30{
31 auto cos_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Cos(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, cos_float_lambda);
37}
OMStatus Cos(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References onert_micro::execute::pal::Cos(), execute_math_common(), and output_shape.

◆ execute_kernel_CircleDepthwiseConv2D()

OMStatus onert_micro::execute::execute_kernel_CircleDepthwiseConv2D ( const OMExecuteArgs execute_args)

Definition at line 50 of file DepthwiseConv2D.cpp.

51{
52 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
53 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
54 uint16_t op_index = execute_args.kernel_index;
55
56 const circle::Tensor *input;
57 const circle::Tensor *weight;
58 const circle::Tensor *output;
59
60 uint8_t *input_data;
61 uint8_t *weight_data;
62 uint8_t *bias_data;
63 uint8_t *output_data;
64
65 const circle::DepthwiseConv2DOptions *options;
66 // Read kernel
67 {
68 execute::OMRuntimeKernel runtime_kernel;
69 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
70 if (status != Ok)
71 return status;
72
73 input = runtime_kernel.inputs[inputTensorIdx];
74 weight = runtime_kernel.inputs[weightTensorIdx];
75 output = runtime_kernel.outputs[outputTensorIdx];
76 assert(input != nullptr);
77 assert(weight != nullptr);
78 // Bias can be nullptr
79 assert(output != nullptr);
80
81 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
82 if (status != Ok)
83 return status;
84
85 input_data = runtime_kernel.inputs_data[inputTensorIdx];
86 weight_data = runtime_kernel.inputs_data[weightTensorIdx];
87 bias_data = runtime_kernel.inputs_data[biasTensorIdx];
88 output_data = runtime_kernel.outputs_data[outputTensorIdx];
89 assert(input_data != nullptr);
90 assert(weight_data != nullptr);
91 // Bias can be nullptr
92 assert(output_data != nullptr);
93
94 options = runtime_kernel.first_operator->builtin_options_as_DepthwiseConv2DOptions();
95 }
96
97 OMStatus status;
98
99 int32_t padding_h = 0;
100 int32_t padding_w = 0;
101
102 OMRuntimeShape weight_shape(weight);
103 OMRuntimeShape input_shape(input);
104
105 const int input_width = input_shape.dims(2);
106 const int input_height = input_shape.dims(1);
107 const int weight_width = weight_shape.dims(2);
108 const int weight_height = weight_shape.dims(1);
109 execute::computePaddingHeightWidth(options->stride_h(), options->stride_w(),
110 options->dilation_h_factor(), options->dilation_w_factor(),
111 input_height, input_width, weight_height, weight_width,
112 options->padding(), &padding_h, &padding_w);
113
114 const auto output_shape = OMRuntimeShape(output);
115
116 switch (input->type())
117 {
118#ifndef DIS_FLOAT
119 case circle::TensorType_FLOAT32:
120 {
121
122 FloatConv2D params{};
123 status = calculateActivationRange(options->fused_activation_function(),
124 &params.activation_min, &params.activation_max);
125 params.stride_w = options->stride_w();
126 params.stride_h = options->stride_h();
127 params.dilation_width_factor = options->dilation_w_factor();
128 params.dilation_height_factor = options->dilation_h_factor();
129 params.depth_multiplier = options->depth_multiplier();
130 params.pad_h = padding_h;
131 params.pad_w = padding_w;
132
133 if (status != Ok)
134 return status;
135
137 &params, input_shape, core::utils::castInputData<float>(input_data), weight_shape,
138 core::utils::castInputData<float>(weight_data),
139 core::utils::castInputData<float>(bias_data), output_shape,
140 core::utils::castOutputData<float>(output_data));
141 assert(status == Ok);
142 }
143 break;
144#endif // DIS_FLOAT
145#ifndef DIS_QUANT
146 case circle::TensorType_INT8:
147 {
148 ConvQuant params{};
149 params.pad_h = padding_h;
150 params.pad_w = padding_w;
151 params.depth_multiplier = options->depth_multiplier();
152
153 const auto padding = options->padding();
154 const auto stride_height = options->stride_h();
155 const auto stride_width = options->stride_w();
156 const auto dilation_height_factor = options->dilation_h_factor();
157 const auto dilation_width_factor = options->dilation_h_factor();
158
159 params.stride_height = stride_height;
160 params.stride_width = stride_width;
161 params.dilation_height_factor = dilation_height_factor;
162 params.dilation_width_factor = dilation_width_factor;
163
164 status =
165 createConvParams(params, input, weight, output, options->fused_activation_function());
166 assert(status == Ok);
167 if (status != Ok)
168 return status;
169
171 params, input_shape, core::utils::castInputData<int8_t>(input_data), weight_shape,
172 core::utils::castInputData<int8_t>(weight_data),
173 core::utils::castInputData<int32_t>(bias_data), output_shape,
174 core::utils::castOutputData<int8_t>(output_data));
175 }
176 break;
177#endif // DIS_QUANT
178 default:
179 {
180 status = UnsupportedActivation;
181 assert(false && "Unsupported type.");
182 }
183 }
184
185 return status;
186}
OMStatus DepthwiseConv2D< float >(const core::FloatConv2D *params, const core::OMRuntimeShape &input_shape, const float *input_data, const core::OMRuntimeShape &filter_shape, const float *filter_data, const float *bias_data, const core::OMRuntimeShape &output_shape, float *output_data)
OMStatus DepthwiseConvPerChannel(const core::ConvQuant &params, const core::OMRuntimeShape &input_shape, const int8_t *input_data, const core::OMRuntimeShape &filter_shape, const int8_t *filter_data, const int32_t *bias_data, const core::OMRuntimeShape &output_shape, int8_t *output_data)

References calculateActivationRange(), computePaddingHeightWidth(), createConvParams(), onert_micro::execute::pal::DepthwiseConv2D< float >(), onert_micro::execute::pal::DepthwiseConvPerChannel(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::core::ConvQuant::pad_h, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleDequantize()

OMStatus onert_micro::execute::execute_kernel_CircleDequantize ( const OMExecuteArgs execute_args)

Definition at line 43 of file Dequantize.cpp.

44{
45 const circle::Tensor *input = nullptr;
46 const circle::Tensor *output = nullptr;
47
48 uint8_t *input_data = nullptr;
49 uint8_t *output_data = nullptr;
50
51 SISOHeader(execute_args, &input, &output, &input_data, &output_data);
52
53 assert(output->type() == circle::TensorType_FLOAT32);
54
55 OMStatus status = Ok;
56 switch (input->type())
57 {
58#ifndef DIS_FLOAT
59 case circle::TensorType_INT8:
60 {
61 assert(input->quantization() != nullptr);
62 assert(input->quantization()->scale() != nullptr and
63 input->quantization()->scale()->size() == 1);
64 assert(input->quantization()->zero_point() != nullptr and
65 input->quantization()->zero_point()->size() == 1);
67 params.zero_point = input->quantization()->zero_point()->operator[](0);
68 params.scale = input->quantization()->scale()->operator[](0);
69
70 status = pal::Dequantize(params, core::OMRuntimeShape(input).flatSize(),
71 core::utils::castInputData<int8_t>(input_data),
72 core::utils::castOutputData<float>(output_data));
73 }
74 break;
75#endif // DIS_FLOAT
76 default:
77 {
78 status = UnsupportedType;
79 assert(false && "Unsupported type.");
80 }
81 }
82
83 return status;
84}
OMStatus Dequantize(const core::QuantizationParams op_params, const uint32_t flat_size, const InputT *input_data, OutputT *output_data)

References onert_micro::execute::pal::Dequantize(), onert_micro::Ok, SISOHeader(), onert_micro::UnsupportedType, and onert_micro::core::QuantizationParams::zero_point.

◆ execute_kernel_CircleDiv()

OMStatus onert_micro::execute::execute_kernel_CircleDiv ( const OMExecuteArgs execute_args)

Definition at line 45 of file Div.cpp.

46{
47 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
48 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
49 uint16_t op_index = execute_args.kernel_index;
50
51 const circle::Tensor *input1;
52 const circle::Tensor *input2;
53 const circle::Tensor *output;
54
55 uint8_t *input1_data;
56 uint8_t *input2_data;
57 uint8_t *output_data;
58
59 const circle::DivOptions *options;
60 // Read kernel
61 {
62 execute::OMRuntimeKernel runtime_kernel;
63 runtime_kernel.readKernel(op_index, runtime_context);
64
65 input1 = runtime_kernel.inputs[input1TensorIdx];
66 input2 = runtime_kernel.inputs[input2TensorIdx];
67 output = runtime_kernel.outputs[outputTensorIdx];
68 assert(input1 != nullptr);
69 assert(input2 != nullptr);
70 assert(output != nullptr);
71
72 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
73
74 input1_data = runtime_kernel.inputs_data[input1TensorIdx];
75 input2_data = runtime_kernel.inputs_data[input2TensorIdx];
76 output_data = runtime_kernel.outputs_data[outputTensorIdx];
77 assert(input1_data != nullptr);
78 assert(input2_data != nullptr);
79 assert(output_data != nullptr);
80
81 options = runtime_kernel.first_operator->builtin_options_as_DivOptions();
82 }
83
84 OMStatus status;
85
86 core::OMRuntimeShape input1_shape(input1);
87 core::OMRuntimeShape input2_shape(input2);
89
91 const bool need_broadcast = pal::processBroadcastShapes(input1_shape, input2_shape, &params);
92
93 switch (input1->type())
94 {
95#ifndef DIS_FLOAT
96 case circle::TensorType_FLOAT32:
97 {
98 status = execute::calculateActivationRange(options->fused_activation_function(),
99 &params.float_activation_min,
100 &params.float_activation_max);
101
102 if (need_broadcast)
103 {
105 params, input1_shape, core::utils::castInputData<float>(input1_data), input2_shape,
106 core::utils::castInputData<float>(input2_data), output_shape,
107 core::utils::castOutputData<float>(output_data));
108 }
109 else
110 {
111 status =
112 pal::Div(params, input1_shape.flatSize(), core::utils::castInputData<float>(input1_data),
113 core::utils::castInputData<float>(input2_data),
114 core::utils::castOutputData<float>(output_data));
115 }
116 }
117 break;
118#endif // DIS_FLOAT
119 case circle::TensorType_INT64:
120 {
121 status = execute::calculateActivationRange(options->fused_activation_function(),
122 &params.int64_activation_min,
123 &params.int64_activation_max);
124
125 if (need_broadcast)
126 {
128 params, input1_shape, core::utils::castInputData<int64_t>(input1_data), input2_shape,
129 core::utils::castInputData<int64_t>(input2_data), output_shape,
130 core::utils::castOutputData<int64_t>(output_data));
131 }
132 else
133 {
134 status = pal::Div(params, input1_shape.flatSize(),
135 core::utils::castInputData<int64_t>(input1_data),
136 core::utils::castInputData<int64_t>(input2_data),
137 core::utils::castOutputData<int64_t>(output_data));
138 }
139 }
140 break;
141 case circle::TensorType_INT32:
142 {
143 status = execute::calculateActivationRange(options->fused_activation_function(),
144 &params.int32_activation_min,
145 &params.int32_activation_max);
146
147 if (need_broadcast)
148 {
150 params, input1_shape, core::utils::castInputData<int32_t>(input1_data), input2_shape,
151 core::utils::castInputData<int32_t>(input2_data), output_shape,
152 core::utils::castOutputData<int32_t>(output_data));
153 }
154 else
155 {
156 status = pal::Div(params, input1_shape.flatSize(),
157 core::utils::castInputData<int32_t>(input1_data),
158 core::utils::castInputData<int32_t>(input2_data),
159 core::utils::castOutputData<int32_t>(output_data));
160 }
161 }
162 break;
163 default:
164 {
165 status = UnsupportedType;
166 assert(false && "Unsupported type.");
167 }
168 }
169
170 return status;
171}
OMStatus BroadcastDiv4DSlow(const core::BinaryArithmeticBroadcastParams &params, const core::OMRuntimeShape &input1_shape, const T *input1_data, const core::OMRuntimeShape &input2_shape, const T *input2_data, const core::OMRuntimeShape &output_shape, T *output_data)
OMStatus Div(const core::BinaryArithmeticBroadcastParams &params, const int flat_size, const T *input1_data, const T *input2_data, T *output_data)

References onert_micro::execute::pal::BroadcastDiv4DSlow(), calculateActivationRange(), onert_micro::execute::pal::Div(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::pal::processBroadcastShapes(), onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleElu()

OMStatus onert_micro::execute::execute_kernel_CircleElu ( const OMExecuteArgs execute_args)

Definition at line 42 of file Elu.cpp.

43{
44 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
45 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
46 uint16_t op_index = execute_args.kernel_index;
47
48 const circle::Tensor *input = nullptr;
49 const circle::Tensor *output = nullptr;
50
51 uint8_t *input_data = nullptr;
52 uint8_t *output_data = nullptr;
53
54 OMStatus status = Ok;
55
56 OMRuntimeKernel runtime_kernel;
57 runtime_kernel.readKernel(op_index, runtime_context);
58
59 input = runtime_kernel.inputs[inputTensorIdx];
60 output = runtime_kernel.outputs[outputTensorIdx];
61
62 assert(input != nullptr);
63 assert(output != nullptr);
64
65 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
66 if (status != Ok)
67 return status;
68
69 input_data = runtime_kernel.inputs_data[inputTensorIdx];
70 output_data = runtime_kernel.outputs_data[outputTensorIdx];
71
72 assert(input_data != nullptr);
73 assert(output_data != nullptr);
74
75 switch (input->type())
76 {
77#ifndef DIS_FLOAT
78 case circle::TensorType_FLOAT32:
79 {
80 core::OMRuntimeShape input_shape(input);
82
83 const auto *input_data_float = core::utils::castInputData<float>(input_data);
84 auto *output_data_float = core::utils::castOutputData<float>(output_data);
85
86 assert(output_data_float);
87 const int flat_size = input_shape.flatSize();
88
89 status = pal::Elu(flat_size, input_data_float, output_data_float);
90 }
91 break;
92#endif // DIS_FLOAT
93 default:
94 {
95 status = UnsupportedType;
96 assert(false && "Unsupported type.");
97 break;
98 }
99 }
100
101 return status;
102}
OMStatus Elu(const int flat_size, const float *input_data, float *output_data)
Definition PALElu.h:32

References onert_micro::execute::pal::Elu(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleEqual()

OMStatus onert_micro::execute::execute_kernel_CircleEqual ( const OMExecuteArgs execute_args)

Definition at line 44 of file Equal.cpp.

45{
46 OMStatus status = Ok;
47
48 const circle::Tensor *input1 = nullptr;
49 const circle::Tensor *input2 = nullptr;
50 const circle::Tensor *output = nullptr;
51
52 OMRuntimeKernel runtime_kernel;
53
54 TISOHeader(execute_args, &input1, &input2, &output, &runtime_kernel);
55
56 switch (input1->type())
57 {
58 case circle::TensorType_INT64:
59 onert_micro::execute::evalComparisonGeneric<int64_t>(&runtime_kernel,
61 break;
62 case circle::TensorType_INT32:
63 onert_micro::execute::evalComparisonGeneric<int32_t>(&runtime_kernel,
65 break;
66
67#ifndef DIS_FLOAT
68 case circle::TensorType_FLOAT32:
69 onert_micro::execute::evalComparisonGeneric<float>(&runtime_kernel,
71 break;
72#endif // DIS_FLOAT
73 default:
74 assert(false && "Unsupported type.");
75 }
76
77 return status;
78}
bool EqualFn(T lhs, T rhs)
OMStatus TISOHeader(const OMExecuteArgs &execute_args, const circle::Tensor **input1, const circle::Tensor **input2, const circle::Tensor **output, OMRuntimeKernel *runtime_kernel)
Definition OMUtils.cpp:240

References onert_micro::execute::pal::EqualFn(), onert_micro::Ok, and TISOHeader().

◆ execute_kernel_CircleExp()

OMStatus onert_micro::execute::execute_kernel_CircleExp ( const OMExecuteArgs execute_args)

Definition at line 29 of file Exp.cpp.

30{
31 auto exp_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Exp(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, exp_float_lambda);
37}
OMStatus Exp(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), onert_micro::execute::pal::Exp(), and output_shape.

◆ execute_kernel_CircleExpandDims()

OMStatus onert_micro::execute::execute_kernel_CircleExpandDims ( const OMExecuteArgs execute_args)

Definition at line 28 of file ExpandDims.cpp.

29{
30 return execute_reshape_common(execute_args);
31}
OMStatus execute_reshape_common(const OMExecuteArgs &execute_args)

References execute_reshape_common().

◆ execute_kernel_CircleFill()

OMStatus onert_micro::execute::execute_kernel_CircleFill ( const OMExecuteArgs execute_args)

Definition at line 44 of file Fill.cpp.

45{
46 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
47 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
48 uint16_t op_index = execute_args.kernel_index;
49
50 const circle::Tensor *value;
51 const circle::Tensor *output;
52
53 uint8_t *value_data;
54 uint8_t *output_data;
55
56 // Read kernel
57 {
58 execute::OMRuntimeKernel runtime_kernel;
59 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
60 if (status != Ok)
61 return status;
62
63 value = runtime_kernel.inputs[valueTensorIdx];
64 output = runtime_kernel.outputs[outputTensorIdx];
65 assert(value != nullptr);
66 assert(output != nullptr);
67
68 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
69 if (status != Ok)
70 return status;
71
72 value_data = runtime_kernel.inputs_data[valueTensorIdx];
73 output_data = runtime_kernel.outputs_data[outputTensorIdx];
74 assert(value_data != nullptr);
75 assert(output_data != nullptr);
76 }
77
78 OMStatus status = Ok;
79
80 assert(OMRuntimeShape(value).flatSize() == 1);
82
83 switch (output->type())
84 {
85#ifndef DIS_FLOAT
86 case circle::TensorType_FLOAT32:
87 {
88 status = pal::Fill(core::utils::castInputData<float>(value_data), output_shape,
89 core::utils::castOutputData<float>(output_data));
90 }
91 break;
92#endif // DIS_FLOAT
93 case circle::TensorType_INT32:
94 {
95 status = pal::Fill(core::utils::castInputData<int32_t>(value_data), output_shape,
96 core::utils::castOutputData<int32_t>(output_data));
97 }
98 break;
99 default:
100 {
101 status = UnsupportedActivation;
102 assert(false && "Unsupported type.");
103 break;
104 }
105 }
106
107 return status;
108}
OMStatus Fill(const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)
Definition PALFill.h:32

References onert_micro::execute::pal::Fill(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleFloor()

OMStatus onert_micro::execute::execute_kernel_CircleFloor ( const OMExecuteArgs execute_args)

Definition at line 29 of file Floor.cpp.

30{
31 auto floor_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Floor(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, floor_float_lambda);
37}
OMStatus Floor(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), onert_micro::execute::pal::Floor(), and output_shape.

◆ execute_kernel_CircleFloorDiv()

OMStatus onert_micro::execute::execute_kernel_CircleFloorDiv ( const OMExecuteArgs execute_args)

Definition at line 34 of file FloorDiv.cpp.

35{
36 uint8_t *input_data1;
37 uint8_t *input_data2;
38 uint8_t *output_data;
39
40 core::OMRuntimeShape input_shape1;
41 core::OMRuntimeShape input_shape2;
43
44 circle::TensorType input1_type;
45
46 OMStatus status =
47 execute::readKernelDataTISO(execute_args, input_data1, input_data2, output_data, input_shape1,
48 input_shape2, output_shape, input1_type);
49
50 switch (input1_type)
51 {
52#ifndef DIS_FLOAT
53 case circle::TensorType_FLOAT32:
54 {
55 // Check the denominator
56 for (int i = 0; i < input_shape2.flatSize(); ++i)
57 {
58 status = utils::checkCondition(core::utils::castInputData<float>(input_data2)[i] != 0);
59 if (status != Ok)
60 return status;
61 }
62 // check that input and output dimensions are equal
63 if (input_shape1 == input_shape2)
64 {
65 const int flat_size = input_shape1.flatSize();
66 pal::FloorDiv(flat_size, core::utils::castInputData<float>(input_data1),
67 core::utils::castInputData<float>(input_data2),
68 core::utils::castOutputData<float>(output_data));
69 }
70 else
71 {
72 pal::BroadcastFloorDiv4DSlow(input_shape1, core::utils::castInputData<float>(input_data1),
73 input_shape2, core::utils::castInputData<float>(input_data2),
74 output_shape, core::utils::castOutputData<float>(output_data));
75 }
76 }
77 break;
78#endif // DIS_FLOAT
79 default:
80 assert(false && "Unsupported type.");
81 }
82
83 return status;
84}
OMStatus readKernelDataTISO(const OMExecuteArgs &execute_args, uint8_t *&input_data1, uint8_t *&input_data2, uint8_t *&output_data, core::OMRuntimeShape &input1_shape_ref, core::OMRuntimeShape &input2_shape_ref, core::OMRuntimeShape &output_shape_ref, circle::TensorType &tensor_type)

References onert_micro::execute::pal::BroadcastFloorDiv4DSlow(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::pal::FloorDiv(), onert_micro::Ok, output_shape, and readKernelDataTISO().

◆ execute_kernel_CircleFloorMod()

OMStatus onert_micro::execute::execute_kernel_CircleFloorMod ( const OMExecuteArgs execute_args)

Definition at line 33 of file FloorMod.cpp.

34{
35 uint8_t *input_data1;
36 uint8_t *input_data2;
37 uint8_t *output_data;
38
39 core::OMRuntimeShape input_shape1;
40 core::OMRuntimeShape input_shape2;
42
43 circle::TensorType input1_type;
44
45 OMStatus status =
46 execute::readKernelDataTISO(execute_args, input_data1, input_data2, output_data, input_shape1,
47 input_shape2, output_shape, input1_type);
48
49 switch (input1_type)
50 {
51#ifndef DIS_FLOAT
52 case circle::TensorType_FLOAT32:
53 {
54 // Check the denominator
55 for (int i = 0; i < input_shape2.flatSize(); ++i)
56 {
57 utils::checkCondition(core::utils::castInputData<float>(input_data2)[i] != 0);
58 }
59 // check that input and output dimensions are equal
60 if (input_shape1 == input_shape2)
61 {
62 const int flat_size = input_shape1.flatSize();
63 pal::FloorMod(flat_size, core::utils::castInputData<float>(input_data1),
64 core::utils::castInputData<float>(input_data2),
65 core::utils::castOutputData<float>(output_data));
66 }
67 else
68 {
69 pal::BroadcastFloorMod4DSlow(input_shape1, core::utils::castInputData<float>(input_data1),
70 input_shape2, core::utils::castInputData<float>(input_data2),
71 output_shape, core::utils::castOutputData<float>(output_data));
72 }
73 }
74 break;
75#endif // DIS_FLOAT
76 default:
77 assert(false && "Unsupported type.");
78 }
79
80 return status;
81}

References onert_micro::execute::pal::BroadcastFloorMod4DSlow(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::pal::FloorMod(), output_shape, and readKernelDataTISO().

◆ execute_kernel_CircleFullyConnected()

OMStatus onert_micro::execute::execute_kernel_CircleFullyConnected ( const OMExecuteArgs execute_args)

Definition at line 98 of file FullyConnected.cpp.

99{
100 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
101 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
102 uint16_t op_index = execute_args.kernel_index;
103
104 const circle::Tensor *input;
105 const circle::Tensor *weight;
106 const circle::Tensor *output;
107
108 uint8_t *input_data;
109 uint8_t *weight_data;
110 uint8_t *bias_data;
111 uint8_t *output_data;
112
113 const circle::FullyConnectedOptions *options;
114 // Read kernel
115 {
116 execute::OMRuntimeKernel runtime_kernel;
117 runtime_kernel.readKernel(op_index, runtime_context);
118
119 input = runtime_kernel.inputs[inputTensorIdx];
120 weight = runtime_kernel.inputs[weightTensorIdx];
121 output = runtime_kernel.outputs[outputTensorIdx];
122 assert(input != nullptr);
123 assert(weight != nullptr);
124 // Bias can be nullptr
125 assert(output != nullptr);
126
127 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
128
129 input_data = runtime_kernel.inputs_data[inputTensorIdx];
130 weight_data = runtime_kernel.inputs_data[weightTensorIdx];
131 bias_data = runtime_kernel.inputs_data[biasTensorIdx];
132 output_data = runtime_kernel.outputs_data[outputTensorIdx];
133 assert(input_data != nullptr);
134 assert(weight_data != nullptr);
135 // Bias can be nullptr
136 assert(output_data != nullptr);
137
138 options = runtime_kernel.first_operator->builtin_options_as_FullyConnectedOptions();
139 }
140
141 OMStatus status;
142
143 switch (input->type())
144 {
145#ifndef DIS_FLOAT
146 case circle::TensorType_FLOAT32:
147 {
148 FullyConnectedParams params{};
149 status = calculateActivationRange(options->fused_activation_function(),
150 &params.float_activation_min, &params.float_activation_max);
151 if (status != Ok)
152 return status;
153
154 switch (weight->type())
155 {
156 case circle::TensorType_FLOAT32:
157 {
158
159 status = pal::FullyConnected(
160 params, core::utils::castInputData<float>(input_data), OMRuntimeShape(weight),
161 core::utils::castInputData<float>(weight_data),
162 core::utils::castInputData<float>(bias_data), OMRuntimeShape(output),
163 core::utils::castOutputData<float>(output_data));
164 }
165 break;
166 case circle::TensorType_INT8:
167 {
168 // weight quantized INT8 mode
169 params.weights_scales =
170 reinterpret_cast<const float *>(weight->quantization()->scale()->data());
171 params.is_channel_wise_quant = weight->quantization()->scale()->size() > 1;
172
173 status = pal::FullyConnected(
174 params, core::utils::castInputData<float>(input_data), OMRuntimeShape(weight),
175 core::utils::castInputData<int8_t>(weight_data),
176 core::utils::castInputData<float>(bias_data), OMRuntimeShape(output),
177 core::utils::castOutputData<float>(output_data));
178 }
179 break;
180 default:
181 assert(false && "Unsupported hybrid weight type");
182 }
183 }
184 break;
185#endif // DIS_FLOAT
186#ifndef DIS_QUANT
187 case circle::TensorType_INT8:
188 {
189 FullyConnectedParams op_params{};
190
191 calculateOpDataFullyConnected(input, weight, output, options->fused_activation_function(),
192 op_params);
193
194 status =
195 pal::FullyConnected(op_params, core::utils::castInputData<int8_t>(input_data),
196 OMRuntimeShape(weight), core::utils::castInputData<int8_t>(weight_data),
197 core::utils::castInputData<int32_t>(bias_data), OMRuntimeShape(output),
198 core::utils::castOutputData<int8_t>(output_data));
199 }
200 break;
201 case circle::TensorType_INT16:
202 {
203 FullyConnectedParams op_params{};
204
205 calculateOpDataFullyConnected(input, weight, output, options->fused_activation_function(),
206 op_params);
207
208 status =
209 pal::FullyConnected(op_params, core::utils::castInputData<int16_t>(input_data),
210 OMRuntimeShape(weight), core::utils::castInputData<int8_t>(weight_data),
211 core::utils::castInputData<int32_t>(bias_data), OMRuntimeShape(output),
212 core::utils::castOutputData<int16_t>(output_data));
213 }
214 break;
215#endif // DIS_QUANT
216 default:
217 {
218 status = UnsupportedType;
219 assert(false && "Unsupported type.");
220 }
221 }
222
223 return status;
224}
OMStatus FullyConnected(const core::FullyConnectedParams &params, const int16_t *input_data, const core::OMRuntimeShape &filter_shape, const int8_t *filter_data, const int64_t *bias_data, const core::OMRuntimeShape &output_shape, int16_t *output_data)

References calculateActivationRange(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::core::FullyConnectedParams::float_activation_max, onert_micro::core::FullyConnectedParams::float_activation_min, onert_micro::execute::pal::FullyConnected(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::core::FullyConnectedParams::is_channel_wise_quant, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, onert_micro::UnsupportedType, and onert_micro::core::FullyConnectedParams::weights_scales.

◆ execute_kernel_CircleGather()

OMStatus onert_micro::execute::execute_kernel_CircleGather ( const OMExecuteArgs execute_args)

Definition at line 70 of file Gather.cpp.

71{
72 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
73 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
74 uint16_t op_index = execute_args.kernel_index;
75
76 const circle::Tensor *input;
77 const circle::Tensor *position;
78 const circle::Tensor *output;
79
80 uint8_t *input_data;
81 uint8_t *position_data;
82 uint8_t *output_data;
83
84 const circle::GatherOptions *options;
85 // Read kernel
86 {
87 execute::OMRuntimeKernel runtime_kernel;
88 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
89 if (status != Ok)
90 return status;
91
92 input = runtime_kernel.inputs[inputTensorIdx];
93 position = runtime_kernel.inputs[positionsTensorIdx];
94 output = runtime_kernel.outputs[outputTensorIdx];
95 assert(input != nullptr);
96 assert(position != nullptr);
97 assert(output != nullptr);
98
99 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
100 if (status != Ok)
101 return status;
102
103 input_data = runtime_kernel.inputs_data[inputTensorIdx];
104 position_data = runtime_kernel.inputs_data[positionsTensorIdx];
105 output_data = runtime_kernel.outputs_data[outputTensorIdx];
106 assert(input_data != nullptr);
107 assert(position_data != nullptr);
108 assert(output_data != nullptr);
109
110 options = runtime_kernel.first_operator->builtin_options_as_GatherOptions();
111 }
112
113 OMStatus status = Ok;
114
115 OMRuntimeShape position_shape(position);
116 OMRuntimeShape input_shape(input);
117
118 const int input_dims_size = input_shape.dimensionsCount();
119 int axis = options->axis();
120 if (axis < 0)
121 {
122 axis += input_dims_size;
123 }
124
125 int batch_dims = options->batch_dims();
126 // batch_dims should be in range: [-rank(coords), rank(coords)].
127 // Negative batch_dims is added with rank of coords.
128 const int coords_dims_size = position_shape.dimensionsCount();
129 if (batch_dims < 0)
130 {
131 batch_dims += coords_dims_size;
132 }
133
134 const int axis_size = input_shape.dims(axis);
135
136 int batch_size = 1;
137 for (int i = 0; i < batch_dims; ++i)
138 {
139 batch_size *= input_shape.dims(i);
140 }
141 int outer_size = 1;
142 for (int i = batch_dims; i < axis; ++i)
143 {
144 outer_size *= input_shape.dims(i);
145 }
146 int inner_size = 1;
147 for (int i = axis + 1; i < input_dims_size; ++i)
148 {
149 inner_size *= input_shape.dims(i);
150 }
151 int coord_size = 1;
152 for (int i = batch_dims; i < coords_dims_size; ++i)
153 {
154 coord_size *= position_shape.dims(i);
155 }
156
157 switch (input->type())
158 {
159#ifndef DIS_FLOAT
160 case circle::TensorType_FLOAT32:
161 {
162 gather<float, int32_t>(utils::castInputData<float>(input_data),
163 utils::castInputData<int32_t>(position_data),
164 utils::castOutputData<float>(output_data), axis_size, batch_size,
165 outer_size, inner_size, coord_size);
166 }
167 break;
168#endif // DIS_FLOAT
169#ifndef DIS_QUANT
170 case circle::TensorType_INT8:
171 {
172 gather<int8_t, int32_t>(utils::castInputData<int8_t>(input_data),
173 utils::castInputData<int32_t>(position_data),
174 utils::castOutputData<int8_t>(output_data), axis_size, batch_size,
175 outer_size, inner_size, coord_size);
176 }
177 break;
178#endif // DIS_QUANT
179 case circle::TensorType_INT32:
180 {
181 gather<int32_t, int32_t>(utils::castInputData<int32_t>(input_data),
182 utils::castInputData<int32_t>(position_data),
183 utils::castOutputData<int32_t>(output_data), axis_size, batch_size,
184 outer_size, inner_size, coord_size);
185 }
186 break;
187 default:
188 {
189 status = UnsupportedActivation;
190 assert(false && "Unsupported type.");
191 }
192 }
193
194 return status;
195}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleGatherND()

OMStatus onert_micro::execute::execute_kernel_CircleGatherND ( const OMExecuteArgs execute_args)

Definition at line 39 of file GatherND.cpp.

40{
41
42 uint8_t *input_data;
43 uint8_t *position_data;
44 uint8_t *output_data;
45
46 core::OMRuntimeShape input_shape;
47 core::OMRuntimeShape position_shape;
49
50 circle::TensorType inputType;
51
52 OMStatus status =
53 execute::readKernelDataTISO(execute_args, input_data, position_data, output_data, input_shape,
54 position_shape, output_shape, inputType);
55
56 switch (inputType)
57 {
58#ifndef DIS_FLOAT
59 case circle::TensorType_FLOAT32:
60 {
61 pal::GatherND<float, int32_t>(input_shape, utils::castInputData<float>(input_data),
62 position_shape, utils::castInputData<int32_t>(position_data),
63 utils::castOutputData<float>(output_data));
64 }
65 break;
66#endif // DIS_FLOAT
67 default:
68 {
69 status = UnsupportedActivation;
70 assert(false && "Unsupported type.");
71 }
72 }
73
74 return status;
75}

References output_shape, readKernelDataTISO(), and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleGreater()

OMStatus onert_micro::execute::execute_kernel_CircleGreater ( const OMExecuteArgs execute_args)

Definition at line 44 of file Greater.cpp.

45{
46 OMStatus status = Ok;
47
48 const circle::Tensor *input1 = nullptr;
49 const circle::Tensor *input2 = nullptr;
50 const circle::Tensor *output = nullptr;
51
52 OMRuntimeKernel runtime_kernel;
53
54 TISOHeader(execute_args, &input1, &input2, &output, &runtime_kernel);
55
56 switch (input1->type())
57 {
58 case circle::TensorType_INT64:
59 onert_micro::execute::evalComparisonGeneric<int64_t>(&runtime_kernel,
61 break;
62 case circle::TensorType_INT32:
63 onert_micro::execute::evalComparisonGeneric<int32_t>(&runtime_kernel,
65 break;
66#ifndef DIS_FLOAT
67 case circle::TensorType_FLOAT32:
68 onert_micro::execute::evalComparisonGeneric<float>(&runtime_kernel,
70 break;
71#endif // DIS_FLOAT
72 default:
73 assert(false && "Unsupported type.");
74 }
75
76 return status;
77}
bool GreaterFn(T lhs, T rhs)

References onert_micro::execute::pal::GreaterFn(), onert_micro::Ok, and TISOHeader().

◆ execute_kernel_CircleGreaterEqual()

OMStatus onert_micro::execute::execute_kernel_CircleGreaterEqual ( const OMExecuteArgs execute_args)

Definition at line 44 of file GreaterEqual.cpp.

45{
46 OMStatus status = Ok;
47
48 const circle::Tensor *input1 = nullptr;
49 const circle::Tensor *input2 = nullptr;
50 const circle::Tensor *output = nullptr;
51
52 OMRuntimeKernel runtime_kernel;
53
54 TISOHeader(execute_args, &input1, &input2, &output, &runtime_kernel);
55
56 switch (input1->type())
57 {
58 case circle::TensorType_INT64:
59 onert_micro::execute::evalComparisonGeneric<int64_t>(
61 break;
62 case circle::TensorType_INT32:
63 onert_micro::execute::evalComparisonGeneric<int32_t>(
65 break;
66#ifndef DIS_FLOAT
67 case circle::TensorType_FLOAT32:
68 onert_micro::execute::evalComparisonGeneric<float>(&runtime_kernel,
70 break;
71#endif // DIS_FLOAT
72 default:
73 assert(false && "Unsupported type.");
74 }
75
76 return status;
77}
bool GreaterEqualFn(T lhs, T rhs)

References onert_micro::execute::pal::GreaterEqualFn(), onert_micro::Ok, and TISOHeader().

◆ execute_kernel_CircleGRU()

OMStatus onert_micro::execute::execute_kernel_CircleGRU ( const OMExecuteArgs execute_args)

Definition at line 54 of file GRU.cpp.

55{
56 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
57 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
58 uint16_t op_index = execute_args.kernel_index;
59
60 const circle::Tensor *input;
61 const circle::Tensor *hidden_hidden;
62 const circle::Tensor *hidden_hidden_bias;
63 const circle::Tensor *hidden_input;
64 const circle::Tensor *hidden_input_bias;
65 const circle::Tensor *state;
66
67 const circle::Tensor *output;
68
69 uint8_t *input_data;
70 uint8_t *hidden_hidden_data;
71 uint8_t *hidden_hidden_bias_data;
72 uint8_t *hidden_input_data;
73 uint8_t *hidden_input_bias_data;
74 uint8_t *state_data;
75 uint8_t *output_data;
76
77 uint16_t state_tensor_index = 0;
78
79 // Read kernel
80 {
81 execute::OMRuntimeKernel runtime_kernel;
82 runtime_kernel.readKernel(op_index, runtime_context);
83
84 input = runtime_kernel.inputs[inputTensorIdx];
85 hidden_hidden = runtime_kernel.inputs[hiddenHiddenTensorIdx];
86 hidden_hidden_bias = runtime_kernel.inputs[hiddenHiddenBiasTensorIdx];
87 hidden_input = runtime_kernel.inputs[hiddenInputTensorIdx];
88 hidden_input_bias = runtime_kernel.inputs[hiddenInputBiasTensorIdx];
89 state = runtime_kernel.inputs[stateTensorIdx];
90
91 output = runtime_kernel.outputs[outputTensorIdx];
92 assert(input != nullptr);
93 assert(hidden_hidden != nullptr);
94 assert(hidden_input != nullptr);
95 assert(state != nullptr);
96 // Biases can be nullptr
97 assert(output != nullptr);
98
99 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
100
101 input_data = runtime_kernel.inputs_data[inputTensorIdx];
102 hidden_hidden_data = runtime_kernel.inputs_data[hiddenHiddenTensorIdx];
103 hidden_hidden_bias_data = runtime_kernel.inputs_data[hiddenHiddenBiasTensorIdx];
104 hidden_input_data = runtime_kernel.inputs_data[hiddenInputTensorIdx];
105 hidden_input_bias_data = runtime_kernel.inputs_data[hiddenInputBiasTensorIdx];
106 state_data = runtime_kernel.inputs_data[stateTensorIdx];
107
108 output_data = runtime_kernel.outputs_data[outputTensorIdx];
109 assert(input_data != nullptr);
110 assert(hidden_hidden_data != nullptr);
111 assert(hidden_input_data != nullptr);
112 assert(state_data != nullptr);
113 // Bias can be nullptr
114 assert(output_data != nullptr);
115
116 state_tensor_index = runtime_kernel.inputs_index[stateTensorIdx];
117 }
118
119 OMStatus status;
120
121 uint8_t *output_hidden_data;
122 uint8_t *output_input_data;
123
124 status =
126 sizeof(core::OMDataType(hidden_hidden->type())),
127 &output_hidden_data);
128 if (status != Ok)
129 return status;
131 core::OMRuntimeShape(hidden_input).flatSize() * sizeof(core::OMDataType(hidden_input->type())),
132 &output_input_data);
133 if (status != Ok)
134 return status;
135
136 // If train mode need to allocate memory for internal intermediate tensors for calculation
137 // gradients further Number of intermediate tensors
138 const int32_t num_of_intermediate_tensors = 9;
139 // Note: size of the intermediate is equal to output size (should be checked during import phase)
140 const int32_t size_of_intermediate_tensors = core::OMRuntimeShape(output).flatSize();
141 assert(size_of_intermediate_tensors > 0);
142 if (size_of_intermediate_tensors == 0)
143 return UnknownError;
144
145 const int32_t input_size = core::OMRuntimeShape(input).flatSize();
146 const int32_t output_size = size_of_intermediate_tensors;
147
148 // Allocate buffer with following schema:
149 // times * [output_size * sizeof(data_type),
150 // num_of_intermediate_tensors * size_of_intermediate_tensors * sizeof(data_type)]
151 // Note: need to save all necessary intermediate data to calculate gradients
152 // Deallocation should perform train/GRU kernel
153 const size_t data_type_size = sizeof(core::OMDataType(input->type()));
154 const int32_t time = OMRuntimeShape(input).dims(0);
155 size_t intermediate_buffer_size = 0;
156 uint8_t *intermediate_buffer = nullptr;
157 if (execute_args.is_train_mode)
158 {
159 const auto num_operators = runtime_context.getCircleOperators()->size();
160
161 uint32_t num_train_layers =
162 execute_args.num_train_layers == 0 ? num_operators : execute_args.num_train_layers;
163 uint32_t last_node_pos = std::min(num_operators, num_train_layers);
164 uint32_t last_train_op_index = num_operators - last_node_pos;
165
166 if (execute_args.kernel_index >= last_train_op_index)
167 {
168 intermediate_buffer_size = num_of_intermediate_tensors * size_of_intermediate_tensors;
169
171 time * intermediate_buffer_size * data_type_size, &intermediate_buffer);
172 if (status != Ok)
173 return status;
174
175 // Save its buffer to state tensor index
176 runtime_storage.saveDataToTensorIndex(intermediate_buffer, state_tensor_index);
177 }
178 }
179
180 switch (input->type())
181 {
182#ifndef DIS_FLOAT
183 case circle::TensorType_FLOAT32:
184 {
185 status =
186 pal::GRU(core::utils::castInputData<float>(input_data),
187 core::utils::castInputData<float>(hidden_input_data),
188 core::utils::castInputData<float>(hidden_hidden_data),
189 core::utils::castInputData<float>(hidden_input_bias_data),
190 core::utils::castInputData<float>(hidden_hidden_bias_data),
191 core::utils::castInputData<float>(state_data),
192 core::utils::castOutputData<float>(output_data),
193 core::utils::castOutputData<float>(output_input_data),
194 core::utils::castOutputData<float>(output_hidden_data),
196 core::OMRuntimeShape(hidden_input), core::OMRuntimeShape(hidden_hidden),
197 intermediate_buffer_size, core::utils::castOutputData<float>(intermediate_buffer));
198 }
199 break;
200#endif // DIS_FLOAT
201 default:
202 {
203 status = UnsupportedType;
204 assert(false && "Unsupported type.");
205 }
206 }
207
210
211 return status;
212}
uoffset_t size() const
const reader::CircleOperators * getCircleOperators()
OMStatus saveDataToTensorIndex(uint8_t *data, uint16_t tensor_index)
OMDataType
"scalar" value type
Definition OMDataType.h:35
OMStatus GRU(const float *input_data, const float *weight_input_data, const float *weight_hidden_data, const float *bias_input_data, const float *bias_hidden_data, const float *hidden_state_data, float *output_data, float *output_input_data, float *output_hidden_data, const core::OMRuntimeShape &input_shape, const core::OMRuntimeShape &output_shape, const core::OMRuntimeShape &weight_input_shape, const core::OMRuntimeShape &weight_hidden_shape, const size_t intermediate_buffer_size, float *intermediate_buffer)
static OMStatus deallocateMemory(uint8_t *data)
static OMStatus allocateMemory(uint32_t size, uint8_t **data)

References onert_micro::core::memory::OMMemoryManager::allocateMemory(), onert_micro::core::memory::OMMemoryManager::deallocateMemory(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::core::OMRuntimeContext::getCircleOperators(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::pal::GRU(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMRuntimeKernel::inputs_index, onert_micro::execute::OMExecuteArgs::is_train_mode, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::execute::OMExecuteArgs::num_train_layers, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, onert_micro::core::OMRuntimeStorage::saveDataToTensorIndex(), flatbuffers::Vector< T >::size(), onert_micro::UnknownError, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleL2Normalize()

OMStatus onert_micro::execute::execute_kernel_CircleL2Normalize ( const OMExecuteArgs execute_args)

Definition at line 44 of file L2Normalize.cpp.

45{
46 const circle::Tensor *input = nullptr;
47 const circle::Tensor *output = nullptr;
48
49 uint8_t *input_data = nullptr;
50 uint8_t *output_data = nullptr;
51
52 SISOHeader(execute_args, &input, &output, &input_data, &output_data);
53
54 OMStatus status;
55
56 switch (input->type())
57 {
58#ifndef DIS_FLOAT
59 case circle::TensorType_FLOAT32:
60 {
61
62 core::OMRuntimeShape inputs_shape(input);
63 core::OMRuntimeShape outputs_shape(output);
64
65 const auto trailing_dim = inputs_shape.dimensionsCount() - 1;
66
68 params.num_rows =
69 pal::flatSizeSkipDim(inputs_shape.dimsData(), trailing_dim, inputs_shape.dimensionsCount());
70
71 assert(inputs_shape.dims(trailing_dim) == outputs_shape.dims(trailing_dim));
72 params.row_size = inputs_shape.dims(trailing_dim);
73
74 status = pal::L2Normalization(params, core::utils::castInputData<float>(input_data),
75 core::utils::castOutputData<float>(output_data));
76 }
77 break;
78#endif // DIS_FLOAT
79 default:
80 {
81 status = UnsupportedType;
82 assert(false && "Unsupported type.");
83 }
84 }
85
86 return status;
87}
int flatSizeSkipDim(const int32_t *dims_data, int skip_dim, int num_dims)
Definition PALUtils.h:210
OMStatus L2Normalization(const core::L2NormalizationParams &params, const float *input_data, float *output_data)

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::core::OMRuntimeShape::dimsData(), onert_micro::execute::pal::flatSizeSkipDim(), onert_micro::execute::pal::L2Normalization(), onert_micro::core::L2NormalizationParams::num_rows, onert_micro::core::L2NormalizationParams::row_size, SISOHeader(), and onert_micro::UnsupportedType.

◆ execute_kernel_CircleL2Pool2D()

OMStatus onert_micro::execute::execute_kernel_CircleL2Pool2D ( const OMExecuteArgs execute_args)

Definition at line 29 of file L2Pool2D.cpp.

30{
31 auto l2_pool_float_lambda = [](const core::Pool2DParams &params,
32 const core::OMRuntimeShape &input_shape, const float *input_data,
33 const core::OMRuntimeShape &output_shape, float *output_data) {
34 return pal::L2Pool(params, input_shape, input_data, output_shape, output_data);
35 };
36
37#ifndef DIS_QUANT
38 auto l2_pool_int8_lambda = [](const core::Pool2DParams &params,
39 const core::OMRuntimeShape &input_shape, const int8_t *input_data,
41 int8_t *output_data) { return UnsupportedType; };
42#else
43 auto l2_pool_int8_lambda = [](const core::Pool2DParams &params,
44 const core::OMRuntimeShape &input_shape, const int8_t *input_data,
46 int8_t *output_data) { return UnsupportedType; };
47#endif // DIS_QUANT
48
49 return execute_pooling_common(execute_args, l2_pool_float_lambda, l2_pool_int8_lambda);
50}
OMStatus L2Pool(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const float *input_data, const core::OMRuntimeShape &output_shape, float *output_data)

References execute_pooling_common(), onert_micro::execute::pal::L2Pool(), output_shape, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleLeakyRelu()

OMStatus onert_micro::execute::execute_kernel_CircleLeakyRelu ( const OMExecuteArgs execute_args)

Definition at line 28 of file LeakyRelu.cpp.

29{
30 bool is_relu_6 = false;
31 return execute_relu_common(execute_args, is_relu_6);
32}
OMStatus execute_relu_common(const OMExecuteArgs &execute_args, bool is_relu_6)

References execute_relu_common().

◆ execute_kernel_CircleLess()

OMStatus onert_micro::execute::execute_kernel_CircleLess ( const OMExecuteArgs execute_args)

Definition at line 44 of file Less.cpp.

45{
46 OMStatus status = Ok;
47
48 const circle::Tensor *input1 = nullptr;
49 const circle::Tensor *input2 = nullptr;
50 const circle::Tensor *output = nullptr;
51
52 OMRuntimeKernel runtime_kernel;
53
54 TISOHeader(execute_args, &input1, &input2, &output, &runtime_kernel);
55
56 switch (input1->type())
57 {
58 case circle::TensorType_INT64:
59 onert_micro::execute::evalComparisonGeneric<int64_t>(&runtime_kernel,
61 break;
62 case circle::TensorType_INT32:
63 onert_micro::execute::evalComparisonGeneric<int32_t>(&runtime_kernel,
65 break;
66#ifndef DIS_QUANT
67 case circle::TensorType_UINT8:
68 evalQuantizedComparisonGeneric<uint8_t, int32_t>(&runtime_kernel,
70 break;
71 case circle::TensorType_INT8:
72 evalQuantizedComparisonGeneric<int8_t, int32_t>(&runtime_kernel,
74 break;
75#endif // DIS_QUANT
76
77#ifndef DIS_FLOAT
78 case circle::TensorType_FLOAT32:
79 onert_micro::execute::evalComparisonGeneric<float>(&runtime_kernel,
81 break;
82#endif // DIS_FLOAT
83 default:
84 assert(false && "Unsupported type.");
85 }
86
87 return status;
88}
bool LessFn(T lhs, T rhs)

References onert_micro::execute::pal::LessFn(), onert_micro::Ok, and TISOHeader().

◆ execute_kernel_CircleLessEqual()

OMStatus onert_micro::execute::execute_kernel_CircleLessEqual ( const OMExecuteArgs execute_args)

Definition at line 42 of file LessEqual.cpp.

43{
44 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
45 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
46 uint16_t op_index = execute_args.kernel_index;
47
48 OMStatus status = Ok;
49
50 const circle::Tensor *input1 = nullptr;
51 const circle::Tensor *input2 = nullptr;
52 const circle::Tensor *output = nullptr;
53
54 OMRuntimeKernel runtime_kernel;
55 runtime_kernel.readKernel(op_index, runtime_context);
56
57 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
58 if (status != Ok)
59 return status;
60
61 input1 = runtime_kernel.inputs[input1TensorIdx];
62 input2 = runtime_kernel.inputs[input2TensorIdx];
63 output = runtime_kernel.outputs[outputTensorIdx];
64
65 assert(input1 != nullptr);
66 assert(input2 != nullptr);
67 assert(output != nullptr);
68
69 switch (input1->type())
70 {
71 case circle::TensorType_INT64:
72 onert_micro::execute::evalComparisonGeneric<int64_t>(&runtime_kernel,
74 break;
75 case circle::TensorType_INT32:
76 onert_micro::execute::evalComparisonGeneric<int32_t>(&runtime_kernel,
78 break;
79
80#ifndef DIS_FLOAT
81 case circle::TensorType_FLOAT32:
82 onert_micro::execute::evalComparisonGeneric<float>(&runtime_kernel,
84 break;
85#endif // DIS_FLOAT
86 default:
87 assert(false && "Unsupported type.");
88 }
89
90 return status;
91}
bool LessEqualFn(T lhs, T rhs)

References onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::execute::pal::LessEqualFn(), onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, and onert_micro::execute::OMExecuteArgs::runtime_storage.

◆ execute_kernel_CircleLog()

OMStatus onert_micro::execute::execute_kernel_CircleLog ( const OMExecuteArgs execute_args)

Definition at line 29 of file Log.cpp.

30{
31 auto log_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Log(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, log_float_lambda);
37}
OMStatus Log(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), onert_micro::execute::pal::Log(), and output_shape.

◆ execute_kernel_CircleLogistic()

OMStatus onert_micro::execute::execute_kernel_CircleLogistic ( const OMExecuteArgs execute_args)

Definition at line 45 of file Logistic.cpp.

46{
47 const circle::Tensor *input = nullptr;
48 const circle::Tensor *output = nullptr;
49
50 uint8_t *input_data = nullptr;
51 uint8_t *output_data = nullptr;
52
53 SISOHeader(execute_args, &input, &output, &input_data, &output_data);
54
55 OMStatus status;
56
57 switch (input->type())
58 {
59#ifndef DIS_FLOAT
60 case circle::TensorType_FLOAT32:
61 {
62 status = pal::Logistic(core::OMRuntimeShape(input).flatSize(),
63 core::utils::castInputData<float>(input_data),
64 core::utils::castOutputData<float>(output_data));
65 }
66 break;
67#endif // DIS_FLOAT
68#ifndef DIS_QUANT
69 case circle::TensorType_INT8:
70 {
71 assert(input->quantization() != nullptr);
72 assert(input->quantization()->scale() != nullptr);
73 assert(input->quantization()->scale()->size() == 1);
74 assert(input->quantization()->zero_point() != nullptr);
75 assert(input->quantization()->zero_point()->size() == 1);
76
77 assert(output->quantization() != nullptr);
78 assert(output->quantization()->scale() != nullptr);
79 assert(output->quantization()->scale()->size() == 1);
80 assert(output->quantization()->zero_point() != nullptr);
81 assert(output->quantization()->zero_point()->size() == 1);
82
83 auto input_scale = *input->quantization()->scale()->begin();
84 auto input_zero_point = *input->quantization()->zero_point()->begin();
85 auto output_scale = *input->quantization()->scale()->begin();
86 auto output_zero_point = *input->quantization()->zero_point()->begin();
87
88 status = pal::Logistic(core::OMRuntimeShape(input).flatSize(),
89 core::utils::castInputData<int8_t>(input_data), input_scale,
90 input_zero_point, core::utils::castOutputData<int8_t>(output_data),
91 output_scale, output_zero_point);
92 }
93 break;
94#endif // DIS_QUANT
95 default:
96 {
97 status = UnsupportedType;
98 assert(false && "Unsupported type.");
99 }
100 }
101
102 return status;
103}
OMStatus Logistic(const int flat_size, const float *input_data, float *output_data)
Definition PALLogistic.h:32

References onert_micro::execute::pal::Logistic(), SISOHeader(), and onert_micro::UnsupportedType.

◆ execute_kernel_CircleLogSoftmax()

OMStatus onert_micro::execute::execute_kernel_CircleLogSoftmax ( const OMExecuteArgs execute_args)

Definition at line 44 of file LogSoftmax.cpp.

45{
46 const circle::Tensor *input = nullptr;
47 const circle::Tensor *output = nullptr;
48
49 uint8_t *input_data = nullptr;
50 uint8_t *output_data = nullptr;
51
52 SISOHeader(execute_args, &input, &output, &input_data, &output_data);
53
54 OMStatus status;
55
56 switch (input->type())
57 {
58#ifndef DIS_FLOAT
59 case circle::TensorType_FLOAT32:
60 {
61
62 core::OMRuntimeShape inputs_shape(input);
63 core::OMRuntimeShape outputs_shape(output);
64
65 const auto dim_count = inputs_shape.dimensionsCount();
66
67 const auto trailing_dim = dim_count - 1;
68
69 int flat_size = 1;
70 for (int i = 0; i < inputs_shape.dimensionsCount(); ++i)
71 {
72 flat_size *= (i == trailing_dim) ? 1 : inputs_shape.dims(i);
73 }
74
76 params.num_rows = flat_size;
77
78 assert(inputs_shape.dims(trailing_dim) == outputs_shape.dims(trailing_dim));
79 params.row_size = inputs_shape.dims(trailing_dim);
80
81 status = pal::LogSoftmax(params, core::utils::castInputData<float>(input_data),
82 core::utils::castOutputData<float>(output_data));
83 }
84 break;
85#endif // DIS_FLOAT
86 default:
87 {
88 status = UnsupportedType;
89 assert(false && "Unsupported type.");
90 }
91 }
92
93 return status;
94}
OMStatus LogSoftmax(const core::LogSoftmaxParams &params, const float *input_data, float *output_data)

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::pal::LogSoftmax(), onert_micro::core::LogSoftmaxParams::num_rows, onert_micro::core::LogSoftmaxParams::row_size, SISOHeader(), and onert_micro::UnsupportedType.

◆ execute_kernel_CircleMaximum()

OMStatus onert_micro::execute::execute_kernel_CircleMaximum ( const OMExecuteArgs execute_args)

Definition at line 33 of file Maximum.cpp.

34{
35
36 uint8_t *input_data1;
37 uint8_t *input_data2;
38 uint8_t *output_data;
39
40 core::OMRuntimeShape input_shape1;
41 core::OMRuntimeShape input_shape2;
43
44 circle::TensorType input1_type;
45
46 OMStatus status =
47 execute::readKernelDataTISO(execute_args, input_data1, input_data2, output_data, input_shape1,
48 input_shape2, output_shape, input1_type);
49
50 switch (input1_type)
51 {
52#ifndef DIS_FLOAT
53 case circle::TensorType_FLOAT32:
54 {
55 // check that input and output dimensions are equal
56 if (input_shape1 == input_shape2)
57 {
58 const int flat_size = input_shape1.flatSize();
59 status = pal::Maximum(flat_size, utils::castInputData<float>(input_data1),
60 utils::castInputData<float>(input_data2),
61 utils::castOutputData<float>(output_data));
62 }
63 else
64 {
65 status =
66 pal::BroadcastMaximum4DSlow(input_shape1, utils::castInputData<float>(input_data1),
67 input_shape2, utils::castInputData<float>(input_data2),
68 output_shape, utils::castOutputData<float>(output_data));
69 }
70 }
71 break;
72#endif // DIS_FLOAT
73 default:
74 assert(false && "Unsupported type.");
75 }
76
77 return status;
78}
OMStatus Maximum(const int flat_size, const float *input1_data, const float *input2_data, float *output_data)
OMStatus BroadcastMaximum4DSlow(const core::OMRuntimeShape &input1_shape, const float *input1_data, const core::OMRuntimeShape &input2_shape, const float *input2_data, const core::OMRuntimeShape &output_shape, float *output_data)

References onert_micro::execute::pal::BroadcastMaximum4DSlow(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::pal::Maximum(), output_shape, and readKernelDataTISO().

◆ execute_kernel_CircleMaxPool2D()

OMStatus onert_micro::execute::execute_kernel_CircleMaxPool2D ( const OMExecuteArgs execute_args)

Definition at line 29 of file MaxPool2D.cpp.

30{
31 auto max_pool_float_lambda = [](const core::Pool2DParams &params,
32 const core::OMRuntimeShape &input_shape, const float *input_data,
33 const core::OMRuntimeShape &output_shape, float *output_data) {
34 return pal::MaxPool(params, input_shape, input_data, output_shape, output_data);
35 };
36
37#ifndef DIS_QUANT
38 auto max_pool_int8_lambda = [](const core::Pool2DParams &params,
39 const core::OMRuntimeShape &input_shape, const int8_t *input_data,
40 const core::OMRuntimeShape &output_shape, int8_t *output_data) {
41 return pal::MaxPool(params, input_shape, input_data, output_shape, output_data);
42 };
43#else
44 auto max_pool_int8_lambda = [](const core::Pool2DParams &params,
45 const core::OMRuntimeShape &input_shape, const int8_t *input_data,
47 int8_t *output_data) { return UnsupportedType; };
48#endif // DIS_QUANT
49
50 return execute_pooling_common(execute_args, max_pool_float_lambda, max_pool_int8_lambda);
51}
OMStatus MaxPool(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const int8_t *input_data, const core::OMRuntimeShape &output_shape, int8_t *output_data)

References execute_pooling_common(), onert_micro::execute::pal::MaxPool(), output_shape, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleMean()

OMStatus onert_micro::execute::execute_kernel_CircleMean ( const OMExecuteArgs execute_args)

Definition at line 55 of file Mean.cpp.

56{
57 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
58 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
59 uint16_t op_index = execute_args.kernel_index;
60
61 const circle::Tensor *input;
62 const circle::Tensor *axis;
63 const circle::Tensor *output;
64
65 uint8_t *input_data;
66 uint8_t *axis_data;
67 uint8_t *output_data;
68
69 uint16_t input_index = 0;
70 uint16_t axis_index = 0;
71
72 const circle::ReducerOptions *options;
73 // Read kernel
74 {
75 execute::OMRuntimeKernel runtime_kernel;
76 runtime_kernel.readKernel(op_index, runtime_context);
77
78 input = runtime_kernel.inputs[input1TensorIdx];
79 axis = runtime_kernel.inputs[input2TensorIdx];
80 output = runtime_kernel.outputs[outputTensorIdx];
81 assert(input != nullptr);
82 assert(axis != nullptr);
83 assert(output != nullptr);
84
85 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
86
87 input_data = runtime_kernel.inputs_data[input1TensorIdx];
88 axis_data = runtime_kernel.inputs_data[input2TensorIdx];
89 output_data = runtime_kernel.outputs_data[outputTensorIdx];
90 assert(input_data != nullptr);
91 assert(axis_data != nullptr);
92 assert(output_data != nullptr);
93
94 options = runtime_kernel.first_operator->builtin_options_as_ReducerOptions();
95
96 input_index = runtime_kernel.inputs_index[input1TensorIdx];
97 axis_index = runtime_kernel.inputs_index[input2TensorIdx];
98 }
99
100 OMStatus status;
101
102 core::OMRuntimeShape input_shape(input);
103 core::OMRuntimeShape axis_shape(axis);
105
106 switch (input->type())
107 {
108#ifndef DIS_FLOAT
109 case circle::TensorType_FLOAT32:
110 onert_micro::execute::pal::Mean<float>(
111 input_shape.dimsData(), core::utils::castInputData<float>(input_data),
112 input_shape.dimensionsCount(), core::utils::castOutputData<float>(output_data),
113 output_shape.flatSize(), core::utils::castInputData<int>(axis_data),
114 axis_shape.dimensionsCount());
115
116 break;
117#endif // DIS_FLOAT
118 case circle::TensorType_INT32:
119 break;
120 case circle::TensorType_INT64:
121 break;
122 default:
123 assert(false && "Unsupported type");
124 }
125
126 return status;
127}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dimsData(), onert_micro::execute::OMRuntimeKernel::first_operator, luci_interpreter::RuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMRuntimeKernel::inputs_index, onert_micro::execute::OMExecuteArgs::kernel_index, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, and onert_micro::execute::OMExecuteArgs::runtime_storage.

◆ execute_kernel_CircleMinimum()

OMStatus onert_micro::execute::execute_kernel_CircleMinimum ( const OMExecuteArgs execute_args)

Definition at line 33 of file Minimum.cpp.

34{
35
36 uint8_t *input_data1;
37 uint8_t *input_data2;
38 uint8_t *output_data;
39
40 core::OMRuntimeShape input_shape1;
41 core::OMRuntimeShape input_shape2;
43
44 circle::TensorType input1_type;
45
46 OMStatus status =
47 execute::readKernelDataTISO(execute_args, input_data1, input_data2, output_data, input_shape1,
48 input_shape2, output_shape, input1_type);
49
50 switch (input1_type)
51 {
52#ifndef DIS_FLOAT
53 case circle::TensorType_FLOAT32:
54 {
55 // check that input and output dimensions are equal
56 if (input_shape1 == input_shape2)
57 {
58 const int flat_size = input_shape1.flatSize();
59 status = pal::Minimum(flat_size, utils::castInputData<float>(input_data1),
60 utils::castInputData<float>(input_data2),
61 utils::castOutputData<float>(output_data));
62 }
63 else
64 {
65 status =
66 pal::BroadcastMinimum4DSlow(input_shape1, utils::castInputData<float>(input_data1),
67 input_shape2, utils::castInputData<float>(input_data2),
68 output_shape, utils::castOutputData<float>(output_data));
69 }
70 }
71 break;
72#endif // DIS_FLOAT
73 default:
74 assert(false && "Unsupported type.");
75 }
76
77 return status;
78}
OMStatus BroadcastMinimum4DSlow(const core::OMRuntimeShape &input1_shape, const T *input1_data, const core::OMRuntimeShape &input2_shape, const T *input2_data, const core::OMRuntimeShape &output_shape, T *output_data)
OMStatus Minimum(const int flat_size, const float *input1_data, const float *input2_data, float *output_data)

References onert_micro::execute::pal::BroadcastMinimum4DSlow(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::pal::Minimum(), output_shape, and readKernelDataTISO().

◆ execute_kernel_CircleMul()

OMStatus onert_micro::execute::execute_kernel_CircleMul ( const OMExecuteArgs execute_args)

Definition at line 80 of file Mul.cpp.

81{
82 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
83 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
84 uint16_t op_index = execute_args.kernel_index;
85
86 const circle::Tensor *input1;
87 const circle::Tensor *input2;
88 const circle::Tensor *output;
89
90 uint8_t *input1_data;
91 uint8_t *input2_data;
92 uint8_t *output_data;
93
94 const circle::MulOptions *options;
95 // Read kernel
96 {
97 execute::OMRuntimeKernel runtime_kernel;
98 runtime_kernel.readKernel(op_index, runtime_context);
99
100 input1 = runtime_kernel.inputs[input1TensorIdx];
101 input2 = runtime_kernel.inputs[input2TensorIdx];
102 output = runtime_kernel.outputs[outputTensorIdx];
103 assert(input1 != nullptr);
104 assert(input2 != nullptr);
105 assert(output != nullptr);
106
107 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
108
109 input1_data = runtime_kernel.inputs_data[input1TensorIdx];
110 input2_data = runtime_kernel.inputs_data[input2TensorIdx];
111 output_data = runtime_kernel.outputs_data[outputTensorIdx];
112 assert(input1_data != nullptr);
113 assert(input2_data != nullptr);
114 assert(output_data != nullptr);
115
116 options = runtime_kernel.first_operator->builtin_options_as_MulOptions();
117 }
118
119 OMStatus status;
120
121 core::OMRuntimeShape input1_shape(input1);
122 core::OMRuntimeShape input2_shape(input2);
124
126 const bool need_broadcast = pal::processBroadcastShapes(input1_shape, input2_shape, &params);
127
128 switch (input1->type())
129 {
130#ifndef DIS_FLOAT
131 case circle::TensorType_FLOAT32:
132 {
133 status = execute::calculateActivationRange(options->fused_activation_function(),
134 &params.float_activation_min,
135 &params.float_activation_max);
136
137 if (need_broadcast)
138 {
140 params, input1_shape, core::utils::castInputData<float>(input1_data), input2_shape,
141 core::utils::castInputData<float>(input2_data), output_shape,
142 core::utils::castOutputData<float>(output_data));
143 }
144 else
145 {
146 status =
147 pal::Mul(params, input1_shape.flatSize(), core::utils::castInputData<float>(input1_data),
148 core::utils::castInputData<float>(input2_data),
149 core::utils::castOutputData<float>(output_data));
150 }
151 }
152 break;
153 case circle::TensorType_INT64:
154 {
155 status = execute::calculateActivationRange(options->fused_activation_function(),
156 &params.int64_activation_min,
157 &params.int64_activation_max);
158
159 if (need_broadcast)
160 {
162 params, input1_shape, core::utils::castInputData<int64_t>(input1_data), input2_shape,
163 core::utils::castInputData<int64_t>(input2_data), output_shape,
164 core::utils::castOutputData<int64_t>(output_data));
165 }
166 else
167 {
168 status = pal::Mul(params, input1_shape.flatSize(),
169 core::utils::castInputData<int64_t>(input1_data),
170 core::utils::castInputData<int64_t>(input2_data),
171 core::utils::castOutputData<int64_t>(output_data));
172 }
173 }
174 break;
175 case circle::TensorType_INT32:
176 {
177 status = execute::calculateActivationRange(options->fused_activation_function(),
178 &params.int32_activation_min,
179 &params.int32_activation_max);
180
181 if (need_broadcast)
182 {
184 params, input1_shape, core::utils::castInputData<int32_t>(input1_data), input2_shape,
185 core::utils::castInputData<int32_t>(input2_data), output_shape,
186 core::utils::castOutputData<int32_t>(output_data));
187 }
188 else
189 {
190 status = pal::Mul(params, input1_shape.flatSize(),
191 core::utils::castInputData<int32_t>(input1_data),
192 core::utils::castInputData<int32_t>(input2_data),
193 core::utils::castOutputData<int32_t>(output_data));
194 }
195 }
196 break;
197#endif // DIS_FLOAT
198#ifndef DIS_QUANT
199 case circle::TensorType_INT8:
200 {
201 core::ArithmeticQuantParams add_params{};
202
203 calculateQuantParamsForMul(add_params, input1, input2, output,
204 options->fused_activation_function());
205
206 if (need_broadcast)
207 {
209 add_params, input1_shape, core::utils::castInputData<int8_t>(input1_data), input2_shape,
210 core::utils::castInputData<int8_t>(input2_data), output_shape,
211 core::utils::castOutputData<int8_t>(output_data));
212 }
213 else
214 {
215 assert(input1_shape.flatSize() == input2_shape.flatSize());
216 assert(input1_shape.flatSize() == output_shape.flatSize());
217 status = pal::Mul(add_params, input1_shape.flatSize(),
218 core::utils::castInputData<int8_t>(input1_data),
219 core::utils::castInputData<int8_t>(input2_data),
220 core::utils::castOutputData<int8_t>(output_data));
221 }
222 }
223 break;
224#endif // DIF_QUANT
225 default:
226 {
227 status = UnsupportedType;
228 assert(false && "Unsupported type.");
229 }
230 }
231
232 return status;
233}
OMStatus BroadcastMul6DSlow(const core::ArithmeticQuantParams &params, const core::OMRuntimeShape &input1_shape, const T *input1_data, const core::OMRuntimeShape &input2_shape, const T *input2_data, const core::OMRuntimeShape &output_shape, T *output_data)
OMStatus Mul(const core::ArithmeticQuantParams &params, const uint32_t flat_size, const int8_t *input1_data, const int8_t *input2_data, int8_t *output_data)
Definition PALMul.h:33
OMStatus BroadcastMul4DSlow(const core::BinaryArithmeticBroadcastParams &params, const core::OMRuntimeShape &input1_shape, const T *input1_data, const core::OMRuntimeShape &input2_shape, const T *input2_data, const core::OMRuntimeShape &output_shape, T *output_data)

References onert_micro::execute::pal::BroadcastMul4DSlow(), onert_micro::execute::pal::BroadcastMul6DSlow(), calculateActivationRange(), onert_micro::execute::OMRuntimeKernel::first_operator, luci_interpreter::RuntimeShape::flatSize(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::execute::pal::Mul(), output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::pal::processBroadcastShapes(), onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleNeg()

OMStatus onert_micro::execute::execute_kernel_CircleNeg ( const OMExecuteArgs execute_args)

Definition at line 29 of file Neg.cpp.

30{
31 auto neg_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Neg(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, neg_float_lambda);
37}
OMStatus Neg(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), onert_micro::execute::pal::Neg(), and output_shape.

◆ execute_kernel_CircleNotEqual()

OMStatus onert_micro::execute::execute_kernel_CircleNotEqual ( const OMExecuteArgs execute_args)

Definition at line 44 of file NotEqual.cpp.

45{
46 OMStatus status = Ok;
47
48 const circle::Tensor *input1 = nullptr;
49 const circle::Tensor *input2 = nullptr;
50 const circle::Tensor *output = nullptr;
51
52 OMRuntimeKernel runtime_kernel;
53
54 TISOHeader(execute_args, &input1, &input2, &output, &runtime_kernel);
55
56 switch (input1->type())
57 {
58 case circle::TensorType_INT64:
59 onert_micro::execute::evalComparisonGeneric<int64_t>(&runtime_kernel,
61 break;
62 case circle::TensorType_INT32:
63 onert_micro::execute::evalComparisonGeneric<int32_t>(&runtime_kernel,
65 break;
66
67#ifndef DIS_FLOAT
68 case circle::TensorType_FLOAT32:
69 onert_micro::execute::evalComparisonGeneric<float>(&runtime_kernel,
71 break;
72#endif // DIS_FLOAT
73 default:
74 assert(false && "Unsupported type.");
75 }
76
77 return status;
78}
bool NotEqualFn(T lhs, T rhs)

References onert_micro::execute::pal::NotEqualFn(), onert_micro::Ok, and TISOHeader().

◆ execute_kernel_CirclePack()

OMStatus onert_micro::execute::execute_kernel_CirclePack ( const OMExecuteArgs execute_args)

Definition at line 86 of file Pack.cpp.

87{
88 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
89 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
90 uint16_t op_index = execute_args.kernel_index;
91
92 execute::OMRuntimeKernel runtime_kernel;
93 runtime_kernel.readKernel(op_index, runtime_context);
94
95 const auto type = runtime_kernel.inputs[0]->type();
96 OMStatus status = Ok;
97
98 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
99
100 if (status != Ok)
101 return status;
102
103 switch (type)
104 {
105#ifndef DIS_FLOAT
106 case circle::TensorType_FLOAT32:
107 packImpl<float>(runtime_kernel);
108 break;
109#endif // DIS_FLOAT
110#ifndef DIS_QUANT
111 case circle::TensorType_INT8:
112 packImpl<int8_t>(runtime_kernel);
113 break;
114#endif // DIS_QUANT
115 case circle::TensorType_INT32:
116 packImpl<int32_t>(runtime_kernel);
117 break;
118 case circle::TensorType_INT64:
119 packImpl<int64_t>(runtime_kernel);
120 break;
121 default:
122 assert(false && "Unsupported type.");
123 status = UnsupportedType;
124 }
125
126 return status;
127}

References onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CirclePad()

OMStatus onert_micro::execute::execute_kernel_CirclePad ( const OMExecuteArgs execute_args)

Definition at line 45 of file Pad.cpp.

46{
47 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
48 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
49 uint16_t op_index = execute_args.kernel_index;
50
51 const circle::Tensor *input1;
52 const circle::Tensor *input2;
53 const circle::Tensor *input3;
54 const circle::Tensor *output;
55
56 uint8_t *input1_data;
57 uint8_t *input2_data;
58 uint8_t *input3_data;
59 uint8_t *output_data;
60
61 const circle::PadOptions *options;
62 // Read kernel
63 {
64 execute::OMRuntimeKernel runtime_kernel;
65 runtime_kernel.readKernel(op_index, runtime_context);
66
67 input1 = runtime_kernel.inputs[input1TensorIdx];
68 input2 = runtime_kernel.inputs[input2TensorIdx];
69 input3 = runtime_kernel.inputs[input3TensorIdx];
70 output = runtime_kernel.outputs[outputTensorIdx];
71 assert(input1 != nullptr);
72 assert(input2 != nullptr);
73 // input3 - can be nullptr
74 assert(output != nullptr);
75
76 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
77
78 input1_data = runtime_kernel.inputs_data[input1TensorIdx];
79 input2_data = runtime_kernel.inputs_data[input2TensorIdx];
80 input3_data = runtime_kernel.inputs_data[input3TensorIdx];
81 output_data = runtime_kernel.outputs_data[outputTensorIdx];
82 assert(input1_data != nullptr);
83 assert(input2_data != nullptr);
84 // input3_data can be nullptr
85 assert(output_data != nullptr);
86
87 options = runtime_kernel.first_operator->builtin_options_as_PadOptions();
88 }
89
90 OMStatus status = Ok;
91
92 core::OMRuntimeShape input1_shape(input1);
93 core::OMRuntimeShape input2_shape(input2);
95
96 // Create PadParams
97 core::PadParams pad_params{};
98 const auto num_input_dimensions = input1_shape.dimensionsCount();
99 assert(num_input_dimensions <= 5);
100
101 if (num_input_dimensions > 5)
102 return UnsupportedType;
103
104 pad_params.left_padding_count = num_input_dimensions;
105 pad_params.right_padding_count = num_input_dimensions;
106
107 auto *paddings_data = reinterpret_cast<int32_t *>(input2_data);
108 for (int idx = num_input_dimensions - 1; idx >= 0; --idx)
109 {
110 pad_params.left_padding[idx] = paddings_data[idx * 2];
111 pad_params.right_padding[idx] = paddings_data[idx * 2 + 1];
112 }
113
114 switch (input1->type())
115 {
116#ifndef DIS_FLOAT
117 case circle::TensorType_FLOAT32:
118 {
119 float pad_value = input3_data == nullptr ? 0.f : *reinterpret_cast<float *>(input3_data[0]);
120 status = pal::Pad(pad_params, input1_shape, core::utils::castInputData<float>(input1_data),
121 pad_value, output_shape, core::utils::castOutputData<float>(output_data));
122 }
123 break;
124#endif // DIS_FLOAT
125 default:
126 {
127 status = UnsupportedType;
128 assert(false && "Unsupported type");
129 }
130 }
131
132 return status;
133}
OMStatus Pad(const core::PadParams &op_params, const core::OMRuntimeShape &input_shape, const float *input_data, const float pad_value, const core::OMRuntimeShape &output_shape, float *output_data)
Definition PALPad.h:35

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::pal::Pad(), onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleQuantize()

OMStatus onert_micro::execute::execute_kernel_CircleQuantize ( const OMExecuteArgs execute_args)

Definition at line 44 of file Quantize.cpp.

45{
46 const circle::Tensor *input = nullptr;
47 const circle::Tensor *output = nullptr;
48
49 uint8_t *input_data = nullptr;
50 uint8_t *output_data = nullptr;
51
52 SISOHeader(execute_args, &input, &output, &input_data, &output_data);
53
54 OMStatus status = Ok;
55
56 assert(input->type() == circle::TensorType_FLOAT32);
57
58 switch (output->type())
59 {
60#ifndef DIS_FLOAT
61 case circle::TensorType_INT8:
62 {
63 assert(output->quantization() != nullptr);
64 assert(output->quantization()->scale() != nullptr and
65 output->quantization()->scale()->size() == 1);
66 assert(output->quantization()->zero_point() != nullptr and
67 output->quantization()->zero_point()->size() == 1);
69 params.zero_point = output->quantization()->zero_point()->operator[](0);
70 params.scale = output->quantization()->scale()->operator[](0);
71
72 status = pal::Quantize(params, core::OMRuntimeShape(input).flatSize(),
73 core::utils::castInputData<float>(input_data),
74 core::utils::castOutputData<int8_t>(output_data));
75 }
76 break;
77#endif // DIS_FLOAT
78 default:
79 {
80 status = UnsupportedType;
81 assert(false && "Unsupported type.");
82 }
83 }
84
85 return status;
86}
OMStatus Quantize(const core::QuantizationParams op_params, const uint32_t flat_size, const InputT *input_data, OutputT *output_data)
Definition PALQuantize.h:35

References onert_micro::Ok, onert_micro::execute::pal::Quantize(), SISOHeader(), onert_micro::UnsupportedType, and onert_micro::core::QuantizationParams::zero_point.

◆ execute_kernel_CircleReduceProd()

OMStatus onert_micro::execute::execute_kernel_CircleReduceProd ( const OMExecuteArgs execute_args)

Definition at line 55 of file ReduceProd.cpp.

56{
57 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
58 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
59 uint16_t op_index = execute_args.kernel_index;
60
61 const circle::Tensor *input;
62 const circle::Tensor *axis;
63 const circle::Tensor *output;
64
65 uint8_t *input_data;
66 uint8_t *axis_data;
67 uint8_t *output_data;
68
69 uint16_t input_index = 0;
70 uint16_t axis_index = 0;
71
72 const circle::ReducerOptions *options;
73 // Read kernel
74 {
75 execute::OMRuntimeKernel runtime_kernel;
76 runtime_kernel.readKernel(op_index, runtime_context);
77
78 input = runtime_kernel.inputs[input1TensorIdx];
79 axis = runtime_kernel.inputs[input2TensorIdx];
80 output = runtime_kernel.outputs[outputTensorIdx];
81 assert(input != nullptr);
82 assert(axis != nullptr);
83 assert(output != nullptr);
84
85 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
86
87 input_data = runtime_kernel.inputs_data[input1TensorIdx];
88 axis_data = runtime_kernel.inputs_data[input2TensorIdx];
89 output_data = runtime_kernel.outputs_data[outputTensorIdx];
90 assert(input_data != nullptr);
91 assert(axis_data != nullptr);
92 assert(output_data != nullptr);
93
94 options = runtime_kernel.first_operator->builtin_options_as_ReducerOptions();
95
96 input_index = runtime_kernel.inputs_index[input1TensorIdx];
97 axis_index = runtime_kernel.inputs_index[input2TensorIdx];
98 }
99
100 OMStatus status;
101
102 core::OMRuntimeShape input_shape(input);
103 core::OMRuntimeShape axis_shape(axis);
105
106 switch (input->type())
107 {
108#ifndef DIS_FLOAT
109 case circle::TensorType_FLOAT32:
110 reduceProdGeneric<float>(input_shape, core::utils::castInputData<float>(input_data),
111 axis_shape, core::utils::castInputData<int>(axis_data), output_shape,
112 core::utils::castOutputData<float>(output_data),
113 options->keep_dims());
114 break;
115#endif // DIS_FLOAT
116 case circle::TensorType_INT32:
117 reduceProdGeneric<int32_t>(input_shape, core::utils::castInputData<int32_t>(input_data),
118 axis_shape, core::utils::castInputData<int>(axis_data),
119 output_shape, core::utils::castOutputData<int32_t>(output_data),
120 options->keep_dims());
121 break;
122 case circle::TensorType_INT64:
123 reduceProdGeneric<int64_t>(input_shape, core::utils::castInputData<int64_t>(input_data),
124 axis_shape, core::utils::castInputData<int>(axis_data),
125 output_shape, core::utils::castOutputData<int64_t>(output_data),
126 options->keep_dims());
127 break;
128 default:
129 assert(false && "Unsupported type");
130 }
131
132 return status;
133}

References onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMRuntimeKernel::inputs_index, onert_micro::execute::OMExecuteArgs::kernel_index, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, and onert_micro::execute::OMExecuteArgs::runtime_storage.

◆ execute_kernel_CircleRelu()

OMStatus onert_micro::execute::execute_kernel_CircleRelu ( const OMExecuteArgs execute_args)

Definition at line 28 of file Relu.cpp.

29{
30 bool is_relu_6 = false;
31 return execute_relu_common(execute_args, is_relu_6);
32}

References execute_relu_common().

◆ execute_kernel_CircleRelu6()

OMStatus onert_micro::execute::execute_kernel_CircleRelu6 ( const OMExecuteArgs execute_args)

Definition at line 28 of file Relu6.cpp.

29{
30 bool is_relu_6 = true;
31 return execute_relu_common(execute_args, is_relu_6);
32}

References execute_relu_common().

◆ execute_kernel_CircleReshape()

OMStatus onert_micro::execute::execute_kernel_CircleReshape ( const OMExecuteArgs execute_args)

Definition at line 36 of file Reshape.cpp.

37{
38 return execute_reshape_common(execute_args);
39}

References execute_reshape_common().

◆ execute_kernel_CircleRound()

OMStatus onert_micro::execute::execute_kernel_CircleRound ( const OMExecuteArgs execute_args)

Definition at line 29 of file Round.cpp.

30{
31 auto round_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Round(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, round_float_lambda);
37}
OMStatus Round(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), output_shape, and onert_micro::execute::pal::Round().

◆ execute_kernel_CircleRsqrt()

OMStatus onert_micro::execute::execute_kernel_CircleRsqrt ( const OMExecuteArgs execute_args)

Definition at line 29 of file Rsqrt.cpp.

30{
31 auto rsqrt_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Rsqrt(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, rsqrt_float_lambda);
37}
OMStatus Rsqrt(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), output_shape, and onert_micro::execute::pal::Rsqrt().

◆ execute_kernel_CircleSelectV2()

OMStatus onert_micro::execute::execute_kernel_CircleSelectV2 ( const OMExecuteArgs execute_args)

Definition at line 60 of file SelectV2.cpp.

61{
62 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
63 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
64 uint16_t op_index = execute_args.kernel_index;
65
66 const circle::Tensor *input_cond;
67 const circle::Tensor *input_x;
68 const circle::Tensor *input_y;
69 const circle::Tensor *output;
70
71 uint8_t *input_cond_data;
72 uint8_t *input_x_data;
73 uint8_t *input_y_data;
74 uint8_t *output_data;
75
76 OMStatus status = Ok;
77
78 // Read kernel
79 {
80 execute::OMRuntimeKernel runtime_kernel;
81 runtime_kernel.readKernel(op_index, runtime_context);
82
83 input_cond = runtime_kernel.inputs[inputCond];
84 input_x = runtime_kernel.inputs[inputX];
85 input_y = runtime_kernel.inputs[inputY];
86 output = runtime_kernel.outputs[outputIndex];
87
88 assert(input_cond != nullptr);
89 assert(input_x != nullptr);
90 assert(input_y != nullptr);
91 assert(output != nullptr);
92
93 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
94 if (status != Ok)
95 return status;
96
97 input_cond_data = runtime_kernel.inputs_data[inputCond];
98 input_x_data = runtime_kernel.inputs_data[inputX];
99 input_y_data = runtime_kernel.inputs_data[inputY];
100 output_data = runtime_kernel.outputs_data[outputIndex];
101
102 assert(input_cond_data != nullptr);
103 assert(input_x_data != nullptr);
104 assert(input_y_data != nullptr);
105 assert(output_data != nullptr);
106 }
107
108 const core::OMRuntimeShape input_cond_shape(input_cond);
109 assert(input_cond_shape.flatSize() > 0);
110 const core::OMRuntimeShape input_x_shape(input_x);
111 const core::OMRuntimeShape input_y_shape(input_y);
113
114 switch (input_x->type())
115 {
116#ifndef DIS_FLOAT
117 case circle::TensorType_FLOAT32:
118 {
119 CallSelect<float>(input_cond_shape, core::utils::castInputData<bool>(input_cond_data),
120 input_x_shape, core::utils::castInputData<float>(input_x_data),
121 input_y_shape, core::utils::castInputData<float>(input_y_data),
122 output_shape, core::utils::castOutputData<float>(output_data));
123 }
124 break;
125#endif
126 default:
127 {
128 status = UnsupportedType;
129 assert(false && "Unsupported type.");
130 }
131 }
132
133 return status;
134}

References onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleShape()

OMStatus onert_micro::execute::execute_kernel_CircleShape ( const OMExecuteArgs execute_args)

Definition at line 41 of file Shape.cpp.

42{
43 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
44 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
45 uint16_t op_index = execute_args.kernel_index;
46
47 const circle::Tensor *input = nullptr;
48 uint8_t *output_data = nullptr;
49
50 OMStatus status = Ok;
51 {
52 OMRuntimeKernel runtime_kernel;
53 runtime_kernel.readKernel(op_index, runtime_context);
54
55 input = runtime_kernel.inputs[inputTensorIdx];
56
57 assert(input != nullptr);
58
59 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
60 if (status != Ok)
61 return status;
62
63 output_data = runtime_kernel.outputs_data[outputTensorIdx];
64 }
65
66 assert(output_data != nullptr);
67
68 core::OMRuntimeShape input_shape(input);
69
70 const auto rank = input_shape.dimensionsCount();
71
72 auto output_data_int = core::utils::castOutputData<int32_t>(output_data);
73
74 for (int i = 0; i < rank; ++i)
75 {
76 output_data_int[i] = input_shape.dims(i);
77 }
78
79 return status;
80}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, and onert_micro::execute::OMExecuteArgs::runtime_storage.

◆ execute_kernel_CircleSin()

OMStatus onert_micro::execute::execute_kernel_CircleSin ( const OMExecuteArgs execute_args)

Definition at line 29 of file Sin.cpp.

30{
31 auto sin_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Sin(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, sin_float_lambda);
37}
OMStatus Sin(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), output_shape, and onert_micro::execute::pal::Sin().

◆ execute_kernel_CircleSlice()

OMStatus onert_micro::execute::execute_kernel_CircleSlice ( const OMExecuteArgs execute_args)

Definition at line 62 of file Slice.cpp.

63{
64 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
65 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
66 uint16_t op_index = execute_args.kernel_index;
67
68 const circle::Tensor *input1 = nullptr;
69 const circle::Tensor *input2 = nullptr;
70 const circle::Tensor *input3 = nullptr;
71
72 const circle::Tensor *output = nullptr;
73
74 uint8_t *input1_data;
75 const int32_t *input2_data;
76 const int32_t *input3_data;
77 uint8_t *output_data;
78
79 OMStatus status = Ok;
80 const circle::SliceOptions *options;
81 // Read kernel
82 {
83 execute::OMRuntimeKernel runtime_kernel;
84 runtime_kernel.readKernel(op_index, runtime_context);
85
86 input1 = runtime_kernel.inputs[input1TensorIdx];
87 input2 = runtime_kernel.inputs[input2TensorIdx];
88 input3 = runtime_kernel.inputs[input3TensorIdx];
89
90 output = runtime_kernel.outputs[outputTensorIdx];
91 assert(input1 != nullptr);
92 assert(input2 != nullptr);
93 assert(input3 != nullptr);
94 assert(output != nullptr);
95
96 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
97 if (status != Ok)
98 return status;
99
100 input1_data = runtime_kernel.inputs_data[input1TensorIdx];
101 input2_data = utils::castInputData<int32_t>(runtime_kernel.inputs_data[input2TensorIdx]);
102 input3_data = utils::castInputData<int32_t>(runtime_kernel.inputs_data[input3TensorIdx]);
103 output_data = runtime_kernel.outputs_data[outputTensorIdx];
104
105 assert(input1_data != nullptr);
106 assert(input2_data != nullptr);
107 assert(input3_data != nullptr);
108 assert(output_data != nullptr);
109
110 options = runtime_kernel.first_operator->builtin_options_as_SliceOptions();
111 }
112
113 OMRuntimeShape input_shape(input1);
114
115 SliceParams op_params{};
116 op_params.begin_count = MAX_DIM;
117 op_params.size_count = MAX_DIM;
118 for (int i = 0; i < MAX_DIM; i++)
119 {
120 op_params.begin[i] = 0;
121 op_params.size[i] = 1;
122 }
123 auto num_dim = input_shape.dimensionsCount();
124
125 getBeginAndSizeVectors(num_dim, input2_data, input3_data, op_params.begin, op_params.size);
126
127 switch (input1->type())
128 {
129#ifndef DIS_FLOAT
130 case circle::TensorType_FLOAT32:
131 {
132 status = pal::Slice(op_params, input_shape, utils::castInputData<float>(input1_data),
133 utils::castOutputData<float>(output_data));
134 }
135 break;
136#endif // DIS_FLOAT
137 case circle::TensorType_INT32:
138 {
139 status = pal::Slice(op_params, input_shape, utils::castInputData<int32_t>(input1_data),
140 utils::castOutputData<int32_t>(output_data));
141 }
142 break;
143 case circle::TensorType_INT64:
144 {
145 status = pal::Slice(op_params, input_shape, utils::castInputData<int64_t>(input1_data),
146 utils::castOutputData<int64_t>(output_data));
147 }
148 break;
149 default:
150 {
151 status = UnsupportedActivation;
152 assert(false && "Unsupported type.");
153 }
154 }
155
156 return status;
157}
void getBeginAndSizeVectors(int dimensions, const Tensor *begin, const Tensor *size, std::vector< int > *begins, std::vector< int > *sizes)
Definition Slice.cpp:64
OMStatus Slice(const core::SliceParams &op_params, const core::OMRuntimeShape &input_shape, const T *input_data, T *output_data)
Definition PALSlice.h:29

References onert_micro::core::SliceParams::begin_count, onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, onert_micro::execute::pal::Slice(), and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleSoftmax()

OMStatus onert_micro::execute::execute_kernel_CircleSoftmax ( const OMExecuteArgs execute_args)

Definition at line 57 of file Softmax.cpp.

58{
59 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
60 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
61 uint16_t op_index = execute_args.kernel_index;
62
63 const circle::Tensor *input = nullptr;
64 const circle::Tensor *output = nullptr;
65
66 uint8_t *input_data = nullptr;
67 uint8_t *output_data = nullptr;
68
69 OMStatus status = Ok;
70
71 const circle::SoftmaxOptions *options;
72 {
73 OMRuntimeKernel runtime_kernel;
74 runtime_kernel.readKernel(op_index, runtime_context);
75
76 input = runtime_kernel.inputs[inputTensorIdx];
77 output = runtime_kernel.outputs[outputTensorIdx];
78
79 assert(input != nullptr);
80 assert(output != nullptr);
81
82 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
83 if (status != Ok)
84 return status;
85
86 input_data = runtime_kernel.inputs_data[inputTensorIdx];
87 output_data = runtime_kernel.outputs_data[outputTensorIdx];
88
89 options = runtime_kernel.first_operator->builtin_options_as_SoftmaxOptions();
90 }
91
92 assert(input_data != nullptr);
93 assert(output_data != nullptr);
94
95 const float beta = options->beta();
96
97 core::OMRuntimeShape inputs_shape(input);
98 core::OMRuntimeShape outputs_shape(output);
99
100 const auto dim_count = inputs_shape.dimensionsCount();
101
102 const auto trailing_dim = dim_count - 1;
103
104 int flat_size = 1;
105 for (int i = 0; i < inputs_shape.dimensionsCount(); ++i)
106 {
107 flat_size *= (i == trailing_dim) ? 1 : inputs_shape.dims(i);
108 }
109
110 core::SoftmaxParams params{};
111 params.beta = beta;
112 params.num_rows = flat_size;
113 params.row_size = std::min(inputs_shape.dims(trailing_dim), outputs_shape.dims(trailing_dim));
114
115 switch (input->type())
116 {
117#ifndef DIS_FLOAT
118 case circle::TensorType_FLOAT32:
119 {
120
121 status = pal::Softmax(params, core::utils::castInputData<float>(input_data),
122 core::utils::castOutputData<float>(output_data));
123 }
124 break;
125#endif // DIS_FLOAT
126#ifndef DIS_QUANT
127 case circle::TensorType_INT8:
128 {
129 assert(output->type() == circle::TensorType_INT8);
130 if (output->type() != circle::TensorType_INT8)
131 return UnsupportedType;
132
133 assert(input->quantization() != nullptr and output->quantization() != nullptr);
134 assert(input->quantization()->scale() != nullptr and
135 output->quantization()->scale() != nullptr);
136 assert(input->quantization()->zero_point() != nullptr and
137 output->quantization()->zero_point() != nullptr);
138 assert(input->quantization()->scale()->size() == 1 and
139 output->quantization()->scale()->size() == 1);
140 assert(input->quantization()->zero_point()->size() == 1 and
141 output->quantization()->zero_point()->size() == 1);
142
143 params.output_scale = output->quantization()->scale()->operator[](0);
144 params.input_scale = input->quantization()->scale()->operator[](0);
145 params.output_zp = output->quantization()->zero_point()->operator[](0);
146 params.input_zp = input->quantization()->zero_point()->operator[](0);
147
148 int left_shift = 0;
149 preprocessSoftmaxScaling(static_cast<double>(params.beta),
150 static_cast<double>(params.input_scale), kScaledDiffIntegerBits,
151 &params.input_multiplier, &left_shift);
152 params.input_left_shift = left_shift;
153 params.diff_min = -1.0 * onert_micro::execute::calculateInputRadius(
154 kScaledDiffIntegerBits, params.input_left_shift, 31);
155
156 status = pal::Softmax(params, core::utils::castInputData<int8_t>(input_data),
157 core::utils::castOutputData<int8_t>(output_data));
158 }
159 break;
160#endif // DIS_QUANT
161 default:
162 {
163 status = UnsupportedType;
164 assert(false && "Unsupported type.");
165 }
166 }
167
168 return status;
169}
OMStatus Softmax(const core::SoftmaxParams &params, const T *input_data, U *output_data)
int calculateInputRadius(int input_integer_bits, int input_left_shift, int total_signed_bits)
Definition OMUtils.h:170

References onert_micro::core::SoftmaxParams::beta, calculateInputRadius(), onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, onert_micro::execute::pal::Softmax(), and onert_micro::UnsupportedType.

◆ execute_kernel_CircleSpaceToBatchND()

OMStatus onert_micro::execute::execute_kernel_CircleSpaceToBatchND ( const onert_micro::execute::OMExecuteArgs execute_args)

Definition at line 29 of file SpaceToBatchND.cpp.

30{
31 auto batch_to_space_float_lambda =
32 [](const core::OMRuntimeShape &input1_shape, const float *input1_data,
33 const core::OMRuntimeShape &input2_shape, const int32_t *block_shape_data,
34 const core::OMRuntimeShape &input3_shape, const int32_t *crops_data,
35 const core::OMRuntimeShape &output_shape, float *output_data) {
36 return pal::SpaceToBatchND<float>(input1_shape, input1_data, input2_shape, block_shape_data,
37 input3_shape, crops_data, output_shape, output_data);
38 };
39
40 return execute_spaces_batches_nd_common(execute_args, batch_to_space_float_lambda);
41}

References execute_spaces_batches_nd_common(), and output_shape.

◆ execute_kernel_CircleSpaceToDepth()

OMStatus onert_micro::execute::execute_kernel_CircleSpaceToDepth ( const onert_micro::execute::OMExecuteArgs execute_args)

Definition at line 38 of file SpaceToDepth.cpp.

39{
40 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
41 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
42 uint16_t op_index = execute_args.kernel_index;
43
44 const circle::Tensor *input;
45 const circle::Tensor *output;
46
47 uint8_t *input_data;
48 uint8_t *output_data;
49
50 // Read kernel
51 execute::OMRuntimeKernel runtime_kernel;
52 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
53 if (status != Ok)
54 return status;
55
56 input = runtime_kernel.inputs[inputTensorIdx];
57 output = runtime_kernel.outputs[outputTensorIdx];
58
59 core::OMRuntimeShape input_shape(input);
61
62 assert(input != nullptr);
63 assert(output != nullptr);
64
65 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
66 if (status != Ok)
67 return status;
68
69 input_data = runtime_kernel.inputs_data[inputTensorIdx];
70 output_data = runtime_kernel.outputs_data[outputTensorIdx];
71 const auto *options = runtime_kernel.first_operator->builtin_options_as_SpaceToDepthOptions();
72 const int32_t block_size = options->block_size();
73 switch (input->type())
74 {
75#ifndef DIS_FLOAT
76 case circle::TensorType_FLOAT32:
77 {
78 status =
79 pal::SpaceToDepth<float>(block_size, input_shape, reinterpret_cast<float *>(input_data),
80 output_shape, reinterpret_cast<float *>(output_data));
81 }
82 break;
83#endif // DIS_FLOAT
84#ifndef DIS_QUANT
85 case circle::TensorType_INT8:
86 {
87 status =
88 pal::SpaceToDepth<int8_t>(block_size, input_shape, reinterpret_cast<int8_t *>(input_data),
89 output_shape, reinterpret_cast<int8_t *>(output_data));
90 }
91 break;
92#endif // DIS_QUANT
93 default:
94 {
95 status = UnsupportedType;
96 assert(false && "Unsupported type.");
97 }
98 }
99
100 return status;
101}

References onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_kernel_CircleSplit()

OMStatus onert_micro::execute::execute_kernel_CircleSplit ( const OMExecuteArgs execute_args)

Definition at line 46 of file Split.cpp.

47{
48 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
49 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
50 uint16_t op_index = execute_args.kernel_index;
51
52 const circle::Tensor *input;
53 const circle::Tensor *axis;
54 const circle::Tensor *output;
55
56 uint8_t *input_data;
57 uint8_t *axis_data;
58
59 // Read kernel
60 const circle::SplitOptions *options;
61
62 core::SplitParams params{};
63 {
64 execute::OMRuntimeKernel runtime_kernel;
65 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
66 if (status != Ok)
67 return status;
68
69 input = runtime_kernel.inputs[inputTensorIdx];
70 axis = runtime_kernel.inputs[axisTensorIdx];
71 output = runtime_kernel.outputs[outputTensorIdx];
72 assert(input != nullptr);
73 assert(axis != nullptr);
74 assert(output != nullptr);
75
76 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
77 if (status != Ok)
78 return status;
79
80 input_data = runtime_kernel.inputs_data[inputTensorIdx];
81 axis_data = runtime_kernel.inputs_data[axisTensorIdx];
82 assert(input_data != nullptr);
83 assert(axis_data != nullptr);
84 options = runtime_kernel.first_operator->builtin_options_as_SplitOptions();
85
86 params.num_outputs = options->num_splits();
87
88 for (uint32_t i = 0; i < params.num_outputs; ++i)
89 {
90 params.output_data[i] = runtime_kernel.outputs_data[i];
91 }
92 }
93 OMStatus status;
94 OMRuntimeShape axis_shape(axis);
95 OMRuntimeShape input_shape(input);
97
98 int32_t axis_value = utils::castInputData<int32_t>(axis_data)[0];
99 if (axis_value < 0)
100 {
101 axis_value += input_shape.dimensionsCount() + 1;
102 }
103
104 switch (input->type())
105 {
106#ifndef DIS_FLOAT
107 case circle::TensorType_FLOAT32:
108 status = pal::Split<float>(params, input_shape, core::utils::castInputData<float>(input_data),
109 output_shape, axis_value);
110 break;
111#endif // DIS_FLOAT
112 default:
113 {
114 status = UnsupportedActivation;
115 assert(false && "Unsupported type.");
116 }
117 }
118
119 return status;
120}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleSplitV()

OMStatus onert_micro::execute::execute_kernel_CircleSplitV ( const OMExecuteArgs execute_args)

Definition at line 46 of file SplitV.cpp.

47{
48 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
49 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
50 uint16_t op_index = execute_args.kernel_index;
51
52 const circle::Tensor *input;
53 const circle::Tensor *axis;
54 const circle::Tensor *output;
55
56 uint8_t *input_data;
57 uint8_t *axis_data;
58
59 // Read kernel
60 core::SplitParams params{};
61 {
62 execute::OMRuntimeKernel runtime_kernel;
63 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
64 if (status != Ok)
65 return status;
66
67 input = runtime_kernel.inputs[inputTensorIdx];
68 axis = runtime_kernel.inputs[axisTensorIdx];
69 output = runtime_kernel.outputs[outputTensorIdx];
70 assert(input != nullptr);
71 assert(axis != nullptr);
72 assert(output != nullptr);
73
74 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
75 if (status != Ok)
76 return status;
77
78 input_data = runtime_kernel.inputs_data[inputTensorIdx];
79 axis_data = runtime_kernel.inputs_data[axisTensorIdx];
80 assert(input_data != nullptr);
81 assert(axis_data != nullptr);
82
83 params.num_outputs = runtime_kernel.outputs_num;
84
85 for (uint32_t i = 0; i < params.num_outputs; ++i)
86 {
87 params.output_data[i] = runtime_kernel.outputs_data[i];
88 }
89 }
90 OMStatus status;
91 OMRuntimeShape axis_shape(axis);
92 OMRuntimeShape input_shape(input);
94
95 int32_t axis_value = axis_data[0];
96 if (axis_value < 0)
97 {
98 axis_value += input_shape.dimensionsCount() + 1;
99 }
100
101 switch (input->type())
102 {
103#ifndef DIS_FLOAT
104 case circle::TensorType_FLOAT32:
105 status = pal::Split<float>(params, input_shape, core::utils::castInputData<float>(input_data),
106 output_shape, axis_value);
107 break;
108#endif // DIS_FLOAT
109 default:
110 {
111 status = UnsupportedActivation;
112 assert(false && "Unsupported type.");
113 }
114 }
115
116 return status;
117}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::outputs_num, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleSqrt()

OMStatus onert_micro::execute::execute_kernel_CircleSqrt ( const OMExecuteArgs execute_args)

Definition at line 29 of file Sqrt.cpp.

30{
31 auto sqrt_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Sqrt(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, sqrt_float_lambda);
37}
OMStatus Sqrt(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), output_shape, and onert_micro::execute::pal::Sqrt().

◆ execute_kernel_CircleSquare()

OMStatus onert_micro::execute::execute_kernel_CircleSquare ( const OMExecuteArgs execute_args)

Definition at line 29 of file Square.cpp.

30{
31 auto square_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Square(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, square_float_lambda);
37}
OMStatus Square(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), output_shape, and onert_micro::execute::pal::Square().

◆ execute_kernel_CircleSquaredDifference()

OMStatus onert_micro::execute::execute_kernel_CircleSquaredDifference ( const OMExecuteArgs execute_args)

Definition at line 50 of file SquaredDifference.cpp.

51{
52 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
53 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
54 uint16_t op_index = execute_args.kernel_index;
55
56 const circle::Tensor *input1;
57 const circle::Tensor *input2;
58 const circle::Tensor *output;
59
60 uint8_t *input1_data;
61 uint8_t *input2_data;
62 uint8_t *output_data;
63
64 // Read kernel
65 {
66 execute::OMRuntimeKernel runtime_kernel;
67 runtime_kernel.readKernel(op_index, runtime_context);
68
69 input1 = runtime_kernel.inputs[input1TensorIdx];
70 input2 = runtime_kernel.inputs[input2TensorIdx];
71 output = runtime_kernel.outputs[outputTensorIdx];
72 assert(input1 != nullptr);
73 assert(input2 != nullptr);
74 assert(output != nullptr);
75
76 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
77
78 input1_data = runtime_kernel.inputs_data[input1TensorIdx];
79 input2_data = runtime_kernel.inputs_data[input2TensorIdx];
80 output_data = runtime_kernel.outputs_data[outputTensorIdx];
81 assert(input1_data != nullptr);
82 assert(input2_data != nullptr);
83 assert(output_data != nullptr);
84 }
85
86 OMStatus status;
87
88 core::OMRuntimeShape input1_shape(input1);
89 core::OMRuntimeShape input2_shape(input2);
91
93 const bool need_broadcast = pal::processBroadcastShapes(input1_shape, input2_shape, &params);
94
95 switch (input1->type())
96 {
97#ifndef DIS_FLOAT
98 case circle::TensorType_FLOAT32:
99 {
101 circle::ActivationFunctionType::ActivationFunctionType_NONE, &params.float_activation_min,
102 &params.float_activation_max);
103 if (need_broadcast)
104 {
106 params, input1_shape, core::utils::castInputData<float>(input1_data), input2_shape,
107 core::utils::castInputData<float>(input2_data), output_shape,
108 core::utils::castOutputData<float>(output_data));
109 }
110 else
111 {
112 status = pal::SquaredDifference(params, input1_shape.flatSize(),
113 core::utils::castInputData<float>(input1_data),
114 core::utils::castInputData<float>(input2_data),
115 core::utils::castOutputData<float>(output_data));
116 }
117 }
118 break;
119#endif // DIS_FLOAT
120 default:
121 {
122 status = UnsupportedType;
123 assert(false && "Unsupported type.");
124 }
125 }
126
127 return status;
128}
OMStatus BroadcastSquaredDifference4DSlow(const core::BinaryArithmeticBroadcastParams &params, const core::OMRuntimeShape &input1_shape, const T *input1_data, const core::OMRuntimeShape &input2_shape, const T *input2_data, const core::OMRuntimeShape &output_shape, T *output_data)
OMStatus SquaredDifference(const core::BinaryArithmeticBroadcastParams &params, const int flat_size, const T *input1_data, const T *input2_data, T *output_data)

References onert_micro::execute::pal::BroadcastSquaredDifference4DSlow(), calculateActivationRange(), onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::pal::processBroadcastShapes(), onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, onert_micro::execute::pal::SquaredDifference(), and onert_micro::UnsupportedType.

◆ execute_kernel_CircleStridedSlice()

OMStatus onert_micro::execute::execute_kernel_CircleStridedSlice ( const OMExecuteArgs execute_args)

Definition at line 74 of file StridedSlice.cpp.

75{
76 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
77 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
78 uint16_t op_index = execute_args.kernel_index;
79
80 const circle::Tensor *input = nullptr;
81 const circle::Tensor *begin = nullptr;
82 const circle::Tensor *end = nullptr;
83 const circle::Tensor *strides = nullptr;
84
85 const circle::Tensor *output = nullptr;
86
87 uint8_t *input_data;
88 const int32_t *begin_data;
89 const int32_t *end_data;
90 const int32_t *strides_data;
91 uint8_t *output_data;
92
93 OMStatus status = Ok;
94 const circle::StridedSliceOptions *options;
95 // Read kernel
96 {
97 execute::OMRuntimeKernel runtime_kernel;
98 runtime_kernel.readKernel(op_index, runtime_context);
99
100 input = runtime_kernel.inputs[inputTensorIdx];
101 begin = runtime_kernel.inputs[beginTensorIdx];
102 end = runtime_kernel.inputs[endTensorIdx];
103 strides = runtime_kernel.inputs[stridesTensorIdx];
104
105 output = runtime_kernel.outputs[outputTensorIdx];
106 assert(input != nullptr);
107 assert(begin != nullptr);
108 assert(end != nullptr);
109 assert(strides != nullptr);
110 assert(output != nullptr);
111
112 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
113 if (status != Ok)
114 return status;
115
116 input_data = runtime_kernel.inputs_data[inputTensorIdx];
117 begin_data = utils::castInputData<int32_t>(runtime_kernel.inputs_data[beginTensorIdx]);
118 end_data = utils::castInputData<int32_t>(runtime_kernel.inputs_data[endTensorIdx]);
119 strides_data = utils::castInputData<int32_t>(runtime_kernel.inputs_data[stridesTensorIdx]);
120 output_data = runtime_kernel.outputs_data[outputTensorIdx];
121
122 assert(input_data != nullptr);
123 assert(begin_data != nullptr);
124 assert(end_data != nullptr);
125 assert(strides_data != nullptr);
126 assert(output_data != nullptr);
127
128 options = runtime_kernel.first_operator->builtin_options_as_StridedSliceOptions();
129 }
130
131 core::OMRuntimeShape input_shape(input);
132
133 auto op_params = buildStridedSliceParams(input_shape.dimensionsCount(), begin_data, end_data,
134 strides_data, options);
135
136 switch (input->type())
137 {
138#ifndef DIS_FLOAT
139 case circle::TensorType_FLOAT32:
140 {
141 status = pal::StridedSlice(op_params, input_shape, utils::castInputData<float>(input_data),
142 utils::castOutputData<float>(output_data));
143 }
144 break;
145#endif // DIS_FLOAT
146#ifndef DIS_QUANT
147 case circle::TensorType_INT8:
148 {
149 status = pal::StridedSlice(op_params, input_shape, utils::castInputData<int8_t>(input_data),
150 utils::castOutputData<int8_t>(output_data));
151 }
152 break;
153#endif // DIS_QUANT
154 case circle::TensorType_INT32:
155 {
156 status = pal::StridedSlice(op_params, input_shape, utils::castInputData<int32_t>(input_data),
157 utils::castOutputData<int32_t>(output_data));
158 }
159 break;
160 default:
161 {
162 status = UnsupportedActivation;
163 assert(false && "Unsupported type.");
164 }
165 }
166
167 return status;
168}
OMStatus StridedSlice(core::StridedSliceParams &op_params, const core::OMRuntimeShape &unextended_input_shape, const T *input_data, T *output_data)
int32_t begin[5]
Definition Slice.cpp:33

References begin, onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, onert_micro::execute::pal::StridedSlice(), and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleSub()

OMStatus onert_micro::execute::execute_kernel_CircleSub ( const OMExecuteArgs execute_args)

Definition at line 50 of file Sub.cpp.

51{
52 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
53 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
54 uint16_t op_index = execute_args.kernel_index;
55
56 const circle::Tensor *input1;
57 const circle::Tensor *input2;
58 const circle::Tensor *output;
59
60 uint8_t *input1_data;
61 uint8_t *input2_data;
62 uint8_t *output_data;
63
64 const circle::SubOptions *options;
65 // Read kernel
66 {
67 execute::OMRuntimeKernel runtime_kernel;
68 runtime_kernel.readKernel(op_index, runtime_context);
69
70 input1 = runtime_kernel.inputs[input1TensorIdx];
71 input2 = runtime_kernel.inputs[input2TensorIdx];
72 output = runtime_kernel.outputs[outputTensorIdx];
73 assert(input1 != nullptr);
74 assert(input2 != nullptr);
75 assert(output != nullptr);
76
77 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
78
79 input1_data = runtime_kernel.inputs_data[input1TensorIdx];
80 input2_data = runtime_kernel.inputs_data[input2TensorIdx];
81 output_data = runtime_kernel.outputs_data[outputTensorIdx];
82 assert(input1_data != nullptr);
83 assert(input2_data != nullptr);
84 assert(output_data != nullptr);
85
86 options = runtime_kernel.first_operator->builtin_options_as_SubOptions();
87 }
88
89 OMStatus status;
90
91 core::OMRuntimeShape input1_shape(input1);
92 core::OMRuntimeShape input2_shape(input2);
94
96 const bool need_broadcast = pal::processBroadcastShapes(input1_shape, input2_shape, &params);
97
98 switch (input1->type())
99 {
100#ifndef DIS_FLOAT
101 case circle::TensorType_FLOAT32:
102 {
103 status = execute::calculateActivationRange(options->fused_activation_function(),
104 &params.float_activation_min,
105 &params.float_activation_max);
106
107 if (need_broadcast)
108 {
110 params, input1_shape, core::utils::castInputData<float>(input1_data), input2_shape,
111 core::utils::castInputData<float>(input2_data), output_shape,
112 core::utils::castOutputData<float>(output_data));
113 }
114 else
115 {
116 status =
117 pal::Sub(params, input1_shape.flatSize(), core::utils::castInputData<float>(input1_data),
118 core::utils::castInputData<float>(input2_data),
119 core::utils::castOutputData<float>(output_data));
120 }
121 }
122 break;
123 case circle::TensorType_INT64:
124 {
125 status = execute::calculateActivationRange(options->fused_activation_function(),
126 &params.int64_activation_min,
127 &params.int64_activation_max);
128
129 if (need_broadcast)
130 {
132 params, input1_shape, core::utils::castInputData<int64_t>(input1_data), input2_shape,
133 core::utils::castInputData<int64_t>(input2_data), output_shape,
134 core::utils::castOutputData<int64_t>(output_data));
135 }
136 else
137 {
138 status = pal::Sub(params, input1_shape.flatSize(),
139 core::utils::castInputData<int64_t>(input1_data),
140 core::utils::castInputData<int64_t>(input2_data),
141 core::utils::castOutputData<int64_t>(output_data));
142 }
143 }
144 break;
145 case circle::TensorType_INT32:
146 {
147 status = execute::calculateActivationRange(options->fused_activation_function(),
148 &params.int32_activation_min,
149 &params.int32_activation_max);
150
151 if (need_broadcast)
152 {
154 params, input1_shape, core::utils::castInputData<int32_t>(input1_data), input2_shape,
155 core::utils::castInputData<int32_t>(input2_data), output_shape,
156 core::utils::castOutputData<int32_t>(output_data));
157 }
158 else
159 {
160 status = pal::Sub(params, input1_shape.flatSize(),
161 core::utils::castInputData<int32_t>(input1_data),
162 core::utils::castInputData<int32_t>(input2_data),
163 core::utils::castOutputData<int32_t>(output_data));
164 }
165 }
166 break;
167#endif // DIS_FLOAT
168#ifndef DIS_QUANT
169 case circle::TensorType_INT8:
170 {
171 core::ArithmeticQuantParams sub_params{};
172
173 calculateQuantParams(sub_params, input1, input2, output,
174 options->fused_activation_function());
175
176 if (need_broadcast)
177 {
179 sub_params, input1_shape, core::utils::castInputData<int8_t>(input1_data), input2_shape,
180 core::utils::castInputData<int8_t>(input2_data), output_shape,
181 core::utils::castOutputData<int8_t>(output_data));
182 }
183 else
184 {
185 status = pal::Sub(sub_params, input1_shape.flatSize(),
186 core::utils::castInputData<int8_t>(input1_data),
187 core::utils::castInputData<int8_t>(input2_data),
188 core::utils::castOutputData<int8_t>(output_data));
189 }
190 }
191 break;
192#endif // DIF_QUANT
193 default:
194 {
195 status = UnsupportedType;
196 assert(false && "Unsupported type.");
197 }
198 }
199
200 return status;
201}
OMStatus Sub(const core::BinaryArithmeticBroadcastParams &params, const int flat_size, const T *input1_data, const T *input2_data, T *output_data)
OMStatus BroadcastSub4DSlow(const core::BinaryArithmeticBroadcastParams &params, const core::OMRuntimeShape &input1_shape, const T *input1_data, const core::OMRuntimeShape &input2_shape, const T *input2_data, const core::OMRuntimeShape &output_shape, T *output_data)

References onert_micro::execute::pal::BroadcastSub4DSlow(), calculateActivationRange(), calculateQuantParams(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::pal::processBroadcastShapes(), onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, onert_micro::execute::pal::Sub(), and onert_micro::UnsupportedType.

◆ execute_kernel_CircleSum()

OMStatus onert_micro::execute::execute_kernel_CircleSum ( const OMExecuteArgs execute_args)

Definition at line 44 of file Sum.cpp.

45{
46 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
47 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
48 uint16_t op_index = execute_args.kernel_index;
49
50 const circle::Tensor *input;
51 const circle::Tensor *axis;
52 const circle::Tensor *output;
53
54 uint8_t *input_data;
55 uint8_t *axis_data;
56 uint8_t *output_data;
57
58 uint16_t input_index = 0;
59 uint16_t axis_index = 0;
60
61 const circle::ReducerOptions *options;
62 // Read kernel
63 {
64 execute::OMRuntimeKernel runtime_kernel;
65 runtime_kernel.readKernel(op_index, runtime_context);
66
67 input = runtime_kernel.inputs[input1TensorIdx];
68 axis = runtime_kernel.inputs[input2TensorIdx];
69 output = runtime_kernel.outputs[outputTensorIdx];
70 assert(input != nullptr);
71 assert(axis != nullptr);
72 assert(output != nullptr);
73
74 runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
75
76 input_data = runtime_kernel.inputs_data[input1TensorIdx];
77 axis_data = runtime_kernel.inputs_data[input2TensorIdx];
78 output_data = runtime_kernel.outputs_data[outputTensorIdx];
79 assert(input_data != nullptr);
80 assert(axis_data != nullptr);
81 assert(output_data != nullptr);
82
83 options = runtime_kernel.first_operator->builtin_options_as_ReducerOptions();
84
85 input_index = runtime_kernel.inputs_index[input1TensorIdx];
86 axis_index = runtime_kernel.inputs_index[input2TensorIdx];
87 }
88
89 OMStatus status;
90
91 core::OMRuntimeShape input_shape(input);
92 core::OMRuntimeShape axis_shape(axis);
94
95 switch (input->type())
96 {
97#ifndef DIS_FLOAT
98 case circle::TensorType_FLOAT32:
99 onert_micro::execute::pal::reduceSumImpl<float>(
100 core::utils::castInputData<float>(input_data), input_shape.dimsData(),
101 input_shape.dimensionsCount(), core::utils::castOutputData<float>(output_data),
102 core::utils::castInputData<int>(axis_data), axis_shape.dimensionsCount(),
104 break;
105#endif // DIS_FLOAT
106 case circle::TensorType_INT32:
107 break;
108 case circle::TensorType_INT64:
109 break;
110 default:
111 assert(false && "Unsupported type");
112 }
113
114 return status;
115}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dimsData(), onert_micro::execute::OMRuntimeKernel::first_operator, luci_interpreter::RuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMRuntimeKernel::inputs_index, onert_micro::execute::OMExecuteArgs::kernel_index, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, and onert_micro::execute::OMExecuteArgs::runtime_storage.

◆ execute_kernel_CircleSVDF()

OMStatus onert_micro::execute::execute_kernel_CircleSVDF ( const OMExecuteArgs execute_args)

Definition at line 84 of file SVDF.cpp.

85{
86 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
87 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
88 uint16_t op_index = execute_args.kernel_index;
89
90 const circle::Tensor *input;
91 const circle::Tensor *weights_feature;
92 const circle::Tensor *weights_time;
93 const circle::Tensor *bias;
94 const circle::Tensor *activation_state;
95
96 const circle::Tensor *output;
97
98 uint8_t *input_data;
99 uint8_t *weights_feature_data;
100 uint8_t *weights_time_data;
101 uint8_t *bias_data;
102 uint8_t *activation_state_data;
103 uint8_t *output_data;
104 const circle::SVDFOptions *options = nullptr;
105 // Read kernel
106 {
107 execute::OMRuntimeKernel runtime_kernel;
108 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
109 if (status != Ok)
110 return status;
111
112 input = runtime_kernel.inputs[inputTensorIdx];
113 weights_feature = runtime_kernel.inputs[weightsFeatureTensorIdx];
114 weights_time = runtime_kernel.inputs[weightsTimeTensorIdx];
115 bias = runtime_kernel.inputs[biasTensorIdx];
116 activation_state = runtime_kernel.inputs[inputActivationStateTensorIdx];
117
118 output = runtime_kernel.outputs[outputTensorIdx];
119
120 assert(input != nullptr);
121 assert(weights_feature != nullptr);
122 assert(weights_time != nullptr);
123 // bias can be nullptr
124 assert(activation_state != nullptr);
125 assert(output != nullptr);
126
127 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
128 if (status != Ok)
129 return status;
130
131 input_data = runtime_kernel.inputs_data[inputTensorIdx];
132 weights_feature_data = runtime_kernel.inputs_data[weightsFeatureTensorIdx];
133 weights_time_data = runtime_kernel.inputs_data[weightsTimeTensorIdx];
134 bias_data = runtime_kernel.inputs_data[biasTensorIdx];
135 activation_state_data = runtime_kernel.inputs_data[inputActivationStateTensorIdx];
136 output_data = runtime_kernel.outputs_data[outputTensorIdx];
137
138 assert(input_data != nullptr);
139 assert(weights_feature_data != nullptr);
140 assert(weights_time_data != nullptr);
141 // bias can be nullptr
142 assert(output_data != nullptr);
143
144 options = runtime_kernel.first_operator->builtin_options_as_SVDFOptions();
145 }
146
147 OMStatus status;
148 OMRuntimeShape input_shape(input);
149 OMRuntimeShape weights_feature_shape(weights_feature);
150 OMRuntimeShape weights_time_shape(weights_time);
151 OMRuntimeShape activation_state_shape(activation_state);
153
154 // Define input constants based on input tensor definition above:
155 const int rank = options->rank();
156 const int input_size = input_shape.dims(1);
157 const int batch_size = input_shape.dims(0);
158 const int num_filters = weights_feature_shape.dims(0);
159
160 const int num_units = num_filters / rank;
161 const int memory_size = weights_time_shape.dims(1);
162
163 const auto activation_state_size =
164 activation_state_shape.flatSize() * sizeof(core::OMDataType(output->type()));
165 status =
166 core::memory::OMMemoryManager::allocateMemory(activation_state_size, &activation_state_data);
167 if (status != Ok)
168 return status;
169
170 std::memset(activation_state_data, 0, activation_state_size);
171
172 switch (input->type())
173 {
174#ifndef DIS_FLOAT
175 case circle::TensorType_FLOAT32:
176 {
177 // Temporary buffer
178 uint8_t *scratch_buffer;
180 batch_size * num_filters * sizeof(core::OMDataType(output->type())), &scratch_buffer);
181
182 assert(status == Ok);
183 if (status != Ok)
184 return status;
185 status = pal::SVDF(
186 utils::castInputData<float>(input_data), utils::castInputData<float>(weights_feature_data),
187 utils::castInputData<float>(weights_time_data), utils::castInputData<float>(bias_data),
188 utils::castOutputData<float>(activation_state_data),
189 utils::castOutputData<float>(scratch_buffer), utils::castOutputData<float>(output_data),
190 rank, input_size, batch_size, num_filters, num_units, memory_size,
191 options->fused_activation_function());
192
194 }
195 break;
196#endif // DIS_FLOAT
197#ifndef DIS_QUANT
198 case circle::TensorType_INT8:
199 {
200 core::SVDFQuantParams params{};
201 prepareQuantParams(params, input, weights_feature, weights_time, activation_state, output);
202
203 params.rank = rank;
204
205 status = pal::SVDF(
206 params, utils::castInputData<int8_t>(input_data),
207 utils::castInputData<int8_t>(weights_feature_data),
208 utils::castInputData<int8_t>(weights_time_data), utils::castInputData<int32_t>(bias_data),
209 utils::castOutputData<int8_t>(activation_state_data),
210 utils::castOutputData<int8_t>(output_data), input_shape, weights_feature_shape,
211 weights_time_shape, core::OMRuntimeShape(bias), output_shape);
212 }
213 break;
214#endif // DIS_QUANT
215 default:
216 {
217 status = UnsupportedActivation;
218 assert(false && "Unsupported type.");
219 break;
220 }
221 }
222
223 status = core::memory::OMMemoryManager::deallocateMemory(activation_state_data);
224
225 return status;
226}
OMStatus SVDF(const core::SVDFQuantParams &params, const int8_t *input_data, const int8_t *weights_feature_data, const int8_t *weights_time_data, const int32_t *bias_data, int8_t *state_data, int8_t *output_data, const core::OMRuntimeShape &input_shape, const core::OMRuntimeShape &weights_feature_shape, const core::OMRuntimeShape &weights_time_shape, const core::OMRuntimeShape &bias_shape, const core::OMRuntimeShape &output_shape)
Definition PALSVDF.h:35

References onert_micro::core::memory::OMMemoryManager::allocateMemory(), onert_micro::core::memory::OMMemoryManager::deallocateMemory(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::core::SVDFQuantParams::rank, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, onert_micro::execute::pal::SVDF(), and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleTanh()

OMStatus onert_micro::execute::execute_kernel_CircleTanh ( const OMExecuteArgs execute_args)

Definition at line 29 of file Tanh.cpp.

30{
31 auto tanh_float_lambda = [](const core::OMRuntimeShape &input_shape, const float *input_data,
32 const core::OMRuntimeShape &output_shape, float *output_data) {
33 return pal::Tanh(input_shape, input_data, output_shape, output_data);
34 };
35
36 return execute_math_common(execute_args, tanh_float_lambda);
37}
OMStatus Tanh(const core::OMRuntimeShape &input_shape, const T *input_data, const core::OMRuntimeShape &output_shape, T *output_data)

References execute_math_common(), output_shape, and onert_micro::execute::pal::Tanh().

◆ execute_kernel_CircleTranspose()

OMStatus onert_micro::execute::execute_kernel_CircleTranspose ( const OMExecuteArgs execute_args)

Definition at line 45 of file Transpose.cpp.

46{
47 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
48 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
49 uint16_t op_index = execute_args.kernel_index;
50
51 const circle::Tensor *input;
52 const circle::Tensor *perm;
53 const circle::Tensor *output;
54
55 uint8_t *input_data;
56 uint8_t *perm_data;
57 uint8_t *output_data;
58
59 // Read kernel
60 {
61 execute::OMRuntimeKernel runtime_kernel;
62 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
63 if (status != Ok)
64 return status;
65
66 input = runtime_kernel.inputs[kInputTensorIdx];
67 perm = runtime_kernel.inputs[kPermTensorIdx];
68 output = runtime_kernel.outputs[kOutputTensorIdx];
69 assert(input != nullptr);
70 assert(perm != nullptr);
71 assert(output != nullptr);
72
73 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
74 if (status != Ok)
75 return status;
76
77 input_data = runtime_kernel.inputs_data[kInputTensorIdx];
78 perm_data = runtime_kernel.inputs_data[kPermTensorIdx];
79 output_data = runtime_kernel.outputs_data[kOutputTensorIdx];
80 assert(input_data != nullptr);
81 assert(perm_data != nullptr);
82 assert(output_data != nullptr);
83 }
84 OMStatus status;
85 OMRuntimeShape perm_shape(perm);
86 OMRuntimeShape input_shape(input);
88
89 for (int idx = 0; idx < input_shape.dimensionsCount(); ++idx)
90 assert(reinterpret_cast<int32_t *>(perm_data)[idx] >= 0 and
91 perm_data[idx] < input_shape.dimensionsCount());
92
94 params.perm_count = perm_shape.dims(0);
95 for (int i = 0; i < params.perm_count; ++i)
96 params.perm[i] = reinterpret_cast<int32_t *>(perm_data)[i];
97
98 switch (input->type())
99 {
100#ifndef DIS_FLOAT
101 case circle::TensorType_FLOAT32:
102 status = pal::Transpose<float>(params, input_shape, reinterpret_cast<float *>(input_data),
103 output_shape, reinterpret_cast<float *>(output_data));
104 break;
105#endif // DIS_FLOAT
106 default:
107 {
108 status = UnsupportedActivation;
109 assert(false && "Unsupported type.");
110 }
111 }
112
113 return status;
114}

References onert_micro::core::OMRuntimeShape::dimensionsCount(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::core::TransposeParams::perm, onert_micro::core::TransposeParams::perm_count, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleTransposeConv()

OMStatus onert_micro::execute::execute_kernel_CircleTransposeConv ( const OMExecuteArgs execute_args)

Definition at line 53 of file TransposeConv.cpp.

54{
55 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
56 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
57 uint16_t op_index = execute_args.kernel_index;
58
59 const circle::Tensor *input;
60 const circle::Tensor *weight;
61 const circle::Tensor *output;
62
63 uint8_t *input_data;
64 uint8_t *weight_data;
65 uint8_t *bias_data;
66 uint8_t *output_data;
67
68 const circle::TransposeConvOptions *options;
69 // Read kernel
70 {
71 execute::OMRuntimeKernel runtime_kernel;
72 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
73 if (status != Ok)
74 return status;
75
76 input = runtime_kernel.inputs[kInputTensorIdx];
77 weight = runtime_kernel.inputs[kWeightTensorIdx];
78 output = runtime_kernel.outputs[kOutputTensorIdx];
79 assert(input != nullptr);
80 assert(weight != nullptr);
81 // Bias can be nullptr
82 assert(output != nullptr);
83
84 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
85 if (status != Ok)
86 return status;
87
88 input_data = runtime_kernel.inputs_data[kInputTensorIdx];
89 weight_data = runtime_kernel.inputs_data[kWeightTensorIdx];
90 bias_data = runtime_kernel.inputs_data[kBiasTensorIdx];
91 output_data = runtime_kernel.outputs_data[kOutputTensorIdx];
92 assert(input_data != nullptr);
93 assert(weight_data != nullptr);
94 // Bias can be nullptr
95 assert(output_data != nullptr);
96
97 options = runtime_kernel.first_operator->builtin_options_as_TransposeConvOptions();
98 }
99
100 OMStatus status;
101
102 int32_t padding_h = 0;
103 int32_t padding_w = 0;
104
105 OMRuntimeShape weight_shape(weight);
106 OMRuntimeShape input_shape(input);
107
108 const int input_width = input_shape.dims(2);
109 const int input_height = input_shape.dims(1);
110 const int weight_width = weight_shape.dims(2);
111 const int weight_height = weight_shape.dims(1);
112
113 // Note: Dilation height and width are always 1 for transpose_conv
114 execute::computePaddingHeightWidth(options->stride_h(), options->stride_w(), 1, 1, input_height,
115 input_width, weight_height, weight_width, options->padding(),
116 &padding_h, &padding_w);
117
118 switch (input->type())
119 {
120#ifndef DIS_FLOAT
121 case circle::TensorType_FLOAT32:
122 {
123
124 FloatConv2D params{};
125 status = calculateActivationRange(options->fused_activation_function(),
126 &params.activation_min, &params.activation_max);
127 params.stride_w = options->stride_w();
128 params.stride_h = options->stride_h();
129 params.dilation_width_factor = 1;
130 params.dilation_height_factor = 1;
131 params.pad_h = padding_h;
132 params.pad_w = padding_w;
133
134 if (status != Ok)
135 return status;
136
138 &params, input_shape, core::utils::castInputData<float>(input_data), weight_shape,
139 core::utils::castInputData<float>(weight_data),
140 core::utils::castInputData<float>(bias_data), OMRuntimeShape(output),
141 core::utils::castOutputData<float>(output_data));
142 assert(status == Ok);
143 }
144 break;
145#endif // DIS_FLOAT
146 default:
147 {
148 status = UnsupportedActivation;
149 assert(false && "Unsupported type.");
150 }
151 }
152
153 return status;
154}
OMStatus TransposeConv< float >(const core::FloatConv2D *params, const core::OMRuntimeShape &input_shape, const float *input_data, const core::OMRuntimeShape &filter_shape, const float *filter_data, const float *bias_data, const core::OMRuntimeShape &output_shape, float *output_data)

References calculateActivationRange(), computePaddingHeightWidth(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, onert_micro::execute::pal::TransposeConv< float >(), and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleUnpack()

OMStatus onert_micro::execute::execute_kernel_CircleUnpack ( const OMExecuteArgs execute_args)

Definition at line 45 of file Unpack.cpp.

46{
47 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
48 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
49 uint16_t op_index = execute_args.kernel_index;
50
51 const circle::Tensor *input;
52 const circle::Tensor *output;
53
54 uint8_t *input_data;
55
56 // Read kernel
57 const circle::UnpackOptions *options;
58
59 core::SplitParams params{};
60 {
61 execute::OMRuntimeKernel runtime_kernel;
62 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
63 if (status != Ok)
64 return status;
65
66 input = runtime_kernel.inputs[inputTensorIdx];
67 output = runtime_kernel.outputs[outputTensorIdx];
68 assert(input != nullptr);
69 assert(output != nullptr);
70
71 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
72 if (status != Ok)
73 return status;
74
75 input_data = runtime_kernel.inputs_data[inputTensorIdx];
76 assert(input_data != nullptr);
77 options = runtime_kernel.first_operator->builtin_options_as_UnpackOptions();
78
79 params.num_outputs = options->num();
80
81 for (uint32_t i = 0; i < params.num_outputs; ++i)
82 {
83 params.output_data[i] = runtime_kernel.outputs_data[i];
84 }
85 }
86 OMStatus status;
87 OMRuntimeShape input_shape(input);
89
90 int32_t axis_value = options->axis();
91
92 switch (input->type())
93 {
94#ifndef DIS_FLOAT
95 case circle::TensorType_FLOAT32:
96 status =
97 pal::Unpack<float>(params, input_shape, core::utils::castInputData<float>(input_data),
98 output_shape, axis_value);
99 break;
100#endif // DIS_FLOAT
101#ifndef DIS_QUANT
102 case circle::TensorType_INT8:
103 status =
104 pal::Unpack<int8_t>(params, input_shape, core::utils::castInputData<int8_t>(input_data),
105 output_shape, axis_value);
106 break;
107#endif // DIS_QUANT
108 default:
109 {
110 status = UnsupportedActivation;
111 assert(false && "Unsupported type.");
112 }
113 }
114
115 return status;
116}

References onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedActivation.

◆ execute_kernel_CircleWhile()

OMStatus onert_micro::execute::execute_kernel_CircleWhile ( const OMExecuteArgs execute_args)

Definition at line 33 of file While.cpp.

34{
35 core::OMRuntimeModule &runtime_module = execute_args.runtime_module;
36 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
37 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
38 uint16_t op_index = execute_args.kernel_index;
39
40 OMRuntimeKernel runtime_kernel;
41 runtime_kernel.readKernel(op_index, runtime_context);
42 auto options = runtime_kernel.first_operator->builtin_options_as_WhileOptions();
43
44 // Obtain conditional and body runtime subgraphs
45 const auto body_subgraph_index = options->body_subgraph_index();
46 const auto cond_subgraph_index = options->cond_subgraph_index();
47 core::OMRuntimeGraph *cond_runtime_graph = nullptr;
48 core::OMRuntimeGraph *body_runtime_graph = nullptr;
49 runtime_module.getRuntimeGraphAt(cond_subgraph_index, &cond_runtime_graph);
50 runtime_module.getRuntimeGraphAt(body_subgraph_index, &body_runtime_graph);
51
52 core::OMRuntimeContext &cond_runtime_context = cond_runtime_graph->getRuntimeContext();
53 core::OMRuntimeStorage &cond_runtime_storage = cond_runtime_graph->getRuntimeStorage();
54 core::memory::OMRuntimeAllocator &cond_runtime_allocator =
55 cond_runtime_graph->getRuntimeAllocator();
56
57 core::OMRuntimeContext &body_runtime_context = body_runtime_graph->getRuntimeContext();
58 core::OMRuntimeStorage &body_runtime_storage = body_runtime_graph->getRuntimeStorage();
59 core::memory::OMRuntimeAllocator &body_runtime_allocator =
60 body_runtime_graph->getRuntimeAllocator();
61
62 OMStatus status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
63 if (status != Ok)
64 return status;
65
66 // Copy input data to the output
67 assert(runtime_kernel.inputs_num == runtime_kernel.outputs_num);
68 for (uint32_t i = 0; i < runtime_kernel.inputs_num; ++i)
69 {
70 const auto cur_input_tensor = runtime_kernel.inputs[i];
71 const auto input_data_size = sizeof(core::OMDataType(cur_input_tensor->type())) *
72 core::OMRuntimeShape(cur_input_tensor).flatSize();
73 std::memcpy(runtime_kernel.outputs_data[i], runtime_kernel.inputs_data[i], input_data_size);
74 }
75
76 do
77 {
78 // Handle conditional graph
79 {
80 // Allocate cond graph inputs
81 cond_runtime_graph->allocateGraphInputs();
82 auto cond_graphs_inputs = cond_runtime_graph->getNumberOfInputs();
83 for (uint32_t i = 0; i < cond_graphs_inputs; ++i)
84 {
85 auto *cur_cond_input_data =
86 reinterpret_cast<uint8_t *>(cond_runtime_graph->getInputDataAt(i));
87 uint8_t *cur_main_input_data = runtime_kernel.outputs_data[i];
88 assert(cur_main_input_data != nullptr);
89 assert(cur_cond_input_data != nullptr);
90 const auto cur_input_tensor = runtime_kernel.inputs[i];
91 const auto input_data_size = sizeof(core::OMDataType(cur_input_tensor->type())) *
92 core::OMRuntimeShape(cur_input_tensor).flatSize();
93 std::memcpy(cur_cond_input_data, cur_main_input_data, input_data_size);
94 }
95 // Run cond graph
96 execute::OMExecuteArgs cond_execute_args = {cond_runtime_storage, cond_runtime_context, 0,
97 runtime_module};
98 status = execute::OMKernelExecute::runForward(cond_execute_args, cond_runtime_allocator);
99 if (status != Ok)
100 return status;
101
102 // Check cond graph result
103 bool cond_result_value = reinterpret_cast<bool *>(cond_runtime_graph->getOutputDataAt(0))[0];
104 // Reset cond graph values
105 cond_runtime_graph->reset();
106 // If false - then finish while loop
107 if (cond_result_value == false)
108 break;
109 }
110
111 // Handle body graph
112 {
113 // Allocate body graph inputs
114 body_runtime_graph->allocateGraphInputs();
115 // Copy data
116 auto body_graphs_inputs = body_runtime_graph->getNumberOfInputs();
117 for (uint32_t i = 0; i < body_graphs_inputs; ++i)
118 {
119 auto *cur_body_input_data =
120 reinterpret_cast<uint8_t *>(body_runtime_graph->getInputDataAt(i));
121 uint8_t *cur_main_input_data = runtime_kernel.outputs_data[i];
122 assert(cur_main_input_data != nullptr);
123 assert(cur_body_input_data != nullptr);
124 const auto cur_input_tensor = runtime_kernel.inputs[i];
125 const auto input_data_size = sizeof(core::OMDataType(cur_input_tensor->type())) *
126 core::OMRuntimeShape(cur_input_tensor).flatSize();
127 std::memcpy(cur_body_input_data, cur_main_input_data, input_data_size);
128 }
129 // Run body graph
130 execute::OMExecuteArgs body_execute_args = {body_runtime_storage, body_runtime_context, 0,
131 runtime_module};
132 status = execute::OMKernelExecute::runForward(body_execute_args, body_runtime_allocator);
133 if (status != Ok)
134 return status;
135
136 // Copy body calculated data to the main output
137 for (uint32_t i = 0; i < runtime_kernel.inputs_num; ++i)
138 {
139 auto cur_calculated_data = body_runtime_graph->getOutputDataAt(i);
140 const auto cur_tensor = runtime_kernel.outputs[i];
141 const auto data_size = sizeof(core::OMDataType(cur_tensor->type())) *
142 core::OMRuntimeShape(cur_tensor).flatSize();
143 std::memcpy(runtime_kernel.outputs_data[i], cur_calculated_data, data_size);
144 }
145
146 body_runtime_graph->reset();
147 }
148 } while (true);
149
150 return status;
151}
memory::OMRuntimeAllocator & getRuntimeAllocator()
OMRuntimeContext & getRuntimeContext()
void * getInputDataAt(uint32_t position)
OMRuntimeStorage & getRuntimeStorage()
void * getOutputDataAt(uint32_t position)
OMStatus getRuntimeGraphAt(uint32_t pos, OMRuntimeGraph **runtime_graph)
core::OMRuntimeModule & runtime_module
static OMStatus runForward(OMExecuteArgs &, core::memory::OMRuntimeAllocator &allocator)

References onert_micro::core::OMRuntimeGraph::allocateGraphInputs(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::core::OMRuntimeGraph::getInputDataAt(), onert_micro::core::OMRuntimeGraph::getNumberOfInputs(), onert_micro::core::OMRuntimeGraph::getOutputDataAt(), onert_micro::core::OMRuntimeGraph::getRuntimeAllocator(), onert_micro::core::OMRuntimeGraph::getRuntimeContext(), onert_micro::core::OMRuntimeModule::getRuntimeGraphAt(), onert_micro::core::OMRuntimeGraph::getRuntimeStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMRuntimeKernel::inputs_num, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::outputs_num, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::core::OMRuntimeGraph::reset(), onert_micro::execute::OMKernelExecute::runForward(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_module, and onert_micro::execute::OMExecuteArgs::runtime_storage.

◆ execute_kernel_CircleZerosLike()

OMStatus onert_micro::execute::execute_kernel_CircleZerosLike ( const OMExecuteArgs execute_args)

Definition at line 48 of file ZerosLike.cpp.

49{
50 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
51 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
52 uint16_t op_index = execute_args.kernel_index;
53
54 const circle::Tensor *input = nullptr;
55 uint8_t *output_data = nullptr;
56
57 OMStatus status = Ok;
58 {
59 OMRuntimeKernel runtime_kernel;
60 runtime_kernel.readKernel(op_index, runtime_context);
61
62 input = runtime_kernel.inputs[inputTensorIdx];
63
64 assert(input != nullptr);
65
66 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
67 if (status != Ok)
68 return status;
69
70 output_data = runtime_kernel.outputs_data[outputTensorIdx];
71 }
72
73 assert(output_data != nullptr);
74
75 core::OMRuntimeShape input_shape(input);
76 const int flat_size = input_shape.flatSize();
77
78 switch (input->type())
79 {
80#ifndef DIS_FLOAT
81 case circle::TensorType_FLOAT32:
82 {
83 resetZeros(core::utils::castOutputData<float>(output_data), flat_size);
84 }
85 break;
86#endif // DIS_FLOAT
87#ifndef DIS_QUANT
88 case circle::TensorType_INT8:
89 {
90 resetZeros(core::utils::castOutputData<int8_t>(output_data), flat_size);
91 }
92 break;
93#endif // DIS_QUANT
94
95 default:
96 {
97 status = UnsupportedType;
98 assert(false && "Unsupported type.");
99 break;
100 }
101 }
102
103 return status;
104}

References onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_math_common() [1/2]

OMStatus onert_micro::execute::execute_math_common ( const OMExecuteArgs execute_args,
const std::function< OMStatus(const core::OMRuntimeShape &, const float *, const core::OMRuntimeShape &, float *)> &  f_float 
)

Definition at line 39 of file MathCommon.cpp.

42{
43 const circle::Tensor *input = nullptr;
44 const circle::Tensor *output = nullptr;
45
46 uint8_t *input_data = nullptr;
47 uint8_t *output_data = nullptr;
48
49 SISOHeader(execute_args, &input, &output, &input_data, &output_data);
50
51 OMStatus status;
52 switch (input->type())
53 {
54#ifndef DIS_FLOAT
55
56 case circle::TensorType_FLOAT32:
57 status =
58 f_float(core::OMRuntimeShape(input), core::utils::castInputData<float>(input_data),
59 core::OMRuntimeShape(output), core::utils::castOutputData<float>(output_data));
60 break;
61#endif // DIS_FLOAT
62 default:
63 {
64 status = UnsupportedType;
65 assert(false && "Unsupported type.");
66 }
67 }
68
69 return status;
70}

References SISOHeader(), and onert_micro::UnsupportedType.

◆ execute_math_common() [2/2]

◆ execute_pooling_common() [1/2]

OMStatus onert_micro::execute::execute_pooling_common ( const OMExecuteArgs execute_args,
const std::function< OMStatus(const core::Pool2DParams &, const core::OMRuntimeShape &, const float *, const core::OMRuntimeShape &, float *)> &  f_float,
const std::function< OMStatus(const core::Pool2DParams &, const core::OMRuntimeShape &, const int8_t *, const core::OMRuntimeShape &, int8_t *)> &  f_int8 
)

Definition at line 36 of file PoolingCommon.cpp.

42{
43 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
44 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
45 uint16_t op_index = execute_args.kernel_index;
46
47 const circle::Tensor *input = nullptr;
48 const circle::Tensor *output = nullptr;
49
50 uint8_t *input_data = nullptr;
51 uint8_t *output_data = nullptr;
52
53 OMStatus status = Ok;
54
55 const circle::Pool2DOptions *options = nullptr;
56 {
57 OMRuntimeKernel runtime_kernel;
58 runtime_kernel.readKernel(op_index, runtime_context);
59
60 input = runtime_kernel.inputs[inputTensorIdx];
61 output = runtime_kernel.outputs[outputTensorIdx];
62
63 assert(input != nullptr);
64 assert(output != nullptr);
65
66 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
67 if (status != Ok)
68 return status;
69
70 input_data = runtime_kernel.inputs_data[inputTensorIdx];
71 output_data = runtime_kernel.outputs_data[outputTensorIdx];
72
73 options = runtime_kernel.first_operator->builtin_options_as_Pool2DOptions();
74 }
75
76 assert(input_data != nullptr);
77 assert(output_data != nullptr);
78 assert(options != nullptr);
79
80 core::OMRuntimeShape input_shape(input);
81
82 int32_t padding_h = 0;
83 int32_t padding_w = 0;
84
85 const int input_width = input_shape.dims(2);
86 const int input_height = input_shape.dims(1);
88 options->stride_h(), options->stride_w(), 1 /* dilation_rate_height */,
89 1 /* dilation_rate_width */, input_height, input_width, options->filter_height(),
90 options->filter_width(), options->padding(), &padding_h, &padding_w);
91
92 core::Pool2DParams params{};
93 params.pad_h = padding_h;
94 params.pad_w = padding_w;
95 params.stride_h = options->stride_h();
96 params.stride_w = options->stride_w();
97 params.filter_h = options->filter_height();
98 params.filter_w = options->filter_width();
99
100 switch (input->type())
101 {
102#ifndef DIS_FLOAT
103 case circle::TensorType_FLOAT32:
104 {
105 calculateActivationRange(options->fused_activation_function(), &params.activation_min,
106 &params.activation_max);
107 status =
108 f_float(params, input_shape, core::utils::castInputData<float>(input_data),
109 core::OMRuntimeShape(output), core::utils::castOutputData<float>(output_data));
110 }
111 break;
112#endif // DIS_FLOAT
113#ifndef DIS_QUANT
114 case circle::TensorType_INT8:
115 {
116 assert(output->quantization() != nullptr);
117 assert(output->quantization()->scale() != nullptr);
118 assert(output->quantization()->scale()->size() == 1);
119 const auto output_scale = output->quantization()->scale()->operator[](0);
120
121 assert(output->quantization()->zero_point() != nullptr);
122 assert(output->quantization()->zero_point()->size() == 1);
123 const auto output_zp = output->quantization()->zero_point()->operator[](0);
124
126 options->fused_activation_function(), output_zp, output_scale, output->type(),
127 &params.quantized_activation_min, &params.quantized_activation_max);
128 status =
129 f_int8(params, input_shape, core::utils::castInputData<int8_t>(input_data),
130 core::OMRuntimeShape(output), core::utils::castOutputData<int8_t>(output_data));
131 }
132 break;
133#endif // DIS_QUANT
134 default:
135 {
136 status = UnsupportedType;
137 assert(false && "Unsupported type.");
138 }
139 }
140
141 return status;
142}
void calculateActivationRangeQuantized(Activation activation, const Tensor *output, int32_t *activation_min, int32_t *activation_max)
Definition Utils.cpp:119

References calculateActivationRange(), calculateActivationRangeQuantized(), computePaddingHeightWidth(), onert_micro::core::OMRuntimeShape::dims(), onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::core::Pool2DParams::pad_h, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ execute_pooling_common() [2/2]

OMStatus onert_micro::execute::execute_pooling_common ( const OMExecuteArgs execute_args,
const std::function< OMStatus(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const float *input_data, const core::OMRuntimeShape &output_shape, float *output_data)> &  f_float,
const std::function< OMStatus(const core::Pool2DParams &params, const core::OMRuntimeShape &input_shape, const int8_t *input_data, const core::OMRuntimeShape &output_shape, int8_t *output_data)> &  f_int8 
)

◆ execute_relu_common()

OMStatus onert_micro::execute::execute_relu_common ( const OMExecuteArgs execute_args,
bool  is_relu_6 
)

Definition at line 37 of file ReluCommon.cpp.

38{
39 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
40 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
41 uint16_t op_index = execute_args.kernel_index;
42
43 const circle::Tensor *input = nullptr;
44 const circle::Tensor *output = nullptr;
45
46 uint8_t *input_data = nullptr;
47 uint8_t *output_data = nullptr;
48
49 OMStatus status = Ok;
50
51 OMRuntimeKernel runtime_kernel;
52 runtime_kernel.readKernel(op_index, runtime_context);
53
54 input = runtime_kernel.inputs[inputTensorIdx];
55 output = runtime_kernel.outputs[outputTensorIdx];
56
57 assert(input != nullptr);
58 assert(output != nullptr);
59
60 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
61 if (status != Ok)
62 return status;
63
64 input_data = runtime_kernel.inputs_data[inputTensorIdx];
65 output_data = runtime_kernel.outputs_data[outputTensorIdx];
66
67 assert(input_data != nullptr);
68 assert(output_data != nullptr);
69
70 float alpha = 0.f;
71 auto options = runtime_kernel.first_operator->builtin_options_as_LeakyReluOptions();
72 if (options != nullptr)
73 alpha = options->alpha();
74
75 switch (input->type())
76 {
77#ifndef DIS_FLOAT
78 case circle::TensorType_FLOAT32:
79 {
80 core::OMRuntimeShape input_shape(input);
82
83 const auto *input_data_float = core::utils::castInputData<float>(input_data);
84 auto *output_data_float = core::utils::castOutputData<float>(output_data);
85
86 assert(output_data_float);
87 const int flat_size = input_shape.flatSize();
88
89 status = pal::ReLUCommon(flat_size, input_data_float, output_data_float, alpha, is_relu_6);
90 }
91 break;
92#endif // DIS_FLOAT
93#ifndef DIS_QUANT
94 case circle::TensorType_INT8:
95 {
96 core::OMRuntimeShape input_shape(input);
98
99 const auto *input_data_int8 = core::utils::castInputData<int8_t>(input_data);
100 auto *output_data_int8 = core::utils::castOutputData<int8_t>(output_data);
101
102 assert(output_data_int8);
103 const int flat_size = input_shape.flatSize();
104
105 status = pal::ReLUCommon(flat_size, input_data_int8, output_data_int8, alpha, is_relu_6);
106 }
107 break;
108#endif // DIS_QUANT
109
110 default:
111 {
112 status = UnsupportedType;
113 assert(false && "Unsupported type.");
114 break;
115 }
116 }
117
118 return status;
119}
OMStatus ReLUCommon(const int flat_size, const Type *input_data, Type *output_data, const float alpha, const bool is_relu_6)

References onert_micro::execute::OMRuntimeKernel::first_operator, onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::pal::ReLUCommon(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

Referenced by execute_kernel_CircleLeakyRelu(), execute_kernel_CircleRelu(), and execute_kernel_CircleRelu6().

◆ execute_reshape_common()

OMStatus onert_micro::execute::execute_reshape_common ( const OMExecuteArgs execute_args)

Definition at line 36 of file ReshapeCommon.cpp.

37{
38 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
39 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
40 uint16_t op_index = execute_args.kernel_index;
41
42 OMRuntimeKernel runtime_kernel;
43 runtime_kernel.readKernel(op_index, runtime_context);
44
45 const circle::Tensor *input = runtime_kernel.inputs[inputTensorIdx];
46 const circle::Tensor *output = runtime_kernel.outputs[outputTensorIdx];
47
48 assert(input != nullptr);
49 assert(output != nullptr);
50
51 OMStatus status = Ok;
52
53 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
54 if (status != Ok)
55 return status;
56
57 uint8_t *input_data = runtime_kernel.inputs_data[inputTensorIdx];
58 uint8_t *output_data = runtime_kernel.outputs_data[outputTensorIdx];
59
60 assert(input_data != nullptr);
61 assert(output_data != nullptr);
62
63 // Check is it inplace kernel
64 if (input_data == output_data)
65 return Ok;
66
67 const core::OMRuntimeShape shape(input);
68
69 const size_t element_size =
70 static_cast<uint32_t>(getOMDataTypeSize(core::onertMicroDatatype(input->type())));
71 const int32_t num_elements = shape.flatSize();
72 std::memcpy(output_data, input_data, num_elements * element_size);
73
74 return status;
75}
OMDataType onertMicroDatatype(const circle::TensorType type)

References onert_micro::core::OMRuntimeShape::flatSize(), onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::core::onertMicroDatatype(), onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, and onert_micro::execute::OMExecuteArgs::runtime_storage.

Referenced by execute_kernel_CircleExpandDims(), and execute_kernel_CircleReshape().

◆ execute_spaces_batches_nd_common() [1/2]

OMStatus onert_micro::execute::execute_spaces_batches_nd_common ( const OMExecuteArgs execute_args,
const std::function< OMStatus(const core::OMRuntimeShape &unextended_input1_shape, const float *input1_data, const core::OMRuntimeShape &unextended_input2_shape, const int32_t *block_shape_data, const core::OMRuntimeShape &unextended_input3_shape, const int32_t *crops_data, const core::OMRuntimeShape &unextended_output_shape, float *output_data)> &  f 
)

◆ execute_spaces_batches_nd_common() [2/2]

OMStatus onert_micro::execute::execute_spaces_batches_nd_common ( const OMExecuteArgs execute_args,
const std::function< OMStatus(const core::OMRuntimeShape &unextended_input1_shape, const float *input1_data, const core::OMRuntimeShape &unextended_input2_shape, const int32_t *block_shape_data, const core::OMRuntimeShape &unextended_input3_shape, const int32_t *crops_data, const core::OMRuntimeShape &unextended_output_shape, float *output_data)> &  func 
)

Definition at line 38 of file SpacesBatchesNDCommon.cpp.

45{
46 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
47 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
48 uint16_t op_index = execute_args.kernel_index;
49
50 const circle::Tensor *input1;
51 const circle::Tensor *input2;
52 const circle::Tensor *input3;
53 const circle::Tensor *output;
54
55 uint8_t *input1_data;
56 uint8_t *input2_data;
57 uint8_t *input3_data;
58 uint8_t *output_data;
59
60 uint16_t input1_index = 0;
61 uint16_t input2_index = 0;
62
63 // Read kernel
64
65 execute::OMRuntimeKernel runtime_kernel;
66 OMStatus status = runtime_kernel.readKernel(op_index, runtime_context);
67 if (status != Ok)
68 return status;
69
70 input1 = runtime_kernel.inputs[input1TensorIdx];
71 input2 = runtime_kernel.inputs[input2TensorIdx];
72 input3 = runtime_kernel.inputs[input3TensorIdx];
73 output = runtime_kernel.outputs[outputTensorIdx];
74
75 core::OMRuntimeShape input1_shape(input1);
76 core::OMRuntimeShape input2_shape(input1);
77 core::OMRuntimeShape input3_shape(input1);
79
80 assert(input1 != nullptr);
81 assert(input2 != nullptr);
82 assert(input3 != nullptr);
83 assert(output != nullptr);
84
85 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
86 if (status != Ok)
87 return status;
88
89 input1_data = runtime_kernel.inputs_data[input1TensorIdx];
90 input2_data = runtime_kernel.inputs_data[input2TensorIdx];
91 input3_data = runtime_kernel.inputs_data[input3TensorIdx];
92 output_data = runtime_kernel.outputs_data[outputTensorIdx];
93
94 switch (input1->type())
95 {
96#ifndef DIS_FLOAT
97 case circle::TensorType_FLOAT32:
98 {
99 status = func(input1_shape, reinterpret_cast<float *>(input1_data), input2_shape,
100 reinterpret_cast<int32_t *>(input2_data), input3_shape,
101 reinterpret_cast<int32_t *>(input3_data), output_shape,
102 reinterpret_cast<float *>(output_data));
103 }
104 break;
105#endif // DIS_FLOAT
106 default:
107 {
108 status = UnsupportedType;
109 assert(false && "Unsupported type.");
110 }
111 }
112
113 return status;
114}

References onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, output_shape, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, onert_micro::execute::OMExecuteArgs::runtime_storage, and onert_micro::UnsupportedType.

◆ getQuantizedConvolutionMultipler()

double onert_micro::execute::getQuantizedConvolutionMultipler ( float  input_scale,
float  filter_scale,
float  output_scale 
)
inline

Definition at line 65 of file OMUtils.h.

67{
68 const double input_product_scale = static_cast<double>(input_scale * filter_scale);
69
70 assert(input_product_scale >= 0);
71
72 assert(output_scale != 0.f);
73
74 return input_product_scale / static_cast<double>(output_scale);
75}

Referenced by getQuantizedConvolutionMultiplers().

◆ getQuantizedConvolutionMultiplers()

std::vector< double > onert_micro::execute::getQuantizedConvolutionMultiplers ( float  input_scale,
const flatbuffers::Vector< float > *  filter_scale,
float  output_scale 
)
inline

Definition at line 95 of file OMUtils.h.

97{
98 std::vector<double> effective_output_scales;
99 size_t n = filter_scale->size();
100 effective_output_scales.reserve(n);
101 for (size_t i = 0; i < n; ++i)
102 {
103 effective_output_scales.push_back(
104 getQuantizedConvolutionMultipler(input_scale, filter_scale->operator[](i), output_scale));
105 }
106 return effective_output_scales;
107}

References getQuantizedConvolutionMultipler(), and flatbuffers::Vector< T >::size().

Referenced by createConvParams().

◆ quantizeMultiplier()

void onert_micro::execute::quantizeMultiplier ( double  double_multiplier,
int32_t *  quantized_multiplier,
int *  shift 
)

Definition at line 23 of file OMUtils.cpp.

25{
26 if (double_multiplier == 0.0)
27 {
28 *quantized_multiplier = 0;
29 *shift = 0;
30 return;
31 }
32
33 const double q = std::frexp(double_multiplier, shift);
34 auto q_fixed = static_cast<int64_t>(std::round(q * (int64_t(1) << 31)));
35
36 if (q_fixed == (int64_t(1) << 31))
37 {
38 q_fixed /= 2;
39 ++*shift;
40 }
41 assert(q_fixed <= std::numeric_limits<int32_t>::max());
42 // A shift amount smaller than -31 would cause all bits to be shifted out
43 // and thus all results would be zero. We implement that instead with
44 // q_fixed==0, so as to avoid hitting issues with right-shift
45 // operations with shift amounts greater than 31. Note that this happens
46 // roughly when abs(double_multiplier) < 2^-31 and the present handling means
47 // that we're effectively flushing tiny double_multiplier's to zero.
48 // We could conceivably handle values in the range (roughly) [32, 63]
49 // as 'denormals' i.e. (shift==0, q_fixed < 2^30). In that point of view
50 // the present handling is just doing 'flush denormals to zero'. We could
51 // reconsider and actually generate nonzero denormals if a need arises.
52 if (*shift < -31)
53 {
54 *shift = 0;
55 q_fixed = 0;
56 }
57 *quantized_multiplier = static_cast<int32_t>(q_fixed);
58}

Referenced by createConvParams(), and quantizeMultiplierSmallerThanOneExp().

◆ quantizeMultiplierSmallerThanOneExp()

void onert_micro::execute::quantizeMultiplierSmallerThanOneExp ( double  double_multiplier,
int32_t *  quantized_multiplier,
int *  left_shift 
)

Definition at line 60 of file OMUtils.cpp.

63{
64 assert(double_multiplier < 1.0);
65 assert(double_multiplier > 0.0);
66 int shift;
67 onert_micro::execute::quantizeMultiplier(double_multiplier, quantized_multiplier, &shift);
68 assert(shift <= 0);
69 *left_shift = shift;
70}

References quantizeMultiplier().

Referenced by calculateQuantParams(), and evalQuantizedComparisonGeneric().

◆ readDataKernel()

template<typename T >
void onert_micro::execute::readDataKernel ( OMRuntimeKernel runtime_kernel,
const T *&  cast_input_data1,
const T *&  cast_input_data2,
bool *&  cast_output_data,
core::OMRuntimeShape input1_shape_ref,
core::OMRuntimeShape input2_shape_ref,
core::OMRuntimeShape output_shape_ref 
)

Definition at line 44 of file ComparisonCommon.h.

48{
49 const circle::Tensor *input1 = nullptr;
50 const circle::Tensor *input2 = nullptr;
51 const circle::Tensor *output = nullptr;
52
53 uint8_t *input_data1 = nullptr;
54 uint8_t *input_data2 = nullptr;
55 uint8_t *output_data = nullptr;
56
57 input1 = runtime_kernel->inputs[input1TensorIdx];
58 input2 = runtime_kernel->inputs[input2TensorIdx];
59 output = runtime_kernel->outputs[outputTensorIdx];
60
61 assert(input1 != nullptr);
62 assert(input2 != nullptr);
63 assert(output != nullptr);
64
65 input_data1 = runtime_kernel->inputs_data[input1TensorIdx];
66 input_data2 = runtime_kernel->inputs_data[input2TensorIdx];
67 output_data = runtime_kernel->outputs_data[outputTensorIdx];
68
69 assert(input_data1 != nullptr);
70 assert(input_data2 != nullptr);
71 assert(output_data != nullptr);
72
73 cast_input_data1 = core::utils::castInputData<T>(input_data1);
74 cast_input_data2 = core::utils::castInputData<T>(input_data2);
75 cast_output_data = core::utils::castOutputData<bool>(output_data);
76
77 input1_shape_ref = std::move(core::OMRuntimeShape(input1));
78 input2_shape_ref = std::move(core::OMRuntimeShape(input2));
79 output_shape_ref = std::move(core::OMRuntimeShape(output));
80}

References onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMRuntimeKernel::outputs, and onert_micro::execute::OMRuntimeKernel::outputs_data.

Referenced by evalComparisonGeneric(), and evalQuantizedComparisonGeneric().

◆ readKernelDataTISO()

OMStatus onert_micro::execute::readKernelDataTISO ( const OMExecuteArgs execute_args,
uint8_t *&  input_data1,
uint8_t *&  input_data2,
uint8_t *&  output_data,
core::OMRuntimeShape input1_shape_ref,
core::OMRuntimeShape input2_shape_ref,
core::OMRuntimeShape output_shape_ref,
circle::TensorType &  tensor_type 
)

Definition at line 37 of file ReadKernelDataCommon.cpp.

43{
44
45 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
46 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
47 uint16_t op_index = execute_args.kernel_index;
48
49 OMStatus status = Ok;
50
51 OMRuntimeKernel runtime_kernel;
52 runtime_kernel.readKernel(op_index, runtime_context);
53
54 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
55 if (status != Ok)
56 return status;
57
58 const circle::Tensor *input1 = nullptr;
59 const circle::Tensor *input2 = nullptr;
60 const circle::Tensor *output = nullptr;
61
62 input1 = runtime_kernel.inputs[TensorIndexTISO::input1TensorIdx];
63 input2 = runtime_kernel.inputs[TensorIndexTISO::input2TensorIdx];
64 output = runtime_kernel.outputs[TensorIndexTISO::outputTensorIdx];
65
66 assert(input1 != nullptr);
67 assert(input2 != nullptr);
68 assert(output != nullptr);
69
70 input_data1 = runtime_kernel.inputs_data[TensorIndexTISO::input1TensorIdx];
71 input_data2 = runtime_kernel.inputs_data[TensorIndexTISO::input2TensorIdx];
72 output_data = runtime_kernel.outputs_data[TensorIndexTISO::outputTensorIdx];
73
74 input1_shape_ref = std::move(core::OMRuntimeShape(input1));
75 input2_shape_ref = std::move(core::OMRuntimeShape(input2));
76 output_shape_ref = std::move(core::OMRuntimeShape(output));
77
78 tensor_type = input1->type();
79
80 return status;
81}
constexpr uint32_t input1TensorIdx
constexpr uint32_t outputTensorIdx
constexpr uint32_t input2TensorIdx

References onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), TensorIndexTISO::input1TensorIdx, TensorIndexTISO::input2TensorIdx, onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, TensorIndexTISO::outputTensorIdx, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, and onert_micro::execute::OMExecuteArgs::runtime_storage.

Referenced by execute_kernel_CircleFloorDiv(), execute_kernel_CircleFloorMod(), execute_kernel_CircleGatherND(), execute_kernel_CircleMaximum(), and execute_kernel_CircleMinimum().

◆ readQuantParams()

void onert_micro::execute::readQuantParams ( const circle::Tensor *  tensor,
long &  zero_point,
float &  scale 
)

Definition at line 143 of file OMUtils.cpp.

145{
146 // additional check
147 assert(tensor->quantization() != nullptr); // Fix caller
148 assert(tensor->quantization()->scale() != nullptr and
149 tensor->quantization()->scale()->size() == 1); // Fix caller
150 assert(tensor->quantization()->zero_point() != nullptr and
151 tensor->quantization()->zero_point()->size() == 1); // Fix caller
152
153 // read zero point
154 zero_point = tensor->quantization()->zero_point()->operator[](0);
155 // read scale
156 scale = tensor->quantization()->scale()->operator[](0);
157}

Referenced by calculateQuantParams().

◆ SISOHeader()

OMStatus onert_micro::execute::SISOHeader ( const OMExecuteArgs execute_args,
const circle::Tensor **  input,
const circle::Tensor **  output,
uint8_t **  input_data,
uint8_t **  output_data 
)

Definition at line 159 of file OMUtils.cpp.

163{
164 OMStatus status;
165
166 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
167 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
168 uint16_t op_index = execute_args.kernel_index;
169
170 {
171 OMRuntimeKernel runtime_kernel;
172 runtime_kernel.readKernel(op_index, runtime_context);
173
174 *input = runtime_kernel.inputs[0];
175 *output = runtime_kernel.outputs[0];
176
177 assert(*input != nullptr);
178 assert(*output != nullptr);
179
180 status = runtime_kernel.getDataFromStorage(op_index, runtime_storage, runtime_context);
181 if (status != Ok)
182 return status;
183
184 *input_data = runtime_kernel.inputs_data[0];
185 *output_data = runtime_kernel.outputs_data[0];
186 }
187
188 assert(*input_data != nullptr);
189 assert(*output_data != nullptr);
190
191 return status;
192}

References onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMRuntimeKernel::inputs_data, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::outputs_data, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, and onert_micro::execute::OMExecuteArgs::runtime_storage.

Referenced by execute_kernel_CircleCast(), execute_kernel_CircleDequantize(), execute_kernel_CircleL2Normalize(), execute_kernel_CircleLogistic(), execute_kernel_CircleLogSoftmax(), execute_kernel_CircleQuantize(), and execute_math_common().

◆ TISOHeader()

OMStatus onert_micro::execute::TISOHeader ( const OMExecuteArgs execute_args,
const circle::Tensor **  input1,
const circle::Tensor **  input2,
const circle::Tensor **  output,
OMRuntimeKernel runtime_kernel 
)

Definition at line 240 of file OMUtils.cpp.

245{
246 OMStatus status;
247
248 core::OMRuntimeContext &runtime_context = execute_args.runtime_context;
249 core::OMRuntimeStorage &runtime_storage = execute_args.runtime_storage;
250 uint16_t op_index = execute_args.kernel_index;
251
252 status = runtime_kernel->readKernel(op_index, runtime_context);
253
254 *input1 = runtime_kernel->inputs[0];
255 *input2 = runtime_kernel->inputs[1];
256 *output = runtime_kernel->outputs[0];
257
258 assert(*input1 != nullptr);
259 assert(*input2 != nullptr);
260 assert(*output != nullptr);
261
262 status = runtime_kernel->getDataFromStorage(op_index, runtime_storage, runtime_context);
263 if (status != Ok)
264 return status;
265
266 return status;
267}

References onert_micro::execute::OMRuntimeKernel::getDataFromStorage(), onert_micro::execute::OMRuntimeKernel::inputs, onert_micro::execute::OMExecuteArgs::kernel_index, onert_micro::Ok, onert_micro::execute::OMRuntimeKernel::outputs, onert_micro::execute::OMRuntimeKernel::readKernel(), onert_micro::execute::OMExecuteArgs::runtime_context, and onert_micro::execute::OMExecuteArgs::runtime_storage.

Referenced by execute_kernel_CircleEqual(), execute_kernel_CircleGreater(), execute_kernel_CircleGreaterEqual(), execute_kernel_CircleLess(), and execute_kernel_CircleNotEqual().

Variable Documentation

◆ kernel_builtin_execute

constexpr KernelBuiltinExecuteRegistry onert_micro::execute::kernel_builtin_execute
constexpr

◆ kernel_custom_execute

constexpr KernelCustomExecuteRegistry onert_micro::execute::kernel_custom_execute
constexpr