ArmNN
 21.02
NeonWorkloadFactory.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include <armnn/Optional.hpp>
9 
13 
14 #include <arm_compute/runtime/IScheduler.h>
15 
16 namespace armnn
17 {
18 
19 // Neon workload factory.
21 {
22 public:
23  NeonWorkloadFactory(const std::shared_ptr<NeonMemoryManager>& memoryManager);
24 
25  NeonWorkloadFactory(const std::shared_ptr<NeonMemoryManager>& memoryManager,
27 
28  const BackendId& GetBackendId() const override;
29 
30  static bool IsLayerSupported(const Layer& layer,
31  Optional<DataType> dataType,
32  std::string& outReasonIfUnsupported);
33 
34  static bool IsLayerSupported(const IConnectableLayer& layer,
35  Optional<DataType> dataType,
36  std::string& outReasonIfUnsupported,
37  const ModelOptions& modelOptions);
38 
39  bool SupportsSubTensors() const override { return true; }
40 
41  ARMNN_DEPRECATED_MSG("Use ITensorHandleFactory::CreateSubTensorHandle instead")
42  std::unique_ptr<ITensorHandle> CreateSubTensorHandle(ITensorHandle& parent,
43  TensorShape const& subTensorShape,
44  unsigned int const* subTensorOrigin) const override;
45 
46  ARMNN_DEPRECATED_MSG("Use ITensorHandleFactory::CreateTensorHandle instead")
47  std::unique_ptr<ITensorHandle> CreateTensorHandle(const TensorInfo& tensorInfo,
48  const bool IsMemoryManaged = true) const override;
49 
50  ARMNN_DEPRECATED_MSG("Use ITensorHandleFactory::CreateTensorHandle instead")
51  std::unique_ptr<ITensorHandle> CreateTensorHandle(const TensorInfo& tensorInfo,
52  DataLayout dataLayout,
53  const bool IsMemoryManaged = true) const override;
54 
55  ARMNN_DEPRECATED_MSG("Use CreateElementwiseUnary instead")
56  std::unique_ptr<IWorkload> CreateAbs(const AbsQueueDescriptor& descriptor,
57  const WorkloadInfo& info) const override;
58 
59  std::unique_ptr<IWorkload> CreateActivation(const ActivationQueueDescriptor& descriptor,
60  const WorkloadInfo& info) const override;
61 
62  std::unique_ptr<IWorkload> CreateAddition(const AdditionQueueDescriptor& descriptor,
63  const WorkloadInfo& info) const override;
64 
65  std::unique_ptr<IWorkload> CreateArgMinMax(const ArgMinMaxQueueDescriptor& descriptor,
66  const WorkloadInfo& info) const override;
67 
68  std::unique_ptr<IWorkload> CreateBatchNormalization(const BatchNormalizationQueueDescriptor& descriptor,
69  const WorkloadInfo& info) const override;
70 
71  std::unique_ptr<IWorkload> CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor,
72  const WorkloadInfo& Info) const override;
73 
74  std::unique_ptr<IWorkload> CreateComparison(const ComparisonQueueDescriptor& descriptor,
75  const WorkloadInfo& Info) const override;
76 
77  std::unique_ptr<IWorkload> CreateConcat(const ConcatQueueDescriptor& descriptor,
78  const WorkloadInfo& info) const override;
79 
80  std::unique_ptr<IWorkload> CreateConstant(const ConstantQueueDescriptor& descriptor,
81  const WorkloadInfo& info) const override;
82 
83  std::unique_ptr<IWorkload> CreateConvertBf16ToFp32(const ConvertBf16ToFp32QueueDescriptor& descriptor,
84  const WorkloadInfo& info) const override;
85 
86  std::unique_ptr<IWorkload> CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor& descriptor,
87  const WorkloadInfo& info) const override;
88 
89  std::unique_ptr<IWorkload> CreateConvertFp32ToBf16(const ConvertFp32ToBf16QueueDescriptor& descriptor,
90  const WorkloadInfo& info) const override;
91 
92  std::unique_ptr<IWorkload> CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor& descriptor,
93  const WorkloadInfo& info) const override;
94 
95  std::unique_ptr<IWorkload> CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
96  const WorkloadInfo& info) const override;
97 
98  std::unique_ptr<IWorkload> CreateDebug(const DebugQueueDescriptor& descriptor,
99  const WorkloadInfo& info) const override;
100 
101  std::unique_ptr<IWorkload> CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor,
102  const WorkloadInfo& info) const override;
103 
104  std::unique_ptr<IWorkload> CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor& descriptor,
105  const WorkloadInfo& info) const override;
106 
107  std::unique_ptr<IWorkload> CreateDequantize(const DequantizeQueueDescriptor& descriptor,
108  const WorkloadInfo& info) const override;
109 
110  std::unique_ptr<IWorkload> CreateDetectionPostProcess(const DetectionPostProcessQueueDescriptor& descriptor,
111  const WorkloadInfo& info) const override;
112 
113  std::unique_ptr<IWorkload> CreateDivision(const DivisionQueueDescriptor& descriptor,
114  const WorkloadInfo& info) const override;
115 
116  std::unique_ptr<IWorkload> CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor& descriptor,
117  const WorkloadInfo& Info) const override;
118 
119  ARMNN_DEPRECATED_MSG("Use CreateComparison instead")
120  std::unique_ptr<IWorkload> CreateEqual(const EqualQueueDescriptor& descriptor,
121  const WorkloadInfo& info) const override;
122 
123  std::unique_ptr<IWorkload> CreateFill(const FillQueueDescriptor& descriptor,
124  const WorkloadInfo& info) const override;
125 
126  std::unique_ptr<IWorkload> CreateFloor(const FloorQueueDescriptor& descriptor,
127  const WorkloadInfo& info) const override;
128 
129  std::unique_ptr<IWorkload> CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
130  const WorkloadInfo& info) const override;
131 
132  std::unique_ptr<IWorkload> CreateGather(const GatherQueueDescriptor& descriptor,
133  const WorkloadInfo& info) const override;
134 
135  ARMNN_DEPRECATED_MSG("Use CreateComparison instead")
136  std::unique_ptr<IWorkload> CreateGreater(const GreaterQueueDescriptor& descriptor,
137  const WorkloadInfo& info) const override;
138 
139  std::unique_ptr<IWorkload> CreateInput(const InputQueueDescriptor& descriptor,
140  const WorkloadInfo& info) const override;
141 
142  std::unique_ptr<IWorkload> CreateInstanceNormalization(const InstanceNormalizationQueueDescriptor& descriptor,
143  const WorkloadInfo& info) const override;
144 
145  std::unique_ptr<IWorkload> CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
146  const WorkloadInfo& info) const override;
147 
148  std::unique_ptr<IWorkload> CreateLogicalBinary(const LogicalBinaryQueueDescriptor& descriptor,
149  const WorkloadInfo& info) const override;
150 
151  std::unique_ptr<IWorkload> CreateLogSoftmax(const LogSoftmaxQueueDescriptor& descriptor,
152  const WorkloadInfo& info) const override;
153 
154  std::unique_ptr<IWorkload> CreateLstm(const LstmQueueDescriptor& descriptor,
155  const WorkloadInfo& info) const override;
156 
157  std::unique_ptr<IWorkload> CreateMaximum(const MaximumQueueDescriptor& descriptor,
158  const WorkloadInfo& info) const override;
159 
160  std::unique_ptr<IWorkload> CreateMean(const MeanQueueDescriptor& descriptor,
161  const WorkloadInfo& Info) const override;
162 
163  std::unique_ptr<IWorkload> CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
164  const WorkloadInfo& info) const override;
165 
166  std::unique_ptr<IWorkload> CreateMemImport(const MemImportQueueDescriptor& descriptor,
167  const WorkloadInfo& info) const override;
168 
169  ARMNN_DEPRECATED_MSG("Use CreateConcat instead")
170  std::unique_ptr<IWorkload> CreateMerger(const MergerQueueDescriptor& descriptor,
171  const WorkloadInfo& info) const override;
172 
173  std::unique_ptr<IWorkload> CreateMinimum(const MinimumQueueDescriptor& descriptor,
174  const WorkloadInfo& info) const override;
175 
176  std::unique_ptr<IWorkload> CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
177  const WorkloadInfo& info) const override;
178 
179  std::unique_ptr<IWorkload> CreateNormalization(const NormalizationQueueDescriptor& descriptor,
180  const WorkloadInfo& info) const override;
181 
182  std::unique_ptr<IWorkload> CreateOutput(const OutputQueueDescriptor& descriptor,
183  const WorkloadInfo& info) const override;
184 
185  std::unique_ptr<IWorkload> CreatePad(const PadQueueDescriptor& descriptor,
186  const WorkloadInfo& info) const override;
187 
188  std::unique_ptr<IWorkload> CreatePermute(const PermuteQueueDescriptor& descriptor,
189  const WorkloadInfo& info) const override;
190 
191  std::unique_ptr<IWorkload> CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
192  const WorkloadInfo& info) const override;
193 
194  std::unique_ptr<IWorkload> CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor,
195  const WorkloadInfo& info) const override;
196 
197  std::unique_ptr<IWorkload> CreatePrelu(const PreluQueueDescriptor& descriptor,
198  const WorkloadInfo& info) const override;
199 
200  std::unique_ptr<IWorkload> CreateQLstm(const QLstmQueueDescriptor& descriptor,
201  const WorkloadInfo& info) const override;
202 
203  std::unique_ptr<IWorkload> CreateQuantize(const QuantizeQueueDescriptor& descriptor,
204  const WorkloadInfo& info) const override;
205 
206  std::unique_ptr<IWorkload> CreateQuantizedLstm(const QuantizedLstmQueueDescriptor& descriptor,
207  const WorkloadInfo& info) const override;
208 
209  std::unique_ptr<IWorkload> CreateRank(const RankQueueDescriptor& descriptor,
210  const WorkloadInfo& info) const override;
211 
212  std::unique_ptr<IWorkload> CreateReduce(const ReduceQueueDescriptor& descriptor,
213  const WorkloadInfo& info) const override;
214 
215  std::unique_ptr<IWorkload> CreateReshape(const ReshapeQueueDescriptor& descriptor,
216  const WorkloadInfo& info) const override;
217 
218  std::unique_ptr<IWorkload> CreateResize(const ResizeQueueDescriptor& descriptor,
219  const WorkloadInfo& info) const override;
220 
221  ARMNN_DEPRECATED_MSG("Use CreateResize instead")
222  std::unique_ptr<IWorkload> CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
223  const WorkloadInfo& info) const override;
224 
225  ARMNN_DEPRECATED_MSG("Use CreateElementwiseUnary instead")
226  std::unique_ptr<IWorkload> CreateRsqrt(const RsqrtQueueDescriptor& descriptor,
227  const WorkloadInfo& info) const override;
228 
229  std::unique_ptr<IWorkload> CreateSlice(const SliceQueueDescriptor& descriptor,
230  const WorkloadInfo& info) const override;
231 
232  std::unique_ptr<IWorkload> CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
233  const WorkloadInfo& info) const override;
234 
235  std::unique_ptr<IWorkload> CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
236  const WorkloadInfo& info) const override;
237 
238  std::unique_ptr<IWorkload> CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor,
239  const WorkloadInfo& info) const override;
240 
241  std::unique_ptr<IWorkload> CreateSplitter(const SplitterQueueDescriptor& descriptor,
242  const WorkloadInfo& info) const override;
243 
244  std::unique_ptr<IWorkload> CreateStack(const StackQueueDescriptor& descriptor,
245  const WorkloadInfo& info) const override;
246 
247  std::unique_ptr<IWorkload> CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
248  const WorkloadInfo& info) const override;
249 
250  std::unique_ptr<IWorkload> CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
251  const WorkloadInfo& info) const override;
252 
253  std::unique_ptr<IWorkload> CreateTranspose(const TransposeQueueDescriptor& descriptor,
254  const WorkloadInfo& info) const override;
255 
256  std::unique_ptr<IWorkload> CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor& descriptor,
257  const WorkloadInfo& info) const override;
258 
259 private:
260  void SetNumberOfThreads();
261 
262  mutable std::shared_ptr<NeonMemoryManager> m_MemoryManager;
264 };
265 
266 } // namespace armnn
std::unique_ptr< IWorkload > CreateDepthToSpace(const DepthToSpaceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDebug(const DebugQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateLstm(const LstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:62
std::unique_ptr< IWorkload > CreateLogSoftmax(const LogSoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
DataLayout
Definition: Types.hpp:50
std::unique_ptr< IWorkload > CreateGather(const GatherQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateNormalization(const NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFullyConnected(const FullyConnectedQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateComparison(const ComparisonQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
std::unique_ptr< IWorkload > CreateRsqrt(const RsqrtQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePad(const PadQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::vector< BackendOptions > ModelOptions
std::unique_ptr< IWorkload > CreateGreater(const GreaterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMemImport(const MemImportQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateL2Normalization(const L2NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStridedSlice(const StridedSliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMinimum(const MinimumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMultiplication(const MultiplicationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQuantize(const QuantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
Copyright (c) 2021 ARM Limited and Contributors.
std::unique_ptr< ITensorHandle > CreateSubTensorHandle(ITensorHandle &parent, TensorShape const &subTensorShape, unsigned int const *subTensorOrigin) const override
std::unique_ptr< IWorkload > CreateConvolution2d(const Convolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
NeonWorkloadFactory(const std::shared_ptr< NeonMemoryManager > &memoryManager)
std::unique_ptr< IWorkload > CreateReshape(const ReshapeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
static bool IsLayerSupported(const Layer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreateAbs(const AbsQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSoftmax(const SoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateResizeBilinear(const ResizeBilinearQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateEqual(const EqualQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSlice(const SliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::shared_ptr< IBackendModelContext > IBackendSpecificModelContextPtr
std::unique_ptr< IWorkload > CreateQuantizedLstm(const QuantizedLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool SupportsSubTensors() const override
const BackendId & GetBackendId() const override
std::unique_ptr< IWorkload > CreateSplitter(const SplitterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFill(const FillQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDequantize(const DequantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMemCopy(const MemCopyQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateInstanceNormalization(const InstanceNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePreCompiled(const PreCompiledQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateLogicalBinary(const LogicalBinaryQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateOutput(const OutputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp32ToBf16(const ConvertFp32ToBf16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConstant(const ConstantQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStack(const StackQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFloor(const FloorQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateActivation(const ActivationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMerger(const MergerQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDivision(const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateReduce(const ReduceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateInput(const InputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQLstm(const QLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateBatchNormalization(const BatchNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
Contains information about inputs and outputs to a layer.
std::unique_ptr< IWorkload > CreateResize(const ResizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
#define ARMNN_DEPRECATED_MSG(message)
Definition: Deprecated.hpp:43
std::unique_ptr< IWorkload > CreateConcat(const ConcatQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePooling2d(const Pooling2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
std::unique_ptr< IWorkload > CreateAddition(const AdditionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDetectionPostProcess(const DetectionPostProcessQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSubtraction(const SubtractionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMaximum(const MaximumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMean(const MeanQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
std::unique_ptr< IWorkload > CreateConvertBf16ToFp32(const ConvertBf16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateRank(const RankQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateArgMinMax(const ArgMinMaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePrelu(const PreluQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateTranspose(const TransposeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToDepth(const SpaceToDepthQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePermute(const PermuteQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const override