From e6eaf661c5b84f4ca051daaf08281d9b8de3fcb9 Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Mon, 8 Jul 2019 08:57:17 +0100 Subject: IVGCVSW-3399 Add support of QuantisedSymm16 to Pad * Add support of QuantisedSymm16 to Pad * Fix custom padding tests * Add unit tests for Pad QuantisedSymm16 Signed-off-by: Narumol Prangnawarat Change-Id: Ieb9a4492760b13fa030a42eb4d38fd9ffd7a8c76 --- src/backends/backendsCommon/test/LayerTests.cpp | 37 ++++++++++++++++++---- src/backends/backendsCommon/test/LayerTests.hpp | 24 +++++++++++++- src/backends/reference/RefLayerSupport.cpp | 25 ++++++++++++--- src/backends/reference/RefWorkloadFactory.cpp | 6 +++- src/backends/reference/test/RefLayerTests.cpp | 5 +++ src/backends/reference/workloads/Pad.cpp | 6 ++++ .../reference/workloads/RefPadWorkload.cpp | 1 + .../reference/workloads/RefPadWorkload.hpp | 3 +- 8 files changed, 92 insertions(+), 15 deletions(-) (limited to 'src/backends') diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index e8257fdc7a..82dda3b342 100644 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -6030,13 +6030,13 @@ float CalcInvL2Norm(std::initializer_list elements) } // anonymous namespace -template> +template LayerTestResult Pad2dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, float qScale, int32_t qOffset, - const float customPaddingValue = 0) + const float customPaddingValue) { const armnn::TensorShape inputShape{ 3, 3 }; const armnn::TensorShape outputShape{ 7, 7 }; @@ -6103,7 +6103,7 @@ LayerTestResult Pad2dTestCommon( return result; } -template> +template LayerTestResult Pad3dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, @@ -6188,7 +6188,7 @@ LayerTestResult Pad3dTestCommon( return result; } -template> +template LayerTestResult Pad4dTestCommon( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, @@ -6437,7 +6437,7 @@ LayerTestResult PadUint82dCustomPaddingTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { - return Pad2dTestCommon(workloadFactory, memoryManager, 1.0f, 0, 1); + return Pad2dTestCommon(workloadFactory, memoryManager, 1.0f, 0, 1.0f); } LayerTestResult PadUint83dTest( @@ -6454,6 +6454,29 @@ LayerTestResult PadUint84dTest( return Pad4dTestCommon(workloadFactory, memoryManager, 1.0f, 0); } + +template LayerTestResult, 2> +Pad2dTestCommon( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float qScale, + int32_t qOffset, + const float customPaddingValue); + +template LayerTestResult, 3> +Pad3dTestCommon( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float qScale, + int32_t qOffset); + +template LayerTestResult, 4> +Pad4dTestCommon( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float qScale, + int32_t qOffset); + LayerTestResult PadFloat322dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) @@ -6465,7 +6488,7 @@ LayerTestResult PadFloat322dCustomPaddingTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { - return Pad2dTestCommon(workloadFactory, memoryManager, 0.0f, 0, 1); + return Pad2dTestCommon(workloadFactory, memoryManager, 0.0f, 0, 1.0f); } LayerTestResult PadFloat323dTest( @@ -10198,4 +10221,4 @@ LayerTestResult UnbiasedStridedTransposeConvolution2dInt16NhwcTest( memoryManager, false, armnn::DataLayout::NHWC); -} \ No newline at end of file +} diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 4eb01accc4..108ea79070 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -1438,6 +1438,28 @@ LayerTestResult PadFloat324dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); +template> +LayerTestResult Pad2dTestCommon( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float qScale, + int32_t qOffset, + const float customPaddingValue = 0.0f); + +template> +LayerTestResult Pad3dTestCommon( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float qScale, + int32_t qOffset); + +template> +LayerTestResult Pad4dTestCommon( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + float qScale, + int32_t qOffset); + void LstmUtilsZeroVectorTest(); void LstmUtilsMeanStddevNormalizationNoneZeroInputTest(); void LstmUtilsMeanStddevNormalizationAllZeroInputTest(); @@ -4446,4 +4468,4 @@ LayerTestResult UnbiasedStridedTransposeConvolution2dInt16NchwTest( LayerTestResult UnbiasedStridedTransposeConvolution2dInt16NhwcTest( armnn::IWorkloadFactory& workloadFactory, - const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); \ No newline at end of file + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 087acd2103..ac7f310c1d 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -1240,12 +1240,27 @@ bool RefLayerSupport::IsPadSupported(const TensorInfo& input, const PadDescriptor& descriptor, Optional reasonIfUnsupported) const { - ignore_unused(output); ignore_unused(descriptor); - return IsSupportedForDataTypeRef(reasonIfUnsupported, - input.GetDataType(), - &TrueFunc<>, - &TrueFunc<>); + bool supported = true; + + // Define supported output and inputs types. + std::array supportedTypes = + { + DataType::Float32, + DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 + }; + + supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported, + "Reference pad: input is not a supported type."); + + supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, + "Reference pad: output is not a supported type."); + + supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, + "Reference pad: input and output types are mismatched."); + + return supported; } bool RefLayerSupport::IsPermuteSupported(const TensorInfo& input, diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 9a31533cba..183103c40c 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -402,7 +402,11 @@ std::unique_ptr RefWorkloadFactory::CreateMinimum( std::unique_ptr RefWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + if (IsQSymm16(info)) + { + return std::make_unique(descriptor, info); + } + return MakeWorkload(descriptor, info); } std::unique_ptr RefWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor, diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 7009dec098..bc64725747 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -751,6 +751,11 @@ ARMNN_AUTO_TEST_CASE(PadUint82dCustomPadding, PadUint82dCustomPaddingTest) ARMNN_AUTO_TEST_CASE(PadUint83d, PadUint83dTest) ARMNN_AUTO_TEST_CASE(PadUint84d, PadUint84dTest) +ARMNN_AUTO_TEST_CASE(Pad2dQSymm16, Pad2dTestCommon, 2.0f, 0, 0.0f) +ARMNN_AUTO_TEST_CASE(Pad2dQSymm16CustomPadding, Pad2dTestCommon, 2.0f, 0, 1.0f) +ARMNN_AUTO_TEST_CASE(Pad3dQSymm16, Pad3dTestCommon, 2.0f, 0) +ARMNN_AUTO_TEST_CASE(Pad4dQSymm16, Pad4dTestCommon, 2.0f, 0) + // Constant ARMNN_AUTO_TEST_CASE(Constant, ConstantTest) ARMNN_AUTO_TEST_CASE(ConstantUint8, ConstantUint8CustomQuantizationScaleAndOffsetTest) diff --git a/src/backends/reference/workloads/Pad.cpp b/src/backends/reference/workloads/Pad.cpp index 1e58124627..41435f47d2 100644 --- a/src/backends/reference/workloads/Pad.cpp +++ b/src/backends/reference/workloads/Pad.cpp @@ -175,5 +175,11 @@ template void Pad(const TensorInfo& inputInfo, const uint8_t* inputData, uint8_t* outData, const float padValue); +template void Pad(const TensorInfo& inputInfo, + const TensorInfo& outputInfo, + std::vector> m_PadList, + const int16_t* inputData, + int16_t* outData, + const float padValue); } //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefPadWorkload.cpp b/src/backends/reference/workloads/RefPadWorkload.cpp index e9724c449f..5e59d83dc9 100644 --- a/src/backends/reference/workloads/RefPadWorkload.cpp +++ b/src/backends/reference/workloads/RefPadWorkload.cpp @@ -35,5 +35,6 @@ void RefPadWorkload::Execute() const template class RefPadWorkload; template class RefPadWorkload; +template class RefPadWorkload; } //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefPadWorkload.hpp b/src/backends/reference/workloads/RefPadWorkload.hpp index 8c6d01351b..b1de53e930 100644 --- a/src/backends/reference/workloads/RefPadWorkload.hpp +++ b/src/backends/reference/workloads/RefPadWorkload.hpp @@ -31,6 +31,7 @@ public: }; using RefPadFloat32Workload = RefPadWorkload; -using RefPadUint8Workload = RefPadWorkload; +using RefPadQAsymm8Workload = RefPadWorkload; +using RefPadQSymm16Workload = RefPadWorkload; } //namespace armnn -- cgit v1.2.1