From 9145e38edf49fa4862008c163c34590141eecb14 Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Thu, 17 Aug 2023 18:44:58 +0100 Subject: IVGCVSW-7505 Create FusedLayer and NeonFusedWorkload for AddMulAdd Neon kernel Signed-off-by: Teresa Charlin Change-Id: Ic778d35b001474b44fb1e433a6fe276e4ec9f565 --- include/armnn/BackendHelper.hpp | 5 +++++ include/armnn/Descriptors.hpp | 21 +++++++++++++++++++++ include/armnn/DescriptorsFwd.hpp | 1 + include/armnn/INetwork.hpp | 8 ++++++++ include/armnn/Types.hpp | 8 +++++++- include/armnn/TypesUtils.hpp | 9 +++++++++ include/armnn/backends/WorkloadData.hpp | 5 +++++ 7 files changed, 56 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/armnn/BackendHelper.hpp b/include/armnn/BackendHelper.hpp index 59cbbfced3..986f854636 100644 --- a/include/armnn/BackendHelper.hpp +++ b/include/armnn/BackendHelper.hpp @@ -194,6 +194,11 @@ public: const FullyConnectedDescriptor& descriptor, Optional reasonIfUnsupported = EmptyOptional()); + bool IsFusedSupported(const std::vector>& inputs, + const std::vector>& outputs, + const FusedDescriptor& descriptor, + Optional reasonIfUnsupported = EmptyOptional()); + bool IsGatherSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, diff --git a/include/armnn/Descriptors.hpp b/include/armnn/Descriptors.hpp index f60e8f3bea..30eaefd83b 100644 --- a/include/armnn/Descriptors.hpp +++ b/include/armnn/Descriptors.hpp @@ -940,6 +940,27 @@ struct FillDescriptor : BaseDescriptor float m_Value; }; +/// A FusedDescriptor for the FusedLayer. +struct FusedDescriptor : BaseDescriptor +{ + FusedDescriptor(unsigned int numInputSlots = 4u, + unsigned int numOutputSlots = 2u, + FusedKernelType fusedType = FusedKernelType::AddMulAdd) + : m_NumInputSlots(numInputSlots), m_NumOutputSlots(numOutputSlots), m_FusedKernelType(fusedType) + {} + + bool operator ==(const FusedDescriptor& rhs) const + { + return m_NumInputSlots == rhs.m_NumInputSlots && + m_NumOutputSlots == rhs.m_NumOutputSlots && + m_FusedKernelType == rhs.m_FusedKernelType; + } + + unsigned int m_NumInputSlots; + unsigned int m_NumOutputSlots; + FusedKernelType m_FusedKernelType; +}; + /// A GatherDescriptor for the GatherLayer. struct GatherDescriptor : BaseDescriptor { diff --git a/include/armnn/DescriptorsFwd.hpp b/include/armnn/DescriptorsFwd.hpp index be1a3f6782..4b9a3e5060 100644 --- a/include/armnn/DescriptorsFwd.hpp +++ b/include/armnn/DescriptorsFwd.hpp @@ -25,6 +25,7 @@ struct ElementwiseUnaryDescriptor; struct FakeQuantizationDescriptor; struct FillDescriptor; struct FullyConnectedDescriptor; +struct FusedDescriptor; struct GatherDescriptor; struct InstanceNormalizationDescriptor; struct L2NormalizationDescriptor; diff --git a/include/armnn/INetwork.hpp b/include/armnn/INetwork.hpp index 1640d7c37d..c2c76e3d97 100644 --- a/include/armnn/INetwork.hpp +++ b/include/armnn/INetwork.hpp @@ -477,6 +477,14 @@ public: IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor, const char* name = nullptr); + /// Adds a Fused layer to the network. + /// Method use is for backend users. + /// @param fusedDescriptor - FusedDescriptor contains parameters for the Fused layer. + /// @param name - Optional name for the layer. + /// @return - Interface for configuring the layer. + IConnectableLayer* AddFusedLayer(const FusedDescriptor& fusedDescriptor, + const char* name = nullptr); + /// Adds a permute layer to the network. /// @param permuteDescriptor - PermuteDescriptor to configure the permute. /// @param name - Optional name for the layer. diff --git a/include/armnn/Types.hpp b/include/armnn/Types.hpp index bf4458ee7f..7cb3a859c7 100644 --- a/include/armnn/Types.hpp +++ b/include/armnn/Types.hpp @@ -262,6 +262,11 @@ enum class MemBlockStrategyType MultiAxisPacking = 1 }; +enum class FusedKernelType +{ + AddMulAdd = 0 +}; + /// Each backend should implement an IBackend. class IBackend { @@ -475,6 +480,7 @@ using InferenceTimingPair = std::pair; X(ElementwiseBinary) \ X(ReverseV2) \ X(Tile) \ + X(Fused) \ // New layers should be added at last position to minimize instability. @@ -486,7 +492,7 @@ enum class LayerType LIST_OF_LAYER_TYPE #undef X FirstLayer = Activation, - LastLayer = Tile + LastLayer = Fused }; const char* GetLayerTypeAsCString(LayerType type); diff --git a/include/armnn/TypesUtils.hpp b/include/armnn/TypesUtils.hpp index eeb5c9e614..ca098f60fb 100644 --- a/include/armnn/TypesUtils.hpp +++ b/include/armnn/TypesUtils.hpp @@ -115,6 +115,15 @@ constexpr char const* GetLogicalBinaryOperationAsCString(LogicalBinaryOperation } } +constexpr char const* GetFusedTypeAsCString(FusedKernelType type) +{ + switch (type) + { + case FusedKernelType::AddMulAdd: return "AddMulAdd"; + default: return "Unknown"; + } +} + constexpr char const* GetPoolingAlgorithmAsCString(PoolingAlgorithm pooling) { switch (pooling) diff --git a/include/armnn/backends/WorkloadData.hpp b/include/armnn/backends/WorkloadData.hpp index 21a597df8a..86796cbcc0 100644 --- a/include/armnn/backends/WorkloadData.hpp +++ b/include/armnn/backends/WorkloadData.hpp @@ -182,6 +182,11 @@ struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters +{ + void Validate(const WorkloadInfo& workloadInfo) const; +}; + // Permute layer workload data. struct PermuteQueueDescriptor : QueueDescriptorWithParameters { -- cgit v1.2.1