blob: c8c2f9c7d11cf082ec14f240697793ccedd65bcd [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. 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#include <armnn/ArmNN.hpp>
telsoa014fcda012018-03-09 14:13:49 +000012
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010013#include <backendsCommon/test/TensorCopyUtils.hpp>
14#include <backendsCommon/test/WorkloadTestUtils.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000015
David Beckac42efd2018-09-26 17:41:13 +010016#include <test/TensorHelpers.hpp>
telsoa014fcda012018-03-09 14:13:49 +000017
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010018namespace
19{
20
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000021template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000022std::vector<LayerTestResult<T,3>> SplitterTestCommon(
23 armnn::IWorkloadFactory& workloadFactory,
24 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
25 float qScale = 0.0f,
26 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +000027{
Derek Lambertic374ff02019-12-10 21:57:35 +000028 boost::ignore_unused(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
183 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
184
185 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
186
187 std::unique_ptr<armnn::ITensorHandle> outputHandle1 =
188 subTensorsSupported ?
189 workloadFactory.CreateSubTensorHandle(*inputHandle, outputTensorInfo1.GetShape(), wOrigin1.data()) :
190 workloadFactory.CreateTensorHandle(outputTensorInfo1);
191
192 std::unique_ptr<armnn::ITensorHandle> outputHandle2 =
193 subTensorsSupported ?
194 workloadFactory.CreateSubTensorHandle(*inputHandle, outputTensorInfo2.GetShape(), wOrigin2.data()) :
195 workloadFactory.CreateTensorHandle(outputTensorInfo2);
196
197 std::unique_ptr<armnn::ITensorHandle> outputHandle3 =
198 subTensorsSupported ?
surmeh013537c2c2018-05-18 16:31:43 +0100199 workloadFactory.CreateSubTensorHandle(*outputHandle2, outputTensorInfo3.GetShape(), wOrigin3.data()) :
telsoa014fcda012018-03-09 14:13:49 +0000200 workloadFactory.CreateTensorHandle(outputTensorInfo3);
201
202 std::unique_ptr<armnn::ITensorHandle> outputHandle4 =
203 subTensorsSupported ?
surmeh013537c2c2018-05-18 16:31:43 +0100204 workloadFactory.CreateSubTensorHandle(*outputHandle2, outputTensorInfo4.GetShape(), wOrigin4.data()) :
telsoa014fcda012018-03-09 14:13:49 +0000205 workloadFactory.CreateTensorHandle(outputTensorInfo4);
206
surmeh013537c2c2018-05-18 16:31:43 +0100207 // Do the first split
telsoa014fcda012018-03-09 14:13:49 +0000208 armnn::SplitterQueueDescriptor data;
209 armnn::WorkloadInfo info;
210 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
211 AddOutputToWorkload(data, info, outputTensorInfo1, outputHandle1.get());
212 AddOutputToWorkload(data, info, outputTensorInfo2, outputHandle2.get());
telsoa014fcda012018-03-09 14:13:49 +0000213
214 data.m_ViewOrigins.push_back(window1);
215 data.m_ViewOrigins.push_back(window2);
telsoa014fcda012018-03-09 14:13:49 +0000216
217 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSplitter(data, info);
218
219 inputHandle->Allocate();
220 outputHandle1->Allocate();
221 outputHandle2->Allocate();
telsoa014fcda012018-03-09 14:13:49 +0000222
223 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0]);
224
225 workload->Execute();
226
227 CopyDataFromITensorHandle(&ret1.output[0][0][0], outputHandle1.get());
228 CopyDataFromITensorHandle(&ret2.output[0][0][0], outputHandle2.get());
surmeh013537c2c2018-05-18 16:31:43 +0100229
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000230 // Do the second split.
surmeh013537c2c2018-05-18 16:31:43 +0100231 armnn::SplitterQueueDescriptor data2;
232 armnn::WorkloadInfo info2;
233 AddInputToWorkload(data2, info2, outputTensorInfo2, outputHandle2.get());
234 AddOutputToWorkload(data2, info2, outputTensorInfo3, outputHandle3.get());
235 AddOutputToWorkload(data2, info2, outputTensorInfo4, outputHandle4.get());
236
237 data2.m_ViewOrigins.push_back(window3);
238 data2.m_ViewOrigins.push_back(window4);
239
240 std::unique_ptr<armnn::IWorkload> workload2 = workloadFactory.CreateSplitter(data2, info2);
241
242 outputHandle3->Allocate();
243 outputHandle4->Allocate();
244
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000245 ExecuteWorkload(*workload2, memoryManager);
surmeh013537c2c2018-05-18 16:31:43 +0100246
telsoa014fcda012018-03-09 14:13:49 +0000247 CopyDataFromITensorHandle(&ret3.output[0][0][0], outputHandle3.get());
248 CopyDataFromITensorHandle(&ret4.output[0][0][0], outputHandle4.get());
telsoa014fcda012018-03-09 14:13:49 +0000249
surmeh013537c2c2018-05-18 16:31:43 +0100250 std::vector<LayerTestResult<T,3>> ret = {ret1, ret2, ret3, ret4,};
telsoa014fcda012018-03-09 14:13:49 +0000251
252 return ret;
253}
254
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000255template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000256LayerTestResult<T, 3> CopyViaSplitterTestImpl(
257 armnn::IWorkloadFactory& workloadFactory,
258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
259 float qScale, int32_t qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000260{
Derek Lambertic374ff02019-12-10 21:57:35 +0000261 boost::ignore_unused(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
292 const bool subTensorsSupported = workloadFactory.SupportsSubTensors();
293
294 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(tensorInfo);
295
296 std::unique_ptr<armnn::ITensorHandle> outputHandle =
297 subTensorsSupported ?
298 workloadFactory.CreateSubTensorHandle(*inputHandle, tensorInfo.GetShape(), origin.data()) :
299 workloadFactory.CreateTensorHandle(tensorInfo);
300
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
313 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0]);
314
315 workload->Execute();
316
317 LayerTestResult<T, 3> ret(tensorInfo);
318 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
319 ret.outputExpected = input;
320
321 return ret;
322}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100323
324} // anonymous namespace
325
Matthew Jackson9bff1442019-09-12 09:08:23 +0100326std::vector<LayerTestResult<float,3>> SplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100327 armnn::IWorkloadFactory& workloadFactory,
328 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
329{
330 return SplitterTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
331}
332
Matthew Jackson9bff1442019-09-12 09:08:23 +0100333std::vector<LayerTestResult<armnn::Half,3>> SplitterFloat16Test(
334 armnn::IWorkloadFactory& workloadFactory,
335 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
336{
337 return SplitterTestCommon<armnn::DataType::Float16>(workloadFactory, memoryManager);
338}
339
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100340std::vector<LayerTestResult<uint8_t,3>> SplitterUint8Test(
341 armnn::IWorkloadFactory& workloadFactory,
342 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
343{
344 return SplitterTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
345}
346
347std::vector<LayerTestResult<int16_t,3>> SplitterInt16Test(
348 armnn::IWorkloadFactory& workloadFactory,
349 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
350{
351 return SplitterTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
352}
353
Matthew Jackson9bff1442019-09-12 09:08:23 +0100354LayerTestResult<float, 3> CopyViaSplitterFloat32Test(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100355 armnn::IWorkloadFactory& workloadFactory,
356 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
357{
358 return CopyViaSplitterTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
359}
360
Matthew Jackson9bff1442019-09-12 09:08:23 +0100361LayerTestResult<armnn::Half, 3> CopyViaSplitterFloat16Test(
362 armnn::IWorkloadFactory& workloadFactory,
363 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
364{
365 return CopyViaSplitterTestImpl<armnn::DataType::Float16>(workloadFactory, memoryManager, 0.0f, 0);
366}
367
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100368LayerTestResult<uint8_t, 3> CopyViaSplitterUint8Test(
369 armnn::IWorkloadFactory& workloadFactory,
370 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
371{
372 return CopyViaSplitterTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
373}
374
375LayerTestResult<int16_t, 3> CopyViaSplitterInt16Test(
376 armnn::IWorkloadFactory& workloadFactory,
377 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
378{
379 return CopyViaSplitterTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
380}