diff options
author | Teresa Charlin <teresa.charlinreyes@arm.com> | 2023-08-17 18:44:58 +0100 |
---|---|---|
committer | Teresa Charlin <teresa.charlinreyes@arm.com> | 2023-08-28 12:37:25 +0100 |
commit | 9145e38edf49fa4862008c163c34590141eecb14 (patch) | |
tree | 64706ef579f548b804d5b674b33f6b239c638d0f /include | |
parent | e40cc8359b02a7786908294300c45b672cf6b0e4 (diff) | |
download | armnn-9145e38edf49fa4862008c163c34590141eecb14.tar.gz |
IVGCVSW-7505 Create FusedLayer and NeonFusedWorkload for AddMulAdd Neon kernel
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com>
Change-Id: Ic778d35b001474b44fb1e433a6fe276e4ec9f565
Diffstat (limited to 'include')
-rw-r--r-- | include/armnn/BackendHelper.hpp | 5 | ||||
-rw-r--r-- | include/armnn/Descriptors.hpp | 21 | ||||
-rw-r--r-- | include/armnn/DescriptorsFwd.hpp | 1 | ||||
-rw-r--r-- | include/armnn/INetwork.hpp | 8 | ||||
-rw-r--r-- | include/armnn/Types.hpp | 8 | ||||
-rw-r--r-- | include/armnn/TypesUtils.hpp | 9 | ||||
-rw-r--r-- | include/armnn/backends/WorkloadData.hpp | 5 |
7 files changed, 56 insertions, 1 deletions
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<std::string&> reasonIfUnsupported = EmptyOptional()); + bool IsFusedSupported(const std::vector<std::reference_wrapper<TensorInfo>>& inputs, + const std::vector<std::reference_wrapper<TensorInfo>>& outputs, + const FusedDescriptor& descriptor, + Optional<std::string&> 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<HighResolutionClock, HighResolutionClock>; 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<FullyConnec void Validate(const WorkloadInfo& workloadInfo) const; }; +struct FusedQueueDescriptor : QueueDescriptorWithParameters<FusedDescriptor> +{ + void Validate(const WorkloadInfo& workloadInfo) const; +}; + // Permute layer workload data. struct PermuteQueueDescriptor : QueueDescriptorWithParameters<PermuteDescriptor> { |