blob: 74407bb9d39008de514fb77af94d5462111878ab [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,
26 armnn::TensorInfo& inputTensorInfo,
27 armnn::TensorInfo& outputTensorInfo,
28 std::vector<float>& inputData,
29 std::vector<float>& outputExpectedData,
30 armnn::SpaceToDepthQueueDescriptor descriptor,
31 const float qScale = 1.0f,
32 const int32_t qOffset = 0)
33{
Jan Eilers8eb25602020-03-09 12:13:48 +000034 IgnoreUnused(memoryManager);
Keith Davisa57eccb2019-06-14 17:33:22 +010035 const armnn::PermutationVector NHWCToNCHW = {0, 2, 3, 1};
36
37 if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
38 {
39 inputTensorInfo = armnnUtils::Permuted(inputTensorInfo, NHWCToNCHW);
40 outputTensorInfo = armnnUtils::Permuted(outputTensorInfo, NHWCToNCHW);
41
42 std::vector<float> inputTmp(inputData.size());
43 armnnUtils::Permute(inputTensorInfo.GetShape(), NHWCToNCHW,
44 inputData.data(), inputTmp.data(), sizeof(float));
45 inputData = inputTmp;
46
47 std::vector<float> outputTmp(outputExpectedData.size());
48 armnnUtils::Permute(outputTensorInfo.GetShape(), NHWCToNCHW,
49 outputExpectedData.data(), outputTmp.data(), sizeof(float));
50 outputExpectedData = outputTmp;
51 }
52
53 if(armnn::IsQuantizedType<T>())
54 {
55 inputTensorInfo.SetQuantizationScale(qScale);
56 inputTensorInfo.SetQuantizationOffset(qOffset);
57 outputTensorInfo.SetQuantizationScale(qScale);
58 outputTensorInfo.SetQuantizationOffset(qOffset);
59 }
60
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010061 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputTensorInfo,
62 armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
Keith Davisa57eccb2019-06-14 17:33:22 +010063
64 LayerTestResult<T, 4> ret(outputTensorInfo);
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010065 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo,
66 armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset));
Keith Davisa57eccb2019-06-14 17:33:22 +010067
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010068 ARMNN_NO_DEPRECATE_WARN_BEGIN
Keith Davisa57eccb2019-06-14 17:33:22 +010069 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
70 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010071 ARMNN_NO_DEPRECATE_WARN_END
Keith Davisa57eccb2019-06-14 17:33:22 +010072
73 armnn::WorkloadInfo info;
74 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
75 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
76
77 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSpaceToDepth(descriptor, info);
78
79 inputHandle->Allocate();
80 outputHandle->Allocate();
81
82 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
83
84 workload->Execute();
85
86 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
87
88 return ret;
89}
90
91template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
James Conroyd2aa85e2019-07-01 17:12:40 +010092LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
Keith Davisa57eccb2019-06-14 17:33:22 +010093 armnn::IWorkloadFactory& workloadFactory,
94 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
95 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>(
121 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
122}
123
124template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
James Conroyd2aa85e2019-07-01 17:12:40 +0100125LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
Keith Davisa57eccb2019-06-14 17:33:22 +0100126 armnn::IWorkloadFactory& workloadFactory,
127 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
128 armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
129{
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100130 unsigned int inputShape[] = {1, 2, 2, 2};
Keith Davisa57eccb2019-06-14 17:33:22 +0100131 unsigned int outputShape[] = {1, 1, 1, 8};
132
133 std::vector<float> input = std::vector<float>(
134 {
135 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
136 });
137
138 std::vector<float> outputExpected = std::vector<float>(
139 {
140 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
141 });
142
143 armnn::TensorInfo inputTensorInfo;
144 armnn::TensorInfo outputTensorInfo;
145
146 armnn::SpaceToDepthQueueDescriptor desc;
147 desc.m_Parameters.m_DataLayout = dataLayout;
148 desc.m_Parameters.m_BlockSize = 2;
149
150 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
151 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
152
153 return SpaceToDepthTestImpl<T>(
154 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
155}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100156
157} // anonymous namespace
158
159LayerTestResult<uint8_t, 4> SpaceToDepthNhwcAsymmQ8Test(
160 armnn::IWorkloadFactory& workloadFactory,
161 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
162{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000163 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100164 workloadFactory,
165 memoryManager);
166}
167
168LayerTestResult<uint8_t, 4> SpaceToDepthNchwAsymmQ8Test(
169 armnn::IWorkloadFactory& workloadFactory,
170 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
171{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000172 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100173 workloadFactory,
174 memoryManager,
175 armnn::DataLayout::NCHW);
176}
177
Matthew Jackson9bff1442019-09-12 09:08:23 +0100178LayerTestResult<armnn::Half, 4> SpaceToDepthNhwcFloat16Test(
179 armnn::IWorkloadFactory& workloadFactory,
180 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
181{
182 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
183 workloadFactory,
184 memoryManager);
185}
186
187LayerTestResult<armnn::Half, 4> SpaceToDepthNchwFloat16Test(
188 armnn::IWorkloadFactory& workloadFactory,
189 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
190{
191 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
192 workloadFactory,
193 memoryManager,
194 armnn::DataLayout::NCHW);
195}
196
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100197LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test1(
198 armnn::IWorkloadFactory& workloadFactory,
199 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
200{
201 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
202 workloadFactory,
203 memoryManager);
204}
205
206LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test1(
207 armnn::IWorkloadFactory& workloadFactory,
208 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
209{
210 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
211 workloadFactory,
212 memoryManager,
213 armnn::DataLayout::NCHW);
214}
215
216LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test2(
217 armnn::IWorkloadFactory& workloadFactory,
218 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
219{
220 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
221 workloadFactory,
222 memoryManager);
223}
224
225LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test2(
226 armnn::IWorkloadFactory& workloadFactory,
227 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
228{
229 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
230 workloadFactory,
231 memoryManager,
232 armnn::DataLayout::NCHW);
233}
234
235LayerTestResult<int16_t, 4> SpaceToDepthNhwcQSymm16Test(
236 armnn::IWorkloadFactory& workloadFactory,
237 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
238{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000239 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100240 workloadFactory,
241 memoryManager);
242}
243
244LayerTestResult<int16_t, 4> SpaceToDepthNchwQSymm16Test(
245 armnn::IWorkloadFactory& workloadFactory,
246 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
247{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000248 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100249 workloadFactory,
250 memoryManager,
251 armnn::DataLayout::NCHW);
252}