From 868eb14c463ee76668ad75d4cd4e718a840f7be6 Mon Sep 17 00:00:00 2001 From: Kevin May Date: Wed, 4 Sep 2019 17:29:31 +0100 Subject: IVGCVSW-3739 Add Arm NN front end support for Abs Layer * Add Abs Layer * Add no-op factory implementations for CpuRef, CpuAcc, GpuAcc * Add Queue Descriptor in WorkloadData * Add IsAbsLayerSupported to LayerSupport * Add LayerVisitor tests Signed-off-by: Kevin May Change-Id: Ib0992571d1c80de851cea466291be904e9bdb430 --- src/backends/backendsCommon/LayerSupportBase.cpp | 7 +++++++ src/backends/backendsCommon/LayerSupportBase.hpp | 4 ++++ src/backends/backendsCommon/WorkloadData.cpp | 24 ++++++++++++++++++++++ src/backends/backendsCommon/WorkloadData.hpp | 5 +++++ src/backends/backendsCommon/WorkloadFactory.cpp | 15 ++++++++++++++ src/backends/backendsCommon/WorkloadFactory.hpp | 3 +++ .../test/IsLayerSupportedTestImpl.hpp | 2 ++ 7 files changed, 60 insertions(+) (limited to 'src/backends/backendsCommon') diff --git a/src/backends/backendsCommon/LayerSupportBase.cpp b/src/backends/backendsCommon/LayerSupportBase.cpp index ee8dc5f7e9..464ec4e108 100644 --- a/src/backends/backendsCommon/LayerSupportBase.cpp +++ b/src/backends/backendsCommon/LayerSupportBase.cpp @@ -34,6 +34,13 @@ bool DefaultLayerSupport(const char* func, namespace armnn { +bool LayerSupportBase::IsAbsSupported(const TensorInfo &input, + const TensorInfo &output, + Optional reasonIfUnsupported) const +{ + return DefaultLayerSupport(__func__, __FILE__, __LINE__, reasonIfUnsupported); +} + bool LayerSupportBase::IsActivationSupported(const TensorInfo& input, const TensorInfo& output, const ActivationDescriptor& descriptor, diff --git a/src/backends/backendsCommon/LayerSupportBase.hpp b/src/backends/backendsCommon/LayerSupportBase.hpp index 0d5a2af16e..3cf3d4e672 100644 --- a/src/backends/backendsCommon/LayerSupportBase.hpp +++ b/src/backends/backendsCommon/LayerSupportBase.hpp @@ -13,6 +13,10 @@ namespace armnn class LayerSupportBase : public ILayerSupport { public: + bool IsAbsSupported(const TensorInfo& input, + const TensorInfo& output, + Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsActivationSupported(const TensorInfo& input, const TensorInfo& output, const ActivationDescriptor& descriptor, diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index b590da1552..fed159bd60 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -2534,4 +2534,28 @@ void QuantizedLstmQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) co ValidateBiasTensorQuantization(outputGateBiasInfo, inputInfo, inputToInputWeightsInfo, descriptorName); } +void AbsQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const +{ + const std::string descriptorName{"AbsQueueDescriptor"}; + + ValidateNumInputs(workloadInfo, descriptorName, 1); + ValidateNumOutputs(workloadInfo, descriptorName, 1); + + const TensorInfo& inputTensorInfo = workloadInfo.m_InputTensorInfos[0]; + const TensorInfo& outputTensorInfo = workloadInfo.m_OutputTensorInfos[0]; + + ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + + std::vector supportedTypes = + { + DataType::Float16, + DataType::Float32, + DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 + }; + + ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); + ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); +} + } // namespace armnn diff --git a/src/backends/backendsCommon/WorkloadData.hpp b/src/backends/backendsCommon/WorkloadData.hpp index c055beb88d..a43c7cccdb 100644 --- a/src/backends/backendsCommon/WorkloadData.hpp +++ b/src/backends/backendsCommon/WorkloadData.hpp @@ -524,4 +524,9 @@ struct QuantizedLstmQueueDescriptor : QueueDescriptor void Validate(const WorkloadInfo& workloadInfo) const; }; +struct AbsQueueDescriptor : QueueDescriptor +{ + void Validate(const WorkloadInfo& workloadInfo) const; +}; + } //namespace armnn diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp index ffef5b4eb7..9d081af8e9 100644 --- a/src/backends/backendsCommon/WorkloadFactory.cpp +++ b/src/backends/backendsCommon/WorkloadFactory.cpp @@ -69,6 +69,15 @@ bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId, switch(layer.GetType()) { + case LayerType::Abs: + { + const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo(); + const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo(); + result = layerSupportObject->IsAbsSupported(OverrideDataType(input, dataType), + OverrideDataType(output, dataType), + reason); + break; + } case LayerType::Activation: { auto cLayer = boost::polymorphic_downcast(&layer); @@ -952,6 +961,12 @@ bool IWorkloadFactory::IsLayerSupported(const IConnectableLayer& connectableLaye } // Default Implementations +std::unique_ptr IWorkloadFactory::CreateAbs(const AbsQueueDescriptor& descriptor, + const WorkloadInfo& info) const +{ + return std::unique_ptr(); +} + std::unique_ptr IWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor, const WorkloadInfo& info) const { diff --git a/src/backends/backendsCommon/WorkloadFactory.hpp b/src/backends/backendsCommon/WorkloadFactory.hpp index a9c6049c37..d0164b202d 100644 --- a/src/backends/backendsCommon/WorkloadFactory.hpp +++ b/src/backends/backendsCommon/WorkloadFactory.hpp @@ -49,6 +49,9 @@ public: virtual std::unique_ptr CreateTensorHandle(const TensorInfo& tensorInfo, DataLayout dataLayout) const = 0; + virtual std::unique_ptr CreateAbs(const AbsQueueDescriptor& descriptor, + const WorkloadInfo& info) const; + virtual std::unique_ptr CreateActivation(const ActivationQueueDescriptor& descriptor, const WorkloadInfo& info) const; diff --git a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp index 1f43c989d6..caf5e588f7 100644 --- a/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp +++ b/src/backends/backendsCommon/test/IsLayerSupportedTestImpl.hpp @@ -385,6 +385,8 @@ template struct LayerTypePolicy; // Every entry in the armnn::LayerType enum must be accounted for below. +DECLARE_LAYER_POLICY_1_PARAM(Abs) + DECLARE_LAYER_POLICY_2_PARAM(Activation) DECLARE_LAYER_POLICY_1_PARAM(Addition) -- cgit v1.2.1