blob: e19a3216c38d0d7a1d9bd6b506b2f191465a9688 [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
telsoa01c577f2c2018-08-31 09:22:23 +010050 // Define the tensor descriptors.
Ruomei Yan25339c32019-05-28 16:48:20 +010051 armnn::TensorInfo inputTensorInfo({ inputChannels, inputHeight, inputWidth }, ArmnnType, qScale, qOffset);
surmeh013537c2c2018-05-18 16:31:43 +010052
telsoa01c577f2c2018-08-31 09:22:23 +010053 // Outputs of the original split.
Ruomei Yan25339c32019-05-28 16:48:20 +010054 armnn::TensorInfo outputTensorInfo1({ outputChannels1, outputHeight1, outputWidth1 }, ArmnnType, qScale, qOffset);
55 armnn::TensorInfo outputTensorInfo2({ outputChannels2, outputHeight2, outputWidth2 }, ArmnnType, qScale, qOffset);
surmeh013537c2c2018-05-18 16:31:43 +010056
telsoa01c577f2c2018-08-31 09:22:23 +010057 // Outputs of the subsequent subtensor split.
Ruomei Yan25339c32019-05-28 16:48:20 +010058 armnn::TensorInfo outputTensorInfo3({ outputChannels1, outputHeight1, outputWidth1 }, ArmnnType, qScale, qOffset);
59 armnn::TensorInfo outputTensorInfo4({ outputChannels1, outputHeight1, outputWidth1 }, ArmnnType, qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +000060
61 // Set quantization parameters if the requested type is a quantized type.
telsoa01c577f2c2018-08-31 09:22:23 +010062 // The quantization doesn't really matter as the splitter operator doesn't dequantize/quantize.
telsoa014fcda012018-03-09 14:13:49 +000063 if(armnn::IsQuantizedType<T>())
64 {
65 inputTensorInfo.SetQuantizationScale(qScale);
66 inputTensorInfo.SetQuantizationOffset(qOffset);
67 outputTensorInfo1.SetQuantizationScale(qScale);
68 outputTensorInfo1.SetQuantizationOffset(qOffset);
69 outputTensorInfo2.SetQuantizationScale(qScale);
70 outputTensorInfo2.SetQuantizationOffset(qOffset);
71 outputTensorInfo3.SetQuantizationScale(qScale);
72 outputTensorInfo3.SetQuantizationOffset(qOffset);
73 outputTensorInfo4.SetQuantizationScale(qScale);
74 outputTensorInfo4.SetQuantizationOffset(qOffset);
telsoa014fcda012018-03-09 14:13:49 +000075 }
76
Sadik Armagan483c8112021-06-01 09:24:52 +010077 auto input = armnnUtils::QuantizedVector<T>(
78 {
telsoa014fcda012018-03-09 14:13:49 +000079 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
80 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
81 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
82 16.0f, 17.0f, 18.0f, 19.0f, 20.0f,
83 21.0f, 22.0f, 23.0f, 24.0f, 25.0f,
84 26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
85
86 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
87 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
88 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
89 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
90 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
91 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
92
93 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
94 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
95 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
96 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
97 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
98 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010099 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100100 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000101
telsoa01c577f2c2018-08-31 09:22:23 +0100102 // Channel 0 of the original input.
Sadik Armagan483c8112021-06-01 09:24:52 +0100103 auto expectedData1 = armnnUtils::QuantizedVector<T>(
104 {
surmeh013537c2c2018-05-18 16:31:43 +0100105 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
106 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
107 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
108 16.0f, 17.0f, 18.0f, 19.0f, 20.0f,
109 21.0f, 22.0f, 23.0f, 24.0f, 25.0f,
110 26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100111 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100112 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000113
telsoa01c577f2c2018-08-31 09:22:23 +0100114 // Channel 1 & 2 of the original input.
Sadik Armagan483c8112021-06-01 09:24:52 +0100115 auto expectedData2 = armnnUtils::QuantizedVector<T>(
116 {
surmeh013537c2c2018-05-18 16:31:43 +0100117 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
118 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
119 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
120 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
121 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
122 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
telsoa014fcda012018-03-09 14:13:49 +0000123
surmeh013537c2c2018-05-18 16:31:43 +0100124 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
125 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
126 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
127 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
128 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
129 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100130 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100131 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000132
telsoa01c577f2c2018-08-31 09:22:23 +0100133 // Channel 0 of return 2 (i.e. channels 1 and 2 of the original input).
Sadik Armagan483c8112021-06-01 09:24:52 +0100134 auto expectedData3 = armnnUtils::QuantizedVector<T>(
135 {
surmeh013537c2c2018-05-18 16:31:43 +0100136 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
137 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
138 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
139 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
140 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
141 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100142 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100143 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000144
telsoa01c577f2c2018-08-31 09:22:23 +0100145 // Channel 1 of return 2.
Sadik Armagan483c8112021-06-01 09:24:52 +0100146 auto expectedData4 = armnnUtils::QuantizedVector<T>(
147 {
surmeh013537c2c2018-05-18 16:31:43 +0100148 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
149 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
150 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
151 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
152 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
153 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100154 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100155 qScale, qOffset);
156
157 std::vector<T> actualData1(outputTensorInfo1.GetNumElements());
158 std::vector<T> actualData2(outputTensorInfo2.GetNumElements());
159 std::vector<T> actualData3(outputTensorInfo3.GetNumElements());
160 std::vector<T> actualData4(outputTensorInfo4.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +0000161
telsoa01c577f2c2018-08-31 09:22:23 +0100162 // 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 +0100163 // 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 +0100164 // note that under the hood the compute engine reverses these i.e. its coordinate system is x, y, channels.
165 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 +0000166 armnn::SplitterQueueDescriptor::ViewOrigin window1(wOrigin1);
167
telsoa01c577f2c2018-08-31 09:22:23 +0100168 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 +0000169 armnn::SplitterQueueDescriptor::ViewOrigin window2(wOrigin2);
170
telsoa01c577f2c2018-08-31 09:22:23 +0100171 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 +0000172 armnn::SplitterQueueDescriptor::ViewOrigin window3(wOrigin3);
173
telsoa01c577f2c2018-08-31 09:22:23 +0100174 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 +0000175 armnn::SplitterQueueDescriptor::ViewOrigin window4(wOrigin4);
176
Sadik Armagan5e719842020-08-28 12:17:33 +0100177 bool subTensorsSupported = tensorHandleFactory.SupportsSubTensors();
178 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000179
180 std::unique_ptr<armnn::ITensorHandle> outputHandle1 =
181 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100182 tensorHandleFactory.CreateSubTensorHandle(*inputHandle, outputTensorInfo1.GetShape(), wOrigin1.data()) :
183 tensorHandleFactory.CreateTensorHandle(outputTensorInfo1);
telsoa014fcda012018-03-09 14:13:49 +0000184
185 std::unique_ptr<armnn::ITensorHandle> outputHandle2 =
186 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100187 tensorHandleFactory.CreateSubTensorHandle(*inputHandle, outputTensorInfo2.GetShape(), wOrigin2.data()) :
188 tensorHandleFactory.CreateTensorHandle(outputTensorInfo2);
telsoa014fcda012018-03-09 14:13:49 +0000189
190 std::unique_ptr<armnn::ITensorHandle> outputHandle3 =
191 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100192 tensorHandleFactory.CreateSubTensorHandle(*outputHandle2, outputTensorInfo3.GetShape(), wOrigin3.data()) :
193 tensorHandleFactory.CreateTensorHandle(outputTensorInfo3);
telsoa014fcda012018-03-09 14:13:49 +0000194
195 std::unique_ptr<armnn::ITensorHandle> outputHandle4 =
196 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100197 tensorHandleFactory.CreateSubTensorHandle(*outputHandle2, outputTensorInfo4.GetShape(), wOrigin4.data()) :
198 tensorHandleFactory.CreateTensorHandle(outputTensorInfo4);
telsoa014fcda012018-03-09 14:13:49 +0000199
surmeh013537c2c2018-05-18 16:31:43 +0100200 // Do the first split
telsoa014fcda012018-03-09 14:13:49 +0000201 armnn::SplitterQueueDescriptor data;
202 armnn::WorkloadInfo info;
203 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
204 AddOutputToWorkload(data, info, outputTensorInfo1, outputHandle1.get());
205 AddOutputToWorkload(data, info, outputTensorInfo2, outputHandle2.get());
telsoa014fcda012018-03-09 14:13:49 +0000206
207 data.m_ViewOrigins.push_back(window1);
208 data.m_ViewOrigins.push_back(window2);
telsoa014fcda012018-03-09 14:13:49 +0000209
210 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSplitter(data, info);
211
212 inputHandle->Allocate();
213 outputHandle1->Allocate();
214 outputHandle2->Allocate();
telsoa014fcda012018-03-09 14:13:49 +0000215
Sadik Armagan483c8112021-06-01 09:24:52 +0100216 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000217
218 workload->Execute();
219
Sadik Armagan483c8112021-06-01 09:24:52 +0100220 CopyDataFromITensorHandle(actualData1.data(), outputHandle1.get());
221 CopyDataFromITensorHandle(actualData2.data(), outputHandle2.get());
surmeh013537c2c2018-05-18 16:31:43 +0100222
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000223 // Do the second split.
surmeh013537c2c2018-05-18 16:31:43 +0100224 armnn::SplitterQueueDescriptor data2;
225 armnn::WorkloadInfo info2;
226 AddInputToWorkload(data2, info2, outputTensorInfo2, outputHandle2.get());
227 AddOutputToWorkload(data2, info2, outputTensorInfo3, outputHandle3.get());
228 AddOutputToWorkload(data2, info2, outputTensorInfo4, outputHandle4.get());
229
230 data2.m_ViewOrigins.push_back(window3);
231 data2.m_ViewOrigins.push_back(window4);
232
233 std::unique_ptr<armnn::IWorkload> workload2 = workloadFactory.CreateSplitter(data2, info2);
234
235 outputHandle3->Allocate();
236 outputHandle4->Allocate();
237
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000238 ExecuteWorkload(*workload2, memoryManager);
surmeh013537c2c2018-05-18 16:31:43 +0100239
Sadik Armagan483c8112021-06-01 09:24:52 +0100240 CopyDataFromITensorHandle(actualData3.data(), outputHandle3.get());
241 CopyDataFromITensorHandle(actualData4.data(), outputHandle4.get());
242
243 LayerTestResult<T,3> ret1(actualData1, expectedData1, outputHandle1->GetShape(), outputTensorInfo1.GetShape());
244 LayerTestResult<T,3> ret2(actualData2, expectedData2, outputHandle2->GetShape(), outputTensorInfo2.GetShape());
245 LayerTestResult<T,3> ret3(actualData3, expectedData3, outputHandle3->GetShape(), outputTensorInfo3.GetShape());
246 LayerTestResult<T,3> ret4(actualData4, expectedData4, outputHandle4->GetShape(), outputTensorInfo4.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000247
surmeh013537c2c2018-05-18 16:31:43 +0100248 std::vector<LayerTestResult<T,3>> ret = {ret1, ret2, ret3, ret4,};
telsoa014fcda012018-03-09 14:13:49 +0000249
250 return ret;
251}
252
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000253template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000254LayerTestResult<T, 3> CopyViaSplitterTestImpl(
255 armnn::IWorkloadFactory& workloadFactory,
256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100257 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000258 float qScale, int32_t qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000259{
Jan Eilers8eb25602020-03-09 12:13:48 +0000260 IgnoreUnused(memoryManager);
Sadik Armagan483c8112021-06-01 09:24:52 +0100261
Ruomei Yan25339c32019-05-28 16:48:20 +0100262 const armnn::TensorInfo tensorInfo({ 3, 6, 5 }, ArmnnType, qScale, qOffset);
Sadik Armagan483c8112021-06-01 09:24:52 +0100263 auto input = armnnUtils::QuantizedVector<T>(
264 {
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100265 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
266 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
267 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
268 16.0f, 17.0f, 18.0f, 19.0f, 20.0f,
269 21.0f, 22.0f, 23.0f, 24.0f, 25.0f,
270 26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
telsoa014fcda012018-03-09 14:13:49 +0000271
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100272 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
273 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
274 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
275 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
276 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
277 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
telsoa014fcda012018-03-09 14:13:49 +0000278
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100279 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
280 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
281 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
282 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
283 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
284 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
285 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100286 qScale, qOffset);
287
288 std::vector<T> actualOutput(tensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +0000289
290 std::vector<unsigned int> origin = { 0, 0, 0 };
291 armnn::SplitterQueueDescriptor::ViewOrigin window(origin);
292
Sadik Armagan5e719842020-08-28 12:17:33 +0100293 const bool subTensorsSupported = tensorHandleFactory.SupportsSubTensors();
294 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000295
296 std::unique_ptr<armnn::ITensorHandle> outputHandle =
297 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100298 tensorHandleFactory.CreateSubTensorHandle(*inputHandle, tensorInfo.GetShape(), origin.data()) :
299 tensorHandleFactory.CreateTensorHandle(tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000300
301 armnn::SplitterQueueDescriptor data;
302 armnn::WorkloadInfo info;
303 AddInputToWorkload(data, info, tensorInfo, inputHandle.get());
304 AddOutputToWorkload(data, info, tensorInfo, outputHandle.get());
305
306 data.m_ViewOrigins.push_back(window);
307
308 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSplitter(data, info);
309
310 inputHandle->Allocate();
311 outputHandle->Allocate();
312
Sadik Armagan483c8112021-06-01 09:24:52 +0100313 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000314
315 workload->Execute();
316
Sadik Armagan483c8112021-06-01 09:24:52 +0100317 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +0000318
Sadik Armagan483c8112021-06-01 09:24:52 +0100319 return LayerTestResult<T, 3>(actualOutput,
320 input,
321 outputHandle->GetShape(),
322 tensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000323}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100324
325} // anonymous namespace
326
Matthew Jackson9bff1442019-09-12 09:08:23 +0100327std::vector<LayerTestResult<float,3>> SplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100328 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100329 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
330 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100331{
Sadik Armagan5e719842020-08-28 12:17:33 +0100332 return SplitterTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100333}
334
Matthew Jackson9bff1442019-09-12 09:08:23 +0100335std::vector<LayerTestResult<armnn::Half,3>> SplitterFloat16Test(
336 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100337 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
338 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100339{
Sadik Armagan5e719842020-08-28 12:17:33 +0100340 return SplitterTestCommon<armnn::DataType::Float16>(workloadFactory, memoryManager, tensorHandleFactory);
Matthew Jackson9bff1442019-09-12 09:08:23 +0100341}
342
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100343std::vector<LayerTestResult<uint8_t,3>> SplitterUint8Test(
344 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100345 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
346 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100347{
Sadik Armagan5e719842020-08-28 12:17:33 +0100348 return SplitterTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100349}
350
351std::vector<LayerTestResult<int16_t,3>> SplitterInt16Test(
352 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100353 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
354 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100355{
Sadik Armagan5e719842020-08-28 12:17:33 +0100356 return SplitterTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100357}
358
Matthew Jackson9bff1442019-09-12 09:08:23 +0100359LayerTestResult<float, 3> CopyViaSplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100360 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100361 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
362 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100363{
Sadik Armagan5e719842020-08-28 12:17:33 +0100364 return CopyViaSplitterTestImpl<armnn::DataType::Float32>(workloadFactory,
365 memoryManager,
366 tensorHandleFactory,
367 0.0f,
368 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100369}
370
Matthew Jackson9bff1442019-09-12 09:08:23 +0100371LayerTestResult<armnn::Half, 3> CopyViaSplitterFloat16Test(
372 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100373 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
374 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100375{
Sadik Armagan5e719842020-08-28 12:17:33 +0100376 return CopyViaSplitterTestImpl<armnn::DataType::Float16>(workloadFactory,
377 memoryManager,
378 tensorHandleFactory,
379 0.0f,
380 0);
Matthew Jackson9bff1442019-09-12 09:08:23 +0100381}
382
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100383LayerTestResult<uint8_t, 3> CopyViaSplitterUint8Test(
384 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100385 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
386 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100387{
Sadik Armagan5e719842020-08-28 12:17:33 +0100388 return CopyViaSplitterTestImpl<armnn::DataType::QAsymmU8>(workloadFactory,
389 memoryManager,
390 tensorHandleFactory,
391 1.0f,
392 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100393}
394
395LayerTestResult<int16_t, 3> CopyViaSplitterInt16Test(
396 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100397 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
398 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100399{
Sadik Armagan5e719842020-08-28 12:17:33 +0100400 return CopyViaSplitterTestImpl<armnn::DataType::QSymmS16>(workloadFactory,
401 memoryManager,
402 tensorHandleFactory,
403 1.0f,
404 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100405}