aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorTeresa Charlin <teresa.charlinreyes@arm.com>2023-08-17 18:44:58 +0100
committerTeresa Charlin <teresa.charlinreyes@arm.com>2023-08-28 12:37:25 +0100
commit9145e38edf49fa4862008c163c34590141eecb14 (patch)
tree64706ef579f548b804d5b674b33f6b239c638d0f /include
parente40cc8359b02a7786908294300c45b672cf6b0e4 (diff)
downloadarmnn-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.hpp5
-rw-r--r--include/armnn/Descriptors.hpp21
-rw-r--r--include/armnn/DescriptorsFwd.hpp1
-rw-r--r--include/armnn/INetwork.hpp8
-rw-r--r--include/armnn/Types.hpp8
-rw-r--r--include/armnn/TypesUtils.hpp9
-rw-r--r--include/armnn/backends/WorkloadData.hpp5
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>
{