From c6138d8a8af334fad5230d73e456f303f9665bae Mon Sep 17 00:00:00 2001 From: Ferran Balaguer Date: Thu, 13 Jun 2019 17:23:50 +0100 Subject: IVGCVSW-3275 Add Uint8 support for L2Normalization Signed-off-by: Ferran Balaguer Change-Id: I7f2bcf0596a4f654166aad9657bc7084f55e7451 --- src/backends/backendsCommon/test/LayerTests.cpp | 105 +++++++++++++++------ src/backends/backendsCommon/test/LayerTests.hpp | 20 ++++ src/backends/reference/RefLayerSupport.cpp | 3 +- src/backends/reference/RefWorkloadFactory.cpp | 2 +- .../reference/test/RefCreateWorkloadTests.cpp | 10 ++ src/backends/reference/test/RefLayerTests.cpp | 12 +++ 6 files changed, 122 insertions(+), 30 deletions(-) diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index 3216ac68ef..9d40197776 100644 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -5287,15 +5287,17 @@ template> LayerTestResult L2NormalizationTestImpl( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - float qScale, - int32_t qOffset, const armnn::TensorShape& inputOutputTensorShape, + float scale, + int32_t offset, const std::vector& inputValues, + float outScale, + int32_t outOffset, const std::vector& expectedOutputValues, const armnn::DataLayout layout) { - const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, ArmnnType, qScale, qOffset); - const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, ArmnnType, qScale, qOffset); + const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, ArmnnType, scale, offset); + const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, ArmnnType, outScale, outOffset); // at this point if we require it permute the input data const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 }; @@ -5799,8 +5801,10 @@ template> LayerTestResult L2Normalization1dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - float qScale, - int32_t qOffset, + float scale, + int32_t offset, + float outScale, + int32_t outOffset, const armnn::DataLayout layout) { // Width: 1 @@ -5864,8 +5868,8 @@ LayerTestResult L2Normalization1dTestCommon( }; - return L2NormalizationTestImpl(workloadFactory, memoryManager, qScale, qOffset, inputOutputShape, - inputValues, expectedOutputValues, layout); + return L2NormalizationTestImpl(workloadFactory, memoryManager, inputOutputShape, scale, offset, + inputValues, outScale, outOffset, expectedOutputValues, layout); } @@ -5874,7 +5878,7 @@ LayerTestResult L2Normalization1dTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout) { - return L2Normalization1dTestCommon(workloadFactory, memoryManager, 0.f, 0, layout); + return L2Normalization1dTestCommon(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,layout); } LayerTestResult L2Normalization1dInt16Test( @@ -5882,16 +5886,27 @@ LayerTestResult L2Normalization1dInt16Test( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout) { - return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, + return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, 1.f, 0, layout); } +LayerTestResult L2Normalization1dUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout) +{ + return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, + 1.f/128, 128, layout); +} + template> LayerTestResult L2Normalization2dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - float qScale, - int32_t qOffset, + float scale, + int32_t offset, + float outScale, + int32_t outOffset, const armnn::DataLayout layout) { // Width: 5 @@ -5930,8 +5945,8 @@ LayerTestResult L2Normalization2dTestCommon( 10.0f * CalcInvL2Norm({ 9.0f, 10.0f }) }; - return L2NormalizationTestImpl(workloadFactory, memoryManager, qScale, qOffset, inputOutputShape, - inputValues, expectedOutputValues, layout); + return L2NormalizationTestImpl(workloadFactory, memoryManager, inputOutputShape, scale, offset, + inputValues, outScale, outOffset, expectedOutputValues, layout); } LayerTestResult L2Normalization2dTest( @@ -5939,7 +5954,8 @@ LayerTestResult L2Normalization2dTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout) { - return L2Normalization2dTestCommon(workloadFactory, memoryManager, 0.f, 0, layout); + return L2Normalization2dTestCommon(workloadFactory, memoryManager, 0.f, 0, 0.f, 0, + layout); } LayerTestResult L2Normalization2dInt16Test( @@ -5947,16 +5963,27 @@ LayerTestResult L2Normalization2dInt16Test( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout) { - return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, + return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, 1.f, 0, layout); } +LayerTestResult L2Normalization2dUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout) +{ + return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, + 1.f/128, 128, layout); +} + template> LayerTestResult L2Normalization3dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - float qScale, - int32_t qOffset, + float scale, + int32_t offset, + float outScale, + int32_t outOffset, const armnn::DataLayout layout) { // Width: 3 @@ -6015,8 +6042,8 @@ LayerTestResult L2Normalization3dTestCommon( 161.0f * CalcInvL2Norm({ 220.0f, 161.0f }) }; - return L2NormalizationTestImpl(workloadFactory, memoryManager, qScale, qOffset, inputOutputShape, - inputValues, expectedOutputValues, layout); + return L2NormalizationTestImpl(workloadFactory, memoryManager, inputOutputShape, scale, offset, + inputValues, outScale, outOffset, expectedOutputValues, layout); } LayerTestResult L2Normalization3dTest( @@ -6024,7 +6051,8 @@ LayerTestResult L2Normalization3dTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout) { - return L2Normalization3dTestCommon(workloadFactory, memoryManager, 0.f, 0, layout); + return L2Normalization3dTestCommon(workloadFactory, memoryManager, 0.f, 0, 0.f, 0, + layout); } LayerTestResult L2Normalization3dInt16Test( @@ -6032,16 +6060,27 @@ LayerTestResult L2Normalization3dInt16Test( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout) { - return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, + return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, 1.f, 0, layout); } +LayerTestResult L2Normalization3dUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout) +{ + return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, + 1.f/128, 128, layout); +} + template> LayerTestResult L2Normalization4dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, - float qScale, - int32_t qOffset, + float scale, + int32_t offset, + float outScale, + int32_t outOffset, const armnn::DataLayout layout) { // Width: 3 @@ -6180,8 +6219,8 @@ LayerTestResult L2Normalization4dTestCommon( 88.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f }) }; - return L2NormalizationTestImpl(workloadFactory, memoryManager, qScale, qOffset, inputOutputShape, - inputValues, expectedOutputValues, layout); + return L2NormalizationTestImpl(workloadFactory, memoryManager, inputOutputShape, scale, offset, + inputValues, outScale, outOffset, expectedOutputValues, layout); } LayerTestResult L2Normalization4dTest( @@ -6189,7 +6228,8 @@ LayerTestResult L2Normalization4dTest( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout) { - return L2Normalization4dTestCommon(workloadFactory, memoryManager, 0.f, 0, layout); + return L2Normalization4dTestCommon(workloadFactory, memoryManager, 0.f, 0, 0.f, 0, + layout); } LayerTestResult L2Normalization4dInt16Test( @@ -6197,10 +6237,19 @@ LayerTestResult L2Normalization4dInt16Test( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout) { - return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, + return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, 1.f, 0, layout); } +LayerTestResult L2Normalization4dUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout) +{ + return L2Normalization1dTestCommon(workloadFactory, memoryManager, 1.f, 0, + 1.f/128, 128, layout); +} + template> LayerTestResult ConstantTestImpl( armnn::IWorkloadFactory& workloadFactory, diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 853a612b78..3eed189c1b 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -932,6 +932,11 @@ LayerTestResult L2Normalization1dInt16Test( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout); +LayerTestResult L2Normalization1dUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout); + LayerTestResult L2Normalization2dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, @@ -942,6 +947,11 @@ LayerTestResult L2Normalization2dInt16Test( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout); +LayerTestResult L2Normalization2dUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout); + LayerTestResult L2Normalization3dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, @@ -952,6 +962,11 @@ LayerTestResult L2Normalization3dInt16Test( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout); +LayerTestResult L2Normalization3dUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout); + LayerTestResult L2Normalization4dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, @@ -962,6 +977,11 @@ LayerTestResult L2Normalization4dInt16Test( const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::DataLayout layout); +LayerTestResult L2Normalization4dUint8Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::DataLayout layout); + LayerTestResult ConstantTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index e42e4242e0..d8c942cd96 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -745,9 +745,10 @@ bool RefLayerSupport::IsL2NormalizationSupported(const TensorInfo& input, { ignore_unused(descriptor); // Define supported types - std::array supportedTypes = + std::array supportedTypes = { DataType::Float32, + DataType::QuantisedAsymm8, DataType::QuantisedSymm16 }; diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 72762a48e6..a2d864046d 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -255,7 +255,7 @@ std::unique_ptr RefWorkloadFactory::CreateFakeQuantization( std::unique_ptr RefWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const { - if (IsFloat16(info) || IsUint8(info)) + if (IsFloat16(info)) { return MakeWorkload(descriptor, info); } diff --git a/src/backends/reference/test/RefCreateWorkloadTests.cpp b/src/backends/reference/test/RefCreateWorkloadTests.cpp index 3de47d20e4..8d15530c1e 100644 --- a/src/backends/reference/test/RefCreateWorkloadTests.cpp +++ b/src/backends/reference/test/RefCreateWorkloadTests.cpp @@ -730,6 +730,16 @@ BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16Nhwc) RefCreateL2NormalizationTest(DataLayout::NHWC); } +BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8) +{ + RefCreateL2NormalizationTest(DataLayout::NCHW); +} + +BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8Nhwc) +{ + RefCreateL2NormalizationTest(DataLayout::NHWC); +} + template static void RefCreateReshapeWorkloadTest() { diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 30520cbf2e..5bab6bb605 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -472,20 +472,32 @@ ARMNN_AUTO_TEST_CASE(L2Normalization1d, L2Normalization1dTest, armnn::DataLayout ARMNN_AUTO_TEST_CASE(L2Normalization2d, L2Normalization2dTest, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(L2Normalization3d, L2Normalization3dTest, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(L2Normalization4d, L2Normalization4dTest, armnn::DataLayout::NCHW) + ARMNN_AUTO_TEST_CASE(L2Normalization1dInt16, L2Normalization1dInt16Test, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(L2Normalization2dInt16, L2Normalization2dInt16Test, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(L2Normalization3dInt16, L2Normalization3dInt16Test, armnn::DataLayout::NCHW) ARMNN_AUTO_TEST_CASE(L2Normalization4dInt16, L2Normalization4dInt16Test, armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(L2Normalization1dUint8, L2Normalization1dUint8Test, armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(L2Normalization2dUint8, L2Normalization2dUint8Test, armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(L2Normalization3dUint8, L2Normalization3dUint8Test, armnn::DataLayout::NCHW) +ARMNN_AUTO_TEST_CASE(L2Normalization4dUint8, L2Normalization4dUint8Test, armnn::DataLayout::NCHW) + ARMNN_AUTO_TEST_CASE(L2Normalization1dNhwc, L2Normalization1dTest, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(L2Normalization2dNhwc, L2Normalization2dTest, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(L2Normalization3dNhwc, L2Normalization3dTest, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(L2Normalization4dNhwc, L2Normalization4dTest, armnn::DataLayout::NHWC) + ARMNN_AUTO_TEST_CASE(L2Normalization1dInt16Nhwc, L2Normalization1dInt16Test, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(L2Normalization2dInt16Nhwc, L2Normalization2dInt16Test, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(L2Normalization3dInt16Nhwc, L2Normalization3dInt16Test, armnn::DataLayout::NHWC) ARMNN_AUTO_TEST_CASE(L2Normalization4dInt16Nhwc, L2Normalization4dInt16Test, armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(L2Normalization1dUint8Nhwc, L2Normalization1dUint8Test, armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(L2Normalization2dUint8Nhwc, L2Normalization2dUint8Test, armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(L2Normalization3dUint8Nhwc, L2Normalization3dUint8Test, armnn::DataLayout::NHWC) +ARMNN_AUTO_TEST_CASE(L2Normalization4dUint8Nhwc, L2Normalization4dUint8Test, armnn::DataLayout::NHWC) + // Pad ARMNN_AUTO_TEST_CASE(PadFloat322d, PadFloat322dTest) ARMNN_AUTO_TEST_CASE(PadFloat323d, PadFloat323dTest) -- cgit v1.2.1