blob: e2040b5b20d5a31a9f276f47c9474d80d647c171 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
telsoa014fcda012018-03-09 14:13:49 +00005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "SplitterTestImpl.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>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000010
telsoa014fcda012018-03-09 14:13:49 +000011
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010012#include <backendsCommon/test/TensorCopyUtils.hpp>
13#include <backendsCommon/test/WorkloadTestUtils.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014
David Beckac42efd2018-09-26 17:41:13 +010015#include <test/TensorHelpers.hpp>
telsoa014fcda012018-03-09 14:13:49 +000016
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010017namespace
18{
19
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000020template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000021std::vector<LayerTestResult<T,3>> SplitterTestCommon(
22 armnn::IWorkloadFactory& workloadFactory,
23 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +010024 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000025 float qScale = 0.0f,
26 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +000027{
Jan Eilers8eb25602020-03-09 12:13:48 +000028 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +000029 unsigned int inputWidth = 5;
30 unsigned int inputHeight = 6;
31 unsigned int inputChannels = 3;
32
surmeh013537c2c2018-05-18 16:31:43 +010033 // NOTE: Compute Library imposes a restriction that the x and y dimension (input height and width)
34 // cannot be split.
telsoa01c577f2c2018-08-31 09:22:23 +010035 // For the reasons for this, see first comment on https://jira.arm.com/browse/IVGCVSW-1239
surmeh013537c2c2018-05-18 16:31:43 +010036 //
telsoa01c577f2c2018-08-31 09:22:23 +010037 // This test has therefore been recast to split the channels, then split the resulting subtensor.
telsoa014fcda012018-03-09 14:13:49 +000038
telsoa01c577f2c2018-08-31 09:22:23 +010039 // To take channel 0 of original output
40 // and channel 0 and channel 1 of the split subtensor.
surmeh013537c2c2018-05-18 16:31:43 +010041 unsigned int outputWidth1 = inputWidth;
42 unsigned int outputHeight1 = inputHeight;
43 unsigned int outputChannels1 = 1;
telsoa014fcda012018-03-09 14:13:49 +000044
telsoa01c577f2c2018-08-31 09:22:23 +010045 // To take channel 1 and 2 of the original output.
surmeh013537c2c2018-05-18 16:31:43 +010046 unsigned int outputWidth2 = inputWidth;
47 unsigned int outputHeight2 = inputHeight;
48 unsigned int outputChannels2 = 2;
telsoa014fcda012018-03-09 14:13:49 +000049
50
telsoa01c577f2c2018-08-31 09:22:23 +010051 // Define the tensor descriptors.
Ruomei Yan25339c32019-05-28 16:48:20 +010052 armnn::TensorInfo inputTensorInfo({ inputChannels, inputHeight, inputWidth }, ArmnnType, qScale, qOffset);
surmeh013537c2c2018-05-18 16:31:43 +010053
telsoa01c577f2c2018-08-31 09:22:23 +010054 // Outputs of the original split.
Ruomei Yan25339c32019-05-28 16:48:20 +010055 armnn::TensorInfo outputTensorInfo1({ outputChannels1, outputHeight1, outputWidth1 }, ArmnnType, qScale, qOffset);
56 armnn::TensorInfo outputTensorInfo2({ outputChannels2, outputHeight2, outputWidth2 }, ArmnnType, qScale, qOffset);
surmeh013537c2c2018-05-18 16:31:43 +010057
telsoa01c577f2c2018-08-31 09:22:23 +010058 // Outputs of the subsequent subtensor split.
Ruomei Yan25339c32019-05-28 16:48:20 +010059 armnn::TensorInfo outputTensorInfo3({ outputChannels1, outputHeight1, outputWidth1 }, ArmnnType, qScale, qOffset);
60 armnn::TensorInfo outputTensorInfo4({ outputChannels1, outputHeight1, outputWidth1 }, ArmnnType, qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +000061
62 // Set quantization parameters if the requested type is a quantized type.
telsoa01c577f2c2018-08-31 09:22:23 +010063 // The quantization doesn't really matter as the splitter operator doesn't dequantize/quantize.
telsoa014fcda012018-03-09 14:13:49 +000064 if(armnn::IsQuantizedType<T>())
65 {
66 inputTensorInfo.SetQuantizationScale(qScale);
67 inputTensorInfo.SetQuantizationOffset(qOffset);
68 outputTensorInfo1.SetQuantizationScale(qScale);
69 outputTensorInfo1.SetQuantizationOffset(qOffset);
70 outputTensorInfo2.SetQuantizationScale(qScale);
71 outputTensorInfo2.SetQuantizationOffset(qOffset);
72 outputTensorInfo3.SetQuantizationScale(qScale);
73 outputTensorInfo3.SetQuantizationOffset(qOffset);
74 outputTensorInfo4.SetQuantizationScale(qScale);
75 outputTensorInfo4.SetQuantizationOffset(qOffset);
telsoa014fcda012018-03-09 14:13:49 +000076 }
77
78 LayerTestResult<T,3> ret1(outputTensorInfo1);
79 LayerTestResult<T,3> ret2(outputTensorInfo2);
80 LayerTestResult<T,3> ret3(outputTensorInfo3);
81 LayerTestResult<T,3> ret4(outputTensorInfo4);
telsoa014fcda012018-03-09 14:13:49 +000082
83 auto input = MakeTensor<T, 3>(inputTensorInfo, std::vector<T>(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010084 armnnUtils::QuantizedVector<T>({
telsoa014fcda012018-03-09 14:13:49 +000085 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
86 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
87 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
88 16.0f, 17.0f, 18.0f, 19.0f, 20.0f,
89 21.0f, 22.0f, 23.0f, 24.0f, 25.0f,
90 26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
91
92 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
93 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
94 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
95 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
96 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
97 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
98
99 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
100 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
101 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
102 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
103 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
104 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100105 },
106 qScale, qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000107 ));
108
telsoa01c577f2c2018-08-31 09:22:23 +0100109 // Channel 0 of the original input.
telsoa014fcda012018-03-09 14:13:49 +0000110 ret1.outputExpected = MakeTensor<T, 3>(outputTensorInfo1, std::vector<T>(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100111 armnnUtils::QuantizedVector<T>({
surmeh013537c2c2018-05-18 16:31:43 +0100112 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
113 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
114 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
115 16.0f, 17.0f, 18.0f, 19.0f, 20.0f,
116 21.0f, 22.0f, 23.0f, 24.0f, 25.0f,
117 26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100118 },
119 qScale, qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000120 ));
121
telsoa01c577f2c2018-08-31 09:22:23 +0100122 // Channel 1 & 2 of the original input.
telsoa014fcda012018-03-09 14:13:49 +0000123 ret2.outputExpected = MakeTensor<T, 3>(outputTensorInfo2, std::vector<T>(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100124 armnnUtils::QuantizedVector<T>({
surmeh013537c2c2018-05-18 16:31:43 +0100125 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
126 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
127 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
128 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
129 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
130 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
telsoa014fcda012018-03-09 14:13:49 +0000131
surmeh013537c2c2018-05-18 16:31:43 +0100132 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
133 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
134 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
135 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
136 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
137 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100138 },
139 qScale, qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000140 ));
141
telsoa01c577f2c2018-08-31 09:22:23 +0100142 // Channel 0 of return 2 (i.e. channels 1 and 2 of the original input).
telsoa014fcda012018-03-09 14:13:49 +0000143 ret3.outputExpected = MakeTensor<T, 3>(outputTensorInfo3, std::vector<T>(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100144 armnnUtils::QuantizedVector<T>({
surmeh013537c2c2018-05-18 16:31:43 +0100145 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
146 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
147 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
148 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
149 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
150 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100151 },
152 qScale, qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000153 ));
154
telsoa01c577f2c2018-08-31 09:22:23 +0100155 // Channel 1 of return 2.
telsoa014fcda012018-03-09 14:13:49 +0000156 ret4.outputExpected = MakeTensor<T, 3>(outputTensorInfo4, std::vector<T>(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100157 armnnUtils::QuantizedVector<T>({
surmeh013537c2c2018-05-18 16:31:43 +0100158 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
159 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
160 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
161 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
162 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
163 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100164 },
165 qScale, qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000166 ));
167
telsoa01c577f2c2018-08-31 09:22:23 +0100168 // NOTE: as a corollary of the splitting of x and y restriction the x and y values of the view origins
surmeh013537c2c2018-05-18 16:31:43 +0100169 // have to be zero, the co-ordinates are as per the tensor info above channels, height/y, width/x
telsoa01c577f2c2018-08-31 09:22:23 +0100170 // note that under the hood the compute engine reverses these i.e. its coordinate system is x, y, channels.
171 std::vector<unsigned int> wOrigin1 = {0, 0, 0}; //Extent of the window is defined by size of output[0].
telsoa014fcda012018-03-09 14:13:49 +0000172 armnn::SplitterQueueDescriptor::ViewOrigin window1(wOrigin1);
173
telsoa01c577f2c2018-08-31 09:22:23 +0100174 std::vector<unsigned int> wOrigin2 = {1, 0, 0}; //Extent of the window is defined by size of output[1].
telsoa014fcda012018-03-09 14:13:49 +0000175 armnn::SplitterQueueDescriptor::ViewOrigin window2(wOrigin2);
176
telsoa01c577f2c2018-08-31 09:22:23 +0100177 std::vector<unsigned int> wOrigin3 = {0, 0, 0}; //Extent of the window is defined by size of output[2].
telsoa014fcda012018-03-09 14:13:49 +0000178 armnn::SplitterQueueDescriptor::ViewOrigin window3(wOrigin3);
179
telsoa01c577f2c2018-08-31 09:22:23 +0100180 std::vector<unsigned int> wOrigin4 = {1, 0, 0}; //Extent of the window is defined by size of output[3].
telsoa014fcda012018-03-09 14:13:49 +0000181 armnn::SplitterQueueDescriptor::ViewOrigin window4(wOrigin4);
182
Sadik Armagan5e719842020-08-28 12:17:33 +0100183 bool subTensorsSupported = tensorHandleFactory.SupportsSubTensors();
184 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000185
186 std::unique_ptr<armnn::ITensorHandle> outputHandle1 =
187 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100188 tensorHandleFactory.CreateSubTensorHandle(*inputHandle, outputTensorInfo1.GetShape(), wOrigin1.data()) :
189 tensorHandleFactory.CreateTensorHandle(outputTensorInfo1);
telsoa014fcda012018-03-09 14:13:49 +0000190
191 std::unique_ptr<armnn::ITensorHandle> outputHandle2 =
192 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100193 tensorHandleFactory.CreateSubTensorHandle(*inputHandle, outputTensorInfo2.GetShape(), wOrigin2.data()) :
194 tensorHandleFactory.CreateTensorHandle(outputTensorInfo2);
telsoa014fcda012018-03-09 14:13:49 +0000195
196 std::unique_ptr<armnn::ITensorHandle> outputHandle3 =
197 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100198 tensorHandleFactory.CreateSubTensorHandle(*outputHandle2, outputTensorInfo3.GetShape(), wOrigin3.data()) :
199 tensorHandleFactory.CreateTensorHandle(outputTensorInfo3);
telsoa014fcda012018-03-09 14:13:49 +0000200
201 std::unique_ptr<armnn::ITensorHandle> outputHandle4 =
202 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100203 tensorHandleFactory.CreateSubTensorHandle(*outputHandle2, outputTensorInfo4.GetShape(), wOrigin4.data()) :
204 tensorHandleFactory.CreateTensorHandle(outputTensorInfo4);
telsoa014fcda012018-03-09 14:13:49 +0000205
surmeh013537c2c2018-05-18 16:31:43 +0100206 // Do the first split
telsoa014fcda012018-03-09 14:13:49 +0000207 armnn::SplitterQueueDescriptor data;
208 armnn::WorkloadInfo info;
209 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
210 AddOutputToWorkload(data, info, outputTensorInfo1, outputHandle1.get());
211 AddOutputToWorkload(data, info, outputTensorInfo2, outputHandle2.get());
telsoa014fcda012018-03-09 14:13:49 +0000212
213 data.m_ViewOrigins.push_back(window1);
214 data.m_ViewOrigins.push_back(window2);
telsoa014fcda012018-03-09 14:13:49 +0000215
216 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSplitter(data, info);
217
218 inputHandle->Allocate();
219 outputHandle1->Allocate();
220 outputHandle2->Allocate();
telsoa014fcda012018-03-09 14:13:49 +0000221
222 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0]);
223
224 workload->Execute();
225
226 CopyDataFromITensorHandle(&ret1.output[0][0][0], outputHandle1.get());
227 CopyDataFromITensorHandle(&ret2.output[0][0][0], outputHandle2.get());
surmeh013537c2c2018-05-18 16:31:43 +0100228
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000229 // Do the second split.
surmeh013537c2c2018-05-18 16:31:43 +0100230 armnn::SplitterQueueDescriptor data2;
231 armnn::WorkloadInfo info2;
232 AddInputToWorkload(data2, info2, outputTensorInfo2, outputHandle2.get());
233 AddOutputToWorkload(data2, info2, outputTensorInfo3, outputHandle3.get());
234 AddOutputToWorkload(data2, info2, outputTensorInfo4, outputHandle4.get());
235
236 data2.m_ViewOrigins.push_back(window3);
237 data2.m_ViewOrigins.push_back(window4);
238
239 std::unique_ptr<armnn::IWorkload> workload2 = workloadFactory.CreateSplitter(data2, info2);
240
241 outputHandle3->Allocate();
242 outputHandle4->Allocate();
243
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000244 ExecuteWorkload(*workload2, memoryManager);
surmeh013537c2c2018-05-18 16:31:43 +0100245
telsoa014fcda012018-03-09 14:13:49 +0000246 CopyDataFromITensorHandle(&ret3.output[0][0][0], outputHandle3.get());
247 CopyDataFromITensorHandle(&ret4.output[0][0][0], outputHandle4.get());
telsoa014fcda012018-03-09 14:13:49 +0000248
surmeh013537c2c2018-05-18 16:31:43 +0100249 std::vector<LayerTestResult<T,3>> ret = {ret1, ret2, ret3, ret4,};
telsoa014fcda012018-03-09 14:13:49 +0000250
251 return ret;
252}
253
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000254template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000255LayerTestResult<T, 3> CopyViaSplitterTestImpl(
256 armnn::IWorkloadFactory& workloadFactory,
257 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100258 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000259 float qScale, int32_t qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000260{
Jan Eilers8eb25602020-03-09 12:13:48 +0000261 IgnoreUnused(memoryManager);
Ruomei Yan25339c32019-05-28 16:48:20 +0100262 const armnn::TensorInfo tensorInfo({ 3, 6, 5 }, ArmnnType, qScale, qOffset);
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100263 auto input = MakeTensor<T, 3>(
264 tensorInfo,
265 armnnUtils::QuantizedVector<T>({
266 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
267 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
268 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
269 16.0f, 17.0f, 18.0f, 19.0f, 20.0f,
270 21.0f, 22.0f, 23.0f, 24.0f, 25.0f,
271 26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
telsoa014fcda012018-03-09 14:13:49 +0000272
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100273 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
274 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
275 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
276 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
277 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
278 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
telsoa014fcda012018-03-09 14:13:49 +0000279
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100280 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
281 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
282 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
283 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
284 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
285 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
286 },
287 qScale, qOffset));
telsoa014fcda012018-03-09 14:13:49 +0000288
289 std::vector<unsigned int> origin = { 0, 0, 0 };
290 armnn::SplitterQueueDescriptor::ViewOrigin window(origin);
291
Sadik Armagan5e719842020-08-28 12:17:33 +0100292 const bool subTensorsSupported = tensorHandleFactory.SupportsSubTensors();
293 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000294
295 std::unique_ptr<armnn::ITensorHandle> outputHandle =
296 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100297 tensorHandleFactory.CreateSubTensorHandle(*inputHandle, tensorInfo.GetShape(), origin.data()) :
298 tensorHandleFactory.CreateTensorHandle(tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000299
300 armnn::SplitterQueueDescriptor data;
301 armnn::WorkloadInfo info;
302 AddInputToWorkload(data, info, tensorInfo, inputHandle.get());
303 AddOutputToWorkload(data, info, tensorInfo, outputHandle.get());
304
305 data.m_ViewOrigins.push_back(window);
306
307 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSplitter(data, info);
308
309 inputHandle->Allocate();
310 outputHandle->Allocate();
311
312 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0]);
313
314 workload->Execute();
315
316 LayerTestResult<T, 3> ret(tensorInfo);
317 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
318 ret.outputExpected = input;
319
320 return ret;
321}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100322
323} // anonymous namespace
324
Matthew Jackson9bff1442019-09-12 09:08:23 +0100325std::vector<LayerTestResult<float,3>> SplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100326 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100327 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
328 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100329{
Sadik Armagan5e719842020-08-28 12:17:33 +0100330 return SplitterTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100331}
332
Matthew Jackson9bff1442019-09-12 09:08:23 +0100333std::vector<LayerTestResult<armnn::Half,3>> SplitterFloat16Test(
334 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100335 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
336 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100337{
Sadik Armagan5e719842020-08-28 12:17:33 +0100338 return SplitterTestCommon<armnn::DataType::Float16>(workloadFactory, memoryManager, tensorHandleFactory);
Matthew Jackson9bff1442019-09-12 09:08:23 +0100339}
340
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100341std::vector<LayerTestResult<uint8_t,3>> SplitterUint8Test(
342 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
344 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100345{
Sadik Armagan5e719842020-08-28 12:17:33 +0100346 return SplitterTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100347}
348
349std::vector<LayerTestResult<int16_t,3>> SplitterInt16Test(
350 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100351 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
352 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100353{
Sadik Armagan5e719842020-08-28 12:17:33 +0100354 return SplitterTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100355}
356
Matthew Jackson9bff1442019-09-12 09:08:23 +0100357LayerTestResult<float, 3> CopyViaSplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100358 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100359 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
360 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100361{
Sadik Armagan5e719842020-08-28 12:17:33 +0100362 return CopyViaSplitterTestImpl<armnn::DataType::Float32>(workloadFactory,
363 memoryManager,
364 tensorHandleFactory,
365 0.0f,
366 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100367}
368
Matthew Jackson9bff1442019-09-12 09:08:23 +0100369LayerTestResult<armnn::Half, 3> CopyViaSplitterFloat16Test(
370 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100371 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
372 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100373{
Sadik Armagan5e719842020-08-28 12:17:33 +0100374 return CopyViaSplitterTestImpl<armnn::DataType::Float16>(workloadFactory,
375 memoryManager,
376 tensorHandleFactory,
377 0.0f,
378 0);
Matthew Jackson9bff1442019-09-12 09:08:23 +0100379}
380
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100381LayerTestResult<uint8_t, 3> CopyViaSplitterUint8Test(
382 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100383 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
384 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100385{
Sadik Armagan5e719842020-08-28 12:17:33 +0100386 return CopyViaSplitterTestImpl<armnn::DataType::QAsymmU8>(workloadFactory,
387 memoryManager,
388 tensorHandleFactory,
389 1.0f,
390 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100391}
392
393LayerTestResult<int16_t, 3> CopyViaSplitterInt16Test(
394 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100395 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
396 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100397{
Sadik Armagan5e719842020-08-28 12:17:33 +0100398 return CopyViaSplitterTestImpl<armnn::DataType::QSymmS16>(workloadFactory,
399 memoryManager,
400 tensorHandleFactory,
401 1.0f,
402 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100403}