From 47cfee9358be7a5c1c71e4ab7e94bec2557248c1 Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Thu, 4 Jul 2019 10:29:00 +0100 Subject: [PATCH] IVGCVSW-3399 Add support of QuantisedSymm16 to Debug and unit tests, refactor to be done Signed-off-by: Narumol Prangnawarat Change-Id: I6dbf6a2aa328b8c843632e1231931b4e1c6888bb --- src/backends/reference/RefLayerSupport.cpp | 24 +++++++++++++++++----- src/backends/reference/RefWorkloadFactory.cpp | 10 ++++++--- src/backends/reference/test/RefLayerTests.cpp | 6 ++++++ src/backends/reference/workloads/Debug.cpp | 5 +++++ .../reference/workloads/RefDebugWorkload.cpp | 1 + .../reference/workloads/RefDebugWorkload.hpp | 3 ++- 6 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index ae668f3..f375876 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -533,11 +533,25 @@ bool RefLayerSupport::IsDebugSupported(const TensorInfo& input, const TensorInfo& output, Optional reasonIfUnsupported) const { - ignore_unused(output); - return IsSupportedForDataTypeRef(reasonIfUnsupported, - input.GetDataType(), - &TrueFunc<>, - &TrueFunc<>); + bool supported = true; + + std::array supportedTypes = + { + DataType::Float32, + DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 + }; + + supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported, + "Reference debug: input type not supported"); + + supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, + "Reference debug: output type not supported"); + + supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, + "Reference debug: input and output types are mismatched"); + + return supported; } bool RefLayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input, diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 7ae5b97..d1189a6 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -50,9 +50,9 @@ bool IsFloat16(const WorkloadInfo& info) return IsDataType(info); } -bool IsUint8(const WorkloadInfo& info) +bool IsQSymm16(const WorkloadInfo& info) { - return IsDataType(info); + return IsDataType(info); } RefWorkloadFactory::RefWorkloadFactory(const std::shared_ptr& memoryManager) @@ -432,7 +432,11 @@ std::unique_ptr RefWorkloadFactory::CreateGreater(const GreaterQueueD std::unique_ptr RefWorkloadFactory::CreateDebug(const DebugQueueDescriptor& 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::CreateRsqrt(const RsqrtQueueDescriptor& descriptor, diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index e978f42..5542c9a 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -10,6 +10,7 @@ #include +#include #include #include @@ -1025,6 +1026,11 @@ ARMNN_AUTO_TEST_CASE(Debug3DUint8, Debug3DUint8Test) ARMNN_AUTO_TEST_CASE(Debug2DUint8, Debug2DUint8Test) ARMNN_AUTO_TEST_CASE(Debug1DUint8, Debug1DUint8Test) +ARMNN_AUTO_TEST_CASE(Debug4DQSymm16, Debug4DTest) +ARMNN_AUTO_TEST_CASE(Debug3DQSymm16, Debug3DTest) +ARMNN_AUTO_TEST_CASE(Debug2DQSymm16, Debug2DTest) +ARMNN_AUTO_TEST_CASE(Debug1DQSymm16, Debug1DTest) + // Gather ARMNN_AUTO_TEST_CASE(Gather1DParamsFloat, Gather1DParamsFloatTest) ARMNN_AUTO_TEST_CASE(Gather1DParamsUint8, Gather1DParamsUint8Test) diff --git a/src/backends/reference/workloads/Debug.cpp b/src/backends/reference/workloads/Debug.cpp index 594f428..d1c9fdd 100644 --- a/src/backends/reference/workloads/Debug.cpp +++ b/src/backends/reference/workloads/Debug.cpp @@ -97,4 +97,9 @@ template void Debug(const TensorInfo& inputInfo, const std::string& layerName, unsigned int slotIndex); +template void Debug(const TensorInfo& inputInfo, + const int16_t* inputData, + LayerGuid guid, + const std::string& layerName, + unsigned int slotIndex); } // namespace armnn diff --git a/src/backends/reference/workloads/RefDebugWorkload.cpp b/src/backends/reference/workloads/RefDebugWorkload.cpp index be2d82f..325817b 100644 --- a/src/backends/reference/workloads/RefDebugWorkload.cpp +++ b/src/backends/reference/workloads/RefDebugWorkload.cpp @@ -46,5 +46,6 @@ void RefDebugWorkload::RegisterDebugCallback(const DebugCallbackFuncti template class RefDebugWorkload; template class RefDebugWorkload; +template class RefDebugWorkload; } // namespace armnn diff --git a/src/backends/reference/workloads/RefDebugWorkload.hpp b/src/backends/reference/workloads/RefDebugWorkload.hpp index 2985699..6a1fceb 100644 --- a/src/backends/reference/workloads/RefDebugWorkload.hpp +++ b/src/backends/reference/workloads/RefDebugWorkload.hpp @@ -38,6 +38,7 @@ private: }; using RefDebugFloat32Workload = RefDebugWorkload; -using RefDebugUint8Workload = RefDebugWorkload; +using RefDebugQAsymm8Workload = RefDebugWorkload; +using RefDebugQSymm16Workload = RefDebugWorkload; } // namespace armnn -- 2.7.4