blob: a17ce58e56ba0271093421c760f3f5627d9c5326 [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
Colm Donelanc42a9872022-02-02 16:35:09 +00008#include <armnnUtils/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
Sadik Armagana097d2a2021-11-24 15:47:28 +000014#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000015#include <armnnTestUtils/WorkloadTestUtils.hpp>
Keith Davisa57eccb2019-06-14 17:33:22 +010016
Colm Donelanc42a9872022-02-02 16:35:09 +000017#include <armnnTestUtils/TensorHelpers.hpp>
Keith Davisa57eccb2019-06-14 17:33:22 +010018
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
Teresa Charlin611c7fb2022-01-07 09:47:29 +000073 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::SpaceToDepth,
74 descriptor,
75 info);
Keith Davisa57eccb2019-06-14 17:33:22 +010076
77 inputHandle->Allocate();
78 outputHandle->Allocate();
79
Sadik Armagan483c8112021-06-01 09:24:52 +010080 CopyDataToITensorHandle(inputHandle.get(), input.data());
Keith Davisa57eccb2019-06-14 17:33:22 +010081
82 workload->Execute();
83
Sadik Armagan483c8112021-06-01 09:24:52 +010084 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Keith Davisa57eccb2019-06-14 17:33:22 +010085
Sadik Armagan483c8112021-06-01 09:24:52 +010086 return LayerTestResult<T, 4>(actualOutput,
87 expectedOutput,
88 outputHandle->GetShape(),
89 outputTensorInfo.GetShape());
Keith Davisa57eccb2019-06-14 17:33:22 +010090}
91
92template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
James Conroyd2aa85e2019-07-01 17:12:40 +010093LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
Keith Davisa57eccb2019-06-14 17:33:22 +010094 armnn::IWorkloadFactory& workloadFactory,
95 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +010096 const armnn::ITensorHandleFactory& tensorHandleFactory,
Keith Davisa57eccb2019-06-14 17:33:22 +010097 armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
98{
99 unsigned int inputShape[] = {1, 2, 2, 1};
100 unsigned int outputShape[] = {1, 1, 1, 4};
101
102 std::vector<float> input = std::vector<float>(
103 {
104 1.0f, 2.0f, 3.0f, 4.0f
105 });
106
107 std::vector<float> outputExpected = std::vector<float>(
108 {
109 1.0f, 2.0f, 3.0f, 4.0f
110 });
111
112 armnn::TensorInfo inputTensorInfo;
113 armnn::TensorInfo outputTensorInfo;
114
115 armnn::SpaceToDepthQueueDescriptor desc;
116 desc.m_Parameters.m_DataLayout = dataLayout;
117 desc.m_Parameters.m_BlockSize = 2;
118
119 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
120 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
121
122 return SpaceToDepthTestImpl<T>(
Sadik Armagan5e719842020-08-28 12:17:33 +0100123 workloadFactory, memoryManager, tensorHandleFactory,
124 inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
Keith Davisa57eccb2019-06-14 17:33:22 +0100125}
126
127template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
James Conroyd2aa85e2019-07-01 17:12:40 +0100128LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
Keith Davisa57eccb2019-06-14 17:33:22 +0100129 armnn::IWorkloadFactory& workloadFactory,
130 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100131 const armnn::ITensorHandleFactory& tensorHandleFactory,
Keith Davisa57eccb2019-06-14 17:33:22 +0100132 armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
133{
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100134 unsigned int inputShape[] = {1, 2, 2, 2};
Keith Davisa57eccb2019-06-14 17:33:22 +0100135 unsigned int outputShape[] = {1, 1, 1, 8};
136
137 std::vector<float> input = std::vector<float>(
138 {
139 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
140 });
141
142 std::vector<float> outputExpected = std::vector<float>(
143 {
144 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
145 });
146
147 armnn::TensorInfo inputTensorInfo;
148 armnn::TensorInfo outputTensorInfo;
149
150 armnn::SpaceToDepthQueueDescriptor desc;
151 desc.m_Parameters.m_DataLayout = dataLayout;
152 desc.m_Parameters.m_BlockSize = 2;
153
154 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
155 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
156
157 return SpaceToDepthTestImpl<T>(
Sadik Armagan5e719842020-08-28 12:17:33 +0100158 workloadFactory, memoryManager, tensorHandleFactory,
159 inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
Keith Davisa57eccb2019-06-14 17:33:22 +0100160}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100161
162} // anonymous namespace
163
164LayerTestResult<uint8_t, 4> SpaceToDepthNhwcAsymmQ8Test(
165 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100166 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
167 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100168{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000169 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100170 workloadFactory,
171 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100172 tensorHandleFactory);
173}
174
175LayerTestResult<uint8_t, 4> SpaceToDepthNchwAsymmQ8Test(
176 armnn::IWorkloadFactory& workloadFactory,
177 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
178 const armnn::ITensorHandleFactory& tensorHandleFactory)
179{
180 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
181 workloadFactory,
182 memoryManager,
183 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100184 armnn::DataLayout::NCHW);
185}
186
Matthew Jackson9bff1442019-09-12 09:08:23 +0100187LayerTestResult<armnn::Half, 4> SpaceToDepthNhwcFloat16Test(
188 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100189 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
190 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100191{
192 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
193 workloadFactory,
194 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100195 tensorHandleFactory);
196}
197
198LayerTestResult<armnn::Half, 4> SpaceToDepthNchwFloat16Test(
199 armnn::IWorkloadFactory& workloadFactory,
200 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
201 const armnn::ITensorHandleFactory& tensorHandleFactory)
202{
203 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
204 workloadFactory,
205 memoryManager,
206 tensorHandleFactory,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100207 armnn::DataLayout::NCHW);
208}
209
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100210LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test1(
211 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100212 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
213 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100214{
215 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
216 workloadFactory,
217 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100218 tensorHandleFactory);
219}
220
221LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test1(
222 armnn::IWorkloadFactory& workloadFactory,
223 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
224 const armnn::ITensorHandleFactory& tensorHandleFactory)
225{
226 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
227 workloadFactory,
228 memoryManager,
229 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100230 armnn::DataLayout::NCHW);
231}
232
233LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test2(
234 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100235 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
236 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100237{
238 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
239 workloadFactory,
240 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100241 tensorHandleFactory);
242}
243
244LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test2(
245 armnn::IWorkloadFactory& workloadFactory,
246 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
247 const armnn::ITensorHandleFactory& tensorHandleFactory)
248{
249 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
250 workloadFactory,
251 memoryManager,
252 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100253 armnn::DataLayout::NCHW);
254}
255
256LayerTestResult<int16_t, 4> SpaceToDepthNhwcQSymm16Test(
257 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
259 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100260{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000261 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100262 workloadFactory,
263 memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100264 tensorHandleFactory);
265}
266
267LayerTestResult<int16_t, 4> SpaceToDepthNchwQSymm16Test(
268 armnn::IWorkloadFactory& workloadFactory,
269 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
270 const armnn::ITensorHandleFactory& tensorHandleFactory)
271{
272 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
273 workloadFactory,
274 memoryManager,
275 tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100276 armnn::DataLayout::NCHW);
277}