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