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