1 //
2 // Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "Conv3dTestImpl.hpp"
7
8 #include <armnnUtils/QuantizeHelper.hpp>
9
10 #include <armnnUtils/DataLayoutIndexed.hpp>
11
12 #include <armnn/backends/TensorHandle.hpp>
13
14 #include <armnnTestUtils/DataLayoutUtils.hpp>
15 #include <armnnTestUtils/TensorCopyUtils.hpp>
16 #include <armnnTestUtils/WorkloadTestUtils.hpp>
17
18 #include <armnnTestUtils/TensorHelpers.hpp>
19
20 using namespace armnnUtils;
21
22 //
23 // Helper templates
24 //
25
26 // Helper template that returns a quantized bias depending on the number of output channels.
27 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
GetBiasData(bool biasEnabled,float qScale,armnn::TensorInfo outputInfo,armnn::DataLayout layout)28 std::vector<T> GetBiasData(bool biasEnabled, float qScale, armnn::TensorInfo outputInfo, armnn::DataLayout layout)
29 {
30 if(!biasEnabled)
31 {
32 return std::vector<T>();
33 }
34 else
35 {
36 const armnnUtils::DataLayoutIndexed dataLayoutIndexed(layout);
37 const unsigned int outputChannels = outputInfo.GetShape()[dataLayoutIndexed.GetChannelsIndex()];
38
39 switch (outputChannels)
40 {
41 case 1:
42 {
43 return QuantizedVector<T>({2}, qScale, 0);
44 }
45 case 2:
46 default:
47 {
48 return QuantizedVector<T>({0, 2}, qScale, 0);
49 }
50 }
51 }
52 }
53
54 // Modifies a std::vector in-place using a specified bias.
55 template<typename T, typename B>
ApplyBiasToData(std::vector<T> & v,const std::vector<B> & bias,float vScale,int32_t vOffset,float bScale,int32_t bOffset)56 void ApplyBiasToData(std::vector<T>& v, const std::vector<B>& bias,
57 float vScale, int32_t vOffset,
58 float bScale, int32_t bOffset)
59 {
60 ARMNN_ASSERT_MSG((armnn::IsQuantizedType<T>() && vScale != 0.0f) || (!armnn::IsQuantizedType<T>()),
61 "Invalid type and parameter combination.");
62 ARMNN_ASSERT_MSG((armnn::IsQuantizedType<B>() && bScale != 0.0f) || (!armnn::IsQuantizedType<B>()),
63 "Invalid type and parameter combination.");
64
65 for (uint32_t i = 0; i < bias.size(); ++i)
66 {
67 for (size_t j = i; j < v.size(); j+=bias.size())
68 {
69 // Note we need to dequantize and re-quantize the image value and the bias.
70 float dBias = SelectiveDequantize(bias[i], bScale, bOffset);
71
72 T& outRef = v[j];
73 float dOutput = SelectiveDequantize(outRef, vScale, vOffset);
74 outRef = SelectiveQuantize<T>(dOutput + dBias, vScale, vOffset);
75 }
76 }
77 }
78
79 // Set the quantization scale and offset values for data types.
80 template<armnn::DataType ArmnnType>
SetScaleOffset(float & qScale,int32_t & qOffset)81 void SetScaleOffset(float& qScale, int32_t& qOffset)
82 {
83 switch (ArmnnType)
84 {
85 case armnn::DataType::QAsymmU8:
86 {
87 qScale = 0.1f;
88 qOffset = 128;
89 break;
90 }
91 case armnn::DataType::QAsymmS8:
92 {
93 qScale = 0.1f;
94 qOffset = 64;
95 break;
96 }
97 case armnn::DataType::QSymmS16:
98 {
99 qScale = 0.1f;
100 qOffset = 0;
101 break;
102 }
103 case armnn::DataType::BFloat16:
104 case armnn::DataType::Float16:
105 case armnn::DataType::Float32:
106 default:
107 {
108 qScale = 1.f;
109 qOffset = 0;
110 break;
111 }
112 }
113 }
114
115 // Create a vector from 0 to size and quantize (if required).
116 template <typename T>
CreateQuantizedData(int32_t size,float qScale,int32_t qOffset)117 std::vector<T> CreateQuantizedData(int32_t size, float qScale, int32_t qOffset)
118 {
119 std::vector<float> data;
120 for (int32_t i = 0; i < size; ++i)
121 {
122 data.push_back(static_cast<float>(i));
123 }
124
125 return QuantizedVector<T>(data, qScale, qOffset);
126 }
127
128 // Create a vector from 0 to size divided and then quantized (if required) to create smaller floating point values.
129 template <typename T>
CreateSmallQuantizedData(int32_t size,float divisor,float qScale,int32_t qOffset)130 std::vector<T> CreateSmallQuantizedData(int32_t size, float divisor, float qScale, int32_t qOffset)
131 {
132 std::vector<float> data;
133 for (int32_t i = 0; i < size; ++i)
134 {
135 float value = static_cast<float>(i);
136 data.push_back(value/divisor);
137 }
138
139 return QuantizedVector<T>(data, qScale, qOffset);;
140 }
141
142 //
143 // Convolution3d implementations
144 //
145
146 template<armnn::DataType ArmnnType,
147 armnn::DataType ArmnnBType,
148 typename T = armnn::ResolveType<ArmnnType>,
149 typename B = armnn::ResolveType<ArmnnBType>>
SimpleConvolution3dTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const std::vector<T> & input,const std::vector<T> & kernel,const std::vector<B> & bias,const std::vector<T> & outputExpected,const armnn::TensorShape & inputShape,const armnn::TensorShape & kernelShape,const armnn::TensorShape & outputExpectedShape,const armnn::DataLayout dataLayout,float qScale,int32_t qOffset,uint32_t strideX=1,uint32_t strideY=1,uint32_t strideZ=1,uint32_t dilationX=1,uint32_t dilationY=1,uint32_t dilationZ=1,uint32_t padLeft=0,uint32_t padTop=0,uint32_t padRight=0,uint32_t padBottom=0,uint32_t padFront=0,uint32_t padBack=0)150 LayerTestResult<T, 5> SimpleConvolution3dTestImpl(
151 armnn::IWorkloadFactory& workloadFactory,
152 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
153 const armnn::ITensorHandleFactory& tensorHandleFactory,
154 const std::vector<T>& input,
155 const std::vector<T>& kernel,
156 const std::vector<B>& bias,
157 const std::vector<T>& outputExpected,
158 const armnn::TensorShape& inputShape,
159 const armnn::TensorShape& kernelShape,
160 const armnn::TensorShape& outputExpectedShape,
161 const armnn::DataLayout dataLayout,
162 float qScale,
163 int32_t qOffset,
164 uint32_t strideX = 1,
165 uint32_t strideY = 1,
166 uint32_t strideZ = 1,
167 uint32_t dilationX = 1,
168 uint32_t dilationY = 1,
169 uint32_t dilationZ = 1,
170 uint32_t padLeft = 0,
171 uint32_t padTop = 0,
172 uint32_t padRight = 0,
173 uint32_t padBottom = 0,
174 uint32_t padFront = 0,
175 uint32_t padBack = 0)
176 {
177 unsigned int inputNum = armnn::numeric_cast<unsigned int>(inputShape[0]);
178 unsigned int inputDepth = armnn::numeric_cast<unsigned int>(inputShape[1]);
179 unsigned int inputHeight = armnn::numeric_cast<unsigned int>(inputShape[2]);
180 unsigned int inputWidth = armnn::numeric_cast<unsigned int>(inputShape[3]);
181 unsigned int inputChannels = armnn::numeric_cast<unsigned int>(inputShape[4]);
182
183 // Conv3d weights/kernel layout: [D,H,W,I,O]
184 unsigned int kernelDepth = armnn::numeric_cast<unsigned int>(kernelShape[0]);
185 unsigned int kernelHeight = armnn::numeric_cast<unsigned int>(kernelShape[1]);
186 unsigned int kernelWidth = armnn::numeric_cast<unsigned int>(kernelShape[2]);
187 unsigned int kernelInChannels = armnn::numeric_cast<unsigned int>(kernelShape[3]);
188 unsigned int kernelOutChannels = armnn::numeric_cast<unsigned int>(kernelShape[4]);
189
190 unsigned int outputNum = armnn::numeric_cast<unsigned int>(outputExpectedShape[0]);
191 unsigned int outputDepth = armnn::numeric_cast<unsigned int>(outputExpectedShape[1]);
192 unsigned int outputHeight = armnn::numeric_cast<unsigned int>(outputExpectedShape[2]);
193 unsigned int outputWidth = armnn::numeric_cast<unsigned int>(outputExpectedShape[3]);
194 unsigned int outputChannels = armnn::numeric_cast<unsigned int>(outputExpectedShape[4]);
195
196 bool biasEnabled = bias.size() > 0;
197
198 // If a bias is used, its size must equal the number of output channels.
199 ARMNN_ASSERT(!biasEnabled || bias.size() == outputChannels);
200
201 // Creates the tensors.
202 armnn::TensorInfo inputTensorInfo({inputNum, inputDepth, inputHeight, inputWidth, inputChannels}, ArmnnType);
203 armnn::TensorInfo outputTensorInfo({outputNum, outputDepth, outputHeight, outputWidth, outputChannels}, ArmnnType);
204 armnn::TensorInfo kernelDesc({kernelDepth, kernelHeight, kernelWidth, kernelInChannels, kernelOutChannels},
205 ArmnnType);
206 armnn::TensorInfo biasDesc({static_cast<unsigned int>(bias.size())}, ArmnnBType);
207
208 // Set quantization parameters if the requested type is a quantized type.
209 if(armnn::IsQuantizedType<T>())
210 {
211 inputTensorInfo.SetQuantizationScale(qScale);
212 inputTensorInfo.SetQuantizationOffset(qOffset);
213 outputTensorInfo.SetQuantizationScale(qScale);
214 outputTensorInfo.SetQuantizationOffset(qOffset);
215 kernelDesc.SetQuantizationScale(qScale);
216 kernelDesc.SetQuantizationOffset(qOffset);
217 biasDesc.SetQuantizationScale(qScale*qScale);
218 biasDesc.SetQuantizationOffset(0);
219 }
220
221 // Construct the input data.
222 std::vector<T> inputData;
223 inputData.assign(input.data(), input.data() + inputNum*inputDepth*inputHeight*inputWidth*inputChannels);
224
225 // Construct the output data and apply bias if needed.
226 std::vector<T> outputData;
227 outputData.assign(outputExpected.data(), outputExpected.data() +
228 outputNum*outputDepth*outputHeight*outputWidth*outputChannels);
229
230 if (biasEnabled)
231 {
232 ApplyBiasToData(outputData, bias,
233 outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
234 biasDesc.GetQuantizationScale(), biasDesc.GetQuantizationOffset());
235 }
236
237 // Permute input and output if data layout is NCDHW.
238 if (dataLayout == armnn::DataLayout::NCDHW)
239 {
240 PermuteTensorNdhwcToNcdhw(inputTensorInfo, inputData);
241 PermuteTensorNdhwcToNcdhw(outputTensorInfo, outputData);
242 }
243
244 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
245
246 std::unique_ptr<armnn::ITensorHandle> input0Handle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
247 std::unique_ptr<armnn::ITensorHandle> input1Handle = tensorHandleFactory.CreateTensorHandle(kernelDesc);
248 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
249
250 armnn::Convolution3dQueueDescriptor data;
251 data.m_Parameters.m_StrideX = strideX;
252 data.m_Parameters.m_StrideY = strideY;
253 data.m_Parameters.m_StrideZ = strideZ;
254 data.m_Parameters.m_PadLeft = padLeft;
255 data.m_Parameters.m_PadRight = padRight;
256 data.m_Parameters.m_PadTop = padTop;
257 data.m_Parameters.m_PadBottom = padBottom;
258 data.m_Parameters.m_PadFront = padFront;
259 data.m_Parameters.m_PadBack = padBack;
260 data.m_Parameters.m_DilationX = dilationX;
261 data.m_Parameters.m_DilationY = dilationY;
262 data.m_Parameters.m_DilationZ = dilationZ;
263 data.m_Parameters.m_DataLayout = dataLayout;
264 data.m_Parameters.m_BiasEnabled = biasEnabled;
265
266 armnn::WorkloadInfo info;
267 AddInputToWorkload(data, info, inputTensorInfo, input0Handle.get());
268 AddInputToWorkload(data, info, kernelDesc, input1Handle.get());
269 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
270
271 std::unique_ptr<armnn::ITensorHandle> input2Handle = nullptr;
272 if (biasEnabled)
273 {
274 input2Handle = tensorHandleFactory.CreateTensorHandle(biasDesc);
275 AddInputToWorkload(data, info, biasDesc, input2Handle.get());
276 }
277
278 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Convolution3d,
279 data,
280 info);
281 input0Handle->Allocate();
282 input1Handle->Allocate();
283 outputHandle->Allocate();
284
285 CopyDataToITensorHandle(input0Handle.get(), inputData.data());
286 CopyDataToITensorHandle(input1Handle.get(), kernel.data());
287 if (biasEnabled)
288 {
289 input2Handle->Allocate();
290 CopyDataToITensorHandle(input2Handle.get(), bias.data());
291 }
292
293 ExecuteWorkload(*workload, memoryManager);
294
295 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
296
297 return LayerTestResult<T, 5>(actualOutput,
298 outputData,
299 outputHandle->GetShape(),
300 outputTensorInfo.GetShape());
301 }
302
303 template<armnn::DataType ArmnnType,
304 armnn::DataType ArmnnBType,
305 typename T = armnn::ResolveType<ArmnnType>>
SimpleConvolution3d3x3x3TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)306 LayerTestResult<T, 5> SimpleConvolution3d3x3x3TestCommon(
307 armnn::IWorkloadFactory& workloadFactory,
308 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
309 const armnn::ITensorHandleFactory& tensorHandleFactory,
310 bool biasEnabled,
311 armnn::DataLayout dataLayout)
312 {
313 float qScale;
314 int32_t qOffset;
315 SetScaleOffset<ArmnnType>(qScale, qOffset);
316
317 armnn::TensorInfo inputDesc({ 1, 5, 5, 5, 1 }, ArmnnType);
318 std::vector<T> input = CreateQuantizedData<T>(125, qScale, qOffset);
319
320 armnn::TensorInfo kernelDesc({ 3, 3, 3, 1, 1 }, ArmnnType);
321 std::vector<T> kernel = QuantizedVector<T>(
322 {
323 1, 1, 1,
324 1, 1, 1,
325 1, 1, 1,
326
327 0, 0, 0,
328 0, 1, 0,
329 0, 0, 0,
330
331 1, 1, 1,
332 1, 1, 1,
333 1, 1, 1,
334 },
335 qScale, qOffset);
336
337 armnn::TensorInfo outputDesc({ 1, 3, 3, 3, 1 }, ArmnnType);
338 std::vector<T> outputData = QuantizedVector<T>(
339 {
340 589, 608, 627,
341 684, 703, 722,
342 779, 798, 817,
343
344 1064, 1083, 1102,
345 1159, 1178, 1197,
346 1254, 1273, 1292,
347
348 1539, 1558, 1577,
349 1634, 1653, 1672,
350 1729, 1748, 1767
351 },
352 qScale, qOffset);
353
354 return SimpleConvolution3dTestImpl<ArmnnType, ArmnnBType>(
355 workloadFactory,
356 memoryManager,
357 tensorHandleFactory,
358 input,
359 kernel,
360 GetBiasData<ArmnnBType>(biasEnabled, qScale * qScale, outputDesc, dataLayout),
361 outputData,
362 inputDesc.GetShape(),
363 kernelDesc.GetShape(),
364 outputDesc.GetShape(),
365 dataLayout,
366 qScale,
367 qOffset
368 );
369 }
370
371 template<armnn::DataType ArmnnType,
372 armnn::DataType ArmnnBType,
373 typename T = armnn::ResolveType<ArmnnType>>
Convolution3d2x2x2Strides3x5x5TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)374 LayerTestResult<T, 5> Convolution3d2x2x2Strides3x5x5TestCommon(
375 armnn::IWorkloadFactory& workloadFactory,
376 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
377 const armnn::ITensorHandleFactory& tensorHandleFactory,
378 bool biasEnabled,
379 armnn::DataLayout dataLayout)
380 {
381 float qScale;
382 int32_t qOffset;
383 SetScaleOffset<ArmnnType>(qScale, qOffset);
384
385 armnn::TensorInfo inputDesc({ 1, 3, 10, 10, 1 }, ArmnnType);
386 std::vector<T> input = CreateQuantizedData<T>(300, qScale, qOffset);
387
388 armnn::TensorInfo kernelDesc({ 3, 5, 5, 1, 1 }, ArmnnType);
389 std::vector<T> kernel = QuantizedVector<T>(
390 {
391 1, 1, 1, 1, 1,
392 1, 1, 1, 1, 1,
393 1, 1, 1, 1, 1,
394 1, 1, 1, 1, 1,
395 1, 1, 1, 1, 1,
396
397 0, 0, 0, 0, 0,
398 0, 0, 0, 0, 0,
399 0, 0, 0, 0, 0,
400 0, 0, 0, 0, 0,
401 0, 0, 0, 0, 0,
402
403 2, 2, 2, 2, 2,
404 2, 2, 2, 2, 2,
405 2, 2, 2, 2, 2,
406 2, 2, 2, 2, 2,
407 2, 2, 2, 2, 2,
408 },
409 qScale, qOffset);
410
411 armnn::TensorInfo outputDesc({ 1, 1, 3, 3, 1 }, ArmnnType);
412 std::vector<T> outputData = QuantizedVector<T>(
413 {
414 11650, 11800, 11950,
415
416 13150, 13300, 13450,
417
418 14650, 14800, 14950
419 },
420 qScale, qOffset);
421
422 return SimpleConvolution3dTestImpl<ArmnnType, ArmnnBType>(
423 workloadFactory,
424 memoryManager,
425 tensorHandleFactory,
426 input,
427 kernel,
428 GetBiasData<ArmnnBType>(biasEnabled, qScale * qScale, outputDesc, dataLayout),
429 outputData,
430 inputDesc.GetShape(),
431 kernelDesc.GetShape(),
432 outputDesc.GetShape(),
433 dataLayout,
434 qScale,
435 qOffset,
436 2, // strideX
437 2, // strideY
438 2 // strideZ
439 );
440 }
441
442 template<armnn::DataType ArmnnType,
443 armnn::DataType ArmnnBType,
444 typename T = armnn::ResolveType<ArmnnType>>
Convolution3d2x2x2Dilation2x2x2TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)445 LayerTestResult<T, 5> Convolution3d2x2x2Dilation2x2x2TestCommon(
446 armnn::IWorkloadFactory& workloadFactory,
447 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
448 const armnn::ITensorHandleFactory& tensorHandleFactory,
449 bool biasEnabled,
450 armnn::DataLayout dataLayout)
451 {
452 float qScale;
453 int32_t qOffset;
454 SetScaleOffset<ArmnnType>(qScale, qOffset);
455
456 armnn::TensorInfo inputDesc({ 1, 5, 5, 5, 2 }, ArmnnType);
457 std::vector<T> input = CreateQuantizedData<T>(250, qScale, qOffset);
458
459 armnn::TensorInfo kernelDesc({ 2, 2, 2, 2, 2 }, ArmnnType);
460 std::vector<T> kernel = QuantizedVector<T>(
461 {
462 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1,
463 1, 1, -1, 1, -1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -1, 1,
464 },
465 qScale, qOffset);
466
467 // Since the dilation rate is 3 this will dilate the kernel to be 4x4,
468 // therefore the output will be 2x2
469 armnn::TensorInfo outputDesc({ 1, 2, 2, 2, 2 }, ArmnnType);
470 std::vector<T> outputData = QuantizedVector<T>(
471 {
472 -1124, 974,
473 -1148, 978,
474
475 -1244, 994,
476 -1268, 998,
477
478 -1724, 1074,
479 -1748, 1078,
480
481 -1844, 1094,
482 -1868, 1098
483 },
484 qScale, qOffset);
485
486 return SimpleConvolution3dTestImpl<ArmnnType, ArmnnBType>(
487 workloadFactory,
488 memoryManager,
489 tensorHandleFactory,
490 input,
491 kernel,
492 GetBiasData<ArmnnBType>(biasEnabled, qScale * qScale, outputDesc, dataLayout),
493 outputData,
494 inputDesc.GetShape(),
495 kernelDesc.GetShape(),
496 outputDesc.GetShape(),
497 dataLayout,
498 qScale,
499 qOffset,
500 1, // strideX
501 1, // strideY
502 1, // strideZ
503 3, // dilationX
504 3, // dilationY
505 3 // dilationZ
506 );
507 }
508
509 template<armnn::DataType ArmnnType,
510 armnn::DataType ArmnnBType,
511 typename T = armnn::ResolveType<ArmnnType>>
Convolution3dPaddingSame3x3x3TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)512 LayerTestResult<T, 5> Convolution3dPaddingSame3x3x3TestCommon(
513 armnn::IWorkloadFactory& workloadFactory,
514 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
515 const armnn::ITensorHandleFactory& tensorHandleFactory,
516 bool biasEnabled,
517 armnn::DataLayout dataLayout)
518 {
519 float qScale;
520 int32_t qOffset;
521 SetScaleOffset<ArmnnType>(qScale, qOffset);
522
523 armnn::TensorInfo inputDesc({ 1, 5, 5, 5, 1 }, ArmnnType);
524 std::vector<T> input = CreateQuantizedData<T>(125, qScale, qOffset);
525
526 armnn::TensorInfo kernelDesc({ 3, 3, 3, 1, 1 }, ArmnnType);
527 std::vector<T> kernel = QuantizedVector<T>(
528 {
529 1, 1, 1,
530 1, 1, 1,
531 1, 1, 1,
532
533 0, 0, 0,
534 0, 0, 0,
535 0, 0, 0,
536
537 1, 1, 1,
538 1, 1, 1,
539 1, 1, 1,
540 },
541 qScale, qOffset);
542
543 armnn::TensorInfo outputDesc({ 1, 5, 5, 5, 1 }, ArmnnType);
544 std::vector<T> outputData = QuantizedVector<T>(
545 {
546 112, 171, 177, 183, 124,
547 183, 279, 288, 297, 201,
548 213, 324, 333, 342, 231,
549 243, 369, 378, 387, 261,
550 172, 261, 267, 273, 184,
551
552 224, 342, 354, 366, 248,
553 366, 558, 576, 594, 402,
554 426, 648, 666, 684, 462,
555 486, 738, 756, 774, 522,
556 344, 522, 534, 546, 368,
557
558 424, 642, 654, 666, 448,
559 666, 1008, 1026, 1044, 702,
560 726, 1098, 1116, 1134, 762,
561 786, 1188, 1206, 1224, 822,
562 544, 822, 834, 846, 568,
563 624, 942, 954, 966, 648,
564
565 966, 1458, 1476, 1494, 1002,
566 1026, 1548, 1566, 1584, 1062,
567 1086, 1638, 1656, 1674, 1122,
568 744, 1122, 1134, 1146, 768,
569 312, 471, 477, 483, 324,
570 483, 729, 738, 747, 501,
571 513, 774, 783, 792, 531,
572 543, 819, 828, 837, 561,
573 372, 561, 567, 573, 384
574 },
575 qScale, qOffset);
576
577 return SimpleConvolution3dTestImpl<ArmnnType, ArmnnBType>(
578 workloadFactory,
579 memoryManager,
580 tensorHandleFactory,
581 input,
582 kernel,
583 GetBiasData<ArmnnBType>(biasEnabled, qScale * qScale, outputDesc, dataLayout),
584 outputData,
585 inputDesc.GetShape(),
586 kernelDesc.GetShape(),
587 outputDesc.GetShape(),
588 dataLayout,
589 qScale,
590 qOffset,
591 1, // strideX
592 1, // strideY
593 1, // strideZ
594 1, // dilationX
595 1, // dilationY
596 1, // dilationZ
597 1, // padLeft
598 1, // padTop
599 1, // padRight
600 1, // padBottom
601 1, // padFront
602 1 // padBack
603 );
604 }
605
Convolution3dStrideDilationPadding3x3x3TestCommonFloat32(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)606 LayerTestResult<float, 5> Convolution3dStrideDilationPadding3x3x3TestCommonFloat32(
607 armnn::IWorkloadFactory& workloadFactory,
608 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
609 const armnn::ITensorHandleFactory& tensorHandleFactory,
610 bool biasEnabled,
611 armnn::DataLayout dataLayout)
612 {
613 float qScale = 0.f;
614 int32_t qOffset = 0;
615
616 armnn::TensorInfo inputDesc({ 1, 3, 10, 10, 2 }, armnn::DataType::Float32);
617 std::vector<float> input = CreateSmallQuantizedData<float>(600, 100.0f, qScale, qOffset);
618
619 armnn::TensorInfo kernelDesc({ 3, 3, 3, 2, 2 }, armnn::DataType::Float32);
620 std::vector<float> kernel = CreateSmallQuantizedData<float>(108, 100.0f, qScale, qOffset);
621
622 // Since the dilation rate is 2 this will dilate the kernel to be 5x5: d(K-1)+1 --> 2 x (3-1) + 1 = 5,
623 // therefore the output will be 1x4x4: (I − K + 2P)/S +1 => trunc((10 - 3 + 2x2 )/3 + 1))
624 // where, dilation size = d = 2; kernel size = K = 3; input size = I = 10; padding size = P = 2; stride = S = 3
625 armnn::TensorInfo outputDesc({ 1, 1, 4, 4, 2 }, armnn::DataType::Float32);
626 std::vector<float> outputData =
627 {
628 12.0312f, 12.2268f, 17.7512f, 18.0494f,
629 18.176f, 18.4814f, 5.6912f, 5.7938f,
630 19.1664f, 19.5078f, 28.119f, 28.6383f,
631 28.6914f, 29.2215f, 8.9094f, 9.0873f,
632
633 23.1264f, 23.5398f, 33.843f, 34.4703f,
634 34.4154f, 35.0535f, 10.6734f, 10.8873f,
635 6.2712f, 6.417f, 9.0718f, 9.2929f,
636 9.2194f, 9.4441f, 2.7862f, 2.8615f
637 };
638
639 return SimpleConvolution3dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
640 workloadFactory,
641 memoryManager,
642 tensorHandleFactory,
643 input,
644 kernel,
645 GetBiasData<armnn::DataType::Float32>(biasEnabled, qScale * qScale, outputDesc, dataLayout),
646 outputData,
647 inputDesc.GetShape(),
648 kernelDesc.GetShape(),
649 outputDesc.GetShape(),
650 dataLayout,
651 qScale,
652 qOffset,
653 3, // strideX
654 3, // strideY
655 3, // strideZ
656 2, // dilationX
657 2, // dilationY
658 2, // dilationZ
659 1, // padLeft
660 1, // padTop
661 1, // padRight
662 1, // padBottom
663 1, // padFront
664 1 // padBack
665 );
666 }
667
Convolution3d2x2x2Stride3x3x3SmallTestCommonFloat32(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)668 LayerTestResult<float, 5> Convolution3d2x2x2Stride3x3x3SmallTestCommonFloat32(
669 armnn::IWorkloadFactory& workloadFactory,
670 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
671 const armnn::ITensorHandleFactory& tensorHandleFactory,
672 bool biasEnabled,
673 armnn::DataLayout dataLayout)
674 {
675 float qScale = 0.f;
676 int32_t qOffset = 0;
677
678 armnn::TensorInfo inputDesc({ 1, 3, 10, 10, 1 }, armnn::DataType::Float32);
679 std::vector<float> input = CreateSmallQuantizedData<float>(300, 100.0f, qScale, qOffset);
680
681 armnn::TensorInfo kernelDesc({ 3, 3, 3, 1, 1 }, armnn::DataType::Float32);
682 std::vector<float> kernel =
683 {
684 0.125977f, 0.150391f, 0.101562f,
685 0.0585938f, 0.0864258f, 0.043457f,
686 0.034668f, 0.0322266f, 0.0385742f,
687
688 0.125977f, 0.150391f, -0.101562f,
689 -0.0585938f,-0.0864258f,-0.043457f,
690 -0.0104630f, 0.0154114f, 0.0013768f,
691
692 0.0344238f, 0.035644f, 0.0495605f,
693 0.0683594f, 0.099121f, -0.0461426f,
694 -0.0996094f,-0.126953f, -0.043457f,
695 };
696
697 armnn::TensorInfo outputDesc({ 1, 1, 4, 4, 1 }, armnn::DataType::Float32);
698 std::vector<float> outputData =
699 {
700 -0.08156067f, -0.06891209f, -0.05589598f, -0.04310101f,
701 0.04584253f, 0.05855697f, 0.07129729f, 0.08325434f,
702 0.17304349f, 0.18521416f, 0.19818866f, 0.21096253f,
703 0.29965734f, 0.312698f, 0.32547557f, 0.33818722f
704 };
705
706 return SimpleConvolution3dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
707 workloadFactory,
708 memoryManager,
709 tensorHandleFactory,
710 input,
711 kernel,
712 GetBiasData<armnn::DataType::Float32>(biasEnabled, qScale * qScale, outputDesc, dataLayout),
713 outputData,
714 inputDesc.GetShape(),
715 kernelDesc.GetShape(),
716 outputDesc.GetShape(),
717 dataLayout,
718 qScale,
719 qOffset,
720 2, // strideX
721 2, // strideY
722 2 // strideZ
723 );
724 }
725
Convolution3d2x3x3TestCommonFloat16(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)726 LayerTestResult<armnn::Half, 5> Convolution3d2x3x3TestCommonFloat16(
727 armnn::IWorkloadFactory& workloadFactory,
728 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
729 const armnn::ITensorHandleFactory& tensorHandleFactory,
730 bool biasEnabled,
731 armnn::DataLayout dataLayout)
732 {
733 using namespace half_float::literal;
734
735 float qScale = 0.f;
736 int32_t qOffset = 0;
737
738 armnn::TensorInfo inputDesc({ 1, 2, 3, 3, 2 }, armnn::DataType::Float16);
739 const std::vector<armnn::Half> input =
740 {
741 1._h, 2._h, 3._h,
742 4._h, 5._h, 6._h,
743
744 7._h, 8._h, 9._h,
745 10._h, 11._h, 12._h,
746
747 13._h, 14._h, 15._h,
748 16._h, 17._h, 18._h,
749
750 19._h, 20._h, 21._h,
751 22._h, 23._h, 24._h,
752
753 25._h, 26._h, 27._h,
754 28._h, 29._h, 30._h,
755
756 31._h, 32._h, 33._h,
757 34._h, 35._h, 36._h
758 };
759
760 armnn::TensorInfo kernelDesc({ 2, 2, 2, 2, 2 }, armnn::DataType::Float16);
761 std::vector<armnn::Half> kernel =
762 {
763 -1._h, -1._h, -1._h, -1._h, -1._h, -1._h, -1._h, -1._h,
764 -1._h, -1._h, -1._h, 1._h, 1._h, 1._h, -1._h, -1._h,
765 1._h, 1._h, -1._h, 1._h, -1._h, 1._h, -1._h, 1._h,
766 -1._h, -1._h, -1._h, 1._h, -1._h, 1._h, -1._h, 1._h,
767 };
768
769 armnn::TensorInfo outputDesc({ 1, 1, 2, 2, 2 }, armnn::DataType::Float16);
770 std::vector<armnn::Half> outputData =
771 {
772 -176._h, 128._h,
773 -200._h, 132._h,
774
775 -248._h, 140._h,
776 -272._h, 144._h
777 };
778
779 return SimpleConvolution3dTestImpl<armnn::DataType::Float16, armnn::DataType::Float16>(
780 workloadFactory,
781 memoryManager,
782 tensorHandleFactory,
783 input,
784 kernel,
785 GetBiasData<armnn::DataType::Float16>(biasEnabled, qScale * qScale, outputDesc, dataLayout),
786 outputData,
787 inputDesc.GetShape(),
788 kernelDesc.GetShape(),
789 outputDesc.GetShape(),
790 dataLayout,
791 qScale,
792 qOffset
793 );
794 }
795
Convolution3d2x2x2SmallTestCommonFloat16(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)796 LayerTestResult<armnn::Half, 5> Convolution3d2x2x2SmallTestCommonFloat16(
797 armnn::IWorkloadFactory& workloadFactory,
798 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
799 const armnn::ITensorHandleFactory& tensorHandleFactory,
800 bool biasEnabled,
801 armnn::DataLayout dataLayout)
802 {
803 using namespace half_float::literal;
804
805 float qScale = 0.f;
806 int32_t qOffset = 0;
807
808 armnn::TensorInfo inputDesc({ 1, 2, 4, 4, 1 }, armnn::DataType::Float16);
809 const std::vector<armnn::Half> input =
810 {
811 0.0367984_h, 0.0380895_h, 0.0420157_h, 0.0675631_h,
812 0.0938920_h, 0.0476106_h, 0.1035490_h, 0.1260370_h,
813 0.0461647_h, 0.0883828_h, 0.1159540_h, 0.0498519_h,
814 0.0104630_h, 0.0154114_h, 0.00137681_h, 0.0344238_h,
815
816 0.0356445_h, 0.0495605_h, 0.0683594_h, 0.0991211_h,
817 0.0461426_h, 0.0996094_h, 0.1269530_h, 0.0393066_h,
818 0.103516_h, 0.032544_h, 0.124334_h, 0.0564566_h,
819 0.0123544_h, 0.0461647_h, 0.0883828_h, 0.1159540_h,
820 };
821
822 armnn::TensorInfo kernelDesc({ 2, 2, 2, 1, 1 }, armnn::DataType::Float16);
823 std::vector<armnn::Half> kernel =
824 {
825 -0.126184_h, -0.150468_h,
826 -0.101412_h, -0.0586369_h,
827
828 -0.0435089_h, 0.0347555_h,
829 0.0323111_h, 0.0385381_h
830 };
831
832 armnn::TensorInfo outputDesc({ 1, 1, 3, 3, 1 }, armnn::DataType::Float16);
833 std::vector<armnn::Half> outputData =
834 {
835 -0.01718917_h, -0.01370182_h, -0.02727737_h,
836
837 -0.02282543_h, -0.03144084_h, -0.04468598_h,
838
839 -0.02228982_h, -0.02244923_h, -0.02042268_h
840 };
841
842 return SimpleConvolution3dTestImpl<armnn::DataType::Float16, armnn::DataType::Float16>(
843 workloadFactory,
844 memoryManager,
845 tensorHandleFactory,
846 input,
847 kernel,
848 GetBiasData<armnn::DataType::Float16>(biasEnabled, qScale * qScale, outputDesc, dataLayout),
849 outputData,
850 inputDesc.GetShape(),
851 kernelDesc.GetShape(),
852 outputDesc.GetShape(),
853 dataLayout,
854 qScale,
855 qOffset
856 );
857 }
858
SimpleConvolution3d3x3x3Float32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)859 LayerTestResult<float, 5> SimpleConvolution3d3x3x3Float32Test(
860 armnn::IWorkloadFactory& workloadFactory,
861 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
862 const armnn::ITensorHandleFactory& tensorHandleFactory,
863 bool biasEnabled,
864 armnn::DataLayout dataLayout)
865 {
866 return SimpleConvolution3d3x3x3TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
867 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
868 }
869
SimpleConvolution3d3x3x3Int8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)870 LayerTestResult<int8_t, 5> SimpleConvolution3d3x3x3Int8Test(
871 armnn::IWorkloadFactory& workloadFactory,
872 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
873 const armnn::ITensorHandleFactory& tensorHandleFactory,
874 bool biasEnabled,
875 armnn::DataLayout dataLayout)
876 {
877 return SimpleConvolution3d3x3x3TestCommon<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
878 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
879 }
880
SimpleConvolution3d3x3x3Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)881 LayerTestResult<uint8_t, 5> SimpleConvolution3d3x3x3Uint8Test(
882 armnn::IWorkloadFactory& workloadFactory,
883 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
884 const armnn::ITensorHandleFactory& tensorHandleFactory,
885 bool biasEnabled,
886 armnn::DataLayout dataLayout)
887 {
888 return SimpleConvolution3d3x3x3TestCommon<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
889 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
890 }
891
SimpleConvolution3d3x3x3Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)892 LayerTestResult<int16_t, 5> SimpleConvolution3d3x3x3Int16Test(
893 armnn::IWorkloadFactory& workloadFactory,
894 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
895 const armnn::ITensorHandleFactory& tensorHandleFactory,
896 bool biasEnabled,
897 armnn::DataLayout dataLayout)
898 {
899 return SimpleConvolution3d3x3x3TestCommon<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
900 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
901 }
902
903
Convolution3d2x2x2Strides3x5x5Float32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)904 LayerTestResult<float, 5> Convolution3d2x2x2Strides3x5x5Float32Test(
905 armnn::IWorkloadFactory& workloadFactory,
906 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
907 const armnn::ITensorHandleFactory& tensorHandleFactory,
908 bool biasEnabled,
909 armnn::DataLayout dataLayout)
910 {
911 return Convolution3d2x2x2Strides3x5x5TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
912 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
913 }
914
Convolution3d2x2x2Strides3x5x5Int8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)915 LayerTestResult<int8_t, 5> Convolution3d2x2x2Strides3x5x5Int8Test(
916 armnn::IWorkloadFactory& workloadFactory,
917 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
918 const armnn::ITensorHandleFactory& tensorHandleFactory,
919 bool biasEnabled,
920 armnn::DataLayout dataLayout)
921 {
922 return Convolution3d2x2x2Strides3x5x5TestCommon<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
923 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
924 }
925
Convolution3d2x2x2Strides3x5x5Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)926 LayerTestResult<uint8_t, 5> Convolution3d2x2x2Strides3x5x5Uint8Test(
927 armnn::IWorkloadFactory& workloadFactory,
928 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
929 const armnn::ITensorHandleFactory& tensorHandleFactory,
930 bool biasEnabled,
931 armnn::DataLayout dataLayout)
932 {
933 return Convolution3d2x2x2Strides3x5x5TestCommon<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
934 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
935 }
936
Convolution3d2x2x2Strides3x5x5Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)937 LayerTestResult<int16_t, 5> Convolution3d2x2x2Strides3x5x5Int16Test(
938 armnn::IWorkloadFactory& workloadFactory,
939 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
940 const armnn::ITensorHandleFactory& tensorHandleFactory,
941 bool biasEnabled,
942 armnn::DataLayout dataLayout)
943 {
944 return Convolution3d2x2x2Strides3x5x5TestCommon<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
945 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
946 }
947
Convolution3d2x2x2Dilation2x2x2Float32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)948 LayerTestResult<float, 5> Convolution3d2x2x2Dilation2x2x2Float32Test(
949 armnn::IWorkloadFactory& workloadFactory,
950 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
951 const armnn::ITensorHandleFactory& tensorHandleFactory,
952 bool biasEnabled,
953 armnn::DataLayout dataLayout)
954 {
955 return Convolution3d2x2x2Dilation2x2x2TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
956 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
957 }
958
Convolution3d2x2x2Dilation2x2x2Int8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)959 LayerTestResult<int8_t, 5> Convolution3d2x2x2Dilation2x2x2Int8Test(
960 armnn::IWorkloadFactory& workloadFactory,
961 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
962 const armnn::ITensorHandleFactory& tensorHandleFactory,
963 bool biasEnabled,
964 armnn::DataLayout dataLayout)
965 {
966 return Convolution3d2x2x2Dilation2x2x2TestCommon<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
967 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
968 }
969
Convolution3d2x2x2Dilation2x2x2Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)970 LayerTestResult<uint8_t, 5> Convolution3d2x2x2Dilation2x2x2Uint8Test(
971 armnn::IWorkloadFactory& workloadFactory,
972 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
973 const armnn::ITensorHandleFactory& tensorHandleFactory,
974 bool biasEnabled,
975 armnn::DataLayout dataLayout)
976 {
977 return Convolution3d2x2x2Dilation2x2x2TestCommon<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
978 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
979 }
980
Convolution3d2x2x2Dilation2x2x2Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)981 LayerTestResult<int16_t, 5> Convolution3d2x2x2Dilation2x2x2Int16Test(
982 armnn::IWorkloadFactory& workloadFactory,
983 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
984 const armnn::ITensorHandleFactory& tensorHandleFactory,
985 bool biasEnabled,
986 armnn::DataLayout dataLayout)
987 {
988 return Convolution3d2x2x2Dilation2x2x2TestCommon<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
989 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
990 }
991
Convolution3dPaddingSame3x3x3Float32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)992 LayerTestResult<float, 5> Convolution3dPaddingSame3x3x3Float32Test(
993 armnn::IWorkloadFactory& workloadFactory,
994 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
995 const armnn::ITensorHandleFactory& tensorHandleFactory,
996 bool biasEnabled,
997 armnn::DataLayout dataLayout)
998 {
999 return Convolution3dPaddingSame3x3x3TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1000 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
1001 }
1002
Convolution3dPaddingSame3x3x3Int8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)1003 LayerTestResult<int8_t, 5> Convolution3dPaddingSame3x3x3Int8Test(
1004 armnn::IWorkloadFactory& workloadFactory,
1005 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1006 const armnn::ITensorHandleFactory& tensorHandleFactory,
1007 bool biasEnabled,
1008 armnn::DataLayout dataLayout)
1009 {
1010 return Convolution3dPaddingSame3x3x3TestCommon<armnn::DataType::QAsymmS8, armnn::DataType::Signed32>(
1011 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
1012 }
1013
Convolution3dPaddingSame3x3x3Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)1014 LayerTestResult<uint8_t, 5> Convolution3dPaddingSame3x3x3Uint8Test(
1015 armnn::IWorkloadFactory& workloadFactory,
1016 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1017 const armnn::ITensorHandleFactory& tensorHandleFactory,
1018 bool biasEnabled,
1019 armnn::DataLayout dataLayout)
1020 {
1021 return Convolution3dPaddingSame3x3x3TestCommon<armnn::DataType::QAsymmU8, armnn::DataType::Signed32>(
1022 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
1023 }
1024
Convolution3dPaddingSame3x3x3Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)1025 LayerTestResult<int16_t, 5> Convolution3dPaddingSame3x3x3Int16Test(
1026 armnn::IWorkloadFactory& workloadFactory,
1027 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1028 const armnn::ITensorHandleFactory& tensorHandleFactory,
1029 bool biasEnabled,
1030 armnn::DataLayout dataLayout)
1031 {
1032 return Convolution3dPaddingSame3x3x3TestCommon<armnn::DataType::QSymmS16, armnn::DataType::Signed32>(
1033 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
1034 }
1035
Convolution3dStrideDilationPadding3x3x3Float32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)1036 LayerTestResult<float, 5> Convolution3dStrideDilationPadding3x3x3Float32Test(
1037 armnn::IWorkloadFactory& workloadFactory,
1038 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1039 const armnn::ITensorHandleFactory& tensorHandleFactory,
1040 bool biasEnabled,
1041 armnn::DataLayout dataLayout)
1042 {
1043 return Convolution3dStrideDilationPadding3x3x3TestCommonFloat32(
1044 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
1045 }
1046
Convolution3d2x2x2Stride3x3x3SmallFloat32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)1047 LayerTestResult<float, 5> Convolution3d2x2x2Stride3x3x3SmallFloat32Test(
1048 armnn::IWorkloadFactory& workloadFactory,
1049 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1050 const armnn::ITensorHandleFactory& tensorHandleFactory,
1051 bool biasEnabled,
1052 armnn::DataLayout dataLayout)
1053 {
1054 return Convolution3d2x2x2Stride3x3x3SmallTestCommonFloat32(
1055 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
1056 }
1057
Convolution3d2x3x3Float16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)1058 LayerTestResult<armnn::Half, 5> Convolution3d2x3x3Float16Test(
1059 armnn::IWorkloadFactory& workloadFactory,
1060 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1061 const armnn::ITensorHandleFactory& tensorHandleFactory,
1062 bool biasEnabled,
1063 armnn::DataLayout dataLayout)
1064 {
1065 return Convolution3d2x3x3TestCommonFloat16(
1066 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
1067 }
1068
Convolution3d2x2x2SmallFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool biasEnabled,armnn::DataLayout dataLayout)1069 LayerTestResult<armnn::Half, 5> Convolution3d2x2x2SmallFloat16Test(
1070 armnn::IWorkloadFactory& workloadFactory,
1071 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1072 const armnn::ITensorHandleFactory& tensorHandleFactory,
1073 bool biasEnabled,
1074 armnn::DataLayout dataLayout)
1075 {
1076 return Convolution3d2x2x2SmallTestCommonFloat16(
1077 workloadFactory, memoryManager, tensorHandleFactory, biasEnabled, dataLayout);
1078 }
1079