ArmNN
 20.11
ClWorkloadFactory.cpp
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 #include "ClWorkloadFactory.hpp"
6 #include "ClBackendId.hpp"
8 
9 #include <Layer.hpp>
10 
11 #include <armnn/Exceptions.hpp>
12 #include <armnn/Utils.hpp>
16 
21 
22 #include <cl/ClTensorHandle.hpp>
25 
26 #include <arm_compute/core/CL/CLKernelLibrary.h>
27 #include <arm_compute/runtime/CL/CLBufferAllocator.h>
28 #include <arm_compute/runtime/CL/CLScheduler.h>
29 
30 namespace armnn
31 {
32 
33 namespace
34 {
35 static const BackendId s_Id{ClBackendId()};
36 }
37 
39  Optional<DataType> dataType,
40  std::string& outReasonIfUnsupported)
41 {
42  return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
43 }
44 
46  Optional<DataType> dataType,
47  std::string& outReasonIfUnsupported,
48  const ModelOptions& modelOptions)
49 {
50  return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported, modelOptions);
51 }
52 
54 {
55  return s_Id;
56 }
57 
58 template <typename FloatWorkload, typename Uint8Workload, typename QueueDescriptorType, typename... Args>
59 std::unique_ptr<IWorkload> ClWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
60  const WorkloadInfo& info,
61  Args&&... args)
62 {
63  try
64  {
65  return MakeWorkloadHelper<FloatWorkload, Uint8Workload>(descriptor, info, std::forward<Args>(args)...);
66  }
67  catch (const cl::Error& clError)
68  {
69  throw WrapClError(clError, CHECK_LOCATION());
70  }
71 }
72 
73 template <typename Workload, typename QueueDescriptorType, typename... Args>
74 std::unique_ptr<IWorkload> ClWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
75  const WorkloadInfo& info,
76  Args&&... args)
77 {
78  try
79  {
80  return std::make_unique<Workload>(descriptor, info, std::forward<Args>(args)...);
81  }
82  catch (const cl::Error& clError)
83  {
84  throw WrapClError(clError, CHECK_LOCATION());
85  }
86 }
87 
88 ClWorkloadFactory::ClWorkloadFactory(const std::shared_ptr<ClMemoryManager>& memoryManager)
89  : m_MemoryManager(memoryManager), m_ModelContextPtr(IBackendInternal::IBackendSpecificModelContextPtr{})
90 {
91 }
92 
93 ClWorkloadFactory::ClWorkloadFactory(const std::shared_ptr<ClMemoryManager>& memoryManager,
95  : m_MemoryManager(memoryManager), m_ModelContextPtr(modelContextPtr)
96 {
97 }
98 
99 std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
100  const bool IsMemoryManaged) const
101 {
102  IgnoreUnused(IsMemoryManaged);
103  std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo);
104  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
105 
106  return tensorHandle;
107 }
108 
109 std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
110  DataLayout dataLayout,
111  const bool IsMemoryManaged) const
112 {
113  IgnoreUnused(IsMemoryManaged);
114  std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo, dataLayout);
115  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
116 
117  return tensorHandle;
118 }
119 
120 std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
121  TensorShape const& subTensorShape,
122  unsigned int const* subTensorOrigin) const
123 {
125  arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
126 
127  coords.set_num_dimensions(subTensorShape.GetNumDimensions());
128  for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++)
129  {
130  // Arm compute indexes tensor coords in reverse order.
131  unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
132  coords.set(i, armnn::numeric_cast<int>(subTensorOrigin[revertedIndex]));
133  }
134 
135  const arm_compute::TensorShape parentShape = armcomputetensorutils::BuildArmComputeTensorShape(parent.GetShape());
136  if (!::arm_compute::error_on_invalid_subtensor(__func__, __FILE__, __LINE__, parentShape, coords, shape))
137  {
138  return nullptr;
139  }
140 
141  return std::make_unique<ClSubTensorHandle>(
142  PolymorphicDowncast<IClTensorHandle*>(&parent), shape, coords);
143 }
144 
145 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAbs(const AbsQueueDescriptor& descriptor,
146  const WorkloadInfo& info) const
147 {
148  IgnoreUnused(descriptor);
149 
150  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
151  elementwiseUnaryDescriptor.m_Parameters = ElementwiseUnaryDescriptor(UnaryOperation::Abs);
152 
153  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
154 }
155 
156 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
157  const WorkloadInfo& info) const
158 {
159  return MakeWorkload<ClActivationWorkload>(descriptor, info);
160 }
161 
162 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
163  const WorkloadInfo& info) const
164 {
165  return MakeWorkload<ClAdditionWorkload>(descriptor, info);
166 }
167 
168 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateArgMinMax(const ArgMinMaxQueueDescriptor& descriptor,
169  const WorkloadInfo& info) const
170 {
171  return std::make_unique<ClArgMinMaxWorkload>(descriptor, info);
172 }
173 
175  const BatchNormalizationQueueDescriptor& descriptor,
176  const WorkloadInfo& info) const
177 {
178  return MakeWorkload<ClBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
179 }
180 
181 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor,
182  const WorkloadInfo& info) const
183 {
184  return MakeWorkload<ClBatchToSpaceNdWorkload>(descriptor, info);
185 }
186 
187 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateComparison(const ComparisonQueueDescriptor& descriptor,
188  const WorkloadInfo& info) const
189 {
190  return MakeWorkload<ClComparisonWorkload>(descriptor, info);
191 }
192 
193 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& descriptor,
194  const WorkloadInfo& info) const
195 {
196  return MakeWorkload<ClConcatWorkload>(descriptor, info);
197 }
198 
199 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
200  const WorkloadInfo& info) const
201 {
202  return MakeWorkload<ClConstantWorkload>(descriptor, info);
203 }
204 
206  const ConvertFp16ToFp32QueueDescriptor& descriptor,
207  const WorkloadInfo& info) const
208 {
209  return MakeWorkload<ClConvertFp16ToFp32Workload>(descriptor, info);
210 }
211 
213  const ConvertFp32ToFp16QueueDescriptor& descriptor,
214  const WorkloadInfo& info) const
215 {
216  return MakeWorkload<ClConvertFp32ToFp16Workload>(descriptor, info);
217 }
218 
219 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
220  const WorkloadInfo& info) const
221 {
222  bool isFastMathEnabled = false;
223  if (m_ModelContextPtr)
224  {
225  if (m_ModelContextPtr.get() != nullptr)
226  {
227  auto modelOptions = dynamic_cast<ClBackendModelContext*>(m_ModelContextPtr.get());
228  if (modelOptions)
229  {
230  isFastMathEnabled = modelOptions->IsFastMathEnabled();
231  }
232  }
233  }
234  return MakeWorkload<ClConvolution2dWorkload>(descriptor,
235  info,
236  m_MemoryManager->GetIntraLayerManager(),
237  isFastMathEnabled);
238 }
239 
240 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor,
241  const WorkloadInfo& info) const
242 {
243  return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
244 }
245 
246 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor,
247  const WorkloadInfo& info) const
248 {
249  return MakeWorkload<ClDepthToSpaceWorkload>(descriptor, info);
250 }
251 
253  const DepthwiseConvolution2dQueueDescriptor& descriptor,
254  const WorkloadInfo& info) const
255 {
256  return MakeWorkload<ClDepthwiseConvolutionWorkload>(descriptor, info);
257 }
258 
259 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDequantize(const DequantizeQueueDescriptor& descriptor,
260  const WorkloadInfo& info) const
261 {
262  return MakeWorkload<ClDequantizeWorkload>(descriptor, info);
263 }
264 
266  const DetectionPostProcessQueueDescriptor& descriptor,
267  const WorkloadInfo& info) const
268 {
269  return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
270 }
271 
272 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
273  const WorkloadInfo& info) const
274 {
275  return MakeWorkload<ClDivisionFloatWorkload, NullWorkload>(descriptor, info);
276 }
277 
279  const WorkloadInfo& info) const
280 {
281  switch(descriptor.m_Parameters.m_Operation)
282  {
283  case UnaryOperation::Abs:
284  {
285  AbsQueueDescriptor absQueueDescriptor;
286  absQueueDescriptor.m_Inputs = descriptor.m_Inputs;
287  absQueueDescriptor.m_Outputs = descriptor.m_Outputs;
288 
289  return std::make_unique<ClAbsWorkload>(absQueueDescriptor, info);
290  }
291  case UnaryOperation::Exp:
292  return std::make_unique<ClExpWorkload>(descriptor, info);
293  case UnaryOperation::Neg:
294  return std::make_unique<ClNegWorkload>(descriptor, info);
296  {
297  RsqrtQueueDescriptor rsqrtQueueDescriptor;
298  rsqrtQueueDescriptor.m_Inputs = descriptor.m_Inputs;
299  rsqrtQueueDescriptor.m_Outputs = descriptor.m_Outputs;
300 
301  return std::make_unique<ClRsqrtWorkload>(rsqrtQueueDescriptor, info);
302  }
304  return std::make_unique<ClLogicalNotWorkload>(descriptor, info);
305  default:
306  return nullptr;
307  }
308 }
309 
310 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor,
311  const WorkloadInfo& info) const
312 {
313  IgnoreUnused(descriptor);
314 
315  ComparisonQueueDescriptor comparisonDescriptor;
317 
318  return CreateComparison(comparisonDescriptor, info);
319 }
320 
321 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFill(const FillQueueDescriptor& descriptor,
322  const WorkloadInfo& info) const
323 {
324  return std::make_unique<ClFillWorkload>(descriptor, info);
325 }
326 
327 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
328  const WorkloadInfo& info) const
329 {
330  return MakeWorkload<ClFloorFloatWorkload, NullWorkload>(descriptor, info);
331 }
332 
333 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
334  const WorkloadInfo& info) const
335 {
336  return MakeWorkload<ClFullyConnectedWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
337 }
338 
339 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateGather(const GatherQueueDescriptor& descriptor,
340  const WorkloadInfo& info) const
341 {
342  return MakeWorkload<ClGatherWorkload>(descriptor, info);
343 }
344 
345 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
346  const WorkloadInfo& info) const
347 {
348  IgnoreUnused(descriptor);
349 
350  ComparisonQueueDescriptor comparisonDescriptor;
352 
353  return CreateComparison(comparisonDescriptor, info);
354 }
355 
356 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
357  const WorkloadInfo& info) const
358 {
359  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
360 }
361 
363  const InstanceNormalizationQueueDescriptor& descriptor,
364  const WorkloadInfo& info) const
365 {
366  return MakeWorkload<ClInstanceNormalizationWorkload>(descriptor, info);
367 }
368 
370  const WorkloadInfo& info) const
371 {
372  return MakeWorkload<ClL2NormalizationFloatWorkload, NullWorkload>(descriptor, info);
373 }
374 
375 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLogicalBinary(const LogicalBinaryQueueDescriptor& descriptor,
376  const WorkloadInfo& info) const
377 {
378  switch(descriptor.m_Parameters.m_Operation)
379  {
381  return std::make_unique<ClLogicalAndWorkload>(descriptor, info);
383  return std::make_unique<ClLogicalOrWorkload>(descriptor, info);
384  default:
385  return nullptr;
386  }
387 }
388 
389 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLogicalUnary(const ElementwiseUnaryQueueDescriptor& descriptor,
390  const WorkloadInfo& info) const
391 {
392  switch(descriptor.m_Parameters.m_Operation)
393  {
395  return std::make_unique<ClLogicalNotWorkload>(descriptor, info);
396  default:
397  return nullptr;
398  }
399 }
400 
401 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLogSoftmax(const LogSoftmaxQueueDescriptor& descriptor,
402  const WorkloadInfo& info) const
403 {
404  return MakeWorkload<ClLogSoftmaxWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
405 }
406 
407 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
408  const WorkloadInfo& info) const
409 {
410  return MakeWorkload<ClLstmFloatWorkload, NullWorkload>(descriptor, info);
411 }
412 
413 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMaximum(const MaximumQueueDescriptor& descriptor,
414  const WorkloadInfo& info) const
415 {
416  return MakeWorkload<ClMaximumWorkload>(descriptor, info);
417 }
418 
419 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
420  const WorkloadInfo& info) const
421 {
422  return MakeWorkload<ClMeanWorkload>(descriptor, info);
423 }
424 
425 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
426  const WorkloadInfo& info) const
427 {
428  if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
429  {
430  throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemCopy workload");
431  }
432 
433  return MakeWorkload<CopyMemGenericWorkload>(descriptor, info);
434 }
435 
436 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& descriptor,
437  const WorkloadInfo& info) const
438 {
439  if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
440  {
441  throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemImport workload");
442  }
443 
444  return std::make_unique<ImportMemGenericWorkload>(descriptor, info);
445 }
446 
447 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
448  const WorkloadInfo& info) const
449 {
450  return CreateConcat(descriptor, info);
451 }
452 
453 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& descriptor,
454  const WorkloadInfo& info) const
455 {
456  return MakeWorkload<ClMinimumWorkload>(descriptor, info);
457 }
458 
459 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
460  const WorkloadInfo& info) const
461 {
462  return MakeWorkload<ClMultiplicationWorkload>(descriptor, info);
463 }
464 
465 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
466  const WorkloadInfo& info) const
467 {
468  return MakeWorkload<ClNormalizationFloatWorkload, NullWorkload>(descriptor, info);
469 }
470 
471 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
472  const WorkloadInfo& info) const
473 {
474  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
475 }
476 
477 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
478  const WorkloadInfo& info) const
479 {
480  return MakeWorkload<ClPadWorkload>(descriptor, info);
481 }
482 
483 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
484  const WorkloadInfo& info) const
485 {
486  return MakeWorkload<ClPermuteWorkload>(descriptor, info);
487 }
488 
489 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
490  const WorkloadInfo& info) const
491 {
492  return MakeWorkload<ClPooling2dWorkload>(descriptor, info);
493 }
494 
495 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor,
496  const WorkloadInfo& info) const
497 {
498  return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
499 }
500 
501 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePrelu(const PreluQueueDescriptor &descriptor,
502  const WorkloadInfo &info) const
503 {
504  return MakeWorkload<ClPreluWorkload>(descriptor, info);
505 }
506 
507 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateQLstm(const QLstmQueueDescriptor& descriptor,
508  const WorkloadInfo& info) const
509 {
510  return std::make_unique<ClQLstmWorkload>(descriptor, info);
511 }
512 
513 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
514  const WorkloadInfo& info) const
515 {
516  return MakeWorkload<ClQuantizeWorkload>(descriptor, info);
517 }
518 
519 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateQuantizedLstm(const QuantizedLstmQueueDescriptor& descriptor,
520  const WorkloadInfo& info) const
521 {
522  return MakeWorkload<ClQuantizedLstmWorkload>(descriptor, info);
523 }
524 
525 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
526  const WorkloadInfo& info) const
527 {
528  return MakeWorkload<ClReshapeWorkload>(descriptor, info);
529 }
530 
531 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
532  const WorkloadInfo& info) const
533 {
534  return MakeWorkload<ClResizeWorkload>(descriptor, info);
535 }
536 
537 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
538  const WorkloadInfo& info) const
539 {
540  ResizeQueueDescriptor resizeDescriptor;
541  resizeDescriptor.m_Inputs = descriptor.m_Inputs;
542  resizeDescriptor.m_Outputs = descriptor.m_Outputs;
543 
544  resizeDescriptor.m_Parameters.m_Method = ResizeMethod::Bilinear;
545  resizeDescriptor.m_Parameters.m_DataLayout = descriptor.m_Parameters.m_DataLayout;
546  resizeDescriptor.m_Parameters.m_TargetHeight = descriptor.m_Parameters.m_TargetHeight;
547  resizeDescriptor.m_Parameters.m_TargetWidth = descriptor.m_Parameters.m_TargetWidth;
548 
549  return CreateResize(resizeDescriptor, info);
550 }
551 
552 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor& descriptor,
553  const WorkloadInfo& info) const
554 {
555  IgnoreUnused(descriptor);
556 
557  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
558  elementwiseUnaryDescriptor.m_Parameters = ElementwiseUnaryDescriptor(UnaryOperation::Rsqrt);
559 
560  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
561 }
562 
563 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSlice(const SliceQueueDescriptor& descriptor,
564  const WorkloadInfo& info) const
565 {
566  return MakeWorkload<ClSliceWorkload>(descriptor, info);
567 }
568 
569 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
570  const WorkloadInfo& info) const
571 {
572  return std::make_unique<ClSoftmaxWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
573 }
574 
575 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
576  const WorkloadInfo& info) const
577 {
578  return MakeWorkload<ClSpaceToBatchNdWorkload>(descriptor, info);
579 }
580 
581 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor,
582  const WorkloadInfo& info) const
583 {
584  return MakeWorkload<ClSpaceToDepthWorkload>(descriptor, info);
585 }
586 
587 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
588  const WorkloadInfo& info) const
589 {
590  return MakeWorkload<ClSplitterWorkload>(descriptor, info);
591 }
592 
593 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateStack(const StackQueueDescriptor& descriptor,
594  const WorkloadInfo& info) const
595 {
596  return MakeWorkload<ClStackWorkload>(descriptor, info);
597 }
598 
599 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
600  const WorkloadInfo& info) const
601 {
602  return MakeWorkload<ClStridedSliceWorkload>(descriptor, info);
603 }
604 
605 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
606  const WorkloadInfo& info) const
607 {
608  return MakeWorkload<ClSubtractionWorkload>(descriptor, info);
609 }
610 
611 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateTranspose(const TransposeQueueDescriptor& descriptor,
612  const WorkloadInfo& info) const
613 {
614  return MakeWorkload<ClTransposeWorkload>(descriptor, info);
615 }
616 
618  const TransposeConvolution2dQueueDescriptor& descriptor,
619  const WorkloadInfo& info) const
620 {
621  return MakeWorkload<ClTransposeConvolution2dWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
622 }
623 
624 } // namespace armnn
std::unique_ptr< IWorkload > CreateDetectionPostProcess(const DetectionPostProcessQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< ITensorHandle > CreateSubTensorHandle(ITensorHandle &parent, TensorShape const &subTensorShape, unsigned int const *subTensorOrigin) const override
std::unique_ptr< IWorkload > CreateComparison(const ComparisonQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateGather(const GatherQueueDescriptor &descriptor, const WorkloadInfo &info) const override
ClWorkloadFactory(const std::shared_ptr< ClMemoryManager > &memoryManager)
UnaryOperation m_Operation
Specifies the elementwiseUnary operation to execute.
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
std::unique_ptr< IWorkload > CreateDebug(const DebugQueueDescriptor &descriptor, const WorkloadInfo &info) const override
DataLayout
Definition: Types.hpp:50
std::unique_ptr< IWorkload > CreateReshape(const ReshapeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDivision(const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:73
uint32_t m_TargetWidth
Target width value.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
constexpr const char * ClBackendId()
Definition: ClBackendId.hpp:10
std::vector< BackendOptions > ModelOptions
std::unique_ptr< IWorkload > CreateStridedSlice(const StridedSliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQuantize(const QuantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::array< unsigned int, MaxNumOfTensorDimensions > Coordinates
std::unique_ptr< IWorkload > CreateInput(const InputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStack(const StackQueueDescriptor &descriptor, const WorkloadInfo &info) const override
ResizeMethod m_Method
The Interpolation method to use (Bilinear, NearestNeighbor).
std::unique_ptr< IWorkload > CreateFullyConnected(const FullyConnectedQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSlice(const SliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const override
std::unique_ptr< IWorkload > CreateQuantizedLstm(const QuantizedLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
const BackendId & GetBackendId() const override
Copyright (c) 2020 ARM Limited.
void IgnoreUnused(Ts &&...)
TypedWorkload< QueueDescriptor, armnn::DataType::Float16, armnn::DataType::Float32 > FloatWorkload
Definition: Workload.hpp:155
std::unique_ptr< IWorkload > CreateAbs(const AbsQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateLstm(const LstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
LogicalBinaryOperation m_Operation
Specifies the logical operation to execute.
std::unique_ptr< IWorkload > CreateLogicalBinary(const LogicalBinaryQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateLogSoftmax(const LogSoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMean(const MeanQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
std::unique_ptr< IWorkload > CreateMinimum(const MinimumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFill(const FillQueueDescriptor &descriptor, const WorkloadInfo &info) const override
static bool IsLayerSupported(const Layer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreateQLstm(const QLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDepthToSpace(const DepthToSpaceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::shared_ptr< IBackendModelContext > IBackendSpecificModelContextPtr
std::unique_ptr< IWorkload > CreateResize(const ResizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePermute(const PermuteQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMemCopy(const MemCopyQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetWidth
Target width value.
std::unique_ptr< IWorkload > CreateSoftmax(const SoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMaximum(const MaximumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RuntimeException WrapClError(const cl::Error &clError, const CheckLocation &location)
std::unique_ptr< IWorkload > CreateEqual(const EqualQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFloor(const FloorQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePreCompiled(const PreCompiledQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSubtraction(const SubtractionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
static bool IsLayerSupported(const BackendId &backendId, const IConnectableLayer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreateMultiplication(const MultiplicationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateAddition(const AdditionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePooling2d(const Pooling2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
#define CHECK_LOCATION()
Definition: Exceptions.hpp:197
virtual TensorShape GetShape() const =0
Get the number of elements for each dimension ordered from slowest iterating dimension to fastest ite...
uint32_t m_TargetHeight
Target height value.
uint32_t m_TargetHeight
Target height value.
std::unique_ptr< IWorkload > CreateMerger(const MergerQueueDescriptor &descriptor, const WorkloadInfo &info) const override
TypedWorkload< QueueDescriptor, armnn::DataType::QAsymmU8 > Uint8Workload
Definition: Workload.hpp:161
std::unique_ptr< IWorkload > CreateRsqrt(const RsqrtQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSplitter(const SplitterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateGreater(const GreaterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
Definition: Descriptors.hpp:93
std::unique_ptr< IWorkload > CreateL2Normalization(const L2NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateActivation(const ActivationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::vector< ITensorHandle * > m_Outputs
std::unique_ptr< IWorkload > CreatePad(const PadQueueDescriptor &descriptor, const WorkloadInfo &info) const override
unsigned int GetNumDimensions() const
Function that returns the tensor rank.
Definition: Tensor.cpp:174
std::unique_ptr< IWorkload > CreateSpaceToDepth(const SpaceToDepthQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateNormalization(const NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateInstanceNormalization(const InstanceNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateTranspose(const TransposeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
Contains information about inputs and outputs to a layer.
std::vector< ITensorHandle * > m_Inputs
std::unique_ptr< IWorkload > CreateBatchNormalization(const BatchNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConcat(const ConcatQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMemImport(const MemImportQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateLogicalUnary(const ElementwiseUnaryQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateResizeBilinear(const ResizeBilinearQueueDescriptor &descriptor, const WorkloadInfo &info) const override
The ClBackendModelContext is used to pass in CL specific backend ModelOptions.
std::unique_ptr< IWorkload > CreatePrelu(const PreluQueueDescriptor &descriptor, const WorkloadInfo &info) const override
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::unique_ptr< IWorkload > CreateDequantize(const DequantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConstant(const ConstantQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvolution2d(const Convolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateArgMinMax(const ArgMinMaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateOutput(const OutputQueueDescriptor &descriptor, const WorkloadInfo &info) const override