ArmNN  NotReleased
RefWorkloadFactory.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #include <Layer.hpp>
10 #include "RefWorkloadFactory.hpp"
11 #include "RefBackendId.hpp"
13 #include "RefTensorHandle.hpp"
14 
15 
16 namespace armnn
17 {
18 
19 namespace
20 {
21 static const BackendId s_Id{RefBackendId()};
22 }
23 template <typename F32Workload, typename U8Workload, typename QueueDescriptorType>
24 std::unique_ptr<IWorkload> RefWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
25  const WorkloadInfo& info) const
26 {
27  return MakeWorkloadHelper<NullWorkload, F32Workload, U8Workload, NullWorkload, NullWorkload, NullWorkload>
28  (descriptor, info);
29 }
30 
31 template <DataType ArmnnType>
33 {
34  auto checkType = [](const TensorInfo& tensorInfo) {return tensorInfo.GetDataType() == ArmnnType;};
35  auto it = std::find_if(std::begin(info.m_InputTensorInfos), std::end(info.m_InputTensorInfos), checkType);
36  if (it != std::end(info.m_InputTensorInfos))
37  {
38  return true;
39  }
40  it = std::find_if(std::begin(info.m_OutputTensorInfos), std::end(info.m_OutputTensorInfos), checkType);
41  if (it != std::end(info.m_OutputTensorInfos))
42  {
43  return true;
44  }
45  return false;
46 }
47 
49 {
50  return IsDataType<DataType::Signed32>(info);
51 }
52 
54 {
55  return IsDataType<DataType::Float16>(info);
56 }
57 
59 {
60  return IsDataType<DataType::QSymmS16>(info);
61 }
62 
64 {
65  return IsDataType<DataType::QSymmS8>(info);
66 }
67 
69 {
70  return IsDataType<DataType::QAsymmS8>(info);
71 }
72 
74 {
75  return IsDataType<DataType::QAsymmU8>(info);
76 }
77 
78 RefWorkloadFactory::RefWorkloadFactory(const std::shared_ptr<RefMemoryManager>& memoryManager)
79  : m_MemoryManager(memoryManager)
80 {
81 }
82 
84  : m_MemoryManager(new RefMemoryManager())
85 {
86 }
87 
89 {
90  return s_Id;
91 }
92 
94  Optional<DataType> dataType,
95  std::string& outReasonIfUnsupported)
96 {
97  return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
98 }
99 
100 std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
101  const bool isMemoryManaged) const
102 {
103  // For Ref it is okay to make the TensorHandle memory managed as it can also store a pointer
104  // to unmanaged memory. This also ensures memory alignment.
105  boost::ignore_unused(isMemoryManaged);
106  return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
107 }
108 
109 std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
110  DataLayout dataLayout,
111  const bool isMemoryManaged) const
112 {
113  // For Ref it is okay to make the TensorHandle memory managed as it can also store a pointer
114  // to unmanaged memory. This also ensures memory alignment.
115  boost::ignore_unused(isMemoryManaged, dataLayout);
116  return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
117 }
118 
119 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateAbs(const AbsQueueDescriptor& descriptor,
120  const WorkloadInfo& info) const
121 {
122  boost::ignore_unused(descriptor);
123  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
124  elementwiseUnaryDescriptor.m_Parameters.m_Operation = UnaryOperation::Abs;
125 
126  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
127 }
128 
129 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
130  const WorkloadInfo& info) const
131 {
132  return std::make_unique<RefActivationWorkload>(descriptor, info);
133 }
134 
135 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
136  const WorkloadInfo& info) const
137 {
138  return std::make_unique<RefAdditionWorkload>(descriptor, info);
139 }
140 
141 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateArgMinMax(const ArgMinMaxQueueDescriptor& descriptor,
142  const WorkloadInfo& info) const
143 {
144  return std::make_unique<RefArgMinMaxWorkload>(descriptor, info);
145 }
146 
148  const BatchNormalizationQueueDescriptor& descriptor,
149  const WorkloadInfo& info) const
150 {
151  return std::make_unique<RefBatchNormalizationWorkload>(descriptor, info);
152 }
153 
154 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor,
155  const WorkloadInfo& info) const
156 {
157  return std::make_unique<RefBatchToSpaceNdWorkload>(descriptor, info);
158 }
159 
160 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateComparison(const ComparisonQueueDescriptor& descriptor,
161  const WorkloadInfo& info) const
162 {
163  return std::make_unique<RefComparisonWorkload>(descriptor, info);
164 }
165 
166 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& descriptor,
167  const WorkloadInfo& info) const
168 {
169  return std::make_unique<RefConcatWorkload>(descriptor, info);
170 }
171 
172 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
173  const WorkloadInfo& info) const
174 {
175  return std::make_unique<RefConstantWorkload>(descriptor, info);
176 }
177 
179  const ConvertFp16ToFp32QueueDescriptor& descriptor,
180  const WorkloadInfo& info) const
181 {
182  return std::make_unique<RefConvertFp16ToFp32Workload>(descriptor, info);
183 }
184 
186  const ConvertFp32ToFp16QueueDescriptor& descriptor,
187  const WorkloadInfo& info) const
188 {
189  return std::make_unique<RefConvertFp32ToFp16Workload>(descriptor, info);
190 }
191 
192 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
193  const WorkloadInfo& info) const
194 {
195  return std::make_unique<RefConvolution2dWorkload>(descriptor, info);
196 }
197 
198 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor,
199  const WorkloadInfo& info) const
200 {
201  if (IsFloat16(info))
202  {
203  return std::make_unique<RefDebugFloat16Workload>(descriptor, info);
204  }
205  if (IsQSymmS16(info))
206  {
207  return std::make_unique<RefDebugQSymmS16Workload>(descriptor, info);
208  }
209  if (IsQSymmS8(info))
210  {
211  return std::make_unique<RefDebugQSymmS8Workload>(descriptor, info);
212  }
213  if (IsQAsymmU8(info))
214  {
215  return std::make_unique<RefDebugQAsymmU8Workload>(descriptor, info);
216  }
217  if (IsQAsymmS8(info))
218  {
219  return std::make_unique<RefDebugQAsymmS8Workload>(descriptor, info);
220  }
221  if (IsSigned32(info))
222  {
223  return std::make_unique<RefDebugSigned32Workload>(descriptor, info);
224  }
225 
226  return MakeWorkload<RefDebugFloat32Workload, RefDebugQAsymmU8Workload>(descriptor, info);
227 }
228 
229 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor,
230  const WorkloadInfo& info) const
231 {
232  return std::make_unique<RefDepthToSpaceWorkload>(descriptor, info);
233 }
234 
236  const DepthwiseConvolution2dQueueDescriptor& descriptor,
237  const WorkloadInfo& info) const
238 {
239  return std::make_unique<RefDepthwiseConvolution2dWorkload>(descriptor, info);
240 }
241 
242 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDequantize(const DequantizeQueueDescriptor& descriptor,
243  const WorkloadInfo& info) const
244 {
245  return std::make_unique<RefDequantizeWorkload>(descriptor, info);
246 }
247 
249  const DetectionPostProcessQueueDescriptor& descriptor,
250  const WorkloadInfo& info) const
251 {
252  return std::make_unique<RefDetectionPostProcessWorkload>(descriptor, info);
253 }
254 
255 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
256  const WorkloadInfo& info) const
257 {
258  return std::make_unique<RefDivisionWorkload>(descriptor, info);
259 }
260 
262  const WorkloadInfo& info) const
263 {
264  return std::make_unique<RefElementwiseUnaryWorkload>(descriptor, info);
265 }
266 
267 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor,
268  const WorkloadInfo& info) const
269 {
270  boost::ignore_unused(descriptor);
271  ComparisonQueueDescriptor comparisonDescriptor;
272  comparisonDescriptor.m_Parameters.m_Operation = ComparisonOperation::Equal;
273 
274  return CreateComparison(comparisonDescriptor, info);
275 }
276 
278  const FakeQuantizationQueueDescriptor& descriptor,
279  const WorkloadInfo& info) const
280 {
281  return MakeWorkload<RefFakeQuantizationFloat32Workload, NullWorkload>(descriptor, info);
282 }
283 
284 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
285  const WorkloadInfo& info) const
286 {
287  return std::make_unique<RefFloorWorkload>(descriptor, info);
288 }
289 
290 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFullyConnected(
291  const FullyConnectedQueueDescriptor& descriptor,
292  const WorkloadInfo& info) const
293 {
294  return std::make_unique<RefFullyConnectedWorkload>(descriptor, info);
295 }
296 
297 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGather(const GatherQueueDescriptor& descriptor,
298  const WorkloadInfo& info) const
299 {
300  return std::make_unique<RefGatherWorkload>(descriptor, info);
301 }
302 
303 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
304  const WorkloadInfo& info) const
305 {
306  boost::ignore_unused(descriptor);
307  ComparisonQueueDescriptor comparisonDescriptor;
309 
310  return CreateComparison(comparisonDescriptor, info);
311 }
312 
313 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
314  const WorkloadInfo& info) const
315 {
316  if (info.m_InputTensorInfos.empty() )
317  {
318  throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Input cannot be zero length");
319  }
320  if (info.m_OutputTensorInfos.empty())
321  {
322  throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Output cannot be zero length");
323  }
324 
325  if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
326  {
327  throw InvalidArgumentException("RefWorkloadFactory::CreateInput: data input and output differ in byte count.");
328  }
329 
330  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
331 }
332 
334  const InstanceNormalizationQueueDescriptor& descriptor,
335  const WorkloadInfo& info) const
336 {
337  return std::make_unique<RefInstanceNormalizationWorkload>(descriptor, info);
338 }
339 
341  const WorkloadInfo& info) const
342 {
343  return std::make_unique<RefL2NormalizationWorkload>(descriptor, info);
344 }
345 
346 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLogSoftmax(const LogSoftmaxQueueDescriptor& descriptor,
347  const WorkloadInfo& info) const
348 {
349  return std::make_unique<RefLogSoftmaxWorkload>(descriptor, info);
350 }
351 
352 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
353  const WorkloadInfo& info) const
354 {
355  return std::make_unique<RefLstmWorkload>(descriptor, info);
356 }
357 
358 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMaximum(const MaximumQueueDescriptor& descriptor,
359  const WorkloadInfo& info) const
360 {
361  return std::make_unique<RefMaximumWorkload>(descriptor, info);
362 }
363 
364 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
365  const WorkloadInfo& info) const
366 {
367  return std::make_unique<RefMeanWorkload>(descriptor, info);
368 }
369 
370 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
371  const WorkloadInfo& info) const
372 {
373  if (descriptor.m_Inputs.empty())
374  {
375  throw InvalidArgumentException("RefWorkloadFactory: CreateMemCopy() expected an input tensor.");
376  }
377  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
378 }
379 
380 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& descriptor,
381  const WorkloadInfo& info) const
382 {
383  if (descriptor.m_Inputs.empty())
384  {
385  throw InvalidArgumentException("RefWorkloadFactory: CreateMemImport() expected an input tensor.");
386  }
387  return std::make_unique<ImportMemGenericWorkload>(descriptor, info);
388 }
389 
390 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
391  const WorkloadInfo& info) const
392 {
393  return CreateConcat(descriptor, info);
394 }
395 
396 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& descriptor,
397  const WorkloadInfo& info) const
398 {
399  return std::make_unique<RefMinimumWorkload>(descriptor, info);
400 }
401 
402 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
403  const WorkloadInfo& info) const
404 {
405  return std::make_unique<RefMultiplicationWorkload>(descriptor, info);
406 }
407 
408 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
409  const WorkloadInfo& info) const
410 {
411  return std::make_unique<RefNormalizationWorkload>(descriptor, info);
412 }
413 
414 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
415  const WorkloadInfo& info) const
416 {
417  if (info.m_InputTensorInfos.empty() )
418  {
419  throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Input cannot be zero length");
420  }
421  if (info.m_OutputTensorInfos.empty())
422  {
423  throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Output cannot be zero length");
424  }
425  if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
426  {
427  throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: data input and output differ in byte count.");
428  }
429 
430  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
431 }
432 
433 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
434  const WorkloadInfo& info) const
435 {
436  if (IsQSymmS16(info))
437  {
438  return std::make_unique<RefPadQSymm16Workload>(descriptor, info);
439  }
440  else if (IsFloat16(info))
441  {
442  return std::make_unique<RefPadFloat16Workload>(descriptor, info);
443  }
444  return MakeWorkload<RefPadFloat32Workload, RefPadQAsymm8Workload>(descriptor, info);
445 }
446 
447 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
448  const WorkloadInfo& info) const
449 {
450  if (IsQSymmS16(info))
451  {
452  return std::make_unique<RefPermuteQSymm16Workload>(descriptor, info);
453  }
455  NullWorkload, NullWorkload, NullWorkload>(descriptor, info);
456 }
457 
458 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
459  const WorkloadInfo& info) const
460 {
461  return std::make_unique<RefPooling2dWorkload>(descriptor, info);
462 }
463 
464 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& /*descriptor*/,
465  const WorkloadInfo& /*info*/) const
466 {
467  return nullptr;
468 }
469 
470 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePrelu(const PreluQueueDescriptor& descriptor,
471  const WorkloadInfo& info) const
472 {
473  return std::make_unique<RefPreluWorkload>(descriptor, info);
474 }
475 
476 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
477  const WorkloadInfo& info) const
478 {
479  return std::make_unique<RefQuantizeWorkload>(descriptor, info);
480 }
481 
482 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
483  const WorkloadInfo& info) const
484 {
485  return std::make_unique<RefReshapeWorkload>(descriptor, info);
486 }
487 
488 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
489  const WorkloadInfo& info) const
490 {
491  return std::make_unique<RefResizeWorkload>(descriptor, info);
492 }
493 
494 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
495  const WorkloadInfo& info) const
496 {
497  ResizeQueueDescriptor resizeDescriptor;
498  resizeDescriptor.m_Parameters.m_Method = ResizeMethod::Bilinear;
499  resizeDescriptor.m_Parameters.m_DataLayout = descriptor.m_Parameters.m_DataLayout;
500  resizeDescriptor.m_Parameters.m_TargetWidth = descriptor.m_Parameters.m_TargetWidth;
501  resizeDescriptor.m_Parameters.m_TargetHeight = descriptor.m_Parameters.m_TargetHeight;
502 
503  return CreateResize(resizeDescriptor, info);
504 }
505 
506 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor& descriptor,
507  const WorkloadInfo& info) const
508 {
509  boost::ignore_unused(descriptor);
510  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
511  elementwiseUnaryDescriptor.m_Parameters.m_Operation = UnaryOperation::Rsqrt;
512 
513  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
514 }
515 
516 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSlice(const SliceQueueDescriptor& descriptor,
517  const WorkloadInfo& info) const
518 {
519  return std::make_unique<RefSliceWorkload>(descriptor, info);
520 }
521 
522 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
523  const WorkloadInfo& info) const
524 {
525  return std::make_unique<RefSoftmaxWorkload>(descriptor, info);
526 }
527 
528 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
529  const WorkloadInfo& info) const
530 {
531  return std::make_unique<RefSpaceToBatchNdWorkload>(descriptor, info);
532 }
533 
534 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor,
535  const WorkloadInfo& info) const
536 {
537  return std::make_unique<RefSpaceToDepthWorkload>(descriptor, info);
538 }
539 
540 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
541  const WorkloadInfo& info) const
542 {
543  return std::make_unique<RefSplitterWorkload>(descriptor, info);
544 }
545 
546 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStack(const StackQueueDescriptor& descriptor,
547  const WorkloadInfo& info) const
548 {
549  return std::make_unique<RefStackWorkload>(descriptor, info);
550 }
551 
552 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
553  const WorkloadInfo& info) const
554 {
555  return std::make_unique<RefStridedSliceWorkload>(descriptor, info);
556 }
557 
558 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
559  const WorkloadInfo& info) const
560 {
561  return std::make_unique<RefSubtractionWorkload>(descriptor, info);
562 }
563 
565  const TransposeConvolution2dQueueDescriptor& descriptor,
566  const WorkloadInfo& info) const
567 {
568  return std::make_unique<RefTransposeConvolution2dWorkload>(descriptor, info);
569 }
570 
571 } // namespace armnn
std::unique_ptr< IWorkload > CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateLstm(const LstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateComparison(const ComparisonQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateEqual(const EqualQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool IsQSymmS8(const WorkloadInfo &info)
UnaryOperation m_Operation
Specifies the elementwiseUnary operation to execute.
Definition: Descriptors.hpp:98
std::unique_ptr< IWorkload > CreateDequantize(const DequantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
const BackendId & GetBackendId() const override
std::unique_ptr< IWorkload > CreateNormalization(const NormalizationQueueDescriptor &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 > CreateLogSoftmax(const LogSoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetHeight
Target height value.
std::unique_ptr< IWorkload > CreateMemCopy(const MemCopyQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePermute(const PermuteQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMerger(const MergerQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::vector< TensorInfo > m_OutputTensorInfos
std::unique_ptr< IWorkload > CreateDebug(const DebugQueueDescriptor &descriptor, const WorkloadInfo &info) const override
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::unique_ptr< IWorkload > CreateSubtraction(const SubtractionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePrelu(const PreluQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePooling2d(const Pooling2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
constexpr const char * RefBackendId()
std::unique_ptr< IWorkload > CreateDepthToSpace(const DepthToSpaceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvolution2d(const Convolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool IsDataType(const WorkloadInfo &info)
uint32_t m_TargetWidth
Target width value.
static bool IsLayerSupported(const Layer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFullyConnected(const FullyConnectedQueueDescriptor &descriptor, const WorkloadInfo &info) const override
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::unique_ptr< IWorkload > CreateBatchNormalization(const BatchNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMean(const MeanQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
std::unique_ptr< IWorkload > CreateResizeBilinear(const ResizeBilinearQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePad(const PadQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSoftmax(const SoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToDepth(const SpaceToDepthQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool IsFloat16(const WorkloadInfo &info)
bool IsQSymmS16(const WorkloadInfo &info)
std::vector< TensorInfo > m_InputTensorInfos
bool IsQAsymmS8(const WorkloadInfo &info)
std::unique_ptr< IWorkload > CreateConstant(const ConstantQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMinimum(const MinimumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RefPermuteWorkload< DataType::Float16 > RefPermuteFloat16Workload
std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const override
std::unique_ptr< IWorkload > CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSplitter(const SplitterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetWidth
Target width value.
std::unique_ptr< IWorkload > CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
DataLayout
Definition: Types.hpp:48
ComparisonOperation m_Operation
Specifies the comparison operation to execute.
Definition: Descriptors.hpp:78
std::unique_ptr< IWorkload > CreateResize(const ResizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateL2Normalization(const L2NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQuantize(const QuantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePreCompiled(const PreCompiledQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RefPermuteWorkload< DataType::QAsymmU8 > RefPermuteQAsymm8Workload
static bool IsLayerSupported(const BackendId &backendId, const IConnectableLayer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreateRsqrt(const RsqrtQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateAbs(const AbsQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStack(const StackQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateGather(const GatherQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::vector< ITensorHandle * > m_Inputs
std::unique_ptr< IWorkload > CreateFloor(const FloorQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStridedSlice(const StridedSliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSlice(const SliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFakeQuantization(const FakeQuantizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetHeight
Target height value.
std::unique_ptr< IWorkload > CreateOutput(const OutputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateArgMinMax(const ArgMinMaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMaximum(const MaximumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool IsSigned32(const WorkloadInfo &info)
std::unique_ptr< IWorkload > CreateInstanceNormalization(const InstanceNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDivision(const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateActivation(const ActivationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool IsQAsymmU8(const WorkloadInfo &info)
RefPermuteWorkload< DataType::Float32 > RefPermuteFloat32Workload
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 > CreateInput(const InputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConcat(const ConcatQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMultiplication(const MultiplicationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateReshape(const ReshapeQueueDescriptor &descriptor, const WorkloadInfo &info) const override