From dc8ed9d75e54e914a970e137900930fa64a0782b Mon Sep 17 00:00:00 2001 From: Samuel Yap Date: Mon, 8 Aug 2022 14:07:42 +0100 Subject: IVGCVSW-7105: BatchMatMul Optional Parameter Support * Added transpose parameters to pre-transpose each input tensor's slices * Added adjoint parameters to pre-adjoint each input tensor's slices * Small refactoring (BatchMatMulDescriptor static helpers and BatchMatMulImpl constructor) * Updated input validation and output shape inference for parameters * Additional layer unit tests for parameters added * Versionings incremented Signed-off-by: Samuel Yap Change-Id: Ibe5242a8a5bf604c13de0dc65844fd6c421cc667 --- .../test/layerTests/BatchMatMulTestImpl.cpp | 364 ++++++++++++++++++++- .../test/layerTests/BatchMatMulTestImpl.hpp | 18 + 2 files changed, 365 insertions(+), 17 deletions(-) (limited to 'src/backends/backendsCommon/test/layerTests') diff --git a/src/backends/backendsCommon/test/layerTests/BatchMatMulTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/BatchMatMulTestImpl.cpp index 41add6e6da..6fcc35ab52 100644 --- a/src/backends/backendsCommon/test/layerTests/BatchMatMulTestImpl.cpp +++ b/src/backends/backendsCommon/test/layerTests/BatchMatMulTestImpl.cpp @@ -191,7 +191,7 @@ LayerTestResult BatchMatMul3DSimpleTest( std::vector outputExpected = armnnUtils::QuantizedVector({ 19, 22, 43, 50 - },qScale, qOffset); + }, qScale, qOffset); return BatchMatMulTestImpl(workloadFactory, memoryManager, @@ -247,9 +247,7 @@ LayerTestResult BatchMatMulNCHWSimpleTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - auto descriptor = armnn::BatchMatMulDescriptor( - armnn::Optional(armnn::DataLayout::NCHW), - armnn::Optional(armnn::DataLayout::NCHW)); + auto descriptor = armnn::BatchMatMulDescriptor(); // Default arbitrary layout is treated the same as NCHW float qScale = 0.0f; int32_t qOffset = 0; @@ -282,7 +280,7 @@ LayerTestResult BatchMatMulNCHWSimpleTest( std::vector outputExpected = armnnUtils::QuantizedVector({ 19, 22, 43, 50 - },qScale, qOffset); + }, qScale, qOffset); return BatchMatMulTestImpl(workloadFactory, memoryManager, @@ -338,9 +336,12 @@ LayerTestResult BatchMatMulNHWCSimpleTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - auto descriptor = armnn::BatchMatMulDescriptor( - armnn::Optional(armnn::DataLayout::NHWC), - armnn::Optional(armnn::DataLayout::NHWC)); + auto descriptor = armnn::BatchMatMulDescriptor(false, + false, + false, + false, + armnn::DataLayout::NHWC, + armnn::DataLayout::NHWC); float qScale = 0.0f; int32_t qOffset = 0; @@ -373,7 +374,7 @@ LayerTestResult BatchMatMulNHWCSimpleTest( std::vector outputExpected = armnnUtils::QuantizedVector({ 19, 22, 43, 50 - },qScale, qOffset); + }, qScale, qOffset); return BatchMatMulTestImpl(workloadFactory, memoryManager, @@ -471,7 +472,7 @@ LayerTestResult BatchMatMul3DBatchTest( 267, 286, 323, 346 - },qScale, qOffset); + }, qScale, qOffset); return BatchMatMulTestImpl(workloadFactory, memoryManager, @@ -566,7 +567,7 @@ LayerTestResult BatchMatMul3DBroadcastTest( 267, 286, 323, 346 - },qScale, qOffset); + }, qScale, qOffset); return BatchMatMulTestImpl(workloadFactory, memoryManager, @@ -661,7 +662,7 @@ LayerTestResult BatchMatMul3D2DBroadcastTest( 267, 286, 323, 346 - },qScale, qOffset); + }, qScale, qOffset); return BatchMatMulTestImpl(workloadFactory, memoryManager, @@ -717,9 +718,12 @@ LayerTestResult BatchMatMulNDHWCNHWCTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory) { - auto descriptor = armnn::BatchMatMulDescriptor( - armnn::Optional(armnn::DataLayout::NDHWC), - armnn::Optional(armnn::DataLayout::NHWC)); + auto descriptor = armnn::BatchMatMulDescriptor(false, + false, + false, + false, + armnn::DataLayout::NDHWC, + armnn::DataLayout::NHWC); float qScale = 0.0f; int32_t qOffset = 0; @@ -761,7 +765,7 @@ LayerTestResult BatchMatMulNDHWCNHWCTest( 34, 1079, 46, 1167 - },qScale, qOffset); + }, qScale, qOffset); return BatchMatMulTestImpl(workloadFactory, memoryManager, @@ -959,7 +963,7 @@ LayerTestResult BatchMatMul3DNonSquareTest( 88, 100, 142, 106, 39, 61, 78, 56, 72, 52, 98, 70 - },qScale, qOffset); + }, qScale, qOffset); return BatchMatMulTestImpl(workloadFactory, memoryManager, @@ -1005,6 +1009,332 @@ BatchMatMul3DNonSquareTest( template LayerTestResult, 3> BatchMatMul3DNonSquareTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template +LayerTestResult BatchMatMul2DTranspSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + auto descriptor = armnn::BatchMatMulDescriptor(true, + false, + false, + false); + + float qScale = 0.0f; + int32_t qOffset = 0; + + switch(ArmnnType) + { + case armnn::DataType::QAsymmS8: + case armnn::DataType::QAsymmU8: + case armnn::DataType::QSymmS16: + qScale = 1.0f; + break; + default: + break; + } + + armnn::TensorInfo inputXInfo({2,3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo inputYInfo({2,3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3,3}, ArmnnType, qScale, qOffset); + + std::vector inputX = armnnUtils::QuantizedVector({ + 1, 2, 3, + 4, 5, 6 + }, qScale, qOffset); + + std::vector inputY = armnnUtils::QuantizedVector({ + 7, 8, 9, + 10, 11, 12 + }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ + 47, 52, 57, + 64, 71, 78, + 81, 90, 99 + }, qScale, qOffset); + + return BatchMatMulTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + descriptor, + inputX, + inputY, + outputExpected, + inputXInfo, + inputYInfo, + outputInfo); +} + +template LayerTestResult, 2> +BatchMatMul2DTranspSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DTranspSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DTranspSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DTranspSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DTranspSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DTranspSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template +LayerTestResult BatchMatMul2DAdjointSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + auto descriptor = armnn::BatchMatMulDescriptor(false, + false, + true, + false); + + float qScale = 0.0f; + int32_t qOffset = 0; + + switch(ArmnnType) + { + case armnn::DataType::QAsymmS8: + case armnn::DataType::QAsymmU8: + case armnn::DataType::QSymmS16: + qScale = 1.0f; + break; + default: + break; + } + + armnn::TensorInfo inputXInfo({3,3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo inputYInfo({3,3}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({3,3}, ArmnnType, qScale, qOffset); + + std::vector inputX = armnnUtils::QuantizedVector({ + 3, 1, 1, + 1, 3, -1, + 2, 4, 1 + }, qScale, qOffset); + + std::vector inputY = armnnUtils::QuantizedVector({ + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ + 7, 3, -4, + -3, 1, 4, + -2, -10, 8 + }, qScale, qOffset); + + switch (ArmnnType) + { + case armnn::DataType::QAsymmU8: + outputExpected = armnnUtils::QuantizedVector({ + 3, 3, 0, + 0, 1, 1, + 0, 0, 8 + }, qScale, qOffset); + break; + default: + break; + } + + return BatchMatMulTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + descriptor, + inputX, + inputY, + outputExpected, + inputXInfo, + inputYInfo, + outputInfo); +} + +template LayerTestResult, 2> +BatchMatMul2DAdjointSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DAdjointSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DAdjointSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DAdjointSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DAdjointSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 2> +BatchMatMul2DAdjointSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template +LayerTestResult BatchMatMulNHWCParamsTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + auto descriptor = armnn::BatchMatMulDescriptor(false, + true, + true, + false, + armnn::DataLayout::NHWC, + armnn::DataLayout::NHWC); + + float qScale = 0.0f; + int32_t qOffset = 0; + + switch(ArmnnType) + { + case armnn::DataType::QAsymmS8: + case armnn::DataType::QAsymmU8: + case armnn::DataType::QSymmS16: + qScale = 1.0f; + break; + default: + break; + } + + armnn::TensorInfo inputXInfo({1,4,4,2}, ArmnnType, qScale, qOffset); + armnn::TensorInfo inputYInfo({2,2,4,1}, ArmnnType, qScale, qOffset); + armnn::TensorInfo outputInfo({2,4,2,2}, ArmnnType, qScale, qOffset); + + std::vector inputX = armnnUtils::QuantizedVector({ + 1, -3, 1, 4, 4, 9, 1, 2, + 2, 4, 2, 2, 10, 7, 6, -5, + 3, 8, 9, 9, 21, 1, 17, 7, + 5, 11, 11, 8, 29, 3, 23, 6 + }, qScale, qOffset); + + std::vector inputY = armnnUtils::QuantizedVector({ + 1, 2, 3, 4, + 5, 6, 7, 8, + + 9, 10, 11, 12, + 13, 14, 15, 16 + }, qScale, qOffset); + + std::vector outputExpected = armnnUtils::QuantizedVector({ + 28, 625, 140, 585, + 8, 110, -8, 1662, + -24, 401, -120, 921, + 12, 131, 108, -501, + + 252, 545, 364, 505, + -24, 3214, -40, 4766, + -216, 1441, -312, 1961, + 204, -1133, 300, -1765 + }, qScale, qOffset); + + switch (ArmnnType) + { + case armnn::DataType::QAsymmU8: + outputExpected = armnnUtils::QuantizedVector({ + 28, 80, 140, 80, + 8, 45, 0, 255, + 0, 18, 0, 18, + 12, 0, 108, 0, + + 252, 80, 255, 80, + 0, 255, 0, 255, + 0, 18, 0, 18, + 204, 0, 255, 0 + }, qScale, qOffset); + break; + default: + break; + } + + return BatchMatMulTestImpl(workloadFactory, + memoryManager, + tensorHandleFactory, + descriptor, + inputX, + inputY, + outputExpected, + inputXInfo, + inputYInfo, + outputInfo); +} + +template LayerTestResult, 4> +BatchMatMulNHWCParamsTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 4> +BatchMatMulNHWCParamsTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 4> +BatchMatMulNHWCParamsTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 4> +BatchMatMulNHWCParamsTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 4> +BatchMatMulNHWCParamsTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template LayerTestResult, 4> +BatchMatMulNHWCParamsTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory); \ No newline at end of file diff --git a/src/backends/backendsCommon/test/layerTests/BatchMatMulTestImpl.hpp b/src/backends/backendsCommon/test/layerTests/BatchMatMulTestImpl.hpp index 9e2139667b..0b261fba37 100644 --- a/src/backends/backendsCommon/test/layerTests/BatchMatMulTestImpl.hpp +++ b/src/backends/backendsCommon/test/layerTests/BatchMatMulTestImpl.hpp @@ -80,6 +80,24 @@ LayerTestResult BatchMatMul2DTinyTest( template> LayerTestResult BatchMatMul3DNonSquareTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult BatchMatMul2DTranspSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult BatchMatMul2DAdjointSimpleTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); + +template> +LayerTestResult BatchMatMulNHWCParamsTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory); \ No newline at end of file -- cgit v1.2.1