diff options
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/backendsCommon/WorkloadData.cpp | 26 | ||||
-rw-r--r-- | src/backends/backendsCommon/WorkloadFactory.cpp | 2 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/LayerTests.cpp | 22 | ||||
-rw-r--r-- | src/backends/backendsCommon/test/LayerTests.hpp | 12 | ||||
-rw-r--r-- | src/backends/reference/RefLayerSupport.cpp | 35 | ||||
-rw-r--r-- | src/backends/reference/test/RefEndToEndTests.cpp | 10 | ||||
-rw-r--r-- | src/backends/reference/test/RefLayerTests.cpp | 3 |
7 files changed, 99 insertions, 11 deletions
diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 5ca492888f..cd40097e74 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -1597,23 +1597,41 @@ void RsqrtQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const void GatherQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const { - ValidateNumInputs(workloadInfo, "GatherQueueDescriptor", 2); - ValidateNumOutputs(workloadInfo, "GatherQueueDescriptor", 1); + const std::string GatherQueueDescriptorStr = "GatherQueueDescriptor"; + + ValidateNumInputs(workloadInfo, GatherQueueDescriptorStr, 2); + ValidateNumOutputs(workloadInfo, GatherQueueDescriptorStr, 1); const TensorInfo& indices = workloadInfo.m_InputTensorInfos[1]; if (indices.GetDataType() != DataType::Signed32) { - throw InvalidArgumentException("GatherQueueDescriptor: Indices tensor type must be int32."); + throw InvalidArgumentException(GatherQueueDescriptorStr + ": Indices tensor type must be int32."); } + std::vector<DataType> supportedTypes = + { + DataType::Float16, + DataType::Float32, + DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 + }; + + ValidateDataTypes(workloadInfo.m_InputTensorInfos[0], + supportedTypes, + GatherQueueDescriptorStr); + + ValidateTensorDataTypesMatch(workloadInfo.m_InputTensorInfos[0], + workloadInfo.m_OutputTensorInfos[0], + GatherQueueDescriptorStr, "Input", "Output"); + const TensorInfo& params = workloadInfo.m_InputTensorInfos[0]; const TensorInfo& output = workloadInfo.m_OutputTensorInfos[0]; unsigned int paramsDim = params.GetNumDimensions(); unsigned int indicesDim = indices.GetNumDimensions(); unsigned int outputDim = paramsDim - 1 + indicesDim; - ValidateTensorNumDimensions(output, "GatherQueueDescriptor", outputDim, "output"); + ValidateTensorNumDimensions(output, GatherQueueDescriptorStr, outputDim, "output"); } void DetectionPostProcessQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp index 2fba3b7059..7cda3fe884 100644 --- a/src/backends/backendsCommon/WorkloadFactory.cpp +++ b/src/backends/backendsCommon/WorkloadFactory.cpp @@ -323,7 +323,7 @@ bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId, const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo(); const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo(); result = layerSupportObject->IsGatherSupported(OverrideDataType(input0, dataType), - OverrideDataType(input1, dataType), + input1, OverrideDataType(output, dataType), reason); break; diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index 64b9676a4b..a625097fdb 100644 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -9551,6 +9551,13 @@ LayerTestResult<uint8_t, 1> Gather1DParamsUint8Test( return Gather1DParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager); } +LayerTestResult<int16_t, 1> Gather1DParamsInt16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return Gather1DParamsTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager); +} + LayerTestResult<float, 2> GatherMultiDimParamsFloatTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) @@ -9565,6 +9572,13 @@ LayerTestResult<uint8_t, 2> GatherMultiDimParamsUint8Test( return GatherMultiDimParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager); } +LayerTestResult<int16_t, 2> GatherMultiDimParamsInt16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return GatherMultiDimParamsTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager); +} + LayerTestResult<float, 4> GatherMultiDimParamsMultiDimIndicesFloatTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) @@ -9580,6 +9594,14 @@ LayerTestResult<uint8_t, 4> GatherMultiDimParamsMultiDimIndicesUint8Test( workloadFactory, memoryManager); } +LayerTestResult<int16_t, 4> GatherMultiDimParamsMultiDimIndicesInt16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::QuantisedSymm16>( + workloadFactory, memoryManager); +} + LayerTestResult<float, 4> DequantizeSimpleUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 77adca1ac7..d54d41e5f5 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -1909,6 +1909,10 @@ LayerTestResult<uint8_t, 1> Gather1DParamsUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); +LayerTestResult<int16_t, 1> Gather1DParamsInt16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + LayerTestResult<float, 2> GatherMultiDimParamsFloatTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); @@ -1917,6 +1921,10 @@ LayerTestResult<uint8_t, 2> GatherMultiDimParamsUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); +LayerTestResult<int16_t, 2> GatherMultiDimParamsInt16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + LayerTestResult<float, 4> GatherMultiDimParamsMultiDimIndicesFloatTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); @@ -1925,6 +1933,10 @@ LayerTestResult<uint8_t, 4> GatherMultiDimParamsMultiDimIndicesUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); +LayerTestResult<int16_t, 4> GatherMultiDimParamsMultiDimIndicesInt16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + LayerTestResult<float, 4> DequantizeSimpleUint8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index a1807819e3..4e9a67879f 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -130,6 +130,14 @@ struct TypeAnyOf : public Rule } }; +struct TypeIs : public Rule +{ + TypeIs(const TensorInfo& info, DataType dt) + { + m_Res = dt == info.GetDataType(); + } +}; + struct BiasAndWeightsTypesMatch : public Rule { BiasAndWeightsTypesMatch(const TensorInfo& biases, const TensorInfo& weights) @@ -721,12 +729,27 @@ bool RefLayerSupport::IsGatherSupported(const armnn::TensorInfo& input0, const armnn::TensorInfo& output, armnn::Optional<std::string&> reasonIfUnsupported) const { - ignore_unused(input1); - ignore_unused(output); - return IsSupportedForDataTypeRef(reasonIfUnsupported, - input0.GetDataType(), - &TrueFunc<>, - &TrueFunc<>); + bool supported = true; + std::array<DataType,3> supportedTypes = + { + DataType::Float32, + DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 + }; + + supported &= CheckSupportRule(TypeAnyOf(input0, supportedTypes), reasonIfUnsupported, + "Reference Gather: input type not supported"); + + supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, + "Reference Gather: output type not supported"); + + supported &= CheckSupportRule(TypeIs(input1, DataType::Signed32), reasonIfUnsupported, + "Reference Gather: indices (input1) type not supported"); + + supported &= CheckSupportRule(TypesAreEqual(input0, output), reasonIfUnsupported, + "Reference Gather: input and output types not matching"); + + return supported; } bool RefLayerSupport::IsGreaterSupported(const TensorInfo& input0, diff --git a/src/backends/reference/test/RefEndToEndTests.cpp b/src/backends/reference/test/RefEndToEndTests.cpp index be73116f65..c186c03984 100644 --- a/src/backends/reference/test/RefEndToEndTests.cpp +++ b/src/backends/reference/test/RefEndToEndTests.cpp @@ -448,6 +448,11 @@ BOOST_AUTO_TEST_CASE(RefGatherUint8Test) GatherEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends); } +BOOST_AUTO_TEST_CASE(RefGatherInt16Test) +{ + GatherEndToEnd<armnn::DataType::QuantisedSymm16>(defaultBackends); +} + BOOST_AUTO_TEST_CASE(RefGatherMultiDimFloatTest) { GatherMultiDimEndToEnd<armnn::DataType::Float32>(defaultBackends); @@ -458,6 +463,11 @@ BOOST_AUTO_TEST_CASE(RefGatherMultiDimUint8Test) GatherMultiDimEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends); } +BOOST_AUTO_TEST_CASE(RefGatherMultiDimInt16Test) +{ + GatherMultiDimEndToEnd<armnn::DataType::QuantisedSymm16>(defaultBackends); +} + BOOST_AUTO_TEST_CASE(DequantizeEndToEndSimpleTest) { DequantizeEndToEndSimple<armnn::DataType::QuantisedAsymm8>(defaultBackends); diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 4cb261f07d..f933bfe3e1 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -896,10 +896,13 @@ ARMNN_AUTO_TEST_CASE(Debug1DUint8, Debug1DUint8Test) // Gather ARMNN_AUTO_TEST_CASE(Gather1DParamsFloat, Gather1DParamsFloatTest) ARMNN_AUTO_TEST_CASE(Gather1DParamsUint8, Gather1DParamsUint8Test) +ARMNN_AUTO_TEST_CASE(Gather1DParamsInt16, Gather1DParamsInt16Test) ARMNN_AUTO_TEST_CASE(GatherMultiDimParamsFloat, GatherMultiDimParamsFloatTest) ARMNN_AUTO_TEST_CASE(GatherMultiDimParamsUint8, GatherMultiDimParamsUint8Test) +ARMNN_AUTO_TEST_CASE(GatherMultiDimParamsInt16, GatherMultiDimParamsInt16Test) ARMNN_AUTO_TEST_CASE(GatherMultiDimParamsMultiDimIndicesFloat, GatherMultiDimParamsMultiDimIndicesFloatTest) ARMNN_AUTO_TEST_CASE(GatherMultiDimParamsMultiDimIndicesUint8, GatherMultiDimParamsMultiDimIndicesUint8Test) +ARMNN_AUTO_TEST_CASE(GatherMultiDimParamsMultiDimIndicesInt16, GatherMultiDimParamsMultiDimIndicesInt16Test) // Detection PostProcess BOOST_AUTO_TEST_CASE(DetectionPostProcessRegularNmsFloat) |