xref: /aosp_15_r20/external/armnn/src/backends/reference/workloads/RefFakeQuantizationFloat32Workload.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "RefFakeQuantizationFloat32Workload.hpp"
7 
8 #include "RefWorkloadUtils.hpp"
9 
10 #include "Profiling.hpp"
11 
12 #include <armnn/utility/NumericCast.hpp>
13 
14 namespace armnn
15 {
16 
FakeQuantization(const float * inputData,float * outputData,uint32_t numElements,float min,float max)17 void FakeQuantization(const float* inputData, float* outputData, uint32_t numElements, float min, float max)
18 {
19     float scale = (max - min) / 255.f;
20     int32_t offset = armnn::numeric_cast<int32_t>((-min * 255.f) / (max - min));
21 
22     for (uint32_t i = 0; i < numElements; i++)
23     {
24         outputData[i] = static_cast<float>(armnn::Quantize<uint8_t>(inputData[i], scale, offset));
25     }
26 
27 }
28 
Execute() const29 void RefFakeQuantizationFloat32Workload::Execute() const
30 {
31     Execute(m_Data.m_Inputs, m_Data.m_Outputs);
32 }
33 
ExecuteAsync(ExecutionData & executionData)34 void RefFakeQuantizationFloat32Workload::ExecuteAsync(ExecutionData& executionData)
35 {
36     WorkingMemDescriptor* workingMemDescriptor = static_cast<WorkingMemDescriptor*>(executionData.m_Data);
37     Execute(workingMemDescriptor->m_Inputs, workingMemDescriptor->m_Outputs);
38 }
39 
Execute(std::vector<ITensorHandle * > inputs,std::vector<ITensorHandle * > outputs) const40 void RefFakeQuantizationFloat32Workload::Execute(std::vector<ITensorHandle*> inputs,
41                                                  std::vector<ITensorHandle*> outputs) const
42 {
43     ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefFakeQuantizationFloat32Workload_Execute");
44 
45     const TensorInfo& inputInfo = GetTensorInfo(inputs[0]);
46 
47     const float* inputData = reinterpret_cast<const float*>(inputs[0]->Map());
48     float* outputData = reinterpret_cast<float*>(outputs[0]->Map());
49     FakeQuantization(inputData, outputData, inputInfo.GetNumElements(),
50                      m_Data.m_Parameters.m_Min,
51                      m_Data.m_Parameters.m_Max);
52 }
53 
54 } //namespace armnn
55