From 32b9046ea74d2387a08819cf5e67c183e03f6d3f Mon Sep 17 00:00:00 2001 From: narpra01 Date: Thu, 13 Sep 2018 11:07:48 +0100 Subject: IVGCVSW-1813 - Add MeanLayer * add MeanLayer functionalities * modify MeanQueueDescriptor to use parameter * add IsMeanSupported placeholder for all backends Change-Id: Ic69a34a61df667849977aad9b38f9a01eef565b5 --- src/armnn/backends/ClLayerSupport.cpp | 8 ++++++++ src/armnn/backends/ClLayerSupport.hpp | 5 +++++ src/armnn/backends/NeonLayerSupport.cpp | 8 ++++++++ src/armnn/backends/NeonLayerSupport.hpp | 5 +++++ src/armnn/backends/RefLayerSupport.cpp | 8 ++++++++ src/armnn/backends/RefLayerSupport.hpp | 5 +++++ src/armnn/backends/WorkloadData.cpp | 21 +++------------------ src/armnn/backends/WorkloadData.hpp | 11 +---------- src/armnn/backends/WorkloadFactory.cpp | 13 +++++++++++++ .../backends/test/IsLayerSupportedTestImpl.hpp | 2 ++ 10 files changed, 58 insertions(+), 28 deletions(-) (limited to 'src/armnn/backends') diff --git a/src/armnn/backends/ClLayerSupport.cpp b/src/armnn/backends/ClLayerSupport.cpp index aeb2759aa1..4664c2ee32 100644 --- a/src/armnn/backends/ClLayerSupport.cpp +++ b/src/armnn/backends/ClLayerSupport.cpp @@ -462,4 +462,12 @@ bool IsConvertFp32ToFp16SupportedCl(const TensorInfo& input, reasonIfUnsupported); } +bool IsMeanSupportedCl(const TensorInfo& input, + const TensorInfo& output, + const MeanDescriptor& descriptor, + std::string* reasonIfUnsupported) +{ + return false; +} + } diff --git a/src/armnn/backends/ClLayerSupport.hpp b/src/armnn/backends/ClLayerSupport.hpp index dbe546c18d..f5c1226e56 100644 --- a/src/armnn/backends/ClLayerSupport.hpp +++ b/src/armnn/backends/ClLayerSupport.hpp @@ -142,6 +142,11 @@ bool IsFloorSupportedCl(const TensorInfo& input, const TensorInfo& output, std::string* reasonIfUnsupported = nullptr); +bool IsMeanSupportedCl(const TensorInfo& input, + const TensorInfo& output, + const MeanDescriptor& descriptor, + std::string* reasonIfUnsupported = nullptr); + bool IsConvertFp16ToFp32SupportedCl(const TensorInfo& input, const TensorInfo& output, std::string* reasonIfUnsupported = nullptr); diff --git a/src/armnn/backends/NeonLayerSupport.cpp b/src/armnn/backends/NeonLayerSupport.cpp index 73d251893f..7f33c48ed1 100644 --- a/src/armnn/backends/NeonLayerSupport.cpp +++ b/src/armnn/backends/NeonLayerSupport.cpp @@ -453,4 +453,12 @@ bool IsConvertFp32ToFp16SupportedNeon(const TensorInfo& input, return true; } +bool IsMeanSupportedNeon(const TensorInfo& input, + const TensorInfo& output, + const MeanDescriptor& descriptor, + std::string* reasonIfUnsupported) +{ + return false; +} + } diff --git a/src/armnn/backends/NeonLayerSupport.hpp b/src/armnn/backends/NeonLayerSupport.hpp index f7b62536a6..95b14b3ba6 100644 --- a/src/armnn/backends/NeonLayerSupport.hpp +++ b/src/armnn/backends/NeonLayerSupport.hpp @@ -155,4 +155,9 @@ bool IsConvertFp32ToFp16SupportedNeon(const TensorInfo& input, const TensorInfo& output, std::string* reasonIfUnsupported = nullptr); +bool IsMeanSupportedNeon(const TensorInfo& input, + const TensorInfo& output, + const MeanDescriptor& descriptor, + std::string* reasonIfUnsupported = nullptr); + } diff --git a/src/armnn/backends/RefLayerSupport.cpp b/src/armnn/backends/RefLayerSupport.cpp index 41f57f1677..d56cdebeda 100644 --- a/src/armnn/backends/RefLayerSupport.cpp +++ b/src/armnn/backends/RefLayerSupport.cpp @@ -387,4 +387,12 @@ bool IsConvertFp32ToFp16SupportedRef(const TensorInfo& input, &FalseFuncU8<>)); } +bool IsMeanSupportedRef(const TensorInfo& input, + const TensorInfo& output, + const MeanDescriptor& descriptor, + std::string* reasonIfUnsupported) +{ + return false; +} + } diff --git a/src/armnn/backends/RefLayerSupport.hpp b/src/armnn/backends/RefLayerSupport.hpp index 464eb1c91c..ff2e7e387f 100644 --- a/src/armnn/backends/RefLayerSupport.hpp +++ b/src/armnn/backends/RefLayerSupport.hpp @@ -147,4 +147,9 @@ bool IsConvertFp32ToFp16SupportedRef(const TensorInfo& input, const TensorInfo& output, std::string* reasonIfUnsupported = nullptr); +bool IsMeanSupportedRef(const TensorInfo& input, + const TensorInfo& output, + const MeanDescriptor& descriptor, + std::string* reasonIfUnsupported = nullptr); + } diff --git a/src/armnn/backends/WorkloadData.cpp b/src/armnn/backends/WorkloadData.cpp index 3ed77dacdb..25144a4753 100644 --- a/src/armnn/backends/WorkloadData.cpp +++ b/src/armnn/backends/WorkloadData.cpp @@ -129,18 +129,6 @@ void ValidateTensorNumDimensions(const TensorInfo& tensor, } } -void ValidateTensorMaxNumElements(const TensorInfo& tensor, - std::string const& descName, - unsigned int maxNumElements, - std::string const& tensorName) -{ - if (tensor.GetNumElements() > maxNumElements) - { - throw InvalidArgumentException(descName + ": Expected maximum of " + to_string(maxNumElements) + " but got " + - to_string(tensor.GetNumElements()) + " elements for " + tensorName + " tensor."); - } -} - //--------------------------------------------------------------- void ValidateTensorDataType(const TensorInfo& tensor, DataType dataType, const std::string& descName, std::string const& tensorName) @@ -844,20 +832,17 @@ void MeanQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const const TensorInfo& input = workloadInfo.m_InputTensorInfos[0]; const TensorInfo& output = workloadInfo.m_OutputTensorInfos[0]; - if (m_Keepdims) + if (m_Parameters.m_KeepDims) { ValidateTensorNumDimensions(output, "MeanQueueDescriptor", input.GetNumDimensions(), "output"); } - else if (m_Axis == nullptr) + else if (m_Parameters.m_Axis.empty()) { ValidateTensorNumDimensions(output, "MeanQueueDescriptor", 1, "output"); } else { - const TensorInfo& axis = m_Axis->GetTensorInfo(); - ValidateTensorNumDimensions(axis, "MeanQueueDescriptor", 1, "axis"); - ValidateTensorMaxNumElements(axis, "MeanQueueDescriptor", input.GetNumDimensions(), "axis"); - unsigned int outputDim = input.GetNumDimensions() - axis.GetNumElements(); + auto outputDim = input.GetNumDimensions() - boost::numeric_cast(m_Parameters.m_Axis.size()); ValidateTensorNumDimensions(output, "MeanQueueDescriptor", outputDim > 0 ? outputDim : 1, diff --git a/src/armnn/backends/WorkloadData.hpp b/src/armnn/backends/WorkloadData.hpp index face761e73..a36f0ad7e6 100644 --- a/src/armnn/backends/WorkloadData.hpp +++ b/src/armnn/backends/WorkloadData.hpp @@ -197,17 +197,8 @@ struct SubtractionQueueDescriptor : QueueDescriptor }; // Mean layer workload data. -struct MeanQueueDescriptor : QueueDescriptor +struct MeanQueueDescriptor : QueueDescriptorWithParameters { - MeanQueueDescriptor() - : m_Axis(nullptr) - , m_Keepdims(false) - { - } - - const ConstCpuTensorHandle* m_Axis; - bool m_Keepdims; - void Validate(const WorkloadInfo& workloadInfo) const; }; diff --git a/src/armnn/backends/WorkloadFactory.cpp b/src/armnn/backends/WorkloadFactory.cpp index d1887252c2..773a8c1a18 100644 --- a/src/armnn/backends/WorkloadFactory.cpp +++ b/src/armnn/backends/WorkloadFactory.cpp @@ -537,6 +537,19 @@ bool IWorkloadFactory::IsLayerSupported(Compute compute, const Layer& layer, boo reasonCapacity); break; } + case LayerType::Mean: + { + auto cLayer = boost::polymorphic_downcast(&layer); + const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo(); + const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo(); + result = IsMeanSupported(compute, + OverrideDataType(input, dataType), + OverrideDataType(output, dataType), + cLayer->GetParameters(), + reason, + reasonCapacity); + break; + } default: { BOOST_ASSERT_MSG(false, "WorkloadFactory did not recognise type of layer."); diff --git a/src/armnn/backends/test/IsLayerSupportedTestImpl.hpp b/src/armnn/backends/test/IsLayerSupportedTestImpl.hpp index 7745972fdd..c5389df06e 100644 --- a/src/armnn/backends/test/IsLayerSupportedTestImpl.hpp +++ b/src/armnn/backends/test/IsLayerSupportedTestImpl.hpp @@ -328,6 +328,8 @@ DECLARE_LAYER_POLICY_1_PARAM(L2Normalization) DECLARE_LAYER_POLICY_2_PARAM(Lstm) +DECLARE_LAYER_POLICY_2_PARAM(Mean) + DECLARE_LAYER_POLICY_2_PARAM(Merger) DECLARE_LAYER_POLICY_1_PARAM(Multiplication) -- cgit v1.2.1