xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/test/layerTests/DequantizeTestImpl.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "DequantizeTestImpl.hpp"
7 
8 #include <ResolveType.hpp>
9 
10 
11 #include <armnnTestUtils/TensorCopyUtils.hpp>
12 #include <armnnTestUtils/WorkloadTestUtils.hpp>
13 
14 #include <armnnTestUtils/TensorHelpers.hpp>
15 
16 namespace
17 {
18 
19 template<typename T, std::size_t Dim, typename T1=float>
DequantizeTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::TensorInfo & inputTensorInfo,const armnn::TensorInfo & outputTensorInfo,const std::vector<T> & inputData,const std::vector<T1> & expectedOutputData,armnn::DequantizeQueueDescriptor descriptor)20 LayerTestResult<T1, Dim> DequantizeTestImpl(
21         armnn::IWorkloadFactory& workloadFactory,
22         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
23         const armnn::TensorInfo& inputTensorInfo,
24         const armnn::TensorInfo& outputTensorInfo,
25         const std::vector<T>& inputData,
26         const std::vector<T1>& expectedOutputData,
27         armnn::DequantizeQueueDescriptor descriptor)
28 {
29     IgnoreUnused(memoryManager);
30 
31     std::vector<T1> actualOutput(outputTensorInfo.GetNumElements());
32 
33     ARMNN_NO_DEPRECATE_WARN_BEGIN
34     std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
35     std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
36     ARMNN_NO_DEPRECATE_WARN_END
37 
38     armnn::WorkloadInfo info;
39     AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
40     AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
41 
42     std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Dequantize,
43                                                                                 descriptor,
44                                                                                 info);
45 
46     inputHandle->Allocate();
47     outputHandle->Allocate();
48 
49     CopyDataToITensorHandle(inputHandle.get(), inputData.data());
50 
51     ExecuteWorkload(*workload, memoryManager);
52 
53     CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
54 
55     return LayerTestResult<T1, Dim>(actualOutput,
56                                     expectedOutputData,
57                                     outputHandle->GetShape(),
58                                     outputTensorInfo.GetShape());
59 }
60 
61 template <armnn::DataType ArmnnInputType,
62           armnn::DataType ArmnnOutputType=armnn::DataType::Float32,
63           typename OutType=armnn::ResolveType<ArmnnOutputType>>
DequantizeSimpleTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)64 LayerTestResult<OutType, 4> DequantizeSimpleTest(
65     armnn::IWorkloadFactory& workloadFactory,
66     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
67 {
68     using T = armnn::ResolveType<ArmnnInputType>;
69 
70     armnn::DequantizeQueueDescriptor desc;
71 
72     const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, ArmnnInputType, 0.5f, 0);
73     const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, ArmnnOutputType);
74 
75     std::vector<T> inputData = std::vector<T>(
76     {
77          2,  4,  6,
78          8, 10, 12,
79         14, 16, 18,
80         20, 22, 24,
81     });
82 
83     std::vector<OutType> expectedOutputData;
84     for (OutType i = OutType(1); i <= OutType(12); ++i)
85     {
86         expectedOutputData.push_back(i);
87     }
88 
89     return DequantizeTestImpl<T, 4, OutType>(workloadFactory,
90                                              memoryManager,
91                                              inputTensorInfo,
92                                              outputTensorInfo,
93                                              inputData,
94                                              expectedOutputData,
95                                              desc);
96 }
97 
98 template <armnn::DataType ArmnnInputType>
DequantizeOffsetTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)99 LayerTestResult<float, 4> DequantizeOffsetTest(
100     armnn::IWorkloadFactory& workloadFactory,
101     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
102 {
103     using T = armnn::ResolveType<ArmnnInputType>;
104 
105     armnn::DequantizeQueueDescriptor desc;
106 
107     const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, ArmnnInputType, 0.5f, 1);
108     const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, armnn::DataType::Float32);
109 
110     std::vector<T> inputData = std::vector<T>(
111     {
112          3,  5,  7,
113          9, 11, 13,
114         15, 17, 19,
115         21, 23, 25,
116     });
117 
118     std::vector<float> expectedOutputData = std::vector<float>(
119     {
120         1.0f,   2.0f,  3.0f,
121         4.0f,   5.0f,  6.0f,
122         7.0f,   8.0f,  9.0f,
123         10.0f, 11.0f, 12.0f,
124     });
125 
126     return DequantizeTestImpl<T, 4>(workloadFactory,
127                                     memoryManager,
128                                     inputTensorInfo,
129                                     outputTensorInfo,
130                                     inputData,
131                                     expectedOutputData,
132                                     desc);
133 }
134 
135 } // anonymous namespace
136 
DequantizeSimpleUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)137 LayerTestResult<float, 4> DequantizeSimpleUint8Test(
138     armnn::IWorkloadFactory& workloadFactory,
139     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
140 {
141     return DequantizeSimpleTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
142 }
143 
DequantizeOffsetUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)144 LayerTestResult<float, 4> DequantizeOffsetUint8Test(
145     armnn::IWorkloadFactory& workloadFactory,
146     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
147 {
148     return DequantizeOffsetTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
149 }
150 
DequantizeSimpleAsymmInt8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)151 LayerTestResult<float, 4> DequantizeSimpleAsymmInt8Test(
152     armnn::IWorkloadFactory& workloadFactory,
153     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
154 {
155     return DequantizeSimpleTest<armnn::DataType::QAsymmS8>(workloadFactory, memoryManager);
156 }
157 
DequantizeOffsetAsymmInt8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)158 LayerTestResult<float, 4> DequantizeOffsetAsymmInt8Test(
159     armnn::IWorkloadFactory& workloadFactory,
160     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
161 {
162     return DequantizeOffsetTest<armnn::DataType::QAsymmS8>(workloadFactory, memoryManager);
163 }
164 
DequantizeSimpleInt8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)165 LayerTestResult<float, 4> DequantizeSimpleInt8Test(
166         armnn::IWorkloadFactory& workloadFactory,
167         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
168 {
169     return DequantizeSimpleTest<armnn::DataType::QSymmS8>(workloadFactory, memoryManager);
170 }
171 
DequantizeSimpleInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)172 LayerTestResult<float, 4> DequantizeSimpleInt16Test(
173     armnn::IWorkloadFactory& workloadFactory,
174     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
175 {
176     return DequantizeSimpleTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
177 }
178 
DequantizeSimpleUint8ToFp16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)179 LayerTestResult<armnn::Half, 4> DequantizeSimpleUint8ToFp16Test(
180     armnn::IWorkloadFactory& workloadFactory,
181     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
182 {
183     return DequantizeSimpleTest<armnn::DataType::QAsymmU8, armnn::DataType::Float16>(workloadFactory,
184                                                                                             memoryManager);
185 }
186 
DequantizeSimpleInt8ToFp16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)187 LayerTestResult<armnn::Half, 4> DequantizeSimpleInt8ToFp16Test(
188         armnn::IWorkloadFactory& workloadFactory,
189         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
190 {
191     return DequantizeSimpleTest<armnn::DataType::QSymmS8, armnn::DataType::Float16>(workloadFactory, memoryManager);
192 }
193 
DequantizeSimpleInt16ToFp16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)194 LayerTestResult<armnn::Half, 4> DequantizeSimpleInt16ToFp16Test(
195     armnn::IWorkloadFactory& workloadFactory,
196     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
197 {
198     return DequantizeSimpleTest<armnn::DataType::QSymmS16, armnn::DataType::Float16>(workloadFactory,
199                                                                                             memoryManager);
200 }
201