// // Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "BatchMatMulTestHelper.hpp" #include #include #include #include namespace armnnDelegate { void BatchMatMul2DFp32SimpleTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 2, 2 }; std::vector RHSInputShape { 2, 2 }; std::vector outputShape { 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul2DInt8SimpleTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 2, 2 }; std::vector RHSInputShape { 2, 2 }; std::vector outputShape { 2, 2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul3DFp32SimpleTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 1,2,2 }; std::vector RHSInputShape { 1,2,2 }; std::vector outputShape { 1,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul3DInt8SimpleTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 1,2,2 }; std::vector RHSInputShape { 1,2,2 }; std::vector outputShape { 1,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul4DFp32SimpleTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 1,1,2,2 }; std::vector RHSInputShape { 1,1,2,2 }; std::vector outputShape { 1,1,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul4DInt8SimpleTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 1,1,2,2}; std::vector RHSInputShape { 1,1,2,2 }; std::vector outputShape { 1,1,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4 }; std::vector RHSInputValues = { 5, 6, 7, 8 }; std::vector expectedOutputValues = { 19, 22, 43, 50 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul3DFp32BatchTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 2,2,2 }; std::vector RHSInputShape { 2,2,2 }; std::vector outputShape { 2,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 5, 6, 7, 8, 13, 14, 15, 16 }; std::vector expectedOutputValues = { 19, 22, 43, 50, 267, 286, 323, 346 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul3DInt8BatchTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 2,2,2 }; std::vector RHSInputShape { 2,2,2 }; std::vector outputShape { 2,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 5, 6, 7, 8, 1, 2, 3, 4 }; std::vector expectedOutputValues = { 19, 22, 43, 50, 39, 58, 47, 70 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul3DFp32BroadcastTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 2,2,2 }; std::vector RHSInputShape { 2,2 }; std::vector outputShape { 2,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 13, 14, 15, 16 }; std::vector expectedOutputValues = { 43, 46, 99, 106, 267, 286, 323, 346 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul3DInt8BroadcastTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 2,2,2 }; std::vector RHSInputShape { 1,2,2 }; std::vector outputShape { 2,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 1, 2, 3, 4 }; std::vector expectedOutputValues = { 7, 10, 15, 22, 39, 58, 47, 70 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul3D2DFp32BroadcastTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 2,2,2 }; std::vector RHSInputShape { 2,2 }; std::vector outputShape { 2,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 13, 14, 15, 16 }; std::vector expectedOutputValues = { 43, 46, 99, 106, 267, 286, 323, 346 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul3D2DInt8BroadcastTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 2,2,2 }; std::vector RHSInputShape { 2,2 }; std::vector outputShape { 2,2,2 }; std::vector LHSInputValues = { 1, 2, 3, 4, 9, 10, 11, 12 }; std::vector RHSInputValues = { 1, 2, 3, 4 }; std::vector expectedOutputValues = { 7, 10, 15, 22, 39, 58, 47, 70 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul2DFp32TinyTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 1,1 }; std::vector RHSInputShape { 1,1 }; std::vector outputShape { 1,1 }; std::vector LHSInputValues = { 3 }; std::vector RHSInputValues = { 5 }; std::vector expectedOutputValues = { 15 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul2DInt8TinyTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 1,1 }; std::vector RHSInputShape { 1,1 }; std::vector outputShape { 1,1 }; std::vector LHSInputValues = { 3 }; std::vector RHSInputValues = { 5 }; std::vector expectedOutputValues = { 15 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMulNonSquareFp32Test(std::vector& backends) { // Set input data std::vector LHSInputShape { 2,5,3 }; std::vector RHSInputShape { 2,3,4 }; std::vector outputShape { 2,5,4 }; std::vector LHSInputValues = { 8, 8, 4, 6, 1, 3, 8, 8, 3, 8, 9, 8, 5, 4, 4, 1, 8, 5, 7, 1, 1, 8, 7, 9, 3, 2, 7, 8, 5, 3 }; std::vector RHSInputValues = { 6, 2, 3, 2, 6, 2, 2, 8, 3, 7, 8, 1, 7, 2, 9, 5, 2, 3, 1, 3, 2, 7, 7, 5 }; std::vector expectedOutputValues = { 108, 60, 72, 84, 51, 35, 44, 23, 105, 53, 64, 83, 126, 90, 106, 96, 66, 46, 55, 46, 33, 61, 52, 54, 53, 24, 71, 43, 88, 100, 142, 106, 39, 61, 78, 56, 72, 52, 98, 70 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMulNonSquareInt8Test(std::vector& backends) { // Set input data std::vector LHSInputShape { 2,5,3 }; std::vector RHSInputShape { 2,3,4 }; std::vector outputShape { 2,5,4 }; std::vector LHSInputValues = { 8, 8, 4, 6, 1, 3, 8, 8, 3, 8, 9, 8, 5, 4, 4, 1, 8, 5, 7, 1, 1, 8, 7, 9, 3, 2, 7, 8, 5, 3 }; std::vector RHSInputValues = { 6, 2, 3, 2, 6, 2, 2, 8, 3, 7, 8, 1, 7, 2, 3, 5, 2, 3, 1, 3, 2, 7, 7, 5 }; std::vector expectedOutputValues = { 108, 60, 72, 84, 51, 35, 44, 23, 105, 53, 64, 83, 126, 90, 106, 96, 66, 46, 55, 46, 33, 61, 46, 54, 53, 24, 29, 43, 88, 100, 94, 106, 39, 61, 60, 56, 72, 52, 50, 70 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, false, false); } void BatchMatMul2DFp32SimpleAdjointTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 3,3 }; std::vector RHSInputShape { 3,3 }; std::vector outputShape { 3,3 }; std::vector LHSInputValues = { 3, 1, 1, 1, 3, -1, 2, 4, 1 }; std::vector RHSInputValues = { 1, 0, 0, 0, 1, 0, 0, 0, 1 }; std::vector expectedOutputValues = { 3, 1, 2, 1, 3, 4, 1, -1, 1 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_FLOAT32, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, true, false); } void BatchMatMul2DInt8SimpleAdjointTest(std::vector& backends) { // Set input data std::vector LHSInputShape { 3,3 }; std::vector RHSInputShape { 3,3 }; std::vector outputShape { 3,3 }; std::vector LHSInputValues = { 3, 1, 1, 1, 3, -1, 2, 4, 1 }; std::vector RHSInputValues = { 1, 0, 0, 0, 1, 0, 0, 0, 1 }; std::vector expectedOutputValues = { 3, 1, 2, 1, 3, 4, 1, -1, 1 }; BatchMatMulTest(tflite::BuiltinOperator_BATCH_MATMUL, ::tflite::TensorType_INT8, backends, LHSInputShape, RHSInputShape, outputShape, LHSInputValues, RHSInputValues, expectedOutputValues, true, false); } TEST_SUITE("BATCH_MATMUL_CpuRefTests") { TEST_CASE("BATCH_MATMUL_Fp32_CpuRefTests") { std::vector backends = {armnn::Compute::CpuRef}; BatchMatMul2DFp32SimpleTest (backends); BatchMatMul3DFp32SimpleTest (backends); BatchMatMul4DFp32SimpleTest (backends); BatchMatMul3DFp32BatchTest (backends); BatchMatMul3DFp32BroadcastTest (backends); BatchMatMul3D2DFp32BroadcastTest (backends); BatchMatMul2DFp32TinyTest (backends); BatchMatMulNonSquareFp32Test (backends); BatchMatMul2DFp32SimpleAdjointTest(backends); } TEST_CASE("BATCH_MATMUL_Int8_CpuRefTests") { std::vector backends = {armnn::Compute::CpuRef}; BatchMatMul2DInt8SimpleTest (backends); BatchMatMul3DInt8SimpleTest (backends); BatchMatMul4DInt8SimpleTest (backends); BatchMatMul3DInt8BatchTest (backends); BatchMatMul3DInt8BroadcastTest (backends); BatchMatMul3D2DInt8BroadcastTest (backends); BatchMatMul2DInt8TinyTest (backends); BatchMatMulNonSquareInt8Test (backends); BatchMatMul2DInt8SimpleAdjointTest(backends); } } TEST_SUITE("BATCH_MATMUL_CpuAccTests") { TEST_CASE("BATCH_MATMUL_Fp32_CpuAccTests") { std::vector backends = {armnn::Compute::CpuAcc}; BatchMatMul2DFp32SimpleTest (backends); BatchMatMul3DFp32SimpleTest (backends); BatchMatMul4DFp32SimpleTest (backends); BatchMatMul3DFp32BatchTest (backends); BatchMatMul2DFp32TinyTest (backends); BatchMatMulNonSquareFp32Test (backends); BatchMatMul2DFp32SimpleAdjointTest(backends); } TEST_CASE("BATCH_MATMUL_Int8_CpuAccTests") { std::vector backends = {armnn::Compute::CpuAcc}; BatchMatMul2DInt8SimpleTest (backends); BatchMatMul3DInt8SimpleTest (backends); BatchMatMul4DInt8SimpleTest (backends); BatchMatMul3DInt8BatchTest (backends); BatchMatMul2DInt8TinyTest (backends); BatchMatMulNonSquareInt8Test (backends); BatchMatMul2DInt8SimpleAdjointTest(backends); } } TEST_SUITE("BATCH_MATMUL_GpuAccTests") { TEST_CASE("BATCH_MATMUL_Fp32_GpuAccTests") { std::vector backends = {armnn::Compute::GpuAcc}; BatchMatMul2DFp32SimpleTest (backends); BatchMatMul3DFp32SimpleTest (backends); BatchMatMul4DFp32SimpleTest (backends); BatchMatMul3DFp32BatchTest (backends); BatchMatMul3DFp32BroadcastTest (backends); BatchMatMul3D2DFp32BroadcastTest (backends); BatchMatMul2DFp32TinyTest (backends); BatchMatMulNonSquareFp32Test (backends); BatchMatMul2DFp32SimpleAdjointTest(backends); } } }