From 0c95f4cd319874ffa4aba3a378e0e3346f688fdc Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Wed, 18 Nov 2020 16:52:07 +0000 Subject: Fix logical vts skip * Add Boolean support for Reshape * Use LogicalUnary factory and data type for LogicalNot Signed-off-by: Narumol Prangnawarat Change-Id: I8e072fde200b7716556ae67f79616458cf98ff20 --- src/armnn/layers/ElementwiseUnaryLayer.cpp | 5 ++++ src/backends/backendsCommon/WorkloadData.cpp | 3 ++- .../backendsCommon/WorkloadFactoryBase.hpp | 4 +++ .../test/layerTests/ReshapeTestImpl.cpp | 24 ++++++++++++++++++ .../test/layerTests/ReshapeTestImpl.hpp | 5 ++++ src/backends/cl/test/ClLayerTests.cpp | 1 + src/backends/neon/test/NeonLayerTests.cpp | 1 + src/backends/reference/RefLayerSupport.cpp | 29 +++++++++++++++++----- src/backends/reference/RefWorkloadFactory.cpp | 4 +++ src/backends/reference/test/RefLayerTests.cpp | 2 ++ 10 files changed, 71 insertions(+), 7 deletions(-) diff --git a/src/armnn/layers/ElementwiseUnaryLayer.cpp b/src/armnn/layers/ElementwiseUnaryLayer.cpp index 74fa16e15f..8c94106818 100644 --- a/src/armnn/layers/ElementwiseUnaryLayer.cpp +++ b/src/armnn/layers/ElementwiseUnaryLayer.cpp @@ -24,6 +24,11 @@ std::unique_ptr ElementwiseUnaryLayer::CreateWorkload(const IWorkload { ElementwiseUnaryQueueDescriptor descriptor; + if (descriptor.m_Parameters.m_Operation == UnaryOperation::LogicalNot) + { + return factory.CreateLogicalUnary(descriptor, PrepInfoAndDesc(descriptor)); + } + return factory.CreateElementwiseUnary(descriptor, PrepInfoAndDesc(descriptor)); } diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 676559cb2c..530dc48a74 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -1675,7 +1675,8 @@ void ReshapeQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const DataType::QAsymmS8, DataType::QAsymmU8, DataType::QSymmS16, - DataType::Signed32 + DataType::Signed32, + DataType::Boolean }; ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); diff --git a/src/backends/backendsCommon/WorkloadFactoryBase.hpp b/src/backends/backendsCommon/WorkloadFactoryBase.hpp index bfdb5e9b33..295202324e 100644 --- a/src/backends/backendsCommon/WorkloadFactoryBase.hpp +++ b/src/backends/backendsCommon/WorkloadFactoryBase.hpp @@ -119,6 +119,10 @@ public: RsqrtQueueDescriptor rsqrtDescriptor; return CreateRsqrt(rsqrtDescriptor, info); } + else if (descriptor.m_Parameters.m_Operation == UnaryOperation::LogicalNot) + { + return CreateLogicalUnary(descriptor, info); + } return nullptr; } diff --git a/src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.cpp index d233e89be8..fbedb943f4 100644 --- a/src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.cpp +++ b/src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.cpp @@ -170,6 +170,30 @@ LayerTestResult Reshape5dTest( workloadFactory, memoryManager, tensorHandleFactory, inputTensorInfo, outputTensorInfo, input, outputExpected); } +LayerTestResult ReshapeBooleanTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory) +{ + armnn::TensorInfo inputTensorInfo; + armnn::TensorInfo outputTensorInfo; + + unsigned int inputShape[] = { 1, 4 }; + unsigned int outputShape[] = { 2, 2 }; + + inputTensorInfo = armnn::TensorInfo(2, inputShape, armnn::DataType::Boolean); + inputTensorInfo.SetQuantizationScale(1.0f); + outputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Boolean); + outputTensorInfo.SetQuantizationScale(1.0f); + + const std::vector input = { true, false, false, true }; + + const std::vector outputExpected = { true, false, false, true }; + + return SimpleReshapeTestImpl( + workloadFactory, memoryManager, tensorHandleFactory, inputTensorInfo, outputTensorInfo, input, outputExpected); +} + // // Explicit template specializations // diff --git a/src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.hpp b/src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.hpp index 661702b9e7..a29a965fdc 100644 --- a/src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.hpp +++ b/src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.hpp @@ -23,3 +23,8 @@ LayerTestResult Reshape5dTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const armnn::ITensorHandleFactory& tensorHandleFactory); + +LayerTestResult ReshapeBooleanTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, + const armnn::ITensorHandleFactory& tensorHandleFactory); diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index 0d87b746a0..1865bdd7c5 100644 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -485,6 +485,7 @@ ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeFloat32, SimpleReshapeTest) ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeUint8, SimpleReshapeTest) ARMNN_AUTO_TEST_CASE_WITH_THF(Reshape5d, Reshape5dTest) +ARMNN_AUTO_TEST_CASE_WITH_THF(ReshapeBoolean, ReshapeBooleanTest) // Pad ARMNN_AUTO_TEST_CASE_WITH_THF(PadFloat322d, PadFloat322dTest) diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index 20afbcb701..59f00fc833 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -747,6 +747,7 @@ ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeFloat32, SimpleReshapeTest) ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeUint8, SimpleReshapeTest) ARMNN_AUTO_TEST_CASE_WITH_THF(Reshape5d, Reshape5dTest) +ARMNN_AUTO_TEST_CASE_WITH_THF(ReshapeBoolean, ReshapeBooleanTest) // Pad ARMNN_AUTO_TEST_CASE_WITH_THF(PadFloat322d, PadFloat322dTest) diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index b3feae6713..d1933c90c0 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -807,13 +807,29 @@ bool RefLayerSupport::IsElementwiseUnarySupported(const TensorInfo& input, DataType::Signed32 }; + std::array logicalSupportedTypes = + { + DataType::Boolean + }; + bool supported = true; - supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported, - "Reference elementwise unary: input type not supported"); + if (descriptor.m_Operation == UnaryOperation::LogicalNot) + { + supported &= CheckSupportRule(TypeAnyOf(input, logicalSupportedTypes), reasonIfUnsupported, + "Reference elementwise unary: input type not supported"); - supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, - "Reference elementwise unary: output type not supported"); + supported &= CheckSupportRule(TypeAnyOf(output, logicalSupportedTypes), reasonIfUnsupported, + "Reference elementwise unary: output type not supported"); + } + else + { + supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported, + "Reference elementwise unary: input type not supported"); + + supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, + "Reference elementwise unary: output type not supported"); + } supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, "Reference elementwise unary: input and output types not matching"); @@ -1720,7 +1736,7 @@ bool RefLayerSupport::IsReshapeSupported(const TensorInfo& input, IgnoreUnused(output); IgnoreUnused(descriptor); // Define supported output types. - std::array supportedOutputTypes = + std::array supportedOutputTypes = { DataType::BFloat16, DataType::Float32, @@ -1728,7 +1744,8 @@ bool RefLayerSupport::IsReshapeSupported(const TensorInfo& input, DataType::Signed32, DataType::QAsymmS8, DataType::QAsymmU8, - DataType::QSymmS16 + DataType::QSymmS16, + DataType::Boolean }; return CheckSupportRule(TypeAnyOf(input, supportedOutputTypes), reasonIfUnsupported, diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 9080028e72..9a8c46d360 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -307,6 +307,10 @@ std::unique_ptr RefWorkloadFactory::CreateDivision(const DivisionQueu std::unique_ptr RefWorkloadFactory::CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor& descriptor, const WorkloadInfo& info) const { + if (descriptor.m_Parameters.m_Operation == UnaryOperation::LogicalNot) + { + return std::make_unique(descriptor, info); + } return std::make_unique(descriptor, info); } diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 60400c514e..be95ad7daf 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -1386,6 +1386,8 @@ ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeQuantisedAsymmS8, SimpleReshapeTest) ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeQuantisedSymm16, SimpleReshapeTest) ARMNN_AUTO_TEST_CASE_WITH_THF(Reshape5d, Reshape5dTest) +ARMNN_AUTO_TEST_CASE_WITH_THF(ReshapeBoolean, ReshapeBooleanTest) + // Rsqrt ARMNN_AUTO_TEST_CASE_WITH_THF(Rsqrt2d, Rsqrt2dTest) -- cgit v1.2.1