blob: 9175aec8c6da2b498430bd83383ef0d3d932fc5c [file] [log] [blame]
Keith Davisa57eccb2019-06-14 17:33:22 +01001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Keith Davisa57eccb2019-06-14 17:33:22 +01003// SPDX-License-Identifier: MIT
4//
Keith Davisa57eccb2019-06-14 17:33:22 +01005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "SpaceToDepthTestImpl.hpp"
7
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01008#include <QuantizeHelper.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01009#include <ResolveType.hpp>
Keith Davisa57eccb2019-06-14 17:33:22 +010010
Keith Davisa57eccb2019-06-14 17:33:22 +010011
Matteo Martincighe011d202019-11-28 11:35:47 +000012#include <armnnUtils/Permute.hpp>
13
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010014#include <backendsCommon/test/TensorCopyUtils.hpp>
15#include <backendsCommon/test/WorkloadTestUtils.hpp>
Keith Davisa57eccb2019-06-14 17:33:22 +010016
17#include <test/TensorHelpers.hpp>
18
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010019namespace
20{
21
Keith Davisa57eccb2019-06-14 17:33:22 +010022template<typename T>
23LayerTestResult<T, 4> SpaceToDepthTestImpl(
24 armnn::IWorkloadFactory& workloadFactory,
25 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +010026 const armnn::ITensorHandleFactory& tensorHandleFactory,
Keith Davisa57eccb2019-06-14 17:33:22 +010027 armnn::TensorInfo& inputTensorInfo,
28 armnn::TensorInfo& outputTensorInfo,
29 std::vector<float>& inputData,
30 std::vector<float>& outputExpectedData,
31 armnn::SpaceToDepthQueueDescriptor descriptor,
32 const float qScale = 1.0f,
33 const int32_t qOffset = 0)
34{
Jan Eilers8eb25602020-03-09 12:13:48 +000035 IgnoreUnused(memoryManager);
Keith Davisa57eccb2019-06-14 17:33:22 +010036 const armnn::PermutationVector NHWCToNCHW = {0, 2, 3, 1};
37
38 if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
39 {
40 inputTensorInfo = armnnUtils::Permuted(inputTensorInfo, NHWCToNCHW);
41 outputTensorInfo = armnnUtils::Permuted(outputTensorInfo, NHWCToNCHW);
42
43 std::vector<float> inputTmp(inputData.size());
44 armnnUtils::Permute(inputTensorInfo.GetShape(), NHWCToNCHW,
45 inputData.data(), inputTmp.data(), sizeof(float));
46 inputData = inputTmp;
47
48 std::vector<float> outputTmp(outputExpectedData.size());
49 armnnUtils::Permute(outputTensorInfo.GetShape(), NHWCToNCHW,
50 outputExpectedData.data(), outputTmp.data(), sizeof(float));
51 outputExpectedData = outputTmp;
52 }
53
54 if(armnn::IsQuantizedType<T>())
55 {
56 inputTensorInfo.SetQuantizationScale(qScale);
57 inputTensorInfo.SetQuantizationOffset(qOffset);
58 outputTensorInfo.SetQuantizationScale(qScale);
59 outputTensorInfo.SetQuantizationOffset(qOffset);
60 }
61
Sadik Armagan483c8112021-06-01 09:24:52 +010062 std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
63 std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset);
64 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
Keith Davisa57eccb2019-06-14 17:33:22 +010065
Sadik Armagan5e719842020-08-28 12:17:33 +010066 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
67 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Keith Davisa57eccb2019-06-14 17:33:22 +010068
69 armnn::WorkloadInfo info;
70 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
71 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
72
73 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSpaceToDepth(descriptor, info);
74
75 inputHandle->Allocate();
76 outputHandle->Allocate();
77
Sadik Armagan483c8112021-06-01 09:24:52 +010078 CopyDataToITensorHandle(inputHandle.get(), input.data());
Keith Davisa57eccb2019-06-14 17:33:22 +010079
80 workload->Execute();
81
Sadik Armagan483c8112021-06-01 09:24:52 +010082 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Keith Davisa57eccb2019-06-14 17:33:22 +010083
Sadik Armagan483c8112021-06-01 09:24:52 +010084 return LayerTestResult<T, 4>(actualOutput,
85 expectedOutput,
86 outputHandle->GetShape(),
87 outputTensorInfo.GetShape());
Keith Davisa57eccb2019-06-14 17:33:22 +010088}
89
90template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
James Conroyd2aa85e2019-07-01 17:12:40 +010091LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
Keith Davisa57eccb2019-06-14 17:33:22 +010092 armnn::IWorkloadFactory& workloadFactory,
93 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +010094 const armnn::ITensorHandleFactory& tensorHandleFactory,
Keith Davisa57eccb2019-06-14 17:33:22 +010095 armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
96{
97 unsigned int inputShape[] = {1, 2, 2, 1};
98 unsigned int outputShape[] = {1, 1, 1, 4};
99
100 std::vector<float> input = std::vector<float>(
101 {
102 1.0f, 2.0f, 3.0f, 4.0f
103 });
104
105 std::vector<float> outputExpected = std::vector<float>(
106 {
107 1.0f, 2.0f, 3.0f, 4.0f
108 });
109
110 armnn::TensorInfo inputTensorInfo;
111 armnn::TensorInfo outputTensorInfo;
112
113 armnn::SpaceToDepthQueueDescriptor desc;
114 desc.m_Parameters.m_DataLayout = dataLayout;
115 desc.m_Parameters.m_BlockSize = 2;
116
117 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
118 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
119
120 return SpaceToDepthTestImpl<T>(
Sadik Armagan5e719842020-08-28 12:17:33 +0100121 workloadFactory, memoryManager, tensorHandleFactory,
122 inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
Keith Davisa57eccb2019-06-14 17:33:22 +0100123}
124
125template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
James Conroyd2aa85e2019-07-01 17:12:40 +0100126LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
Keith Davisa57eccb2019-06-14 17:33:22 +0100127 armnn::IWorkloadFactory& workloadFactory,
128 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100129 const armnn::ITensorHandleFactory& tensorHandleFactory,
Keith Davisa57eccb2019-06-14 17:33:22 +0100130 armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
131{
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100132 unsigned int inputShape[] = {1, 2, 2, 2};
Keith Davisa57eccb2019-06-14 17:33:22 +0100133 unsigned int outputShape[] = {1, 1, 1, 8};
134
135 std::vector<float> input = std::vector<float>(
136 {
137 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
138 });
139
140 std::vector<float> outputExpected = std::vector<float>(
141 {
142 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
143 });
144
145 armnn::TensorInfo inputTensorInfo;
146 armnn::TensorInfo outputTensorInfo;
147
148 armnn::SpaceToDepthQueueDescriptor desc;
149 desc.m_Parameters.m_DataLayout = dataLayout;
150 desc.m_Parameters.m_BlockSize = 2;
151
152 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
153 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
154
155 return SpaceToDepthTestImpl<T>(
Sadik Armagan5e719842020-08-28 12:17:33 +0100156 workloadFactory, memoryManager, tensorHandleFactory,
157 inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
Keith Davisa57eccb2019-06-14 17:33:22 +0100158}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100159
160} // anonymous namespace
161
162LayerTestResult<uint8_t, 4> SpaceToDepthNhwcAsymmQ8Test(
163 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100164 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
165 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100166{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000167 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100168 workloadFactory,
169 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100170 tensorHandleFactory);
171}
172
173LayerTestResult<uint8_t, 4> SpaceToDepthNchwAsymmQ8Test(
174 armnn::IWorkloadFactory& workloadFactory,
175 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
176 const armnn::ITensorHandleFactory& tensorHandleFactory)
177{
178 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
179 workloadFactory,
180 memoryManager,
181 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100182 armnn::DataLayout::NCHW);
183}
184
Matthew Jackson9bff1442019-09-12 09:08:23 +0100185LayerTestResult<armnn::Half, 4> SpaceToDepthNhwcFloat16Test(
186 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100187 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
188 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100189{
190 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
191 workloadFactory,
192 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100193 tensorHandleFactory);
194}
195
196LayerTestResult<armnn::Half, 4> SpaceToDepthNchwFloat16Test(
197 armnn::IWorkloadFactory& workloadFactory,
198 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
199 const armnn::ITensorHandleFactory& tensorHandleFactory)
200{
201 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
202 workloadFactory,
203 memoryManager,
204 tensorHandleFactory,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100205 armnn::DataLayout::NCHW);
206}
207
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100208LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test1(
209 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100210 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
211 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100212{
213 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
214 workloadFactory,
215 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100216 tensorHandleFactory);
217}
218
219LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test1(
220 armnn::IWorkloadFactory& workloadFactory,
221 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
222 const armnn::ITensorHandleFactory& tensorHandleFactory)
223{
224 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
225 workloadFactory,
226 memoryManager,
227 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100228 armnn::DataLayout::NCHW);
229}
230
231LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test2(
232 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100233 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
234 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100235{
236 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
237 workloadFactory,
238 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100239 tensorHandleFactory);
240}
241
242LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test2(
243 armnn::IWorkloadFactory& workloadFactory,
244 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
245 const armnn::ITensorHandleFactory& tensorHandleFactory)
246{
247 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
248 workloadFactory,
249 memoryManager,
250 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100251 armnn::DataLayout::NCHW);
252}
253
254LayerTestResult<int16_t, 4> SpaceToDepthNhwcQSymm16Test(
255 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
257 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100258{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000259 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100260 workloadFactory,
261 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100262 tensorHandleFactory);
263}
264
265LayerTestResult<int16_t, 4> SpaceToDepthNchwQSymm16Test(
266 armnn::IWorkloadFactory& workloadFactory,
267 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
268 const armnn::ITensorHandleFactory& tensorHandleFactory)
269{
270 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
271 workloadFactory,
272 memoryManager,
273 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100274 armnn::DataLayout::NCHW);
275}