blob: 0a4bdb8124dfe9315161a99a1734c0d9eb03f1e1 [file] [log] [blame]
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +00005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "DequantizeTestImpl.hpp"
7
8#include <ResolveType.hpp>
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +00009
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +000010
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010011#include <backendsCommon/test/TensorCopyUtils.hpp>
12#include <backendsCommon/test/WorkloadTestUtils.hpp>
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +000013
14#include <test/TensorHelpers.hpp>
15
16namespace
17{
18
Jan Eilersf7107932019-11-01 11:09:36 +000019template<typename T, std::size_t Dim, typename T1=float>
20LayerTestResult<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)
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +000028{
Jan Eilers8eb25602020-03-09 12:13:48 +000029 IgnoreUnused(memoryManager);
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +000030 boost::multi_array<T, Dim> input = MakeTensor<T, Dim>(inputTensorInfo, inputData);
31
Jan Eilersf7107932019-11-01 11:09:36 +000032 LayerTestResult<T1, Dim> ret(outputTensorInfo);
33 ret.outputExpected = MakeTensor<T1, Dim>(outputTensorInfo, expectedOutputData);
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +000034
35 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
36 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
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.CreateDequantize(descriptor, info);
43
44 inputHandle->Allocate();
45 outputHandle->Allocate();
46
47 CopyDataToITensorHandle(inputHandle.get(), input.data());
48
49 ExecuteWorkload(*workload, memoryManager);
50
51 CopyDataFromITensorHandle(ret.output.data(), outputHandle.get());
52
53 return ret;
54}
55
Jan Eilersf7107932019-11-01 11:09:36 +000056template <armnn::DataType ArmnnInputType,
57 armnn::DataType ArmnnOutputType=armnn::DataType::Float32,
58 typename OutType=armnn::ResolveType<ArmnnOutputType>>
59LayerTestResult<OutType, 4> DequantizeSimpleTest(
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +000060 armnn::IWorkloadFactory& workloadFactory,
61 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
62{
63 using T = armnn::ResolveType<ArmnnInputType>;
64
65 armnn::DequantizeQueueDescriptor desc;
66
Nattapat Chaimanowongafa4e3a2019-04-02 11:41:45 +010067 const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, ArmnnInputType, 0.5f, 0);
Jan Eilersf7107932019-11-01 11:09:36 +000068 const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, ArmnnOutputType);
Nattapat Chaimanowongafa4e3a2019-04-02 11:41:45 +010069
70 std::vector<T> inputData = std::vector<T>(
71 {
72 2, 4, 6,
73 8, 10, 12,
74 14, 16, 18,
75 20, 22, 24,
76 });
77
Jan Eilersf7107932019-11-01 11:09:36 +000078 std::vector<OutType> expectedOutputData;
79 for (OutType i = OutType(1); i <= OutType(12); ++i)
Nattapat Chaimanowongafa4e3a2019-04-02 11:41:45 +010080 {
Jan Eilersf7107932019-11-01 11:09:36 +000081 expectedOutputData.push_back(i);
82 }
Nattapat Chaimanowongafa4e3a2019-04-02 11:41:45 +010083
Jan Eilersf7107932019-11-01 11:09:36 +000084 return DequantizeTestImpl<T, 4, OutType>(workloadFactory,
85 memoryManager,
86 inputTensorInfo,
87 outputTensorInfo,
88 inputData,
89 expectedOutputData,
90 desc);
Nattapat Chaimanowongafa4e3a2019-04-02 11:41:45 +010091}
92
93template <armnn::DataType ArmnnInputType>
94LayerTestResult<float, 4> DequantizeOffsetTest(
95 armnn::IWorkloadFactory& workloadFactory,
96 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
97{
98 using T = armnn::ResolveType<ArmnnInputType>;
99
100 armnn::DequantizeQueueDescriptor desc;
101
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +0000102 const armnn::TensorInfo inputTensorInfo({1, 2, 2, 3}, ArmnnInputType, 0.5f, 1);
103 const armnn::TensorInfo outputTensorInfo({1, 2, 2, 3}, armnn::DataType::Float32);
104
105 std::vector<T> inputData = std::vector<T>(
106 {
107 3, 5, 7,
108 9, 11, 13,
109 15, 17, 19,
110 21, 23, 25,
111 });
112
113 std::vector<float> expectedOutputData = std::vector<float>(
114 {
115 1.0f, 2.0f, 3.0f,
116 4.0f, 5.0f, 6.0f,
117 7.0f, 8.0f, 9.0f,
118 10.0f, 11.0f, 12.0f,
119 });
120
121 return DequantizeTestImpl<T, 4>(workloadFactory,
122 memoryManager,
123 inputTensorInfo,
124 outputTensorInfo,
125 inputData,
126 expectedOutputData,
127 desc);
128}
129
130} // anonymous namespace
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100131
132LayerTestResult<float, 4> DequantizeSimpleUint8Test(
133 armnn::IWorkloadFactory& workloadFactory,
134 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
135{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000136 return DequantizeSimpleTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100137}
138
139LayerTestResult<float, 4> DequantizeOffsetUint8Test(
140 armnn::IWorkloadFactory& workloadFactory,
141 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
142{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000143 return DequantizeOffsetTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100144}
145
Ryan OShea9add1202020-02-07 10:06:33 +0000146LayerTestResult<float, 4> DequantizeSimpleAsymmInt8Test(
147 armnn::IWorkloadFactory& workloadFactory,
148 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
149{
150 return DequantizeSimpleTest<armnn::DataType::QAsymmS8>(workloadFactory, memoryManager);
151}
152
153LayerTestResult<float, 4> DequantizeOffsetAsymmInt8Test(
154 armnn::IWorkloadFactory& workloadFactory,
155 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
156{
157 return DequantizeOffsetTest<armnn::DataType::QAsymmS8>(workloadFactory, memoryManager);
158}
159
Finn Williamsfd271062019-12-04 14:27:27 +0000160LayerTestResult<float, 4> DequantizeSimpleInt8Test(
161 armnn::IWorkloadFactory& workloadFactory,
162 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
163{
164 return DequantizeSimpleTest<armnn::DataType::QSymmS8>(workloadFactory, memoryManager);
165}
166
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100167LayerTestResult<float, 4> DequantizeSimpleInt16Test(
168 armnn::IWorkloadFactory& workloadFactory,
169 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
170{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000171 return DequantizeSimpleTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100172}
Jan Eilersf7107932019-11-01 11:09:36 +0000173
174LayerTestResult<armnn::Half, 4> DequantizeSimpleUint8ToFp16Test(
175 armnn::IWorkloadFactory& workloadFactory,
176 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
177{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000178 return DequantizeSimpleTest<armnn::DataType::QAsymmU8, armnn::DataType::Float16>(workloadFactory,
Jan Eilersf7107932019-11-01 11:09:36 +0000179 memoryManager);
180}
181
Finn Williamsfd271062019-12-04 14:27:27 +0000182LayerTestResult<armnn::Half, 4> DequantizeSimpleInt8ToFp16Test(
183 armnn::IWorkloadFactory& workloadFactory,
184 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
185{
186 return DequantizeSimpleTest<armnn::DataType::QSymmS8, armnn::DataType::Float16>(workloadFactory, memoryManager);
187}
188
Jan Eilersf7107932019-11-01 11:09:36 +0000189LayerTestResult<armnn::Half, 4> DequantizeSimpleInt16ToFp16Test(
190 armnn::IWorkloadFactory& workloadFactory,
191 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
192{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000193 return DequantizeSimpleTest<armnn::DataType::QSymmS16, armnn::DataType::Float16>(workloadFactory,
Jan Eilersf7107932019-11-01 11:09:36 +0000194 memoryManager);
195}