aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNarumol Prangnawarat <narumol.prangnawarat@arm.com>2020-11-18 16:52:07 +0000
committerNarumol Prangnawarat <narumol.prangnawarat@arm.com>2020-11-18 19:00:53 +0000
commit0c95f4cd319874ffa4aba3a378e0e3346f688fdc (patch)
tree3c58b21e70304539508c9e8d563b34ba75fd9839
parent1670b0c047ab56c0b3b68088a3c53f38a91355b4 (diff)
downloadarmnn-0c95f4cd319874ffa4aba3a378e0e3346f688fdc.tar.gz
Fix logical vts skip
* Add Boolean support for Reshape * Use LogicalUnary factory and data type for LogicalNot Signed-off-by: Narumol Prangnawarat <narumol.prangnawarat@arm.com> Change-Id: I8e072fde200b7716556ae67f79616458cf98ff20
-rw-r--r--src/armnn/layers/ElementwiseUnaryLayer.cpp5
-rw-r--r--src/backends/backendsCommon/WorkloadData.cpp3
-rw-r--r--src/backends/backendsCommon/WorkloadFactoryBase.hpp4
-rw-r--r--src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.cpp24
-rw-r--r--src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.hpp5
-rw-r--r--src/backends/cl/test/ClLayerTests.cpp1
-rw-r--r--src/backends/neon/test/NeonLayerTests.cpp1
-rw-r--r--src/backends/reference/RefLayerSupport.cpp29
-rw-r--r--src/backends/reference/RefWorkloadFactory.cpp4
-rw-r--r--src/backends/reference/test/RefLayerTests.cpp2
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<IWorkload> 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<T, 5> Reshape5dTest(
workloadFactory, memoryManager, tensorHandleFactory, inputTensorInfo, outputTensorInfo, input, outputExpected);
}
+LayerTestResult<uint8_t, 2> 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<uint8_t> input = { true, false, false, true };
+
+ const std::vector<uint8_t> outputExpected = { true, false, false, true };
+
+ return SimpleReshapeTestImpl<uint8_t, 2>(
+ 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<T, 5> Reshape5dTest(
armnn::IWorkloadFactory& workloadFactory,
const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
const armnn::ITensorHandleFactory& tensorHandleFactory);
+
+LayerTestResult<uint8_t, 2> 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<DataType::
ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeInt8, SimpleReshapeTest<DataType::QAsymmS8>)
ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeUint8, SimpleReshapeTest<DataType::QAsymmU8>)
ARMNN_AUTO_TEST_CASE_WITH_THF(Reshape5d, Reshape5dTest<DataType::Float32>)
+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::Dat
ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeInt8, SimpleReshapeTest<armnn::DataType::QAsymmS8>)
ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeUint8, SimpleReshapeTest<armnn::DataType::QAsymmU8>)
ARMNN_AUTO_TEST_CASE_WITH_THF(Reshape5d, Reshape5dTest<armnn::DataType::Float32>)
+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<DataType, 1> 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<DataType,7> supportedOutputTypes =
+ std::array<DataType,8> 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<IWorkload> RefWorkloadFactory::CreateDivision(const DivisionQueu
std::unique_ptr<IWorkload> RefWorkloadFactory::CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor& descriptor,
const WorkloadInfo& info) const
{
+ if (descriptor.m_Parameters.m_Operation == UnaryOperation::LogicalNot)
+ {
+ return std::make_unique<RefLogicalUnaryWorkload>(descriptor, info);
+ }
return std::make_unique<RefElementwiseUnaryWorkload>(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<D
ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeQuantisedAsymm8, SimpleReshapeTest<DataType::QAsymmU8>)
ARMNN_AUTO_TEST_CASE_WITH_THF(SimpleReshapeQuantisedSymm16, SimpleReshapeTest<DataType::QSymmS16>)
ARMNN_AUTO_TEST_CASE_WITH_THF(Reshape5d, Reshape5dTest<DataType::Float32>)
+ARMNN_AUTO_TEST_CASE_WITH_THF(ReshapeBoolean, ReshapeBooleanTest)
+
// Rsqrt
ARMNN_AUTO_TEST_CASE_WITH_THF(Rsqrt2d, Rsqrt2dTest<DataType::Float32>)