aboutsummaryrefslogtreecommitdiff
path: root/src/armnn/backends
diff options
context:
space:
mode:
authornarpra01 <narumol.prangnawarat@arm.com>2018-09-13 11:07:48 +0100
committerMatthew Bentham <matthew.bentham@arm.com>2018-10-01 14:56:48 +0100
commit32b9046ea74d2387a08819cf5e67c183e03f6d3f (patch)
tree87d1627aed07bc1c572d7b2121974e24778fe81a /src/armnn/backends
parent5cd01f35e8975ca6d42eb5f2d5f121b57bdb8086 (diff)
downloadarmnn-32b9046ea74d2387a08819cf5e67c183e03f6d3f.tar.gz
IVGCVSW-1813 - Add MeanLayer
* add MeanLayer functionalities * modify MeanQueueDescriptor to use parameter * add IsMeanSupported placeholder for all backends Change-Id: Ic69a34a61df667849977aad9b38f9a01eef565b5
Diffstat (limited to 'src/armnn/backends')
-rw-r--r--src/armnn/backends/ClLayerSupport.cpp8
-rw-r--r--src/armnn/backends/ClLayerSupport.hpp5
-rw-r--r--src/armnn/backends/NeonLayerSupport.cpp8
-rw-r--r--src/armnn/backends/NeonLayerSupport.hpp5
-rw-r--r--src/armnn/backends/RefLayerSupport.cpp8
-rw-r--r--src/armnn/backends/RefLayerSupport.hpp5
-rw-r--r--src/armnn/backends/WorkloadData.cpp21
-rw-r--r--src/armnn/backends/WorkloadData.hpp11
-rw-r--r--src/armnn/backends/WorkloadFactory.cpp13
-rw-r--r--src/armnn/backends/test/IsLayerSupportedTestImpl.hpp2
10 files changed, 58 insertions, 28 deletions
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<unsigned int>(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<MeanDescriptor>
{
- 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<const MeanLayer*>(&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)