ArmNN
 20.08
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"
7 
8 #include <Layer.hpp>
9 
10 #include <armnn/Exceptions.hpp>
11 #include <armnn/Utils.hpp>
14 
19 
20 #include <cl/ClTensorHandle.hpp>
23 
24 #include <arm_compute/core/CL/CLKernelLibrary.h>
25 #include <arm_compute/runtime/CL/CLBufferAllocator.h>
26 #include <arm_compute/runtime/CL/CLScheduler.h>
27 
28 #include <boost/format.hpp>
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 {
47  return s_Id;
48 }
49 
50 template <typename FloatWorkload, typename Uint8Workload, typename QueueDescriptorType, typename... Args>
51 std::unique_ptr<IWorkload> ClWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
52  const WorkloadInfo& info,
53  Args&&... args)
54 {
55  try
56  {
57  return MakeWorkloadHelper<FloatWorkload, Uint8Workload>(descriptor, info, std::forward<Args>(args)...);
58  }
59  catch (const cl::Error& clError)
60  {
61  throw WrapClError(clError, CHECK_LOCATION());
62  }
63 }
64 
65 template <typename Workload, typename QueueDescriptorType, typename... Args>
66 std::unique_ptr<IWorkload> ClWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
67  const WorkloadInfo& info,
68  Args&&... args)
69 {
70  try
71  {
72  return std::make_unique<Workload>(descriptor, info, std::forward<Args>(args)...);
73  }
74  catch (const cl::Error& clError)
75  {
76  throw WrapClError(clError, CHECK_LOCATION());
77  }
78 }
79 
80 ClWorkloadFactory::ClWorkloadFactory(const std::shared_ptr<ClMemoryManager>& memoryManager)
81  : m_MemoryManager(memoryManager)
82 {
83 }
84 
85 std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
86  const bool IsMemoryManaged) const
87 {
88  IgnoreUnused(IsMemoryManaged);
89  std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo);
90  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
91 
92  return tensorHandle;
93 }
94 
95 std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
96  DataLayout dataLayout,
97  const bool IsMemoryManaged) const
98 {
99  IgnoreUnused(IsMemoryManaged);
100  std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo, dataLayout);
101  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
102 
103  return tensorHandle;
104 }
105 
106 std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
107  TensorShape const& subTensorShape,
108  unsigned int const* subTensorOrigin) const
109 {
111  arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
112 
113  coords.set_num_dimensions(subTensorShape.GetNumDimensions());
114  for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++)
115  {
116  // Arm compute indexes tensor coords in reverse order.
117  unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
118  coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex]));
119  }
120 
121  const arm_compute::TensorShape parentShape = armcomputetensorutils::BuildArmComputeTensorShape(parent.GetShape());
122  if (!::arm_compute::error_on_invalid_subtensor(__func__, __FILE__, __LINE__, parentShape, coords, shape))
123  {
124  return nullptr;
125  }
126 
127  return std::make_unique<ClSubTensorHandle>(
128  PolymorphicDowncast<IClTensorHandle*>(&parent), shape, coords);
129 }
130 
131 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAbs(const AbsQueueDescriptor& descriptor,
132  const WorkloadInfo& info) const
133 {
134  IgnoreUnused(descriptor);
135 
136  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
137  elementwiseUnaryDescriptor.m_Parameters = ElementwiseUnaryDescriptor(UnaryOperation::Abs);
138 
139  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
140 }
141 
142 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
143  const WorkloadInfo& info) const
144 {
145  return MakeWorkload<ClActivationWorkload>(descriptor, info);
146 }
147 
148 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
149  const WorkloadInfo& info) const
150 {
151  return MakeWorkload<ClAdditionWorkload>(descriptor, info);
152 }
153 
154 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateArgMinMax(const ArgMinMaxQueueDescriptor& descriptor,
155  const WorkloadInfo& info) const
156 {
157  return std::make_unique<ClArgMinMaxWorkload>(descriptor, info);
158 }
159 
161  const BatchNormalizationQueueDescriptor& descriptor,
162  const WorkloadInfo& info) const
163 {
164  return MakeWorkload<ClBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
165 }
166 
167 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor,
168  const WorkloadInfo& info) const
169 {
170  return MakeWorkload<ClBatchToSpaceNdWorkload>(descriptor, info);
171 }
172 
173 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateComparison(const ComparisonQueueDescriptor& descriptor,
174  const WorkloadInfo& info) const
175 {
176  return MakeWorkload<ClComparisonWorkload>(descriptor, info);
177 }
178 
179 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& descriptor,
180  const WorkloadInfo& info) const
181 {
182  return MakeWorkload<ClConcatWorkload>(descriptor, info);
183 }
184 
185 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
186  const WorkloadInfo& info) const
187 {
188  return MakeWorkload<ClConstantWorkload>(descriptor, info);
189 }
190 
192  const ConvertFp16ToFp32QueueDescriptor& descriptor,
193  const WorkloadInfo& info) const
194 {
195  return MakeWorkload<ClConvertFp16ToFp32Workload>(descriptor, info);
196 }
197 
199  const ConvertFp32ToFp16QueueDescriptor& descriptor,
200  const WorkloadInfo& info) const
201 {
202  return MakeWorkload<ClConvertFp32ToFp16Workload>(descriptor, info);
203 }
204 
205 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
206  const WorkloadInfo& info) const
207 {
208  return MakeWorkload<ClConvolution2dWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
209 }
210 
211 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor,
212  const WorkloadInfo& info) const
213 {
214  return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
215 }
216 
217 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor,
218  const WorkloadInfo& info) const
219 {
220  return MakeWorkload<ClDepthToSpaceWorkload>(descriptor, info);
221 }
222 
224  const DepthwiseConvolution2dQueueDescriptor& descriptor,
225  const WorkloadInfo& info) const
226 {
227  return MakeWorkload<ClDepthwiseConvolutionWorkload>(descriptor, info);
228 }
229 
230 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDequantize(const DequantizeQueueDescriptor& descriptor,
231  const WorkloadInfo& info) const
232 {
233  return MakeWorkload<ClDequantizeWorkload>(descriptor, info);
234 }
235 
237  const DetectionPostProcessQueueDescriptor& descriptor,
238  const WorkloadInfo& info) const
239 {
240  return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
241 }
242 
243 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
244  const WorkloadInfo& info) const
245 {
246  return MakeWorkload<ClDivisionFloatWorkload, NullWorkload>(descriptor, info);
247 }
248 
250  const WorkloadInfo& info) const
251 {
252  switch(descriptor.m_Parameters.m_Operation)
253  {
254  case UnaryOperation::Abs:
255  {
256  AbsQueueDescriptor absQueueDescriptor;
257  absQueueDescriptor.m_Inputs = descriptor.m_Inputs;
258  absQueueDescriptor.m_Outputs = descriptor.m_Outputs;
259 
260  return std::make_unique<ClAbsWorkload>(absQueueDescriptor, info);
261  }
262  case UnaryOperation::Exp:
263  return std::make_unique<ClExpWorkload>(descriptor, info);
264  case UnaryOperation::Neg:
265  return std::make_unique<ClNegWorkload>(descriptor, info);
267  {
268  RsqrtQueueDescriptor rsqrtQueueDescriptor;
269  rsqrtQueueDescriptor.m_Inputs = descriptor.m_Inputs;
270  rsqrtQueueDescriptor.m_Outputs = descriptor.m_Outputs;
271 
272  return std::make_unique<ClRsqrtWorkload>(rsqrtQueueDescriptor, info);
273  }
274  default:
275  return nullptr;
276  }
277 }
278 
279 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor,
280  const WorkloadInfo& info) const
281 {
282  IgnoreUnused(descriptor);
283 
284  ComparisonQueueDescriptor comparisonDescriptor;
286 
287  return CreateComparison(comparisonDescriptor, info);
288 }
289 
290 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFill(const FillQueueDescriptor& descriptor,
291  const WorkloadInfo& info) const
292 {
293  return std::make_unique<ClFillWorkload>(descriptor, info);
294 }
295 
296 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
297  const WorkloadInfo& info) const
298 {
299  return MakeWorkload<ClFloorFloatWorkload, NullWorkload>(descriptor, info);
300 }
301 
302 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
303  const WorkloadInfo& info) const
304 {
305  return MakeWorkload<ClFullyConnectedWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
306 }
307 
308 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateGather(const GatherQueueDescriptor& descriptor,
309  const WorkloadInfo& info) const
310 {
311  return MakeWorkload<ClGatherWorkload>(descriptor, info);
312 }
313 
314 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
315  const WorkloadInfo& info) const
316 {
317  IgnoreUnused(descriptor);
318 
319  ComparisonQueueDescriptor comparisonDescriptor;
321 
322  return CreateComparison(comparisonDescriptor, info);
323 }
324 
325 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
326  const WorkloadInfo& info) const
327 {
328  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
329 }
330 
332  const InstanceNormalizationQueueDescriptor& descriptor,
333  const WorkloadInfo& info) const
334 {
335  return MakeWorkload<ClInstanceNormalizationWorkload>(descriptor, info);
336 }
337 
339  const WorkloadInfo& info) const
340 {
341  return MakeWorkload<ClL2NormalizationFloatWorkload, NullWorkload>(descriptor, info);
342 }
343 
344 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLogSoftmax(const LogSoftmaxQueueDescriptor& descriptor,
345  const WorkloadInfo& info) const
346 {
347  return MakeWorkload<ClLogSoftmaxWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
348 }
349 
350 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
351  const WorkloadInfo& info) const
352 {
353  return MakeWorkload<ClLstmFloatWorkload, NullWorkload>(descriptor, info);
354 }
355 
356 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMaximum(const MaximumQueueDescriptor& descriptor,
357  const WorkloadInfo& info) const
358 {
359  return MakeWorkload<ClMaximumWorkload>(descriptor, info);
360 }
361 
362 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
363  const WorkloadInfo& info) const
364 {
365  return MakeWorkload<ClMeanWorkload>(descriptor, info);
366 }
367 
368 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
369  const WorkloadInfo& info) const
370 {
371  if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
372  {
373  throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemCopy workload");
374  }
375 
376  return MakeWorkload<CopyMemGenericWorkload>(descriptor, info);
377 }
378 
379 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& descriptor,
380  const WorkloadInfo& info) const
381 {
382  if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
383  {
384  throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemImport workload");
385  }
386 
387  return std::make_unique<ImportMemGenericWorkload>(descriptor, info);
388 }
389 
390 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
391  const WorkloadInfo& info) const
392 {
393  return CreateConcat(descriptor, info);
394 }
395 
396 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& descriptor,
397  const WorkloadInfo& info) const
398 {
399  return MakeWorkload<ClMinimumWorkload>(descriptor, info);
400 }
401 
402 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
403  const WorkloadInfo& info) const
404 {
405  return MakeWorkload<ClMultiplicationWorkload>(descriptor, info);
406 }
407 
408 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
409  const WorkloadInfo& info) const
410 {
411  return MakeWorkload<ClNormalizationFloatWorkload, NullWorkload>(descriptor, info);
412 }
413 
414 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
415  const WorkloadInfo& info) const
416 {
417  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
418 }
419 
420 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
421  const WorkloadInfo& info) const
422 {
423  return MakeWorkload<ClPadWorkload>(descriptor, info);
424 }
425 
426 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
427  const WorkloadInfo& info) const
428 {
429  return MakeWorkload<ClPermuteWorkload>(descriptor, info);
430 }
431 
432 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
433  const WorkloadInfo& info) const
434 {
435  return MakeWorkload<ClPooling2dWorkload>(descriptor, info);
436 }
437 
438 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor,
439  const WorkloadInfo& info) const
440 {
441  return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
442 }
443 
444 std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePrelu(const PreluQueueDescriptor &descriptor,
445  const WorkloadInfo &info) const
446 {
447  return MakeWorkload<ClPreluWorkload>(descriptor, info);
448 }
449 
450 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateQLstm(const QLstmQueueDescriptor& descriptor,
451  const WorkloadInfo& info) const
452 {
453  return std::make_unique<ClQLstmWorkload>(descriptor, info);
454 }
455 
456 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
457  const WorkloadInfo& info) const
458 {
459  return MakeWorkload<ClQuantizeWorkload>(descriptor, info);
460 }
461 
462 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateQuantizedLstm(const QuantizedLstmQueueDescriptor& descriptor,
463  const WorkloadInfo& info) const
464 {
465  return MakeWorkload<ClQuantizedLstmWorkload>(descriptor, info);
466 }
467 
468 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
469  const WorkloadInfo& info) const
470 {
471  return MakeWorkload<ClReshapeWorkload>(descriptor, info);
472 }
473 
474 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
475  const WorkloadInfo& info) const
476 {
477  return MakeWorkload<ClResizeWorkload>(descriptor, info);
478 }
479 
480 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
481  const WorkloadInfo& info) const
482 {
483  ResizeQueueDescriptor resizeDescriptor;
484  resizeDescriptor.m_Inputs = descriptor.m_Inputs;
485  resizeDescriptor.m_Outputs = descriptor.m_Outputs;
486 
487  resizeDescriptor.m_Parameters.m_Method = ResizeMethod::Bilinear;
488  resizeDescriptor.m_Parameters.m_DataLayout = descriptor.m_Parameters.m_DataLayout;
489  resizeDescriptor.m_Parameters.m_TargetHeight = descriptor.m_Parameters.m_TargetHeight;
490  resizeDescriptor.m_Parameters.m_TargetWidth = descriptor.m_Parameters.m_TargetWidth;
491 
492  return CreateResize(resizeDescriptor, info);
493 }
494 
495 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor& descriptor,
496  const WorkloadInfo& info) const
497 {
498  IgnoreUnused(descriptor);
499 
500  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
501  elementwiseUnaryDescriptor.m_Parameters = ElementwiseUnaryDescriptor(UnaryOperation::Rsqrt);
502 
503  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
504 }
505 
506 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSlice(const SliceQueueDescriptor& descriptor,
507  const WorkloadInfo& info) const
508 {
509  return MakeWorkload<ClSliceWorkload>(descriptor, info);
510 }
511 
512 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
513  const WorkloadInfo& info) const
514 {
515  return std::make_unique<ClSoftmaxWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
516 }
517 
518 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
519  const WorkloadInfo& info) const
520 {
521  return MakeWorkload<ClSpaceToBatchNdWorkload>(descriptor, info);
522 }
523 
524 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor,
525  const WorkloadInfo& info) const
526 {
527  return MakeWorkload<ClSpaceToDepthWorkload>(descriptor, info);
528 }
529 
530 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
531  const WorkloadInfo& info) const
532 {
533  return MakeWorkload<ClSplitterWorkload>(descriptor, info);
534 }
535 
536 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateStack(const StackQueueDescriptor& descriptor,
537  const WorkloadInfo& info) const
538 {
539  return MakeWorkload<ClStackWorkload>(descriptor, info);
540 }
541 
542 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
543  const WorkloadInfo& info) const
544 {
545  return MakeWorkload<ClStridedSliceWorkload>(descriptor, info);
546 }
547 
548 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
549  const WorkloadInfo& info) const
550 {
551  return MakeWorkload<ClSubtractionWorkload>(descriptor, info);
552 }
553 
554 std::unique_ptr<IWorkload> ClWorkloadFactory::CreateTranspose(const TransposeQueueDescriptor& descriptor,
555  const WorkloadInfo& info) const
556 {
557  return MakeWorkload<ClTransposeWorkload>(descriptor, info);
558 }
559 
561  const TransposeConvolution2dQueueDescriptor& descriptor,
562  const WorkloadInfo& info) const
563 {
564  return MakeWorkload<ClTransposeConvolution2dWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
565 }
566 
567 } // 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.
std::unique_ptr< IWorkload > CreateDebug(const DebugQueueDescriptor &descriptor, const WorkloadInfo &info) const override
DataLayout
Definition: Types.hpp:49
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:70
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::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
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::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:90
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:175
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 > CreateResizeBilinear(const ResizeBilinearQueueDescriptor &descriptor, const WorkloadInfo &info) const override
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