blob: 41add6e6da6c82ed298fe0c1552e20d6b53de181 [file] [log] [blame]
Samuel Yap6b478092022-07-06 15:36:03 +01001//
2// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "BatchMatMulTestImpl.hpp"
7
8#include <armnn/backends/IBackendInternal.hpp>
9#include <armnn/backends/Workload.hpp>
10#include <armnn/backends/WorkloadData.hpp>
11#include <armnn/backends/WorkloadFactory.hpp>
12
13#include <armnnTestUtils/WorkloadTestUtils.hpp>
14#include <armnnUtils/QuantizeHelper.hpp>
15#include <armnnTestUtils/TensorCopyUtils.hpp>
16#include <armnn/Optional.hpp>
17
18
19template<armnn::DataType ArmnnType, typename T, std::size_t NumDims>
20LayerTestResult<T, NumDims> BatchMatMulTestImpl(
21 armnn::IWorkloadFactory& workloadFactory,
22 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
23 const armnn::ITensorHandleFactory& tensorHandleFactory,
24 armnn::BatchMatMulDescriptor descriptor,
25 const std::vector<T>& inputX,
26 const std::vector<T>& inputY,
27 const std::vector<T>& outputExpected,
28 const armnn::TensorInfo& inputXInfo,
29 const armnn::TensorInfo& inputYInfo,
30 const armnn::TensorInfo& outputInfo)
31{
32 std::vector<T> outputActual(outputInfo.GetNumElements());
33
34 std::unique_ptr<armnn::ITensorHandle> inputXHandle = tensorHandleFactory.CreateTensorHandle(inputXInfo);
35 std::unique_ptr<armnn::ITensorHandle> inputYHandle = tensorHandleFactory.CreateTensorHandle(inputYInfo);
36 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
37
38 armnn::BatchMatMulQueueDescriptor queueDescriptor;
39 queueDescriptor.m_Parameters = descriptor;
40 armnn::WorkloadInfo workloadInfo;
41
42 AddInputToWorkload(queueDescriptor, workloadInfo, inputXInfo, inputXHandle.get());
43 AddInputToWorkload(queueDescriptor, workloadInfo, inputYInfo, inputYHandle.get());
44 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
45
46 auto workload = workloadFactory.CreateWorkload(armnn::LayerType::BatchMatMul, queueDescriptor, workloadInfo);
47
48 inputXHandle->Allocate();
49 inputYHandle->Allocate();
50 outputHandle->Allocate();
51
52 CopyDataToITensorHandle(inputXHandle.get(), inputX.data());
53 CopyDataToITensorHandle(inputYHandle.get(), inputY.data());
54
55 workload->PostAllocationConfigure();
56 ExecuteWorkload(*workload, memoryManager);
57
58 CopyDataFromITensorHandle(outputActual.data(), outputHandle.get());
59
60 return LayerTestResult<T, NumDims>(outputActual,
61 outputExpected,
62 outputHandle->GetShape(),
63 outputInfo.GetShape());
64}
65
66template<armnn::DataType ArmnnType, typename T>
67LayerTestResult<T, 2> BatchMatMul2DSimpleTest(
68 armnn::IWorkloadFactory& workloadFactory,
69 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
70 const armnn::ITensorHandleFactory& tensorHandleFactory)
71{
72 auto descriptor = armnn::BatchMatMulDescriptor(); // Arbitrary layout with no transpose/adjointing
73
74 float qScale = 0.0f;
75 int32_t qOffset = 0;
76
77 switch(ArmnnType)
78 {
79 case armnn::DataType::QAsymmS8:
80 case armnn::DataType::QAsymmU8:
81 case armnn::DataType::QSymmS16:
82 qScale = 1.0f;
83 break;
84 default:
85 break;
86 }
87
88 armnn::TensorInfo inputXInfo({2,2}, ArmnnType, qScale, qOffset);
89 armnn::TensorInfo inputYInfo({2,2}, ArmnnType, qScale, qOffset);
90 armnn::TensorInfo outputInfo({2,2}, ArmnnType, qScale, qOffset);
91
92 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
93 1, 2,
94 3, 4
95 }, qScale, qOffset);
96
97 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
98 5, 6,
99 7, 8
100 }, qScale, qOffset);
101
102 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
103 19, 22,
104 43, 50
105 }, qScale, qOffset);
106
107 return BatchMatMulTestImpl<ArmnnType, T, 2>(workloadFactory,
108 memoryManager,
109 tensorHandleFactory,
110 descriptor,
111 inputX,
112 inputY,
113 outputExpected,
114 inputXInfo,
115 inputYInfo,
116 outputInfo);
117}
118
119template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 2>
120BatchMatMul2DSimpleTest<armnn::DataType::BFloat16>(
121 armnn::IWorkloadFactory& workloadFactory,
122 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
123 const armnn::ITensorHandleFactory& tensorHandleFactory);
124
125template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
126BatchMatMul2DSimpleTest<armnn::DataType::Float32>(
127 armnn::IWorkloadFactory& workloadFactory,
128 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
129 const armnn::ITensorHandleFactory& tensorHandleFactory);
130
131template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 2>
132BatchMatMul2DSimpleTest<armnn::DataType::Float16>(
133 armnn::IWorkloadFactory& workloadFactory,
134 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
135 const armnn::ITensorHandleFactory& tensorHandleFactory);
136
137template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 2>
138BatchMatMul2DSimpleTest<armnn::DataType::QAsymmS8>(
139 armnn::IWorkloadFactory& workloadFactory,
140 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
141 const armnn::ITensorHandleFactory& tensorHandleFactory);
142
143template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 2>
144BatchMatMul2DSimpleTest<armnn::DataType::QAsymmU8>(
145 armnn::IWorkloadFactory& workloadFactory,
146 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
147 const armnn::ITensorHandleFactory& tensorHandleFactory);
148
149template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 2>
150BatchMatMul2DSimpleTest<armnn::DataType::QSymmS16>(
151 armnn::IWorkloadFactory& workloadFactory,
152 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
153 const armnn::ITensorHandleFactory& tensorHandleFactory);
154
155template<armnn::DataType ArmnnType, typename T>
156LayerTestResult<T, 3> BatchMatMul3DSimpleTest(
157 armnn::IWorkloadFactory& workloadFactory,
158 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
159 const armnn::ITensorHandleFactory& tensorHandleFactory)
160{
161 auto descriptor = armnn::BatchMatMulDescriptor(); // Arbitrary layout with no transpose/adjointing
162
163 float qScale = 0.0f;
164 int32_t qOffset = 0;
165
166 switch(ArmnnType)
167 {
168 case armnn::DataType::QAsymmS8:
169 case armnn::DataType::QAsymmU8:
170 case armnn::DataType::QSymmS16:
171 qScale = 1.0f;
172 break;
173 default:
174 break;
175 }
176
177 armnn::TensorInfo inputXInfo({1,2,2}, ArmnnType, qScale, qOffset);
178 armnn::TensorInfo inputYInfo({1,2,2}, ArmnnType, qScale, qOffset);
179 armnn::TensorInfo outputInfo({1,2,2}, ArmnnType, qScale, qOffset);
180
181 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
182 1, 2,
183 3, 4
184 }, qScale, qOffset);
185
186 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
187 5, 6,
188 7, 8
189 }, qScale, qOffset);
190
191 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
192 19, 22,
193 43, 50
194 },qScale, qOffset);
195
196 return BatchMatMulTestImpl<ArmnnType, T, 3>(workloadFactory,
197 memoryManager,
198 tensorHandleFactory,
199 descriptor,
200 inputX,
201 inputY,
202 outputExpected,
203 inputXInfo,
204 inputYInfo,
205 outputInfo);
206}
207
208template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 3>
209BatchMatMul3DSimpleTest<armnn::DataType::BFloat16>(
210 armnn::IWorkloadFactory& workloadFactory,
211 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
212 const armnn::ITensorHandleFactory& tensorHandleFactory);
213
214template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 3>
215BatchMatMul3DSimpleTest<armnn::DataType::Float32>(
216 armnn::IWorkloadFactory& workloadFactory,
217 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
218 const armnn::ITensorHandleFactory& tensorHandleFactory);
219
220template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 3>
221BatchMatMul3DSimpleTest<armnn::DataType::Float16>(
222 armnn::IWorkloadFactory& workloadFactory,
223 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
224 const armnn::ITensorHandleFactory& tensorHandleFactory);
225
226template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 3>
227BatchMatMul3DSimpleTest<armnn::DataType::QAsymmS8>(
228 armnn::IWorkloadFactory& workloadFactory,
229 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
230 const armnn::ITensorHandleFactory& tensorHandleFactory);
231
232template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 3>
233BatchMatMul3DSimpleTest<armnn::DataType::QAsymmU8>(
234 armnn::IWorkloadFactory& workloadFactory,
235 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
236 const armnn::ITensorHandleFactory& tensorHandleFactory);
237
238template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 3>
239BatchMatMul3DSimpleTest<armnn::DataType::QSymmS16>(
240 armnn::IWorkloadFactory& workloadFactory,
241 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
242 const armnn::ITensorHandleFactory& tensorHandleFactory);
243
244template<armnn::DataType ArmnnType, typename T>
245LayerTestResult<T, 4> BatchMatMulNCHWSimpleTest(
246 armnn::IWorkloadFactory& workloadFactory,
247 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
248 const armnn::ITensorHandleFactory& tensorHandleFactory)
249{
250 auto descriptor = armnn::BatchMatMulDescriptor(
251 armnn::Optional<armnn::DataLayout>(armnn::DataLayout::NCHW),
252 armnn::Optional<armnn::DataLayout>(armnn::DataLayout::NCHW));
253
254 float qScale = 0.0f;
255 int32_t qOffset = 0;
256
257 switch(ArmnnType)
258 {
259 case armnn::DataType::QAsymmS8:
260 case armnn::DataType::QAsymmU8:
261 case armnn::DataType::QSymmS16:
262 qScale = 1.0f;
263 break;
264 default:
265 break;
266 }
267
268 armnn::TensorInfo inputXInfo({1,1,2,2}, ArmnnType, qScale, qOffset);
269 armnn::TensorInfo inputYInfo({1,1,2,2}, ArmnnType, qScale, qOffset);
270 armnn::TensorInfo outputInfo({1,1,2,2}, ArmnnType, qScale, qOffset);
271
272 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
273 1, 2,
274 3, 4
275 }, qScale, qOffset);
276
277 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
278 5, 6,
279 7, 8
280 }, qScale, qOffset);
281
282 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
283 19, 22,
284 43, 50
285 },qScale, qOffset);
286
287 return BatchMatMulTestImpl<ArmnnType, T, 4>(workloadFactory,
288 memoryManager,
289 tensorHandleFactory,
290 descriptor,
291 inputX,
292 inputY,
293 outputExpected,
294 inputXInfo,
295 inputYInfo,
296 outputInfo);
297}
298
299template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 4>
300BatchMatMulNCHWSimpleTest<armnn::DataType::BFloat16>(
301 armnn::IWorkloadFactory& workloadFactory,
302 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
303 const armnn::ITensorHandleFactory& tensorHandleFactory);
304
305template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
306BatchMatMulNCHWSimpleTest<armnn::DataType::Float32>(
307 armnn::IWorkloadFactory& workloadFactory,
308 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
309 const armnn::ITensorHandleFactory& tensorHandleFactory);
310
311template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
312BatchMatMulNCHWSimpleTest<armnn::DataType::Float16>(
313 armnn::IWorkloadFactory& workloadFactory,
314 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
315 const armnn::ITensorHandleFactory& tensorHandleFactory);
316
317template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
318BatchMatMulNCHWSimpleTest<armnn::DataType::QAsymmS8>(
319 armnn::IWorkloadFactory& workloadFactory,
320 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
321 const armnn::ITensorHandleFactory& tensorHandleFactory);
322
323template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
324BatchMatMulNCHWSimpleTest<armnn::DataType::QAsymmU8>(
325 armnn::IWorkloadFactory& workloadFactory,
326 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
327 const armnn::ITensorHandleFactory& tensorHandleFactory);
328
329template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
330BatchMatMulNCHWSimpleTest<armnn::DataType::QSymmS16>(
331 armnn::IWorkloadFactory& workloadFactory,
332 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
333 const armnn::ITensorHandleFactory& tensorHandleFactory);
334
335template<armnn::DataType ArmnnType, typename T>
336LayerTestResult<T, 4> BatchMatMulNHWCSimpleTest(
337 armnn::IWorkloadFactory& workloadFactory,
338 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
339 const armnn::ITensorHandleFactory& tensorHandleFactory)
340{
341 auto descriptor = armnn::BatchMatMulDescriptor(
342 armnn::Optional<armnn::DataLayout>(armnn::DataLayout::NHWC),
343 armnn::Optional<armnn::DataLayout>(armnn::DataLayout::NHWC));
344
345 float qScale = 0.0f;
346 int32_t qOffset = 0;
347
348 switch(ArmnnType)
349 {
350 case armnn::DataType::QAsymmS8:
351 case armnn::DataType::QAsymmU8:
352 case armnn::DataType::QSymmS16:
353 qScale = 1.0f;
354 break;
355 default:
356 break;
357 }
358
359 armnn::TensorInfo inputXInfo({1,2,2,1}, ArmnnType, qScale, qOffset);
360 armnn::TensorInfo inputYInfo({1,2,2,1}, ArmnnType, qScale, qOffset);
361 armnn::TensorInfo outputInfo({1,2,2,1}, ArmnnType, qScale, qOffset);
362
363 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
364 1, 2,
365 3, 4
366 }, qScale, qOffset);
367
368 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
369 5, 6,
370 7, 8
371 }, qScale, qOffset);
372
373 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
374 19, 22,
375 43, 50
376 },qScale, qOffset);
377
378 return BatchMatMulTestImpl<ArmnnType, T, 4>(workloadFactory,
379 memoryManager,
380 tensorHandleFactory,
381 descriptor,
382 inputX,
383 inputY,
384 outputExpected,
385 inputXInfo,
386 inputYInfo,
387 outputInfo);
388}
389
390template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 4>
391BatchMatMulNHWCSimpleTest<armnn::DataType::BFloat16>(
392 armnn::IWorkloadFactory& workloadFactory,
393 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
394 const armnn::ITensorHandleFactory& tensorHandleFactory);
395
396template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
397BatchMatMulNHWCSimpleTest<armnn::DataType::Float32>(
398 armnn::IWorkloadFactory& workloadFactory,
399 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
400 const armnn::ITensorHandleFactory& tensorHandleFactory);
401
402template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
403BatchMatMulNHWCSimpleTest<armnn::DataType::Float16>(
404 armnn::IWorkloadFactory& workloadFactory,
405 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
406 const armnn::ITensorHandleFactory& tensorHandleFactory);
407
408template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
409BatchMatMulNHWCSimpleTest<armnn::DataType::QAsymmS8>(
410 armnn::IWorkloadFactory& workloadFactory,
411 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
412 const armnn::ITensorHandleFactory& tensorHandleFactory);
413
414template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
415BatchMatMulNHWCSimpleTest<armnn::DataType::QAsymmU8>(
416 armnn::IWorkloadFactory& workloadFactory,
417 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
418 const armnn::ITensorHandleFactory& tensorHandleFactory);
419
420template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
421BatchMatMulNHWCSimpleTest<armnn::DataType::QSymmS16>(
422 armnn::IWorkloadFactory& workloadFactory,
423 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
424 const armnn::ITensorHandleFactory& tensorHandleFactory);
425
426template<armnn::DataType ArmnnType, typename T>
427LayerTestResult<T, 3> BatchMatMul3DBatchTest(
428 armnn::IWorkloadFactory& workloadFactory,
429 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
430 const armnn::ITensorHandleFactory& tensorHandleFactory)
431{
432 auto descriptor = armnn::BatchMatMulDescriptor(); // Arbitrary layout with no transpose/adjointing
433
434 float qScale = 0.0f;
435 int32_t qOffset = 0;
436
437 switch(ArmnnType)
438 {
439 case armnn::DataType::QAsymmS8:
440 case armnn::DataType::QAsymmU8:
441 case armnn::DataType::QSymmS16:
442 qScale = 1.0f;
443 break;
444 default:
445 break;
446 }
447
448 armnn::TensorInfo inputXInfo({2,2,2}, ArmnnType, qScale, qOffset);
449 armnn::TensorInfo inputYInfo({2,2,2}, ArmnnType, qScale, qOffset);
450 armnn::TensorInfo outputInfo({2,2,2}, ArmnnType, qScale, qOffset);
451
452 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
453 1, 2,
454 3, 4,
455
456 9, 10,
457 11, 12
458 }, qScale, qOffset);
459
460 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
461 5, 6,
462 7, 8,
463
464 13, 14,
465 15, 16
466 }, qScale, qOffset);
467
468 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
469 19, 22,
470 43, 50,
471
472 267, 286,
473 323, 346
474 },qScale, qOffset);
475
476 return BatchMatMulTestImpl<ArmnnType, T, 3>(workloadFactory,
477 memoryManager,
478 tensorHandleFactory,
479 descriptor,
480 inputX,
481 inputY,
482 outputExpected,
483 inputXInfo,
484 inputYInfo,
485 outputInfo);
486}
487
488template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 3>
489BatchMatMul3DBatchTest<armnn::DataType::BFloat16>(
490 armnn::IWorkloadFactory& workloadFactory,
491 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
492 const armnn::ITensorHandleFactory& tensorHandleFactory);
493
494template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 3>
495BatchMatMul3DBatchTest<armnn::DataType::Float32>(
496 armnn::IWorkloadFactory& workloadFactory,
497 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
498 const armnn::ITensorHandleFactory& tensorHandleFactory);
499
500template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 3>
501BatchMatMul3DBatchTest<armnn::DataType::Float16>(
502 armnn::IWorkloadFactory& workloadFactory,
503 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
504 const armnn::ITensorHandleFactory& tensorHandleFactory);
505
506template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 3>
507BatchMatMul3DBatchTest<armnn::DataType::QAsymmS8>(
508 armnn::IWorkloadFactory& workloadFactory,
509 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
510 const armnn::ITensorHandleFactory& tensorHandleFactory);
511
512template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 3>
513BatchMatMul3DBatchTest<armnn::DataType::QAsymmU8>(
514 armnn::IWorkloadFactory& workloadFactory,
515 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
516 const armnn::ITensorHandleFactory& tensorHandleFactory);
517
518template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 3>
519BatchMatMul3DBatchTest<armnn::DataType::QSymmS16>(
520 armnn::IWorkloadFactory& workloadFactory,
521 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
522 const armnn::ITensorHandleFactory& tensorHandleFactory);
523
524template<armnn::DataType ArmnnType, typename T>
525LayerTestResult<T, 3> BatchMatMul3DBroadcastTest(
526 armnn::IWorkloadFactory& workloadFactory,
527 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
528 const armnn::ITensorHandleFactory& tensorHandleFactory)
529{
530 auto descriptor = armnn::BatchMatMulDescriptor(); // Arbitrary layout with no transpose/adjointing
531
532 float qScale = 0.0f;
533 int32_t qOffset = 0;
534
535 switch(ArmnnType)
536 {
537 case armnn::DataType::QAsymmS8:
538 case armnn::DataType::QAsymmU8:
539 case armnn::DataType::QSymmS16:
540 qScale = 1.0f;
541 break;
542 default:
543 break;
544 }
545
546 armnn::TensorInfo inputXInfo({2,2,2}, ArmnnType, qScale, qOffset);
547 armnn::TensorInfo inputYInfo({1,2,2}, ArmnnType, qScale, qOffset);
548 armnn::TensorInfo outputInfo({2,2,2}, ArmnnType, qScale, qOffset);
549
550 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
551 1, 2,
552 3, 4,
553
554 9, 10,
555 11, 12
556 }, qScale, qOffset);
557
558 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
559 13, 14,
560 15, 16
561 }, qScale, qOffset);
562
563 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
564 43, 46,
565 99, 106,
566
567 267, 286,
568 323, 346
569 },qScale, qOffset);
570
571 return BatchMatMulTestImpl<ArmnnType, T, 3>(workloadFactory,
572 memoryManager,
573 tensorHandleFactory,
574 descriptor,
575 inputX,
576 inputY,
577 outputExpected,
578 inputXInfo,
579 inputYInfo,
580 outputInfo);
581}
582
583template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 3>
584BatchMatMul3DBroadcastTest<armnn::DataType::BFloat16>(
585 armnn::IWorkloadFactory& workloadFactory,
586 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
587 const armnn::ITensorHandleFactory& tensorHandleFactory);
588
589template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 3>
590BatchMatMul3DBroadcastTest<armnn::DataType::Float32>(
591 armnn::IWorkloadFactory& workloadFactory,
592 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
593 const armnn::ITensorHandleFactory& tensorHandleFactory);
594
595template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 3>
596BatchMatMul3DBroadcastTest<armnn::DataType::Float16>(
597 armnn::IWorkloadFactory& workloadFactory,
598 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
599 const armnn::ITensorHandleFactory& tensorHandleFactory);
600
601template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 3>
602BatchMatMul3DBroadcastTest<armnn::DataType::QAsymmS8>(
603 armnn::IWorkloadFactory& workloadFactory,
604 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
605 const armnn::ITensorHandleFactory& tensorHandleFactory);
606
607template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 3>
608BatchMatMul3DBroadcastTest<armnn::DataType::QAsymmU8>(
609 armnn::IWorkloadFactory& workloadFactory,
610 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
611 const armnn::ITensorHandleFactory& tensorHandleFactory);
612
613template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 3>
614BatchMatMul3DBroadcastTest<armnn::DataType::QSymmS16>(
615 armnn::IWorkloadFactory& workloadFactory,
616 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
617 const armnn::ITensorHandleFactory& tensorHandleFactory);
618
619template<armnn::DataType ArmnnType, typename T>
620LayerTestResult<T, 3> BatchMatMul3D2DBroadcastTest(
621 armnn::IWorkloadFactory& workloadFactory,
622 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
623 const armnn::ITensorHandleFactory& tensorHandleFactory)
624{
625 auto descriptor = armnn::BatchMatMulDescriptor(); // Arbitrary layout with no transpose/adjointing
626
627 float qScale = 0.0f;
628 int32_t qOffset = 0;
629
630 switch(ArmnnType)
631 {
632 case armnn::DataType::QAsymmS8:
633 case armnn::DataType::QAsymmU8:
634 case armnn::DataType::QSymmS16:
635 qScale = 1.0f;
636 break;
637 default:
638 break;
639 }
640
641 armnn::TensorInfo inputXInfo({2,2,2}, ArmnnType, qScale, qOffset);
642 armnn::TensorInfo inputYInfo({2,2}, ArmnnType, qScale, qOffset);
643 armnn::TensorInfo outputInfo({2,2,2}, ArmnnType, qScale, qOffset);
644
645 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
646 1, 2,
647 3, 4,
648
649 9, 10,
650 11, 12
651 }, qScale, qOffset);
652
653 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
654 13, 14,
655 15, 16
656 }, qScale, qOffset);
657
658 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
659 43, 46,
660 99, 106,
661
662 267, 286,
663 323, 346
664 },qScale, qOffset);
665
666 return BatchMatMulTestImpl<ArmnnType, T, 3>(workloadFactory,
667 memoryManager,
668 tensorHandleFactory,
669 descriptor,
670 inputX,
671 inputY,
672 outputExpected,
673 inputXInfo,
674 inputYInfo,
675 outputInfo);
676}
677
678template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 3>
679BatchMatMul3D2DBroadcastTest<armnn::DataType::BFloat16>(
680 armnn::IWorkloadFactory& workloadFactory,
681 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
682 const armnn::ITensorHandleFactory& tensorHandleFactory);
683
684template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 3>
685BatchMatMul3D2DBroadcastTest<armnn::DataType::Float32>(
686 armnn::IWorkloadFactory& workloadFactory,
687 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
688 const armnn::ITensorHandleFactory& tensorHandleFactory);
689
690template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 3>
691BatchMatMul3D2DBroadcastTest<armnn::DataType::Float16>(
692 armnn::IWorkloadFactory& workloadFactory,
693 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
694 const armnn::ITensorHandleFactory& tensorHandleFactory);
695
696template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 3>
697BatchMatMul3D2DBroadcastTest<armnn::DataType::QAsymmS8>(
698 armnn::IWorkloadFactory& workloadFactory,
699 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
700 const armnn::ITensorHandleFactory& tensorHandleFactory);
701
702template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 3>
703BatchMatMul3D2DBroadcastTest<armnn::DataType::QAsymmU8>(
704 armnn::IWorkloadFactory& workloadFactory,
705 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
706 const armnn::ITensorHandleFactory& tensorHandleFactory);
707
708template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 3>
709BatchMatMul3D2DBroadcastTest<armnn::DataType::QSymmS16>(
710 armnn::IWorkloadFactory& workloadFactory,
711 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
712 const armnn::ITensorHandleFactory& tensorHandleFactory);
713
714template<armnn::DataType ArmnnType, typename T>
715LayerTestResult<T, 5> BatchMatMulNDHWCNHWCTest(
716 armnn::IWorkloadFactory& workloadFactory,
717 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
718 const armnn::ITensorHandleFactory& tensorHandleFactory)
719{
720 auto descriptor = armnn::BatchMatMulDescriptor(
721 armnn::Optional<armnn::DataLayout>(armnn::DataLayout::NDHWC),
722 armnn::Optional<armnn::DataLayout>(armnn::DataLayout::NHWC));
723
724 float qScale = 0.0f;
725 int32_t qOffset = 0;
726
727 switch(ArmnnType)
728 {
729 case armnn::DataType::QAsymmS8:
730 case armnn::DataType::QAsymmU8:
731 case armnn::DataType::QSymmS16:
732 qScale = 1.0f;
733 break;
734 default:
735 break;
736 }
737
738 armnn::TensorInfo inputXInfo({1,1,2,2,2}, ArmnnType, qScale, qOffset);
739 armnn::TensorInfo inputYInfo({1,2,2,2}, ArmnnType, qScale, qOffset);
740 armnn::TensorInfo outputInfo({1,1,2,2,2}, ArmnnType, qScale, qOffset);
741
742 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
743 1, 20,
744 3, 22,
745
746 2, 21,
747 4, 23
748 }, qScale, qOffset);
749
750 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
751 5, 24,
752 7, 26,
753
754 6, 25,
755 8, 27
756 }, qScale, qOffset);
757
758 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
759 23, 1030,
760 31, 1114,
761
762 34, 1079,
763 46, 1167
764 },qScale, qOffset);
765
766 return BatchMatMulTestImpl<ArmnnType, T, 5>(workloadFactory,
767 memoryManager,
768 tensorHandleFactory,
769 descriptor,
770 inputX,
771 inputY,
772 outputExpected,
773 inputXInfo,
774 inputYInfo,
775 outputInfo);
776}
777
778template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 5>
779BatchMatMulNDHWCNHWCTest<armnn::DataType::BFloat16>(
780 armnn::IWorkloadFactory& workloadFactory,
781 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
782 const armnn::ITensorHandleFactory& tensorHandleFactory);
783
784template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 5>
785BatchMatMulNDHWCNHWCTest<armnn::DataType::Float32>(
786 armnn::IWorkloadFactory& workloadFactory,
787 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
788 const armnn::ITensorHandleFactory& tensorHandleFactory);
789
790template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 5>
791BatchMatMulNDHWCNHWCTest<armnn::DataType::Float16>(
792 armnn::IWorkloadFactory& workloadFactory,
793 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
794 const armnn::ITensorHandleFactory& tensorHandleFactory);
795
796template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 5>
797BatchMatMulNDHWCNHWCTest<armnn::DataType::QAsymmS8>(
798 armnn::IWorkloadFactory& workloadFactory,
799 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
800 const armnn::ITensorHandleFactory& tensorHandleFactory);
801
802template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 5>
803BatchMatMulNDHWCNHWCTest<armnn::DataType::QAsymmU8>(
804 armnn::IWorkloadFactory& workloadFactory,
805 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
806 const armnn::ITensorHandleFactory& tensorHandleFactory);
807
808template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 5>
809BatchMatMulNDHWCNHWCTest<armnn::DataType::QSymmS16>(
810 armnn::IWorkloadFactory& workloadFactory,
811 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
812 const armnn::ITensorHandleFactory& tensorHandleFactory);
813
814template<armnn::DataType ArmnnType, typename T>
815LayerTestResult<T, 2> BatchMatMul2DTinyTest(
816 armnn::IWorkloadFactory& workloadFactory,
817 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
818 const armnn::ITensorHandleFactory& tensorHandleFactory)
819{
820 auto descriptor = armnn::BatchMatMulDescriptor(); // Arbitrary layout with no transpose/adjointing
821
822 float qScale = 0.0f;
823 int32_t qOffset = 0;
824
825 switch(ArmnnType)
826 {
827 case armnn::DataType::QAsymmS8:
828 case armnn::DataType::QAsymmU8:
829 case armnn::DataType::QSymmS16:
830 qScale = 1.0f;
831 break;
832 default:
833 break;
834 }
835
836 armnn::TensorInfo inputXInfo({1,1}, ArmnnType, qScale, qOffset);
837 armnn::TensorInfo inputYInfo({1,1}, ArmnnType, qScale, qOffset);
838 armnn::TensorInfo outputInfo({1,1}, ArmnnType, qScale, qOffset);
839
840 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
841 3
842 }, qScale, qOffset);
843
844 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
845 5
846 }, qScale, qOffset);
847
848 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
849 15
850 }, qScale, qOffset);
851
852 return BatchMatMulTestImpl<ArmnnType, T, 2>(workloadFactory,
853 memoryManager,
854 tensorHandleFactory,
855 descriptor,
856 inputX,
857 inputY,
858 outputExpected,
859 inputXInfo,
860 inputYInfo,
861 outputInfo);
862}
863
864template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 2>
865BatchMatMul2DTinyTest<armnn::DataType::BFloat16>(
866 armnn::IWorkloadFactory& workloadFactory,
867 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
868 const armnn::ITensorHandleFactory& tensorHandleFactory);
869
870template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
871BatchMatMul2DTinyTest<armnn::DataType::Float32>(
872 armnn::IWorkloadFactory& workloadFactory,
873 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
874 const armnn::ITensorHandleFactory& tensorHandleFactory);
875
876template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 2>
877BatchMatMul2DTinyTest<armnn::DataType::Float16>(
878 armnn::IWorkloadFactory& workloadFactory,
879 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
880 const armnn::ITensorHandleFactory& tensorHandleFactory);
881
882template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 2>
883BatchMatMul2DTinyTest<armnn::DataType::QAsymmS8>(
884 armnn::IWorkloadFactory& workloadFactory,
885 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
886 const armnn::ITensorHandleFactory& tensorHandleFactory);
887
888template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 2>
889BatchMatMul2DTinyTest<armnn::DataType::QAsymmU8>(
890 armnn::IWorkloadFactory& workloadFactory,
891 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
892 const armnn::ITensorHandleFactory& tensorHandleFactory);
893
894template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 2>
895BatchMatMul2DTinyTest<armnn::DataType::QSymmS16>(
896 armnn::IWorkloadFactory& workloadFactory,
897 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
898 const armnn::ITensorHandleFactory& tensorHandleFactory);
899
900template<armnn::DataType ArmnnType, typename T>
901LayerTestResult<T, 3> BatchMatMul3DNonSquareTest(
902 armnn::IWorkloadFactory& workloadFactory,
903 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
904 const armnn::ITensorHandleFactory& tensorHandleFactory)
905{
906 auto descriptor = armnn::BatchMatMulDescriptor(); // Arbitrary layout with no transpose/adjointing
907
908 float qScale = 0.0f;
909 int32_t qOffset = 0;
910
911 switch(ArmnnType)
912 {
913 case armnn::DataType::QAsymmS8:
914 case armnn::DataType::QAsymmU8:
915 case armnn::DataType::QSymmS16:
916 qScale = 1.0f;
917 break;
918 default:
919 break;
920 }
921
922 armnn::TensorInfo inputXInfo({2,5,3}, ArmnnType, qScale, qOffset);
923 armnn::TensorInfo inputYInfo({2,3,4}, ArmnnType, qScale, qOffset);
924 armnn::TensorInfo outputInfo({2,5,4}, ArmnnType, qScale, qOffset);
925
926 std::vector<T> inputX = armnnUtils::QuantizedVector<T>({
927 8, 8, 4,
928 6, 1, 3,
929 8, 8, 3,
930 8, 9, 8,
931 5, 4, 4,
932
933 1, 8, 5,
934 7, 1, 1,
935 8, 7, 9,
936 3, 2, 7,
937 8, 5, 3
938 }, qScale, qOffset);
939
940 std::vector<T> inputY = armnnUtils::QuantizedVector<T>({
941 6, 2, 3, 2,
942 6, 2, 2, 8,
943 3, 7, 8, 1,
944
945 7, 2, 9, 5,
946 2, 3, 1, 3,
947 2, 7, 7, 5
948 }, qScale, qOffset);
949
950 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
951 108, 60, 72, 84,
952 51, 35, 44, 23,
953 105, 53, 64, 83,
954 126, 90, 106, 96,
955 66, 46, 55, 46,
956
957 33, 61, 52, 54,
958 53, 24, 71, 43,
959 88, 100, 142, 106,
960 39, 61, 78, 56,
961 72, 52, 98, 70
962 },qScale, qOffset);
963
964 return BatchMatMulTestImpl<ArmnnType, T, 3>(workloadFactory,
965 memoryManager,
966 tensorHandleFactory,
967 descriptor,
968 inputX,
969 inputY,
970 outputExpected,
971 inputXInfo,
972 inputYInfo,
973 outputInfo);
974}
975
976template LayerTestResult<armnn::ResolveType<armnn::DataType::BFloat16>, 3>
977BatchMatMul3DNonSquareTest<armnn::DataType::BFloat16>(
978 armnn::IWorkloadFactory& workloadFactory,
979 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
980 const armnn::ITensorHandleFactory& tensorHandleFactory);
981
982template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 3>
983BatchMatMul3DNonSquareTest<armnn::DataType::Float32>(
984 armnn::IWorkloadFactory& workloadFactory,
985 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
986 const armnn::ITensorHandleFactory& tensorHandleFactory);
987
988template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 3>
989BatchMatMul3DNonSquareTest<armnn::DataType::Float16>(
990 armnn::IWorkloadFactory& workloadFactory,
991 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
992 const armnn::ITensorHandleFactory& tensorHandleFactory);
993
994template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 3>
995BatchMatMul3DNonSquareTest<armnn::DataType::QAsymmS8>(
996 armnn::IWorkloadFactory& workloadFactory,
997 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
998 const armnn::ITensorHandleFactory& tensorHandleFactory);
999
1000template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 3>
1001BatchMatMul3DNonSquareTest<armnn::DataType::QAsymmU8>(
1002 armnn::IWorkloadFactory& workloadFactory,
1003 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1004 const armnn::ITensorHandleFactory& tensorHandleFactory);
1005
1006template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 3>
1007BatchMatMul3DNonSquareTest<armnn::DataType::QSymmS16>(
1008 armnn::IWorkloadFactory& workloadFactory,
1009 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1010 const armnn::ITensorHandleFactory& tensorHandleFactory);