ONE - On-device Neural Engine
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
onert::backend::cpu::ops Namespace Reference

Data Structures

class  AddNLayer
 
class  ArgMinMaxLayer
 
class  BatchMatMulLayer
 
class  BatchToSpaceNDLayer
 
class  BinaryArithmeticLayer
 
class  BroadcastToLayer
 
class  CompareLayer
 
class  ConcatLayer
 
union  ConstDataPtr
 
class  ConvolutionLayer
 
union  DataPtr
 
class  DepthToSpaceLayer
 
class  DepthwiseConvolutionLayer
 
class  DetectionPostProcessLayer
 
class  EinsumLayer
 
class  ElementwiseActivationLayer
 
class  ElementwiseBinaryLayer
 
class  ElementwiseUnaryLayer
 
class  ExpandDimsLayer
 
class  FillLayer
 
class  FullyConnectedLayer
 
class  FusedBatchNormLayer
 
class  GatherLayer
 
class  L2NormLayer
 
class  LogSoftMaxLayer
 
class  LSTMLayer
 
class  MatrixBandPartLayer
 
class  MeanLayer
 
class  OneHotLayer
 
class  PackLayer
 
class  PadLayer
 
class  PoolLayer
 
class  PowLayer
 
class  QuantizeLayer
 
class  RangeLayer
 
class  RankLayer
 
class  ReduceLayer
 
class  ReshapeLayer
 
class  ResizeBilinearLayer
 
class  ReverseLayer
 
class  RmsNormLayer
 
class  RoPELayer
 
class  SelectLayer
 
class  ShapeLayer
 
class  SliceLayer
 
class  SoftMaxLayer
 
class  SpaceToBatchNDLayer
 
class  SpaceToDepthLayer
 
class  SplitLayer
 
class  SplitVLayer
 
class  SqDiffLayer
 
class  StatelessRandomUniformLayer
 
class  StridedSliceLayer
 
class  TileLayer
 
class  TransposeLayer
 
class  UnpackLayer
 

Enumerations

enum class  ArithmeticType { kAdd , kSub , kMul , kDiv }
 
enum class  ElementwiseActivationType {
  kElu , kLogistic , kReLU , kTanh ,
  kLeakyReLU
}
 
enum class  ElementwiseBinaryType {
  kFloorDiv , kFloorMod , kLogicalAnd , kLogicalOr ,
  kMax , kMin
}
 
enum class  ElementwiseUnaryType {
  kAbs , kCast , kCos , kDequantize ,
  kErf , kExp , kFloor , kLog ,
  kLogicalNot , kNeg , kQuantize , kRound ,
  kRSqrt , kSin , kSqrt , kSquare ,
  kZerosLike
}
 
enum class  PoolType { kAvg , kL2 , kMax }
 
enum class  ReduceType {
  kSum , kProd , kMax , kMin ,
  kAny , kAll , kInvalid
}
 

Functions

template<typename T >
Array< T > toArray (uint8_t *ptr, std::vector< int32_t > &descr)
 
ggml_type getGGMLType (ir::DataType type)
 
struct ggml_tensor getGGMLTensor (const IPortableTensor *tensor)
 
uint32_t getNumberOfDimensions (const IPortableTensor *tensor)
 
uint32_t getNumberOfElements (const IPortableTensor *tensor)
 
uint32_t getSizeOfDimension (const IPortableTensor *tensor, uint32_t dimensionIdx)
 
void QuantizeMultiplier (double double_multiplier, int32_t *quantized_multiplier, int *shift)
 
void GetQuantizedConvolutionMultiplier (const IPortableTensor *input, const IPortableTensor *filter, const IPortableTensor *bias, const IPortableTensor *output, double *multiplier)
 
void GetQuantizedConvolutionMultipliersAndShifts (float input_scale, float output_scale, const float *filter_scales, size_t filter_scales_size, int num_channels, std::vector< int32_t > &per_channel_output_multiplier, std::vector< int > &per_channel_output_shift)
 
void QuantizeMultiplierGreaterThanOne (double double_multiplier, int32_t *quantized_multiplier, int *left_shift)
 
void CalculateActivationRangeQuantized (ir::Activation activation, const IPortableTensor *output, int32_t *act_min, int32_t *act_max)
 
bool HaveSameShapes (const IPortableTensor *input1, const IPortableTensor *input2)
 
int32_t CalculateInputRadius (int input_integer_bits, int input_left_shift)
 
uint32_t sizeOfData (OperandType type, const std::vector< int32_t > &dimensions)
 
nnfw::cker::PaddingType getPaddingType (ir::PaddingType ir_padding_type)
 
std::vector< int32_t > getReducerAxes (const IPortableTensor *axes)
 
nnfw::cker::RoPEMode getRoPEMode (ir::operation::RoPE::RoPEMode rope_mode)
 
nnfw::cker::Shape getExtendedTensorShape (const IPortableTensor *tensor)
 
nnfw::cker::Shape getShape (const IPortableTensor *tensor)
 
nnfw::cker::FusedActivationFunctionType convertActivationType (const ir::Activation activation)
 
int32_t getAxis (uint32_t rank, int32_t axis)
 
template<typename T >
const T * getBuffer (const IPortableTensor *tensor)
 
template<typename T >
T * getBuffer (IPortableTensor *tensor)
 
template<>
const bool * getBuffer (const IPortableTensor *tensor)
 
template<>
bool * getBuffer (IPortableTensor *tensor)
 
template<typename InputT , typename OutputT >
void affineQuantize (const IPortableTensor *input, IPortableTensor *output)
 
template<typename T >
void GetRawShape (const IPortableTensor *input, T *output_data)
 

Enumeration Type Documentation

◆ ArithmeticType

Enumerator
kAdd 
kSub 
kMul 
kDiv 

Definition at line 28 of file BinaryArithmeticLayer.h.

29{
30 kAdd,
31 kSub,
32 kMul,
33 kDiv,
34};

◆ ElementwiseActivationType

◆ ElementwiseBinaryType

◆ ElementwiseUnaryType

◆ PoolType

Enumerator
kAvg 
kL2 
kMax 

Definition at line 28 of file PoolLayer.h.

◆ ReduceType

Enumerator
kSum 
kProd 
kMax 
kMin 
kAny 
kAll 
kInvalid 

Definition at line 35 of file ReduceLayer.h.

Function Documentation

◆ affineQuantize()

template<typename InputT , typename OutputT >
void onert::backend::cpu::ops::affineQuantize ( const IPortableTensor input,
IPortableTensor output 
)

Definition at line 30 of file QuantizeLayer.cc.

31{
32 nnfw::cker::Quantize(getShape(input), getBuffer<InputT>(input), getShape(output),
33 getBuffer<OutputT>(output), output->data_scale(), output->data_zero_point());
34}
void Quantize(const Shape &input_shape, const InputT *input_data, const Shape &output_shape, OutputT *output_data, const float output_scale, const int32_t output_offset)
Definition Quantize.h:34
nnfw::cker::Shape getShape(const IPortableTensor *tensor)

References getShape(), and nnfw::cker::Quantize().

◆ CalculateActivationRangeQuantized()

void onert::backend::cpu::ops::CalculateActivationRangeQuantized ( ir::Activation  activation,
const IPortableTensor output,
int32_t *  act_min,
int32_t *  act_max 
)

Definition at line 138 of file OperationUtils.cc.

140{
141 int32_t qmin = 0;
142 int32_t qmax = 0;
143
144 switch (output->data_type())
145 {
146 case OperandType::QUANT_UINT8_ASYMM:
147 qmin = std::numeric_limits<uint8_t>::min();
148 qmax = std::numeric_limits<uint8_t>::max();
149 break;
150 case OperandType::QUANT_INT8_ASYMM:
151 case OperandType::QUANT_INT8_SYMM:
152 qmin = std::numeric_limits<int8_t>::min();
153 qmax = std::numeric_limits<int8_t>::max();
154 break;
155 default:
156 throw std::runtime_error("CalculateActivationRangeQuantized: Not supported operand type.");
157 }
158
159 const auto scale = output->data_scale();
160 const auto zero_point = output->data_zero_point();
161 auto quantize = [scale, zero_point](float f) {
162 return zero_point + static_cast<int32_t>(std::round(f / scale));
163 };
164 if (activation == ir::Activation::RELU)
165 {
166 *act_min = std::max(qmin, quantize(0.0));
167 *act_max = qmax;
168 }
169 else if (activation == ir::Activation::RELU6)
170 {
171 *act_min = std::max(qmin, quantize(0.0));
172 *act_max = std::min(qmax, quantize(6.0));
173 }
174 else if (activation == ir::Activation::RELU1)
175 {
176 *act_min = std::max(qmin, quantize(-1.0));
177 *act_max = std::min(qmax, quantize(1.0));
178 }
179 else if (activation == ir::Activation::SIGMOID)
180 {
181 *act_min = std::max(qmin, quantize(0.0));
182 *act_max = std::min(qmax, quantize(1.0));
183 }
184 else if (activation == ir::Activation::NONE)
185 {
186 *act_min = qmin;
187 *act_max = qmax;
188 }
189 else
190 {
191 throw std::runtime_error{"Unsupported fused activation function."};
192 }
193}
std::vector< T > quantize(const float *data, size_t num_elements, float scale, int32_t zero_point)
Definition TestUtils.h:174

References onert::ir::NONE, onert::ir::RELU, onert::ir::RELU1, onert::ir::RELU6, and onert::ir::SIGMOID.

Referenced by onert::backend::cpu::ops::PoolLayer::configure(), onert::backend::cpu::ops::DepthwiseConvolutionLayer::convQ8i(), onert::backend::cpu::ops::DepthwiseConvolutionLayer::convQ8uPerChannel(), onert::backend::cpu::ops::DepthwiseConvolutionLayer::convQ8uPerTensor(), and onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedQuant8().

◆ CalculateInputRadius()

int32_t onert::backend::cpu::ops::CalculateInputRadius ( int  input_integer_bits,
int  input_left_shift 
)

Definition at line 219 of file OperationUtils.cc.

220{
221 const double max_input_rescaled = 1.0 * ((1 << input_integer_bits) - 1) *
222 (1ll << (31 - input_integer_bits)) / (1ll << input_left_shift);
223 // Tighten bound using floor. Suppose that we could use the exact value.
224 // After scaling the difference, the result would be at the maximum. Thus we
225 // must ensure that our value has lower magnitude.
226 return static_cast<int32_t>(std::floor(max_input_rescaled));
227}

◆ convertActivationType()

nnfw::cker::FusedActivationFunctionType onert::backend::cpu::ops::convertActivationType ( const ir::Activation  activation)
inline

Definition at line 106 of file OperationUtils.h.

107{
108 switch (activation)
109 {
110 case ir::Activation::NONE:
112 case ir::Activation::RELU:
114 case ir::Activation::RELU1:
116 case ir::Activation::RELU6:
118 case ir::Activation::TANH:
120 case ir::Activation::SIGMOID:
122 default:
123 throw std::runtime_error{"CPU backend: Cannot convert activation type"};
124 }
125}

References nnfw::cker::kNone, nnfw::cker::kRelu, nnfw::cker::kRelu1, nnfw::cker::kRelu6, nnfw::cker::kSigmoid, nnfw::cker::kTanh, onert::ir::NONE, onert::ir::RELU, onert::ir::RELU1, onert::ir::RELU6, onert::ir::SIGMOID, and onert::ir::TANH.

Referenced by onert::backend::cpu::ops::FullyConnectedLayer::fullyConnected16x1Float32(), onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedFloat32(), onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedHybrid(), onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedSparseWeight(), and onert::backend::cpu::ops::LSTMLayer::LSTMFloat().

◆ getAxis()

int32_t onert::backend::cpu::ops::getAxis ( uint32_t  rank,
int32_t  axis 
)
inline

Definition at line 127 of file OperationUtils.h.

128{
129 auto ret = axis;
130
131 if (axis < 0)
132 {
133 ret += rank;
134 }
135
136 return ret;
137}

◆ getBuffer() [1/4]

template<typename T >
const T * onert::backend::cpu::ops::getBuffer ( const IPortableTensor tensor)

Definition at line 169 of file OperationUtils.h.

170{
171 return reinterpret_cast<const T *>(tensor->buffer());
172}

References getBuffer().

Referenced by getBuffer(), and getBuffer().

◆ getBuffer() [2/4]

template<>
const bool * onert::backend::cpu::ops::getBuffer ( const IPortableTensor tensor)
inline

Definition at line 179 of file OperationUtils.h.

180{
181 static_assert(sizeof(bool) == 1, "cpu backend supports bool type which is 1 byte");
182 return reinterpret_cast<const bool *>(tensor->buffer());
183}

References getBuffer().

◆ getBuffer() [3/4]

template<typename T >
T * onert::backend::cpu::ops::getBuffer ( IPortableTensor tensor)

Definition at line 174 of file OperationUtils.h.

175{
176 return reinterpret_cast<T *>(tensor->buffer());
177}

References getBuffer().

◆ getBuffer() [4/4]

template<>
bool * onert::backend::cpu::ops::getBuffer ( IPortableTensor tensor)
inline

Definition at line 185 of file OperationUtils.h.

186{
187 static_assert(sizeof(bool) == 1, "cpu backend supports bool type which is 1 byte");
188 return reinterpret_cast<bool *>(tensor->buffer());
189}

References getBuffer().

◆ getExtendedTensorShape()

nnfw::cker::Shape onert::backend::cpu::ops::getExtendedTensorShape ( const IPortableTensor tensor)
inline

Definition at line 67 of file OperationUtils.h.

68{
69 assert(tensor);
70 const int32_t extended_rank = 4;
71 int32_t raw_shape[extended_rank];
72 auto shape = tensor->getShape();
73 uint32_t src = extended_rank - shape.rank();
74 for (uint32_t i = 0; i < extended_rank; ++i)
75 {
76 if (i < src)
77 {
78 raw_shape[i] = 1;
79 }
80 else
81 {
82 raw_shape[i] = shape.dim(i - src);
83 }
84 }
85
86 return nnfw::cker::Shape(extended_rank, raw_shape);
87}

◆ getGGMLTensor()

struct ggml_tensor onert::backend::cpu::ops::getGGMLTensor ( const IPortableTensor tensor)

Definition at line 41 of file GGMLHelper.cc.

42{
43 struct ggml_tensor res;
44
45 res.type = getGGMLType(tensor->data_type());
46 const auto rank = tensor->getShape().rank();
47 for (int i = 0; i < GGML_MAX_DIMS; ++i)
48 {
49 if (i >= rank)
50 res.ne[i] = 1;
51 else
52 res.ne[i] = tensor->getShape().dim(rank - i - 1);
53 }
54
55 res.nb[0] = ggml_type_size(res.type);
56 res.nb[1] = res.nb[0] * (res.ne[0] / ggml_blck_size(res.type));
57 for (int i = 2; i < GGML_MAX_DIMS; ++i)
58 res.nb[i] = res.nb[i - 1] * res.ne[i - 1];
59
60 res.op = GGML_OP_NONE;
61 res.grad = nullptr;
62 res.data = (void *)(tensor->buffer());
63
64 return res;
65}
ggml_type getGGMLType(ir::DataType type)
Definition GGMLHelper.cc:22

References getGGMLType().

Referenced by onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedGGMLWeight().

◆ getGGMLType()

ggml_type onert::backend::cpu::ops::getGGMLType ( ir::DataType  type)

Definition at line 22 of file GGMLHelper.cc.

23{
24 switch (type)
25 {
26 case ir::DataType::FLOAT32:
27 return GGML_TYPE_F32;
28 case ir::DataType::QUANT_GGML_Q4_0:
29 return GGML_TYPE_Q4_0;
30 case ir::DataType::QUANT_GGML_Q8_0:
31 return GGML_TYPE_Q8_0;
32 case ir::DataType::INT32:
33 return GGML_TYPE_I32;
34 case ir::DataType::INT64:
35 return GGML_TYPE_I64;
36 default:
37 throw std::runtime_error("Unsupported data type");
38 }
39}

Referenced by getGGMLTensor().

◆ getNumberOfDimensions()

uint32_t onert::backend::cpu::ops::getNumberOfDimensions ( const IPortableTensor tensor)

Definition at line 26 of file OperationUtils.cc.

27{
28 assert(tensor);
29 return tensor->getShape().rank();
30}

References getNumberOfDimensions().

◆ getNumberOfElements()

uint32_t onert::backend::cpu::ops::getNumberOfElements ( const IPortableTensor tensor)

Definition at line 32 of file OperationUtils.cc.

33{
34 assert(tensor);
35 uint32_t count = 1;
36 auto shape = tensor->getShape();
37 for (int i = 0; i < shape.rank(); i++)
38 {
39 count *= shape.dim(i);
40 }
41 return count;
42}

References getNumberOfElements().

◆ getPaddingType()

nnfw::cker::PaddingType onert::backend::cpu::ops::getPaddingType ( ir::PaddingType  ir_padding_type)

Definition at line 262 of file OperationUtils.cc.

263{
264 switch (ir_padding_type)
265 {
266 case ir::PaddingType::EXPLICIT:
268 case ir::PaddingType::SAME:
270 case ir::PaddingType::VALID:
272 default:
273 throw std::runtime_error("Wrong padding type.");
274 break;
275 }
276}

References onert::ir::EXPLICIT, getPaddingType(), nnfw::cker::kNone, nnfw::cker::kSame, nnfw::cker::kValid, onert::ir::SAME, and onert::ir::VALID.

Referenced by getPaddingType(), and onert::backend::cpu::ops::ConvolutionLayer::prepare().

◆ GetQuantizedConvolutionMultiplier()

void onert::backend::cpu::ops::GetQuantizedConvolutionMultiplier ( const IPortableTensor input,
const IPortableTensor filter,
const IPortableTensor bias,
const IPortableTensor output,
double *  multiplier 
)

Definition at line 77 of file OperationUtils.cc.

80{
81 const double input_product_scale = input->data_scale() * filter->data_scale();
82 [[maybe_unused]] const double bias_scale =
83 (bias != nullptr) ? bias->data_scale() : input_product_scale;
84 const double output_scale = output->data_scale();
85 // The following conditions must be guaranteed by the training pipeline.
86 assert(std::abs(input_product_scale - bias_scale) <=
87 1e-6 * std::min(input_product_scale, bias_scale));
88 assert(input_product_scale >= 0);
89 assert(input_product_scale < output_scale);
90 *multiplier = input_product_scale / output_scale;
91}

Referenced by onert::backend::cpu::ops::DepthwiseConvolutionLayer::convQ8uPerTensor(), and onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedQuant8().

◆ GetQuantizedConvolutionMultipliersAndShifts()

void onert::backend::cpu::ops::GetQuantizedConvolutionMultipliersAndShifts ( float  input_scale,
float  output_scale,
const float *  filter_scales,
size_t  filter_scales_size,
int  num_channels,
std::vector< int32_t > &  per_channel_output_multiplier,
std::vector< int > &  per_channel_output_shift 
)

Definition at line 93 of file OperationUtils.cc.

97{
98 // Originates from tflite's PopulateConvolutionQuantizationParams()
99 per_channel_output_multiplier.resize(num_channels);
100 per_channel_output_shift.resize(num_channels);
101
102 const bool is_per_channel = filter_scales_size > 1;
103 auto per_channel_multiplier = per_channel_output_multiplier.data();
104 auto per_channel_shift = per_channel_output_shift.data();
105 for (int i = 0; i < num_channels; ++i)
106 {
107 // If per-tensor quantization parameter is specified, broadcast it along the
108 // quantization dimension (channels_out).
109 const float scale = is_per_channel ? filter_scales[i] : filter_scales[0];
110 const double filter_scale = static_cast<double>(scale);
111 const double effective_output_scale =
112 static_cast<double>(input_scale) * filter_scale / static_cast<double>(output_scale);
113 int32_t significand;
114 int channel_shift;
115 QuantizeMultiplier(effective_output_scale, &significand, &channel_shift);
116 per_channel_multiplier[i] = significand;
117 per_channel_shift[i] = channel_shift;
118 }
119}

References QuantizeMultiplier().

Referenced by onert::backend::cpu::ops::ConvolutionLayer::prepare().

◆ GetRawShape()

template<typename T >
void onert::backend::cpu::ops::GetRawShape ( const IPortableTensor input,
T *  output_data 
)

Definition at line 29 of file ShapeLayer.cc.

30{
31 auto shape = input->getShape();
32 for (int i = 0; i < shape.rank(); ++i)
33 {
34 output_data[i] = static_cast<T>(shape.dim(i));
35 }
36}

Referenced by onert::backend::cpu::ops::ShapeLayer::run().

◆ getReducerAxes()

std::vector< int32_t > onert::backend::cpu::ops::getReducerAxes ( const IPortableTensor axes)

Definition at line 278 of file OperationUtils.cc.

279{
280 std::vector<int32_t> ret;
281
282 auto axes_vals = (axes->getShape().rank() == 0) ? 1 : axes->getShape().dim(0);
283 assert(static_cast<size_t>(axes_vals) == axes->getShape().num_elements());
284 switch (axes->data_type())
285 {
286 case ir::DataType::INT32:
287 {
288 for (int i = 0; i < axes_vals; ++i)
289 ret.emplace_back(*(getBuffer<int32_t>(axes) + i));
290 break;
291 }
292 case ir::DataType::INT64:
293 {
294 for (int i = 0; i < axes_vals; ++i)
295 ret.emplace_back(*(getBuffer<int64_t>(axes) + i));
296 break;
297 }
298 default:
299 throw std::runtime_error("getReducerAxes: Not supported data type");
300 break;
301 }
302 return ret;
303}
ir::DataType data_type() const override final
ir::Shape getShape() const override final
Get ir::Shape of tensor.

References onert::backend::IPortableTensor::data_type(), and onert::backend::IPortableTensor::getShape().

Referenced by onert::backend::train::ops::MeanLayer::backward(), onert::backend::cpu::ops::MeanLayer::MeanFloat32(), onert::backend::cpu::ops::MeanLayer::MeanQuant8(), and onert::backend::cpu::ops::ReduceLayer::run().

◆ getRoPEMode()

nnfw::cker::RoPEMode onert::backend::cpu::ops::getRoPEMode ( ir::operation::RoPE::RoPEMode  rope_mode)

Definition at line 305 of file OperationUtils.cc.

306{
307 switch (rope_mode)
308 {
309 case ir::operation::RoPE::RoPEMode::GPT_NEOX:
311 case ir::operation::RoPE::RoPEMode::GPT_J:
313 default:
314 throw std::runtime_error("Wrong rope mode.");
315 break;
316 }
317}

References onert::ir::operation::RoPE::GPT_J, onert::ir::operation::RoPE::GPT_NEOX, nnfw::cker::kGptJ, and nnfw::cker::kGptNeox.

◆ getShape()

nnfw::cker::Shape onert::backend::cpu::ops::getShape ( const IPortableTensor tensor)
inline

Definition at line 89 of file OperationUtils.h.

90{
91 if (tensor == nullptr)
92 return nnfw::cker::Shape();
93
94 const ir::Shape &shape = tensor->get_info().shape();
95 auto rank = shape.rank();
96 nnfw::cker::Shape ret(rank);
97 auto data = ret.DimsData();
98 for (int i = 0; i < rank; ++i)
99 {
100 data[i] = shape.dim(i);
101 }
102 return ret;
103}

References nnfw::cker::Shape::DimsData().

Referenced by affineQuantize(), onert::backend::cpu::ops::BatchMatMulLayer::batchMatMulFloat32(), onert::backend::cpu::ops::BatchToSpaceNDLayer::batchToSpaceNDGeneric(), onert::backend::cpu::ops::ConcatLayer::concatenationGeneral(), onert::backend::cpu::ops::ConcatLayer::concatenationQuant8(), onert::backend::cpu::ops::ElementwiseActivationLayer::configure(), onert::backend::cpu::ops::DepthwiseConvolutionLayer::convFloat32(), onert::backend::cpu::ops::DepthwiseConvolutionLayer::convQ8i(), onert::backend::cpu::ops::DepthwiseConvolutionLayer::convQ8iHybridPerChannel(), onert::backend::cpu::ops::DepthwiseConvolutionLayer::convQ8uPerChannel(), onert::backend::cpu::ops::DepthwiseConvolutionLayer::convQ8uPerTensor(), onert::backend::cpu::ops::EinsumLayer::einsumFloat32(), onert::backend::cpu::ops::ElementwiseActivationLayer::EvalUsingLookupTable(), onert::backend::cpu::ops::FullyConnectedLayer::fullyConnected16x1Float32(), onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedFloat32(), onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedHybrid(), onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedQuant8(), onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedSparseWeight(), onert::backend::cpu::ops::FusedBatchNormLayer::fusedbatchnormFloat32(), onert::backend::cpu::ops::LogSoftMaxLayer::logsoftmaxFloat32(), onert::backend::cpu::ops::LogSoftMaxLayer::logsoftmaxQuant8(), onert::backend::cpu::ops::MatrixBandPartLayer::matrixBandPartFloat32(), onert::backend::cpu::ops::MeanLayer::MeanFloat32(), onert::backend::cpu::ops::MeanLayer::MeanQuant8(), onert::backend::cpu::ops::OneHotLayer::oneHotImpl(), onert::backend::cpu::ops::PackLayer::packImpl(), onert::backend::cpu::ops::PadLayer::padImpl(), onert::backend::cpu::ops::PowLayer::powFloat32(), onert::backend::cpu::ops::ConvolutionLayer::prepare(), onert::backend::cpu::ops::FullyConnectedLayer::prepare(), onert::backend::cpu::ops::AddNLayer::run(), onert::backend::cpu::ops::BroadcastToLayer::run(), onert::backend::cpu::ops::FillLayer::run(), onert::backend::cpu::ops::L2NormLayer::run(), onert::backend::cpu::ops::QuantizeLayer::run(), onert::backend::cpu::ops::ReduceLayer::run(), onert::backend::cpu::ops::ResizeBilinearLayer::run(), onert::backend::cpu::ops::ReverseLayer::run(), onert::backend::cpu::ops::RmsNormLayer::run(), onert::backend::cpu::ops::SoftMaxLayer::softmaxFloat32(), onert::backend::cpu::ops::SoftMaxLayer::softmaxQuant8(), onert::backend::cpu::ops::SplitLayer::split(), onert::backend::cpu::ops::SplitVLayer::splitV(), onert::backend::cpu::ops::SqDiffLayer::SqDiffFloat32(), onert::backend::cpu::ops::StatelessRandomUniformLayer::StatelessRandomUniformFloat32(), onert::backend::cpu::ops::TileLayer::tileFloat32(), and onert::backend::cpu::ops::TransposeLayer::transpose().

◆ getSizeOfDimension()

uint32_t onert::backend::cpu::ops::getSizeOfDimension ( const IPortableTensor tensor,
uint32_t  dimensionIdx 
)

Definition at line 44 of file OperationUtils.cc.

45{
46 assert(tensor);
47 auto shape = tensor->getShape();
48 if (dimensionIdx >= static_cast<uint32_t>(shape.rank()))
49 {
50 // TODO, log the error
51 return 0;
52 }
53 return shape.dim(dimensionIdx);
54}

References getSizeOfDimension().

◆ HaveSameShapes()

bool onert::backend::cpu::ops::HaveSameShapes ( const IPortableTensor input1,
const IPortableTensor input2 
)

Definition at line 195 of file OperationUtils.cc.

196{
197 if (input1 == input2)
198 return true;
199 if (input2 == NULL || input2 == NULL)
200 return false;
201
202 if (input1 == NULL)
203 {
204 return (getNumberOfDimensions(input2) == 0);
205 }
206
207 if (getNumberOfDimensions(input1) != getNumberOfDimensions(input2))
208 return false;
209
210 auto shape1 = input1->getShape();
211 auto shape2 = input2->getShape();
212 for (uint32_t i = 0; i < getNumberOfDimensions(input1); i++)
213 if (shape1.dim(i) != shape2.dim(i))
214 return false;
215
216 return true;
217}
uint32_t getNumberOfDimensions(const Shape &shape)
Definition Shape.cpp:58

References getNumberOfDimensions(), and onert::backend::IPortableTensor::getShape().

Referenced by onert::backend::cpu::ops::PowLayer::powFloat32(), and onert::backend::cpu::ops::SelectLayer::run().

◆ QuantizeMultiplier()

void onert::backend::cpu::ops::QuantizeMultiplier ( double  double_multiplier,
int32_t *  quantized_multiplier,
int *  shift 
)

Definition at line 56 of file OperationUtils.cc.

57{
58 if (double_multiplier == 0.)
59 {
60 *quantized_multiplier = 0;
61 *shift = 0;
62 return;
63 }
64 const double q = std::frexp(double_multiplier, shift);
65 auto q_fixed = static_cast<int64_t>(std::round(q * (1ll << 31)));
66
67 assert(q_fixed <= (1ll << 31));
68 if (q_fixed == (1ll << 31))
69 {
70 q_fixed /= 2;
71 ++*shift;
72 }
73 assert(q_fixed <= std::numeric_limits<int32_t>::max());
74 *quantized_multiplier = static_cast<int32_t>(q_fixed);
75}

Referenced by onert::backend::cpu::ops::QuantizeLayer::configure(), onert::backend::cpu::ops::DepthwiseConvolutionLayer::convQ8uPerTensor(), onert::backend::cpu::ops::FullyConnectedLayer::fullyConnectedQuant8(), and GetQuantizedConvolutionMultipliersAndShifts().

◆ QuantizeMultiplierGreaterThanOne()

void onert::backend::cpu::ops::QuantizeMultiplierGreaterThanOne ( double  double_multiplier,
int32_t *  quantized_multiplier,
int *  left_shift 
)

Definition at line 121 of file OperationUtils.cc.

123{
124 assert(double_multiplier > 1.);
125 const double q = std::frexp(double_multiplier, left_shift);
126 int64_t q_fixed = static_cast<int64_t>(std::round(q * (1ll << 31)));
127 assert(q_fixed <= (1ll << 31));
128 if (q_fixed == (1ll << 31))
129 {
130 q_fixed /= 2;
131 ++*left_shift;
132 }
133 assert(*left_shift >= 0);
134 assert(q_fixed <= std::numeric_limits<int32_t>::max());
135 *quantized_multiplier = static_cast<int32_t>(q_fixed);
136}

◆ sizeOfData()

uint32_t onert::backend::cpu::ops::sizeOfData ( OperandType  type,
const std::vector< int32_t > &  dimensions 
)

Definition at line 229 of file OperationUtils.cc.

230{
231 uint32_t size = 4;
232
233 switch (type)
234 {
235 case OperandType::FLOAT32:
236 case OperandType::INT32:
237 case OperandType::UINT32:
238 size = 4;
239 break;
240 case OperandType::BOOL8:
241 case OperandType::QUANT_UINT8_ASYMM:
242 case OperandType::QUANT_INT8_SYMM:
243 size = 1;
244 break;
245 case OperandType::INT64:
246 size = 8;
247 break;
248 default:
249 throw std::runtime_error("Not supported operand type.");
250 break;
251 }
252
253 for (auto &&d : dimensions)
254 {
255 assert(d >= 0);
256 size *= static_cast<uint32_t>(d);
257 }
258
259 return size;
260}
int32_t size[5]
Definition Slice.cpp:35

References size.

Referenced by onert::backend::cpu::ops::SplitLayer::split(), and onert::backend::cpu::ops::SplitVLayer::splitV().

◆ toArray()

template<typename T >
Array< T > onert::backend::cpu::ops::toArray ( uint8_t *  ptr,
std::vector< int32_t > &  descr 
)

Definition at line 258 of file DetectionPostProcessLayer.cc.

259{
260 ndarray::Shape shape(descr.size());
261 for (size_t i = 0; i < descr.size(); ++i)
262 {
263 shape.dim(i) = descr[i];
264 }
265
266 return Array<T>{reinterpret_cast<T *>(ptr), shape};
267}

References ndarray::Shape::dim().