blob: 9e9c29b088091539118e188e0027337e2524dde0 [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
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,
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
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000210 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Splitter,
211 data,
212 info);
telsoa014fcda012018-03-09 14:13:49 +0000213
214 inputHandle->Allocate();
215 outputHandle1->Allocate();
216 outputHandle2->Allocate();
telsoa014fcda012018-03-09 14:13:49 +0000217
Sadik Armagan483c8112021-06-01 09:24:52 +0100218 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000219
220 workload->Execute();
221
Sadik Armagan483c8112021-06-01 09:24:52 +0100222 CopyDataFromITensorHandle(actualData1.data(), outputHandle1.get());
223 CopyDataFromITensorHandle(actualData2.data(), outputHandle2.get());
surmeh013537c2c2018-05-18 16:31:43 +0100224
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000225 // Do the second split.
surmeh013537c2c2018-05-18 16:31:43 +0100226 armnn::SplitterQueueDescriptor data2;
227 armnn::WorkloadInfo info2;
228 AddInputToWorkload(data2, info2, outputTensorInfo2, outputHandle2.get());
229 AddOutputToWorkload(data2, info2, outputTensorInfo3, outputHandle3.get());
230 AddOutputToWorkload(data2, info2, outputTensorInfo4, outputHandle4.get());
231
232 data2.m_ViewOrigins.push_back(window3);
233 data2.m_ViewOrigins.push_back(window4);
234
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000235 std::unique_ptr<armnn::IWorkload> workload2 = workloadFactory.CreateWorkload(armnn::LayerType::Splitter,
236 data2,
237 info2);
surmeh013537c2c2018-05-18 16:31:43 +0100238
239 outputHandle3->Allocate();
240 outputHandle4->Allocate();
241
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000242 ExecuteWorkload(*workload2, memoryManager);
surmeh013537c2c2018-05-18 16:31:43 +0100243
Sadik Armagan483c8112021-06-01 09:24:52 +0100244 CopyDataFromITensorHandle(actualData3.data(), outputHandle3.get());
245 CopyDataFromITensorHandle(actualData4.data(), outputHandle4.get());
246
247 LayerTestResult<T,3> ret1(actualData1, expectedData1, outputHandle1->GetShape(), outputTensorInfo1.GetShape());
248 LayerTestResult<T,3> ret2(actualData2, expectedData2, outputHandle2->GetShape(), outputTensorInfo2.GetShape());
249 LayerTestResult<T,3> ret3(actualData3, expectedData3, outputHandle3->GetShape(), outputTensorInfo3.GetShape());
250 LayerTestResult<T,3> ret4(actualData4, expectedData4, outputHandle4->GetShape(), outputTensorInfo4.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000251
surmeh013537c2c2018-05-18 16:31:43 +0100252 std::vector<LayerTestResult<T,3>> ret = {ret1, ret2, ret3, ret4,};
telsoa014fcda012018-03-09 14:13:49 +0000253
254 return ret;
255}
256
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000257template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000258LayerTestResult<T, 3> CopyViaSplitterTestImpl(
259 armnn::IWorkloadFactory& workloadFactory,
260 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Sadik Armagan5e719842020-08-28 12:17:33 +0100261 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000262 float qScale, int32_t qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000263{
Jan Eilers8eb25602020-03-09 12:13:48 +0000264 IgnoreUnused(memoryManager);
Sadik Armagan483c8112021-06-01 09:24:52 +0100265
Ruomei Yan25339c32019-05-28 16:48:20 +0100266 const armnn::TensorInfo tensorInfo({ 3, 6, 5 }, ArmnnType, qScale, qOffset);
Sadik Armagan483c8112021-06-01 09:24:52 +0100267 auto input = armnnUtils::QuantizedVector<T>(
268 {
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100269 1.0f, 2.0f, 3.0f, 4.0f, 5.0f,
270 6.0f, 7.0f, 8.0f, 9.0f, 10.0f,
271 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
272 16.0f, 17.0f, 18.0f, 19.0f, 20.0f,
273 21.0f, 22.0f, 23.0f, 24.0f, 25.0f,
274 26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
telsoa014fcda012018-03-09 14:13:49 +0000275
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100276 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
277 36.0f, 37.0f, 38.0f, 39.0f, 40.0f,
278 41.0f, 42.0f, 43.0f, 44.0f, 45.0f,
279 46.0f, 47.0f, 48.0f, 49.0f, 50.0f,
280 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
281 56.0f, 57.0f, 58.0f, 59.0f, 60.0f,
telsoa014fcda012018-03-09 14:13:49 +0000282
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100283 61.0f, 62.0f, 63.0f, 64.0f, 65.0f,
284 66.0f, 67.0f, 68.0f, 69.0f, 70.0f,
285 71.0f, 72.0f, 73.0f, 74.0f, 75.0f,
286 76.0f, 77.0f, 78.0f, 79.0f, 80.0f,
287 81.0f, 82.0f, 83.0f, 84.0f, 85.0f,
288 86.0f, 87.0f, 88.0f, 89.0f, 90.0f,
289 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100290 qScale, qOffset);
291
292 std::vector<T> actualOutput(tensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +0000293
294 std::vector<unsigned int> origin = { 0, 0, 0 };
295 armnn::SplitterQueueDescriptor::ViewOrigin window(origin);
296
Sadik Armagan5e719842020-08-28 12:17:33 +0100297 const bool subTensorsSupported = tensorHandleFactory.SupportsSubTensors();
298 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000299
300 std::unique_ptr<armnn::ITensorHandle> outputHandle =
301 subTensorsSupported ?
Sadik Armagan5e719842020-08-28 12:17:33 +0100302 tensorHandleFactory.CreateSubTensorHandle(*inputHandle, tensorInfo.GetShape(), origin.data()) :
303 tensorHandleFactory.CreateTensorHandle(tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000304
305 armnn::SplitterQueueDescriptor data;
306 armnn::WorkloadInfo info;
307 AddInputToWorkload(data, info, tensorInfo, inputHandle.get());
308 AddOutputToWorkload(data, info, tensorInfo, outputHandle.get());
309
310 data.m_ViewOrigins.push_back(window);
311
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000312 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Splitter,
313 data,
314 info);
telsoa014fcda012018-03-09 14:13:49 +0000315
316 inputHandle->Allocate();
317 outputHandle->Allocate();
318
Sadik Armagan483c8112021-06-01 09:24:52 +0100319 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000320
321 workload->Execute();
322
Sadik Armagan483c8112021-06-01 09:24:52 +0100323 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +0000324
Sadik Armagan483c8112021-06-01 09:24:52 +0100325 return LayerTestResult<T, 3>(actualOutput,
326 input,
327 outputHandle->GetShape(),
328 tensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000329}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100330
331} // anonymous namespace
332
Matthew Jackson9bff1442019-09-12 09:08:23 +0100333std::vector<LayerTestResult<float,3>> SplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100334 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100335 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
336 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100337{
Sadik Armagan5e719842020-08-28 12:17:33 +0100338 return SplitterTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100339}
340
Matthew Jackson9bff1442019-09-12 09:08:23 +0100341std::vector<LayerTestResult<armnn::Half,3>> SplitterFloat16Test(
342 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
344 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100345{
Sadik Armagan5e719842020-08-28 12:17:33 +0100346 return SplitterTestCommon<armnn::DataType::Float16>(workloadFactory, memoryManager, tensorHandleFactory);
Matthew Jackson9bff1442019-09-12 09:08:23 +0100347}
348
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100349std::vector<LayerTestResult<uint8_t,3>> SplitterUint8Test(
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::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100355}
356
357std::vector<LayerTestResult<int16_t,3>> SplitterInt16Test(
358 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 SplitterTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100363}
364
Matthew Jackson9bff1442019-09-12 09:08:23 +0100365LayerTestResult<float, 3> CopyViaSplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100366 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100367 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
368 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100369{
Sadik Armagan5e719842020-08-28 12:17:33 +0100370 return CopyViaSplitterTestImpl<armnn::DataType::Float32>(workloadFactory,
371 memoryManager,
372 tensorHandleFactory,
373 0.0f,
374 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100375}
376
Matthew Jackson9bff1442019-09-12 09:08:23 +0100377LayerTestResult<armnn::Half, 3> CopyViaSplitterFloat16Test(
378 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100379 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
380 const armnn::ITensorHandleFactory& tensorHandleFactory)
Matthew Jackson9bff1442019-09-12 09:08:23 +0100381{
Sadik Armagan5e719842020-08-28 12:17:33 +0100382 return CopyViaSplitterTestImpl<armnn::DataType::Float16>(workloadFactory,
383 memoryManager,
384 tensorHandleFactory,
385 0.0f,
386 0);
Matthew Jackson9bff1442019-09-12 09:08:23 +0100387}
388
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100389LayerTestResult<uint8_t, 3> CopyViaSplitterUint8Test(
390 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100391 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
392 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100393{
Sadik Armagan5e719842020-08-28 12:17:33 +0100394 return CopyViaSplitterTestImpl<armnn::DataType::QAsymmU8>(workloadFactory,
395 memoryManager,
396 tensorHandleFactory,
397 1.0f,
398 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100399}
400
401LayerTestResult<int16_t, 3> CopyViaSplitterInt16Test(
402 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan5e719842020-08-28 12:17:33 +0100403 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
404 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100405{
Sadik Armagan5e719842020-08-28 12:17:33 +0100406 return CopyViaSplitterTestImpl<armnn::DataType::QSymmS16>(workloadFactory,
407 memoryManager,
408 tensorHandleFactory,
409 1.0f,
410 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100411}