blob: 13483e5ebd2ab9b4b5b479731043343d8346fcbe [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Mike Kelly4980e212023-08-04 13:35:41 +01002// Copyright © 2019-2020,2023 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
Colm Donelanc42a9872022-02-02 16:35:09 +00008#include <armnnUtils/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
Sadik Armagana097d2a2021-11-24 15:47:28 +000012#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000013#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014
Colm Donelanc42a9872022-02-02 16:35:09 +000015#include <armnnTestUtils/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,
Teresa Charlinacb3ec52023-04-03 19:57:00 +010025 float qScale = 1.0f,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000026 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;
Mike Kelly4980e212023-08-04 13:35:41 +0100202 data.m_Parameters = armnn::SplitterDescriptor(2, 3);
203
telsoa014fcda012018-03-09 14:13:49 +0000204 armnn::WorkloadInfo info;
205 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
206 AddOutputToWorkload(data, info, outputTensorInfo1, outputHandle1.get());
207 AddOutputToWorkload(data, info, outputTensorInfo2, outputHandle2.get());
telsoa014fcda012018-03-09 14:13:49 +0000208
Mike Kelly4980e212023-08-04 13:35:41 +0100209 data.m_Parameters.SetViewSize(0, 0, outputChannels1);
210 data.m_Parameters.SetViewSize(0, 1, outputHeight1);
211 data.m_Parameters.SetViewSize(0, 2, outputWidth1);
212
213 data.m_Parameters.SetViewSize(1, 0, outputChannels2);
214 data.m_Parameters.SetViewSize(1, 1, outputHeight2);
215 data.m_Parameters.SetViewSize(1, 2, outputWidth2);
216
217 data.m_Parameters.SetViewOriginCoord(0, 0, 0);
218 data.m_Parameters.SetViewOriginCoord(0, 1, 0);
219 data.m_Parameters.SetViewOriginCoord(0, 2, 0);
220
221 data.m_Parameters.SetViewOriginCoord(1, 0, 1);
222 data.m_Parameters.SetViewOriginCoord(1, 1, 0);
223 data.m_Parameters.SetViewOriginCoord(1, 2, 0);
224
telsoa014fcda012018-03-09 14:13:49 +0000225 data.m_ViewOrigins.push_back(window1);
226 data.m_ViewOrigins.push_back(window2);
telsoa014fcda012018-03-09 14:13:49 +0000227
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000228 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Splitter,
229 data,
230 info);
telsoa014fcda012018-03-09 14:13:49 +0000231
232 inputHandle->Allocate();
233 outputHandle1->Allocate();
234 outputHandle2->Allocate();
telsoa014fcda012018-03-09 14:13:49 +0000235
Sadik Armagan483c8112021-06-01 09:24:52 +0100236 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000237
238 workload->Execute();
239
Sadik Armagan483c8112021-06-01 09:24:52 +0100240 CopyDataFromITensorHandle(actualData1.data(), outputHandle1.get());
241 CopyDataFromITensorHandle(actualData2.data(), outputHandle2.get());
surmeh013537c2c2018-05-18 16:31:43 +0100242
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000243 // Do the second split.
surmeh013537c2c2018-05-18 16:31:43 +0100244 armnn::SplitterQueueDescriptor data2;
Mike Kelly4980e212023-08-04 13:35:41 +0100245 data2.m_Parameters = armnn::SplitterDescriptor(2, 3);
246
surmeh013537c2c2018-05-18 16:31:43 +0100247 armnn::WorkloadInfo info2;
248 AddInputToWorkload(data2, info2, outputTensorInfo2, outputHandle2.get());
249 AddOutputToWorkload(data2, info2, outputTensorInfo3, outputHandle3.get());
250 AddOutputToWorkload(data2, info2, outputTensorInfo4, outputHandle4.get());
251
Mike Kelly4980e212023-08-04 13:35:41 +0100252 data2.m_Parameters.SetViewSize(0, 0, outputChannels1);
253 data2.m_Parameters.SetViewSize(0, 1, outputHeight1);
254 data2.m_Parameters.SetViewSize(0, 2, outputWidth1);
255
256 data2.m_Parameters.SetViewSize(1, 0, outputChannels2);
257 data2.m_Parameters.SetViewSize(1, 1, outputHeight2);
258 data2.m_Parameters.SetViewSize(1, 2, outputWidth1);
259
260 data2.m_Parameters.SetViewOriginCoord(0, 0, 0);
261 data2.m_Parameters.SetViewOriginCoord(0, 1, 0);
262 data2.m_Parameters.SetViewOriginCoord(0, 2, 0);
263
264 data2.m_Parameters.SetViewOriginCoord(1, 0, 1);
265 data2.m_Parameters.SetViewOriginCoord(1, 1, 0);
266 data2.m_Parameters.SetViewOriginCoord(1, 2, 0);
267
surmeh013537c2c2018-05-18 16:31:43 +0100268 data2.m_ViewOrigins.push_back(window3);
269 data2.m_ViewOrigins.push_back(window4);
270
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000271 std::unique_ptr<armnn::IWorkload> workload2 = workloadFactory.CreateWorkload(armnn::LayerType::Splitter,
272 data2,
273 info2);
surmeh013537c2c2018-05-18 16:31:43 +0100274
275 outputHandle3->Allocate();
276 outputHandle4->Allocate();
277
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000278 ExecuteWorkload(*workload2, memoryManager);
surmeh013537c2c2018-05-18 16:31:43 +0100279
Sadik Armagan483c8112021-06-01 09:24:52 +0100280 CopyDataFromITensorHandle(actualData3.data(), outputHandle3.get());
281 CopyDataFromITensorHandle(actualData4.data(), outputHandle4.get());
282
283 LayerTestResult<T,3> ret1(actualData1, expectedData1, outputHandle1->GetShape(), outputTensorInfo1.GetShape());
284 LayerTestResult<T,3> ret2(actualData2, expectedData2, outputHandle2->GetShape(), outputTensorInfo2.GetShape());
285 LayerTestResult<T,3> ret3(actualData3, expectedData3, outputHandle3->GetShape(), outputTensorInfo3.GetShape());
286 LayerTestResult<T,3> ret4(actualData4, expectedData4, outputHandle4->GetShape(), outputTensorInfo4.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000287
surmeh013537c2c2018-05-18 16:31:43 +0100288 std::vector<LayerTestResult<T,3>> ret = {ret1, ret2, ret3, ret4,};
telsoa014fcda012018-03-09 14:13:49 +0000289
290 return ret;
291}
292
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000293template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000294LayerTestResult<T, 3> CopyViaSplitterTestImpl(
295 armnn::IWorkloadFactory& workloadFactory,
296 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100297 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000298 float qScale, int32_t qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000299{
Jan Eilers8eb25602020-03-09 12:13:48 +0000300 IgnoreUnused(memoryManager);
Sadik Armagan483c8112021-06-01 09:24:52 +0100301
Ruomei Yan25339c32019-05-28 16:48:20 +0100302 const armnn::TensorInfo tensorInfo({ 3, 6, 5 }, ArmnnType, qScale, qOffset);
Sadik Armagan483c8112021-06-01 09:24:52 +0100303 auto input = armnnUtils::QuantizedVector<T>(
304 {
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100305 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
306 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
307 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
308 16.0f, 17.0f, 18.0f, 19.0f, 20.0f,
309 21.0f, 22.0f, 23.0f, 24.0f, 25.0f,
310 26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
telsoa014fcda012018-03-09 14:13:49 +0000311
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100312 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
313 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
314 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
315 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
316 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
317 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
telsoa014fcda012018-03-09 14:13:49 +0000318
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100319 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
320 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
321 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
322 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
323 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
324 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
325 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100326 qScale, qOffset);
327
328 std::vector<T> actualOutput(tensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +0000329
330 std::vector<unsigned int> origin = { 0, 0, 0 };
331 armnn::SplitterQueueDescriptor::ViewOrigin window(origin);
332
Sadik Armagan5e719842020-08-28 12:17:33 +0100333 const bool subTensorsSupported = tensorHandleFactory.SupportsSubTensors();
334 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000335
336 std::unique_ptr<armnn::ITensorHandle> outputHandle =
337 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100338 tensorHandleFactory.CreateSubTensorHandle(*inputHandle, tensorInfo.GetShape(), origin.data()) :
339 tensorHandleFactory.CreateTensorHandle(tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000340
341 armnn::SplitterQueueDescriptor data;
342 armnn::WorkloadInfo info;
343 AddInputToWorkload(data, info, tensorInfo, inputHandle.get());
344 AddOutputToWorkload(data, info, tensorInfo, outputHandle.get());
345
Mike Kelly4980e212023-08-04 13:35:41 +0100346 data.m_Parameters = armnn::SplitterDescriptor(1, 3);
347 data.m_Parameters.SetAxis(0);
348
349 data.m_Parameters.SetViewSize(0, 0, 3);
350 data.m_Parameters.SetViewSize(0, 1, 6);
351 data.m_Parameters.SetViewSize(0, 2, 5);
352
353 data.m_Parameters.SetViewOriginCoord(0, 0, 0);
354 data.m_Parameters.SetViewOriginCoord(0, 1, 0);
355 data.m_Parameters.SetViewOriginCoord(0, 2, 0);
356
telsoa014fcda012018-03-09 14:13:49 +0000357 data.m_ViewOrigins.push_back(window);
358
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000359 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Splitter,
360 data,
361 info);
telsoa014fcda012018-03-09 14:13:49 +0000362
363 inputHandle->Allocate();
364 outputHandle->Allocate();
365
Sadik Armagan483c8112021-06-01 09:24:52 +0100366 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000367
368 workload->Execute();
369
Sadik Armagan483c8112021-06-01 09:24:52 +0100370 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +0000371
Sadik Armagan483c8112021-06-01 09:24:52 +0100372 return LayerTestResult<T, 3>(actualOutput,
373 input,
374 outputHandle->GetShape(),
375 tensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000376}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100377
378} // anonymous namespace
379
Matthew Jackson9bff1442019-09-12 09:08:23 +0100380std::vector<LayerTestResult<float,3>> SplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100381 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100382 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
383 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100384{
Sadik Armagan5e719842020-08-28 12:17:33 +0100385 return SplitterTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100386}
387
Matthew Jackson9bff1442019-09-12 09:08:23 +0100388std::vector<LayerTestResult<armnn::Half,3>> SplitterFloat16Test(
389 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100390 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
391 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100392{
Sadik Armagan5e719842020-08-28 12:17:33 +0100393 return SplitterTestCommon<armnn::DataType::Float16>(workloadFactory, memoryManager, tensorHandleFactory);
Matthew Jackson9bff1442019-09-12 09:08:23 +0100394}
395
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100396std::vector<LayerTestResult<uint8_t,3>> SplitterUint8Test(
397 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100398 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
399 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100400{
Sadik Armagan5e719842020-08-28 12:17:33 +0100401 return SplitterTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100402}
403
404std::vector<LayerTestResult<int16_t,3>> SplitterInt16Test(
405 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100406 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
407 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100408{
Sadik Armagan5e719842020-08-28 12:17:33 +0100409 return SplitterTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100410}
411
Matthew Jackson9bff1442019-09-12 09:08:23 +0100412LayerTestResult<float, 3> CopyViaSplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100413 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100414 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
415 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100416{
Sadik Armagan5e719842020-08-28 12:17:33 +0100417 return CopyViaSplitterTestImpl<armnn::DataType::Float32>(workloadFactory,
418 memoryManager,
419 tensorHandleFactory,
420 0.0f,
421 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100422}
423
Matthew Jackson9bff1442019-09-12 09:08:23 +0100424LayerTestResult<armnn::Half, 3> CopyViaSplitterFloat16Test(
425 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100426 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
427 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100428{
Sadik Armagan5e719842020-08-28 12:17:33 +0100429 return CopyViaSplitterTestImpl<armnn::DataType::Float16>(workloadFactory,
430 memoryManager,
431 tensorHandleFactory,
432 0.0f,
433 0);
Matthew Jackson9bff1442019-09-12 09:08:23 +0100434}
435
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100436LayerTestResult<uint8_t, 3> CopyViaSplitterUint8Test(
437 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100438 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
439 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100440{
Sadik Armagan5e719842020-08-28 12:17:33 +0100441 return CopyViaSplitterTestImpl<armnn::DataType::QAsymmU8>(workloadFactory,
442 memoryManager,
443 tensorHandleFactory,
444 1.0f,
445 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100446}
447
448LayerTestResult<int16_t, 3> CopyViaSplitterInt16Test(
449 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100450 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
451 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100452{
Sadik Armagan5e719842020-08-28 12:17:33 +0100453 return CopyViaSplitterTestImpl<armnn::DataType::QSymmS16>(workloadFactory,
454 memoryManager,
455 tensorHandleFactory,
456 1.0f,
457 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100458}