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

#include <QuantizeLayer.h>

Collaboration diagram for onert::backend::cpu::ops::QuantizeLayer:

Public Member Functions

 QuantizeLayer ()
 
void configure (const IPortableTensor *input, IPortableTensor *output)
 
void run () override
 
- Public Member Functions inherited from onert::exec::IFunction
virtual ~IFunction ()=default
 
virtual void prepare ()
 

Detailed Description

Definition at line 26 of file QuantizeLayer.h.

Constructor & Destructor Documentation

◆ QuantizeLayer()

onert::backend::cpu::ops::QuantizeLayer::QuantizeLayer ( )
inline

Definition at line 29 of file QuantizeLayer.h.

29 : _input(nullptr), _output(nullptr), _output_multiplier(0), _output_shift(0)
30 {
31 // DO NOTHING
32 }

Member Function Documentation

◆ configure()

void onert::backend::cpu::ops::QuantizeLayer::configure ( const IPortableTensor input,
IPortableTensor output 
)

Definition at line 36 of file QuantizeLayer.cc.

37{
38 assert(input != nullptr);
39 assert(output != nullptr);
40
41 _input = input;
42 _output = output;
43
44 if ((_input->data_type() == OperandType::FLOAT32))
45 {
46 // DO NOTHING
47 }
48 else if (((input->data_type() == OperandType::QUANT_UINT8_ASYMM) &&
49 (output->data_type() == OperandType::QUANT_INT8_ASYMM)) ||
50 ((input->data_type() == OperandType::QUANT_INT8_ASYMM) &&
51 (output->data_type() == OperandType::QUANT_UINT8_ASYMM)))
52 {
53 const double effective_output_scale =
54 static_cast<double>(input->data_scale()) / static_cast<double>(output->data_scale());
55 QuantizeMultiplier(effective_output_scale, &_output_multiplier, &_output_shift);
56 }
57 else
58 {
59 throw std::runtime_error{"Quantize: Unsupported data type"};
60 }
61}
ir::DataType data_type() const override final
void QuantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, int *shift)

References onert::backend::IPortableTensor::data_type(), and onert::backend::cpu::ops::QuantizeMultiplier().

◆ run()

void onert::backend::cpu::ops::QuantizeLayer::run ( )
overridevirtual

Implements onert::exec::IFunction.

Definition at line 63 of file QuantizeLayer.cc.

64{
65 if ((_input->data_type() == OperandType::FLOAT32))
66 {
67 affineQuantize<float, uint8_t>(_input, _output);
68 }
69 else if ((_input->data_type() == OperandType::QUANT_UINT8_ASYMM) &&
70 (_output->data_type() == OperandType::QUANT_INT8_ASYMM))
71 {
73 getBuffer<uint8_t>(_input), MatchingFlatSize(getShape(_input), getShape(_output)),
74 _output_multiplier, _output_shift, _input->data_zero_point(), _output->data_zero_point(),
75 getBuffer<int8_t>(_output));
76 }
77 else if ((_input->data_type() == OperandType::QUANT_INT8_ASYMM) &&
78 (_output->data_type() == OperandType::QUANT_UINT8_ASYMM))
79 {
81 getBuffer<int8_t>(_input), MatchingFlatSize(getShape(_input), getShape(_output)),
82 _output_multiplier, _output_shift, _input->data_zero_point(), _output->data_zero_point(),
83 getBuffer<uint8_t>(_output));
84 }
85 else
86 {
87 throw std::runtime_error{"Quantize: Unsupported data type"};
88 }
89}
int MatchingFlatSize(const Dims< N > &dims, const Dims< N > &check_dims_0)
Definition Dims.h:108
int32_t data_zero_point() const override final
void Requantize< int8_t, uint8_t >(const int8_t *input_data, int32_t size, int32_t effective_scale_multiplier, int32_t effective_scale_shift, int32_t input_zeropoint, int32_t output_zeropoint, uint8_t *output_data)
Definition Quantize.h:379
void Requantize< uint8_t, int8_t >(const uint8_t *input_data, int32_t size, int32_t effective_scale_multiplier, int32_t effective_scale_shift, int32_t input_zeropoint, int32_t output_zeropoint, int8_t *output_data)
Definition Quantize.h:311
nnfw::cker::Shape getShape(const IPortableTensor *tensor)

References onert::backend::IPortableTensor::data_type(), onert::backend::IPortableTensor::data_zero_point(), onert::backend::cpu::ops::getShape(), MatchingFlatSize(), nnfw::cker::Requantize< int8_t, uint8_t >(), and nnfw::cker::Requantize< uint8_t, int8_t >().


The documentation for this class was generated from the following files: