ArmNN
 22.05
ClLayerSupport.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 
6 #include "ClLayerSupport.hpp"
7 #include "ClBackendId.hpp"
9 
11 
12 #include <InternalTypes.hpp>
13 #include <LayerSupportCommon.hpp>
14 
17 
18 #if defined(ARMCOMPUTECL_ENABLED)
85 #endif
86 
87 
88 namespace armnn
89 {
90 
91 namespace
92 {
93 
94 template<unsigned int FilterSize>
95 bool IsMatchingSize2d(const TensorInfo& weightInfo)
96 {
97  // Width & Height must match.
98  return (weightInfo.GetShape()[3] == FilterSize) && (weightInfo.GetShape()[2] == FilterSize);
99 }
100 
101 template<uint32_t ValidStride>
102 bool IsMatchingStride(uint32_t actualStride)
103 {
104  return ValidStride == actualStride;
105 }
106 
107 template<uint32_t FirstStride, uint32_t SecondStride, uint32_t... ValidStrides>
108 bool IsMatchingStride(uint32_t actualStride)
109 {
110  return IsMatchingStride<FirstStride>(actualStride) || IsMatchingStride<SecondStride, ValidStrides...>(actualStride);
111 }
112 
113 template<typename ... Args>
114 bool IsClBackendSupported(Optional<std::string&> reasonIfUnsupported, Args... args)
115 {
116  IgnoreUnused(reasonIfUnsupported, (args)...);
117 #if defined(ARMCOMPUTECL_ENABLED)
118  return true;
119 #else
120  if (reasonIfUnsupported)
121  {
122  reasonIfUnsupported.value() = "The armnn library has been built without CL support";
123  }
124  return false;
125 #endif
126 }
127 
128 #if defined(ARMCOMPUTECL_ENABLED)
129 #define FORWARD_CL_LAYER_SUPPORT_FUNC(expr) (expr)
130 #else
131 #define FORWARD_CL_LAYER_SUPPORT_FUNC(expr) IsClBackendSupported(reasonIfUnsupported)
132 #endif
133 
134 #if defined(ARMCOMPUTECL_ENABLED)
135 template<class FuncType, class... Args>
136 inline bool IsWorkloadSupported(FuncType&& func, Optional<std::string&> reasonIfUnsupported, Args&&... args)
137 {
138  arm_compute::Status aclStatus = func(std::forward<Args>(args)...);
139  const bool supported = (aclStatus.error_code() == arm_compute::ErrorCode::OK);
140  if (!supported && reasonIfUnsupported)
141  {
142  reasonIfUnsupported.value() = aclStatus.error_description();
143  }
144  return supported;
145 }
146 
147 #define FORWARD_WORKLOAD_VALIDATE_FUNC(func, reasonIfUnsupported, ...) \
148  return IsWorkloadSupported(func, reasonIfUnsupported, __VA_ARGS__);
149 #else
150 #define FORWARD_WORKLOAD_VALIDATE_FUNC(func, reasonIfUnsupported, ...) \
151  return IsClBackendSupported(reasonIfUnsupported, __VA_ARGS__);
152 #endif
153 
154 template<typename FloatFunc, typename Uint8Func, typename ... Params>
155 bool IsSupportedForDataTypeCl(Optional<std::string&> reasonIfUnsupported,
156  DataType dataType,
157  FloatFunc floatFuncPtr,
158  Uint8Func uint8FuncPtr,
159  Params&&... params)
160 {
161  return IsClBackendSupported(reasonIfUnsupported) &&
162  IsSupportedForDataTypeGeneric(reasonIfUnsupported,
163  dataType,
164  floatFuncPtr,
165  floatFuncPtr,
166  uint8FuncPtr,
167  &FalseFunc<>,
168  &FalseFunc<>,
169  std::forward<Params>(params)...);
170 }
171 } // anonymous namespace
172 
174  : m_ModelContextPtr(modelContextPtr)
175 {
176 }
177 
179  : m_ModelContextPtr(nullptr)
180 {
181 }
182 
184  const std::vector<TensorInfo>& infos,
185  const BaseDescriptor& descriptor,
186  const Optional<LstmInputParamsInfo>& lstmParamsInfo,
187  const Optional<QuantizedLstmInputParamsInfo>& quantizedLstmParamsInfo,
188  Optional<std::string&> reasonIfUnsupported) const
189 {
190  switch (type)
191  {
193  return IsActivationSupported(infos[0],
194  infos[1],
195  *(PolymorphicDowncast<const ActivationDescriptor*>(&descriptor)),
196  reasonIfUnsupported);
197  case LayerType::Addition:
198  return IsAdditionSupported(infos[0], infos[1], infos[2], reasonIfUnsupported);
200  return IsArgMinMaxSupported(infos[0],
201  infos[1],
202  *(PolymorphicDowncast<const ArgMinMaxDescriptor*>(&descriptor)),
203  reasonIfUnsupported);
205  return IsBatchNormalizationSupported(infos[0],
206  infos[1],
207  infos[2],
208  infos[3],
209  infos[4],
210  infos[5],
211  *(PolymorphicDowncast<const BatchNormalizationDescriptor*>
212  (&descriptor)),
213  reasonIfUnsupported);
215  return IsBatchToSpaceNdSupported(infos[0],
216  infos[1],
217  *(PolymorphicDowncast<const BatchToSpaceNdDescriptor*>(&descriptor)),
218  reasonIfUnsupported);
219  case LayerType::Cast:
220  return IsCastSupported(infos[0], infos[1], reasonIfUnsupported);
222  return IsChannelShuffleSupported(infos[0],
223  infos[1],
224  *(PolymorphicDowncast<const ChannelShuffleDescriptor*>(&descriptor)),
225  reasonIfUnsupported);
227  return IsComparisonSupported(infos[0],
228  infos[1],
229  infos[2],
230  *(PolymorphicDowncast<const ComparisonDescriptor*>(&descriptor)),
231  reasonIfUnsupported);
232  case LayerType::Concat:
233  {
234  std::vector<const TensorInfo*> inputInfos;
235  for (uint32_t i = 0; i < (infos.size() - 1); i++)
236  {
237  inputInfos.push_back(&infos[i]);
238  }
239  return IsConcatSupported(inputInfos,
240  infos[infos.size() - 1],
241  *(PolymorphicDowncast<const OriginsDescriptor*>(&descriptor)),
243  }
244  case LayerType::Constant:
245  return IsConstantSupported(infos[0], reasonIfUnsupported);
247  return IsConvertFp16ToFp32Supported(infos[0], infos[1], reasonIfUnsupported);
249  return IsConvertFp32ToFp16Supported(infos[0], infos[1], reasonIfUnsupported);
252  infos[1],
253  reasonIfUnsupported);
256  infos[1],
257  reasonIfUnsupported);
259  {
260  if (infos.size() != 4)
261  {
262  throw InvalidArgumentException("Invalid number of Convolution2d TensorInfos. "
263  "TensorInfos should be of format: {input, output, weights, biases}.");
264  }
265 
266  auto desc = *(PolymorphicDowncast<const Convolution2dDescriptor*>(&descriptor));
267  if (infos[3] == TensorInfo())
268  {
269  return IsConvolution2dSupported(infos[0],
270  infos[1],
271  desc,
272  infos[2],
273  EmptyOptional(),
274  reasonIfUnsupported);
275  }
276  else
277  {
278  return IsConvolution2dSupported(infos[0],
279  infos[1],
280  desc,
281  infos[2],
282  infos[3],
283  reasonIfUnsupported);
284  }
285  }
287  {
288  if (infos.size() != 4)
289  {
290  throw InvalidArgumentException("Invalid number of Convolution3d TensorInfos. "
291  "TensorInfos should be of format: {input, output, weights, biases}.");
292  }
293 
294  auto desc = *(PolymorphicDowncast<const Convolution3dDescriptor*>(&descriptor));
295  if (infos[3] == TensorInfo())
296  {
297  return IsConvolution3dSupported(infos[0],
298  infos[1],
299  desc,
300  infos[2],
301  EmptyOptional(),
302  reasonIfUnsupported);
303  }
304  else
305  {
306  return IsConvolution3dSupported(infos[0],
307  infos[1],
308  desc,
309  infos[2],
310  infos[3],
311  reasonIfUnsupported);
312  }
313  }
315  return IsDepthToSpaceSupported(infos[0],
316  infos[1],
317  *(PolymorphicDowncast<const DepthToSpaceDescriptor*>(&descriptor)),
318  reasonIfUnsupported);
320  {
321  if (infos.size() != 4)
322  {
323  throw InvalidArgumentException("Invalid number of DepthwiseConvolution2d TensorInfos. "
324  "TensorInfos should be of format: {input, output, weights, biases}.");
325  }
326 
327  auto desc = *(PolymorphicDowncast<const DepthwiseConvolution2dDescriptor*>(&descriptor));
328  if (infos[3] == TensorInfo())
329  {
330  return IsDepthwiseConvolutionSupported(infos[0],
331  infos[1],
332  desc,
333  infos[2],
334  EmptyOptional(),
335  reasonIfUnsupported);
336  }
337  else
338  {
339  return IsDepthwiseConvolutionSupported(infos[0],
340  infos[1],
341  desc,
342  infos[2],
343  infos[3],
344  reasonIfUnsupported);
345  }
346  }
348  return IsDequantizeSupported(infos[0], infos[1], reasonIfUnsupported);
349  case LayerType::Division:
350  return IsDivisionSupported(infos[0], infos[1], infos[2], reasonIfUnsupported);
352  return IsElementwiseUnarySupported(infos[0],
353  infos[1],
354  *(PolymorphicDowncast<const ElementwiseUnaryDescriptor*>(&descriptor)),
355  reasonIfUnsupported);
356  case LayerType::Fill:
357  return IsFillSupported(infos[0],
358  infos[1],
359  *(PolymorphicDowncast<const FillDescriptor*>(&descriptor)),
360  reasonIfUnsupported);
361  case LayerType::Floor:
362  return IsFloorSupported(infos[0], infos[1], reasonIfUnsupported);
364  return IsFullyConnectedSupported(infos[0],
365  infos[1],
366  infos[2],
367  infos[3],
368  *(PolymorphicDowncast<const FullyConnectedDescriptor*>(&descriptor)),
369  reasonIfUnsupported);
370  case LayerType::Gather:
371  return IsGatherSupported(infos[0],
372  infos[1],
373  infos[2],
374  *(PolymorphicDowncast<const GatherDescriptor*>(&descriptor)),
375  reasonIfUnsupported);
376  case LayerType::GatherNd:
377  return IsGatherNdSupported(infos[0],
378  infos[1],
379  infos[2],
380  reasonIfUnsupported);
381  case LayerType::Input:
382  return IsInputSupported(infos[0], reasonIfUnsupported);
384  return IsInstanceNormalizationSupported(infos[0],
385  infos[1],
386  *(PolymorphicDowncast<const InstanceNormalizationDescriptor*>
387  (&descriptor)),
388  reasonIfUnsupported);
390  return IsL2NormalizationSupported(infos[0],
391  infos[1],
392  *(PolymorphicDowncast<const L2NormalizationDescriptor*>(&descriptor)),
393  reasonIfUnsupported);
395  return IsLogicalBinarySupported(infos[0],
396  infos[1],
397  infos[2],
398  *(PolymorphicDowncast<const LogicalBinaryDescriptor*>(&descriptor)),
399  reasonIfUnsupported);
401  return IsLogSoftmaxSupported(infos[0],
402  infos[1],
403  *(PolymorphicDowncast<const LogSoftmaxDescriptor*>(&descriptor)),
404  reasonIfUnsupported);
405  case LayerType::Lstm:
406  return IsLstmSupported(infos[0],
407  infos[1],
408  infos[2],
409  infos[3],
410  infos[4],
411  infos[5],
412  infos[6],
413  *(PolymorphicDowncast<const LstmDescriptor*>(&descriptor)),
414  lstmParamsInfo.value(),
416  case LayerType::Map:
417  return true;
418  case LayerType::MemCopy:
419  return LayerSupportBase::IsMemCopySupported(infos[0], infos[1], reasonIfUnsupported);
421  return LayerSupportBase::IsMemImportSupported(infos[0], infos[1], reasonIfUnsupported);
422  case LayerType::Merge:
423  return LayerSupportBase::IsMergeSupported(infos[0],
424  infos[1],
425  infos[2],
426  reasonIfUnsupported);
427  case LayerType::Maximum:
428  return IsMaximumSupported(infos[0], infos[1], infos[2], reasonIfUnsupported);
429  case LayerType::Mean:
430  return IsMeanSupported(infos[0],
431  infos[1],
432  *(PolymorphicDowncast<const MeanDescriptor*>(&descriptor)),
433  reasonIfUnsupported);
434  case LayerType::Minimum:
435  return IsMinimumSupported(infos[0], infos[1], infos[2], reasonIfUnsupported);
437  return IsMultiplicationSupported(infos[0], infos[1], infos[2], reasonIfUnsupported);
439  return IsNormalizationSupported(infos[0],
440  infos[1],
441  *(PolymorphicDowncast<const NormalizationDescriptor*>(&descriptor)),
442  reasonIfUnsupported);
443  case LayerType::Output:
444  return IsOutputSupported(infos[0], reasonIfUnsupported);
445  case LayerType::Pad:
446  return IsPadSupported(infos[0],
447  infos[1],
448  *(PolymorphicDowncast<const PadDescriptor*>(&descriptor)),
449  reasonIfUnsupported);
450  case LayerType::Permute:
451  return IsPermuteSupported(infos[0],
452  infos[1],
453  *(PolymorphicDowncast<const PermuteDescriptor*>(&descriptor)),
454  reasonIfUnsupported);
456  return IsPooling2dSupported(infos[0],
457  infos[1],
458  *(PolymorphicDowncast<const Pooling2dDescriptor*>(&descriptor)),
459  reasonIfUnsupported);
461  return IsPooling3dSupported(infos[0],
462  infos[1],
463  *(PolymorphicDowncast<const Pooling3dDescriptor*>(&descriptor)),
464  reasonIfUnsupported);
465  case LayerType::Prelu:
466  return IsPreluSupported(infos[0], infos[1], infos[2], reasonIfUnsupported);
467  case LayerType::QLstm:
468  return IsQLstmSupported(infos[0],
469  infos[1],
470  infos[2],
471  infos[3],
472  infos[4],
473  infos[5],
474  *(PolymorphicDowncast<const QLstmDescriptor*>(&descriptor)),
475  lstmParamsInfo.value(),
477  case LayerType::Quantize:
478  return IsQuantizeSupported(infos[0], infos[1], reasonIfUnsupported);
480  return IsQuantizedLstmSupported(infos[0],
481  infos[1],
482  infos[2],
483  infos[3],
484  infos[4],
485  quantizedLstmParamsInfo.value(),
487  case LayerType::Rank:
488  return true;
489  case LayerType::Reduce:
490  return IsReduceSupported(infos[0],
491  infos[1],
492  *(PolymorphicDowncast<const ReduceDescriptor*>(&descriptor)),
493  reasonIfUnsupported);
494  case LayerType::Reshape:
495  return IsReshapeSupported(infos[0],
496  infos[1],
497  *(PolymorphicDowncast<const ReshapeDescriptor*>(&descriptor)),
498  reasonIfUnsupported);
499  case LayerType::Resize:
500  return IsResizeSupported(infos[0],
501  infos[1],
502  *(PolymorphicDowncast<const ResizeDescriptor*>(&descriptor)),
503  reasonIfUnsupported);
504  case LayerType::Shape:
505  return LayerSupportBase::IsShapeSupported(infos[0],
506  infos[1],
507  reasonIfUnsupported);
508  case LayerType::Slice:
509  return IsSliceSupported(infos[0],
510  infos[1],
511  *(PolymorphicDowncast<const SliceDescriptor*>(&descriptor)),
512  reasonIfUnsupported);
513  case LayerType::Softmax:
514  return IsSoftmaxSupported(infos[0],
515  infos[1],
516  *(PolymorphicDowncast<const SoftmaxDescriptor*>(&descriptor)),
517  reasonIfUnsupported);
519  return IsSpaceToBatchNdSupported(infos[0],
520  infos[1],
521  *(PolymorphicDowncast<const SpaceToBatchNdDescriptor*>(&descriptor)),
522  reasonIfUnsupported);
524  return IsSpaceToDepthSupported(infos[0],
525  infos[1],
526  *(PolymorphicDowncast<const SpaceToDepthDescriptor*>(&descriptor)),
527  reasonIfUnsupported);
528  case LayerType::Splitter:
529  {
530  std::vector<TensorInfo> outputInfos;
531  for (uint32_t i = 1; i < infos.size(); i++)
532  {
533  outputInfos.push_back(infos[i]);
534  }
535  return IsSplitterSupported(infos[0],
536  {outputInfos.begin(), outputInfos.end()},
537  *(PolymorphicDowncast<const ViewsDescriptor*>(&descriptor)),
539  }
540  case LayerType::Stack:
541  {
542  std::vector<const TensorInfo*> inputInfos;
543  for (uint32_t i = 0; i < infos.size() - 1; i++)
544  {
545  inputInfos.push_back(&infos[i]);
546  }
547  return IsStackSupported(inputInfos,
548  infos[infos.size() - 1],
549  *(PolymorphicDowncast<const StackDescriptor*>(&descriptor)),
551  }
553  return IsStridedSliceSupported(infos[0],
554  infos[1],
555  *(PolymorphicDowncast<const StridedSliceDescriptor*>(&descriptor)),
556  reasonIfUnsupported);
558  return IsSubtractionSupported(infos[0], infos[1], infos[2], reasonIfUnsupported);
560  return IsTransposeSupported(infos[0],
561  infos[1],
562  *(PolymorphicDowncast<const TransposeDescriptor*>(&descriptor)),
563  reasonIfUnsupported);
565  {
566  if (infos.size() != 4)
567  {
568  throw InvalidArgumentException("Invalid number of TransposeConvolution2d TensorInfos. "
569  "TensorInfos should be of format: {input, output, weights, biases}.");
570  }
571 
572  auto desc = *(PolymorphicDowncast<const TransposeConvolution2dDescriptor*>(&descriptor));
573  if (infos[3] == TensorInfo())
574  {
575  return IsTransposeConvolution2dSupported(infos[0],
576  infos[1],
577  desc,
578  infos[2],
579  EmptyOptional(),
580  reasonIfUnsupported);
581  }
582  else
583  {
584  return IsTransposeConvolution2dSupported(infos[0],
585  infos[1],
586  desc,
587  infos[2],
588  infos[3],
589  reasonIfUnsupported);
590  }
591  }
594  infos[1],
595  infos[2],
596  infos[3],
597  infos[4],
598  infos[5],
599  *(PolymorphicDowncast<const
600  UnidirectionalSequenceLstmDescriptor*>(&descriptor)),
601  lstmParamsInfo.value(),
603  case LayerType::Unmap:
604  return true;
605  default:
606  // layers not supported in cl by default:
607  // debug, detectionpostprocess, fakequantization,
608  // precompiled, standin, switch, pooling3d
609  return false;
610  }
611 }
612 
614  const TensorInfo& output,
616  Optional<std::string&> reasonIfUnsupported) const
617 {
619  reasonIfUnsupported,
620  input,
621  output,
622  descriptor);
623 }
624 
626  const TensorInfo& input1,
627  const TensorInfo& output,
628  Optional<std::string&> reasonIfUnsupported) const
629 {
631  reasonIfUnsupported,
632  input0,
633  input1,
634  output,
635  nullptr);
636 }
637 
639  const TensorInfo& output,
641  Optional<std::string&> reasonIfUnsupported) const
642 {
643 
645  reasonIfUnsupported,
646  input,
647  output,
648  descriptor);
649 }
650 
652  const TensorInfo& output,
653  const TensorInfo& mean,
654  const TensorInfo& var,
655  const TensorInfo& beta,
656  const TensorInfo& gamma,
658  Optional<std::string&> reasonIfUnsupported) const
659 {
661  reasonIfUnsupported,
662  input,
663  output,
664  mean,
665  var,
666  beta,
667  gamma,
668  descriptor,
669  nullptr);
670 }
671 
673  const TensorInfo& output,
675  Optional<std::string&> reasonIfUnsupported) const
676 {
678  reasonIfUnsupported,
679  input,
680  output,
681  descriptor);
682 }
683 
685  const TensorInfo& output,
686  Optional<std::string&> reasonIfUnsupported) const
687 {
689  reasonIfUnsupported,
690  input,
691  output);
692 }
693 
695  const TensorInfo& output,
697  Optional<std::string&> reasonIfUnsupported) const
698 {
700  reasonIfUnsupported,
701  input,
702  output,
703  descriptor);
704 }
705 
707  const TensorInfo& input1,
708  const TensorInfo& output,
710  Optional<std::string&> reasonIfUnsupported) const
711 {
713  reasonIfUnsupported,
714  input0,
715  input1,
716  output,
717  descriptor);
718 }
719 
720 bool ClLayerSupport::IsConcatSupported(const std::vector<const TensorInfo*> inputs,
721  const TensorInfo& output,
723  Optional<std::string&> reasonIfUnsupported) const
724 {
725  if (descriptor.GetNumDimensions() <= descriptor.GetConcatAxis())
726  {
727  SetValueChecked(reasonIfUnsupported, "Cl Concat: Concat axis > Number of dimensions.");
728  return false;
729  }
730 
731  unsigned int concatInnerAxis = (descriptor.GetNumDimensions() - descriptor.GetConcatAxis()) - 1;
732  if(concatInnerAxis < 3) // Width, height, or channels
733  {
735  reasonIfUnsupported,
736  inputs,
737  output,
738  descriptor);
739  }
740  else if (concatInnerAxis == 3)
741  {
742  // We rely on the sub-tensor optimization to handle the batch dimension for 4D tensors. If we can't use
743  // sub-tensors for this then we can't support it. Here is where we check that the sub-tensors will work.
744  for (auto& input : inputs)
745  {
746  if (input && !output.IsTypeSpaceMatch(*input)) // Cannot use sub-tensors if the types are not same space
747  {
748  SetValueChecked(reasonIfUnsupported, "Cl Concat: Types and quantization parameters must match.");
749  return false;
750  }
751  }
752  return true; // Sub-tensors support concat along batch
753  }
754  else // > 4 dimensions not supported.
755  {
756  SetValueChecked(reasonIfUnsupported, "Cl Concat: Maximum of 4 dimensions supported.");
757  return false;
758  }
759 }
760 
762  Optional<std::string&> reasonIfUnsupported) const
763 {
765  reasonIfUnsupported,
766  output);
767 }
768 
770  const TensorInfo& output,
771  Optional<std::string&> reasonIfUnsupported) const
772 {
774  reasonIfUnsupported,
775  input,
776  output);
777 }
778 
780  const TensorInfo& output,
781  Optional<std::string&> reasonIfUnsupported) const
782 {
784  reasonIfUnsupported,
785  input,
786  output);
787 }
788 
790  const TensorInfo& output,
792  const TensorInfo& weights,
794  Optional<std::string&> reasonIfUnsupported) const
795 {
796  bool isFastMathEnabled = false;
797 #if defined(ARMCOMPUTECL_ENABLED)
798  if (m_ModelContextPtr)
799  {
800  if (m_ModelContextPtr.get() != nullptr)
801  {
802  auto modelOptions = dynamic_cast<ClBackendModelContext*>(m_ModelContextPtr.get());
803  if (modelOptions)
804  {
805  isFastMathEnabled = modelOptions->IsFastMathEnabled();
806  }
807  }
808  }
809 #endif
810 
812  reasonIfUnsupported,
813  input,
814  output,
815  descriptor,
816  weights,
817  biases,
818  isFastMathEnabled,
819  nullptr);
820 }
821 
823  const TensorInfo& output,
825  const TensorInfo& weights,
827  Optional<std::string&> reasonIfUnsupported) const
828 {
829  bool isFastMathEnabled = false;
830 #if defined(ARMCOMPUTECL_ENABLED)
831  if (m_ModelContextPtr)
832 {
833  if (m_ModelContextPtr.get() != nullptr)
834  {
835  auto modelOptions = dynamic_cast<ClBackendModelContext*>(m_ModelContextPtr.get());
836  if (modelOptions)
837  {
838  isFastMathEnabled = modelOptions->IsFastMathEnabled();
839  }
840  }
841 }
842 #endif
843 
845  reasonIfUnsupported,
846  input,
847  output,
848  descriptor,
849  weights,
850  biases,
851  isFastMathEnabled,
852  nullptr);
853 }
854 
856  const TensorInfo& output,
857  Optional<std::string&> reasonIfUnsupported) const
858 {
860  reasonIfUnsupported,
861  input,
862  output);
863 }
864 
866  const TensorInfo& output,
868  Optional<std::string&> reasonIfUnsupported) const
869 {
871  reasonIfUnsupported,
872  input,
873  output,
874  descriptor);
875 }
876 
878  const TensorInfo& output,
880  const TensorInfo& weights,
882  Optional<std::string&> reasonIfUnsupported) const
883 {
885  reasonIfUnsupported,
886  input,
887  output,
888  descriptor,
889  weights,
890  biases,
891  nullptr);
892 }
893 
895  const TensorInfo& output,
897  const TensorInfo& weights,
899  Optional<std::string&> reasonIfUnsupported) const
900 {
902  reasonIfUnsupported,
903  input,
904  output,
905  descriptor,
906  weights,
907  biases,
908  nullptr);
909 }
910 
911 
913  const TensorInfo& input1,
914  const TensorInfo& output,
915  Optional<std::string&> reasonIfUnsupported) const
916 {
918  reasonIfUnsupported,
919  input0,
920  input1,
921  output,
922  nullptr);
923 }
924 
926  const TensorInfo& output,
928  Optional<std::string&> reasonIfUnsupported) const
929 {
930  switch(descriptor.m_Operation)
931  {
932  case UnaryOperation::Abs:
934  reasonIfUnsupported,
935  input,
936  output);
937  case UnaryOperation::Exp:
939  reasonIfUnsupported,
940  input,
941  output);
942  case UnaryOperation::Log:
944  reasonIfUnsupported,
945  input,
946  output);
949  reasonIfUnsupported,
950  input,
951  output);
952  case UnaryOperation::Neg:
954  reasonIfUnsupported,
955  input,
956  output);
959  reasonIfUnsupported,
960  input,
961  output);
962  case UnaryOperation::Sin:
964  reasonIfUnsupported,
965  input,
966  output);
969  reasonIfUnsupported,
970  input,
971  output);
972  default:
973  return false;
974  }
975 }
976 
978  const TensorInfo& output,
979  const FillDescriptor& descriptor,
980  Optional<std::string&> reasonIfUnsupported) const
981 {
982  armnn::IgnoreUnused(input);
983  armnn::IgnoreUnused(output);
984  armnn::IgnoreUnused(descriptor);
985 
986  return IsClBackendSupported(reasonIfUnsupported);
987 }
988 
990  const TensorInfo& output,
991  Optional<std::string&> reasonIfUnsupported) const
992 {
994  reasonIfUnsupported,
995  input,
996  output);
997 }
998 
1000  const TensorInfo& output,
1001  const TensorInfo& weights,
1002  const TensorInfo& biases,
1004  Optional<std::string&> reasonIfUnsupported) const
1005 {
1007  reasonIfUnsupported,
1008  input,
1009  output,
1010  weights,
1011  biases,
1012  descriptor,
1013  nullptr);
1014 }
1015 
1017  const TensorInfo& input1,
1018  const TensorInfo& output,
1020  Optional<std::string&> reasonIfUnsupported) const
1021 {
1023  reasonIfUnsupported,
1024  input0,
1025  input1,
1026  output,
1027  descriptor);
1028 }
1029 
1031  const TensorInfo& input1,
1032  const TensorInfo& output,
1033  Optional<std::string&> reasonIfUnsupported) const
1034 {
1036  reasonIfUnsupported,
1037  input0,
1038  input1,
1039  output);
1040 }
1041 
1043  Optional<std::string&> reasonIfUnsupported) const
1044 {
1045  return IsClBackendSupported(reasonIfUnsupported, input);
1046 }
1047 
1049  const TensorInfo& output,
1051  Optional<std::string&> reasonIfUnsupported) const
1052 {
1054  reasonIfUnsupported,
1055  input,
1056  output,
1057  descriptor);
1058 }
1059 
1061  const TensorInfo& output,
1063  Optional<std::string&> reasonIfUnsupported) const
1064 {
1066  reasonIfUnsupported,
1067  input,
1068  output,
1069  descriptor);
1070 }
1071 
1073  const TensorInfo& input1,
1074  const TensorInfo& output,
1076  Optional<std::string&> reasonIfUnsupported) const
1077 {
1078  IgnoreUnused(output);
1079 
1080  switch(descriptor.m_Operation)
1081  {
1084  reasonIfUnsupported,
1085  input0,
1086  input1,
1087  output);
1090  reasonIfUnsupported,
1091  input0,
1092  input1,
1093  output);
1094  default:
1095  return false;
1096  }
1097 }
1098 
1099 
1101  const TensorInfo& output,
1103  Optional<std::string&> reasonIfUnsupported) const
1104 {
1106  reasonIfUnsupported,
1107  input,
1108  output,
1109  descriptor);
1110 }
1111 
1113  const TensorInfo& outputStateIn,
1114  const TensorInfo& cellStateIn,
1115  const TensorInfo& scratchBuffer,
1116  const TensorInfo& outputStateOut,
1117  const TensorInfo& cellStateOut,
1118  const TensorInfo& output,
1119  const LstmDescriptor& descriptor,
1121  Optional<std::string&> reasonIfUnsupported) const
1122 {
1124  reasonIfUnsupported,
1125  input,
1126  outputStateIn,
1127  cellStateIn,
1128  scratchBuffer,
1129  outputStateOut,
1130  cellStateOut,
1131  output,
1132  descriptor,
1133  paramsInfo);
1134 }
1135 
1137  const TensorInfo& input1,
1138  const TensorInfo& output,
1139  Optional<std::string&> reasonIfUnsupported) const
1140 {
1142  reasonIfUnsupported,
1143  input0,
1144  input1,
1145  output);
1146 }
1147 
1149  const TensorInfo& output,
1150  const MeanDescriptor& descriptor,
1151  Optional<std::string&> reasonIfUnsupported) const
1152 {
1154  reasonIfUnsupported,
1155  input,
1156  output,
1157  descriptor);
1158 }
1159 
1161  const TensorInfo& input1,
1162  const TensorInfo& output,
1163  Optional<std::string&> reasonIfUnsupported) const
1164 {
1166  reasonIfUnsupported,
1167  input0,
1168  input1,
1169  output);
1170 }
1171 
1173  const TensorInfo& input1,
1174  const TensorInfo& output,
1175  Optional<std::string&> reasonIfUnsupported) const
1176 {
1178  reasonIfUnsupported,
1179  input0,
1180  input1,
1181  output,
1182  nullptr);
1183 }
1184 
1186  const TensorInfo& output,
1188  Optional<std::string&> reasonIfUnsupported) const
1189 {
1190  FORWARD_WORKLOAD_VALIDATE_FUNC(ClNormalizationWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
1191 }
1192 
1194  Optional<std::string&> reasonIfUnsupported) const
1195 {
1196  return IsClBackendSupported(reasonIfUnsupported, output);
1197 }
1198 
1200  const TensorInfo& output,
1201  const PadDescriptor& descriptor,
1202  Optional<std::string&> reasonIfUnsupported) const
1203 {
1205  reasonIfUnsupported,
1206  input,
1207  output,
1208  descriptor);
1209 }
1210 
1212  const TensorInfo& output,
1214  Optional<std::string&> reasonIfUnsupported) const
1215 {
1216  FORWARD_WORKLOAD_VALIDATE_FUNC(ClPermuteWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
1217 }
1218 
1220  const TensorInfo& output,
1222  Optional<std::string&> reasonIfUnsupported) const
1223 {
1224  FORWARD_WORKLOAD_VALIDATE_FUNC(ClPooling2dWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
1225 }
1226 
1228  const TensorInfo& output,
1230  Optional<std::string&> reasonIfUnsupported) const
1231 {
1232  FORWARD_WORKLOAD_VALIDATE_FUNC(ClPooling3dWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
1233 }
1234 
1236  const armnn::TensorInfo &alpha,
1237  const armnn::TensorInfo &output,
1238  armnn::Optional<std::string &> reasonIfUnsupported) const
1239 {
1240  FORWARD_WORKLOAD_VALIDATE_FUNC(ClPreluWorkloadValidate, reasonIfUnsupported, input, alpha, output);
1241 }
1242 
1246  const TensorInfo& outputStateOut,
1247  const TensorInfo& cellStateOut,
1248  const TensorInfo& output,
1249  const QLstmDescriptor& descriptor,
1251  Optional<std::string&> reasonIfUnsupported) const
1252 {
1253  if (input.GetDataType() == armnn::DataType::QAsymmS8 &&
1254  previousOutputIn.GetDataType() == armnn::DataType::QAsymmS8 &&
1255  previousCellStateIn.GetDataType() == armnn::DataType::QSymmS16 &&
1256  outputStateOut.GetDataType() == armnn::DataType::QAsymmS8 &&
1257  cellStateOut.GetDataType() == armnn::DataType::QSymmS16 &&
1259  {
1261  reasonIfUnsupported,
1262  input,
1263  previousCellStateIn,
1264  previousOutputIn,
1265  cellStateOut,
1266  outputStateOut,
1267  output,
1268  descriptor,
1269  paramsInfo);
1270  }
1271  else
1272  {
1273  return false;
1274  }
1275 }
1276 
1280  const TensorInfo& cellStateOut,
1281  const TensorInfo& output,
1283  Optional<std::string&> reasonIfUnsupported) const
1284 {
1286  reasonIfUnsupported,
1287  input,
1288  previousCellStateIn,
1289  previousOutputIn,
1290  cellStateOut,
1291  output,
1292  paramsInfo);
1293 }
1294 
1296  const TensorInfo& output,
1297  Optional<std::string&> reasonIfUnsupported) const
1298 {
1300  reasonIfUnsupported,
1301  input,
1302  output);
1303 }
1304 
1306  const TensorInfo& output,
1308  Optional<std::string&> reasonIfUnsupported) const
1309 {
1311  reasonIfUnsupported,
1312  input,
1313  output,
1314  descriptor);
1315 }
1316 
1318  const TensorInfo& output,
1320  Optional<std::string&> reasonIfUnsupported) const
1321 {
1322  IgnoreUnused(descriptor);
1323  FORWARD_WORKLOAD_VALIDATE_FUNC(ClReshapeWorkloadValidate, reasonIfUnsupported, input, output);
1324 }
1325 
1327  const TensorInfo& output,
1329  Optional<std::string&> reasonIfUnsupported) const
1330 {
1331  FORWARD_WORKLOAD_VALIDATE_FUNC(ClResizeWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
1332 }
1333 
1335  const TensorInfo& output,
1336  const SliceDescriptor& descriptor,
1337  Optional<std::string&> reasonIfUnsupported) const
1338 {
1339  FORWARD_WORKLOAD_VALIDATE_FUNC(ClSliceWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
1340 }
1341 
1343  const TensorInfo& output,
1345  Optional<std::string&> reasonIfUnsupported) const
1346 {
1347  FORWARD_WORKLOAD_VALIDATE_FUNC(ClSoftmaxWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
1348 }
1349 
1351  const TensorInfo& output,
1353  Optional<std::string&> reasonIfUnsupported) const
1354 {
1356  reasonIfUnsupported,
1357  input,
1358  output,
1359  descriptor);
1360 }
1361 
1363  const TensorInfo& output,
1365  Optional<std::string&> reasonIfUnsupported) const
1366 {
1368  reasonIfUnsupported,
1369  input,
1370  output,
1371  descriptor);
1372 }
1373 
1375  const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
1376  const ViewsDescriptor& descriptor,
1377  Optional<std::string&> reasonIfUnsupported) const
1378 {
1379 #if defined(ARMCOMPUTECL_ENABLED)
1380  // Split along the last dimension, cannot use sub-tensors
1381  // as width and height of the sub-tensors do not match
1382  // the width and height of the parent tensor
1383  // in case of input with more than 2D.
1384  std::set<unsigned int> splitAxis = ComputeSplitAxis(descriptor, input.GetShape());
1385  if (descriptor.GetNumDimensions() > 2 && splitAxis.size() == 1 &&
1386  *splitAxis.begin() == descriptor.GetNumDimensions() - 1 )
1387  {
1389  reasonIfUnsupported,
1390  input,
1391  outputs,
1392  *splitAxis.begin());
1393  }
1394 #endif
1395  IgnoreUnused(descriptor);
1396  for (auto output : outputs)
1397  {
1398  if (!input.IsTypeSpaceMatch(output)) // Cannot use sub-tensors if the types are not same space
1399  {
1400  SetValueChecked(reasonIfUnsupported, "Cl Splitter: Types and quantization parameters must match.");
1401  return false;
1402  }
1403  }
1404  return true;
1405 }
1406 
1407 bool ClLayerSupport::IsStackSupported(const std::vector<const TensorInfo*>& inputs,
1408  const TensorInfo& output,
1409  const StackDescriptor& descriptor,
1410  Optional<std::string&> reasonIfUnsupported) const
1411 {
1413  reasonIfUnsupported,
1414  inputs,
1415  output,
1416  descriptor);
1417 }
1418 
1420  const TensorInfo& output,
1422  Optional<std::string&> reasonIfUnsupported) const
1423 {
1425  reasonIfUnsupported,
1426  input,
1427  output,
1428  descriptor);
1429 }
1430 
1432  const TensorInfo& input1,
1433  const TensorInfo& output,
1434  Optional<std::string&> reasonIfUnsupported) const
1435 {
1437  reasonIfUnsupported,
1438  input0,
1439  input1,
1440  output,
1441  nullptr);
1442 }
1443 
1445  const TensorInfo& output,
1447  const TensorInfo& weights,
1449  Optional<std::string&> reasonIfUnsupported) const
1450 {
1452  reasonIfUnsupported,
1453  input,
1454  output,
1455  descriptor,
1456  weights,
1457  biases);
1458 }
1459 
1461  const TensorInfo& output,
1463  Optional<std::string&> reasonIfUnsupported) const
1464 {
1465  FORWARD_WORKLOAD_VALIDATE_FUNC(ClTransposeWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
1466 }
1467 
1469  const TensorInfo& outputStateIn,
1470  const TensorInfo& cellStateIn,
1471  const TensorInfo& outputStateOut,
1472  const TensorInfo& cellStateOut,
1473  const TensorInfo& output,
1476  Optional<std::string&> reasonIfUnsupported) const
1477 {
1479  reasonIfUnsupported,
1480  input,
1481  outputStateIn,
1482  cellStateIn,
1483  outputStateOut,
1484  cellStateOut,
1485  output,
1486  descriptor,
1487  paramsInfo);
1488 }
1489 
1490 } // namespace armnn
bool IsMinimumSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClAdditionValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const ActivationDescriptor *activationDescriptor)
bool IsOutputSupported(const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsTransposeSupported(const TensorInfo &input, const TensorInfo &output, const TransposeDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClBatchToSpaceNdWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const BatchToSpaceNdDescriptor &descriptor)
arm_compute::Status ClLogicalOrWorkloadValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output)
arm_compute::Status ClDequantizeWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
bool IsFloorSupported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClComparisonWorkloadValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const ComparisonDescriptor &descriptor)
UnaryOperation m_Operation
Specifies the elementwiseUnary operation to execute.
A ViewsDescriptor for the SplitterLayer.
arm_compute::Status ClL2NormalizationWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const L2NormalizationDescriptor &descriptor)
arm_compute::Status ClConvertFp32ToFp16WorkloadValidate(const TensorInfo &input, const TensorInfo &output)
bool IsTypeSpaceMatch(const TensorInfo &other) const
Check that the types are the same and, if quantize, that the quantization parameters are the same...
Definition: Tensor.cpp:432
arm_compute::Status ClDivisionWorkloadValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const ActivationDescriptor *activationDescriptor)
bool IsArgMinMaxSupported(const TensorInfo &input, const TensorInfo &output, const ArgMinMaxDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsReduceSupported(const TensorInfo &input, const TensorInfo &output, const ReduceDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
arm_compute::Status ClConvolution3dWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const Convolution3dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, bool isFastMathEnabled, const ActivationDescriptor *activationDescriptor)
const TensorInfo const TensorInfo const TensorInfo const TensorInfo const TensorInfo const TensorInfo const LstmDescriptor const LstmInputParamsInfo & paramsInfo
const TensorShape & GetShape() const
Definition: Tensor.hpp:191
const TensorInfo & output
arm_compute::Status ClInstanceNormalizationWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const InstanceNormalizationDescriptor &descriptor)
arm_compute::Status ClLogSoftmaxWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const LogSoftmaxDescriptor &descriptor)
bool IsUnidirectionalSequenceLstmSupported(const TensorInfo &input, const TensorInfo &outputStateIn, const TensorInfo &cellStateIn, const TensorInfo &outputStateOut, const TensorInfo &cellStateOut, const TensorInfo &output, const UnidirectionalSequenceLstmDescriptor &descriptor, const LstmInputParamsInfo &paramsInfo, Optional< std::string &> reasonIfUnsupported) const override
A ReshapeDescriptor for the ReshapeLayer.
bool IsMemImportSupported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsSubtractionSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsPreluSupported(const TensorInfo &input, const TensorInfo &alpha, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClSplitterWorkloadValidate(const TensorInfo &input, const std::vector< std::reference_wrapper< TensorInfo >> &outputs, unsigned int splitAxis)
arm_compute::Status ClGatherNdWorkloadValidate(const TensorInfo &paramsInfo, const TensorInfo &indicesInfo, const TensorInfo &outputInfo)
uint32_t GetNumDimensions() const
Get the number of dimensions.
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:89
bool IsSliceSupported(const TensorInfo &input, const TensorInfo &output, const SliceDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
const TensorInfo const TensorInfo const TensorInfo const TensorInfo const TensorInfo & gamma
const std::vector< std::reference_wrapper< TensorInfo > > & outputs
arm_compute::Status ClSliceWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const SliceDescriptor &descriptor)
A Convolution2dDescriptor for the Convolution2dLayer.
bool IsQuantizeSupported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClSubtractionValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const ActivationDescriptor *activationDescriptor)
arm_compute::Status ClLstmFloatWorkloadValidate(const TensorInfo &input, const TensorInfo &outputStateIn, const TensorInfo &cellStateIn, const TensorInfo &scratchBuffer, const TensorInfo &outputStateOut, const TensorInfo &cellStateOut, const TensorInfo &output, const LstmDescriptor &descriptor, const LstmInputParamsInfo &paramsInfo)
bool IsPadSupported(const TensorInfo &input, const TensorInfo &output, const PadDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClPermuteWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const PermuteDescriptor &descriptor)
const TensorInfo const ActivationDescriptor Optional< std::string & > reasonIfUnsupported
bool IsLstmSupported(const TensorInfo &input, const TensorInfo &outputStateIn, const TensorInfo &cellStateIn, const TensorInfo &scratchBuffer, const TensorInfo &outputStateOut, const TensorInfo &cellStateOut, const TensorInfo &output, const LstmDescriptor &descriptor, const LstmInputParamsInfo &paramsInfo, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClTransposeWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const TransposeDescriptor &descriptor)
arm_compute::Status ClReshapeWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
bool IsStridedSliceSupported(const TensorInfo &input, const TensorInfo &output, const StridedSliceDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsShapeSupported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A LogicalBinaryDescriptor for the LogicalBinaryLayer.
#define FORWARD_WORKLOAD_VALIDATE_FUNC(func, reasonIfUnsupported,...)
bool IsLogicalBinarySupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const LogicalBinaryDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported) const override
bool IsLogSoftmaxSupported(const TensorInfo &input, const TensorInfo &output, const LogSoftmaxDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
Copyright (c) 2021 ARM Limited and Contributors.
arm_compute::Status ClSqrtWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
arm_compute::Status ClConvolution2dWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const Convolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, bool isFastMathEnabled, const ActivationDescriptor *activationDescriptor)
void IgnoreUnused(Ts &&...)
const TensorInfo const ActivationDescriptor & descriptor
std::set< unsigned int > ComputeSplitAxis(const armnn::SplitterDescriptor &desc, const TensorShape &input)
bool IsPermuteSupported(const TensorInfo &input, const TensorInfo &output, const PermuteDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsConcatSupported(const std::vector< const TensorInfo *> inputs, const TensorInfo &output, const OriginsDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsComparisonSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &ouput, const ComparisonDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A SpaceToDepthDescriptor for the SpaceToDepthLayer.
bool IsNormalizationSupported(const TensorInfo &input, const TensorInfo &output, const NormalizationDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
LogicalBinaryOperation m_Operation
Specifies the logical operation to execute.
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
bool IsConvolution2dSupported(const TensorInfo &input, const TensorInfo &output, const Convolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
const TensorInfo & outputStateIn
const TensorInfo const TensorInfo & previousCellStateIn
arm_compute::Status ClMeanValidate(const TensorInfo &input, const TensorInfo &output, const MeanDescriptor &descriptor)
arm_compute::Status ClSinWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
arm_compute::Status ClChannelShuffleValidate(const TensorInfo &input, const TensorInfo &output, const ChannelShuffleDescriptor &descriptor)
bool IsConvolution3dSupported(const TensorInfo &input, const TensorInfo &output, const Convolution3dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A ResizeBilinearDescriptor for the ResizeBilinearLayer.
arm_compute::Status ClSoftmaxWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const SoftmaxDescriptor &descriptor)
const TensorInfo & alpha
Base class for all descriptors.
Definition: Descriptors.hpp:22
A StackDescriptor for the StackLayer.
bool IsQuantizedLstmSupported(const TensorInfo &input, const TensorInfo &previousCellStateIn, const TensorInfo &previousOutputIn, const TensorInfo &cellStateOut, const TensorInfo &output, const QuantizedLstmInputParamsInfo &paramsInfo, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClNormalizationWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const NormalizationDescriptor &descriptor)
arm_compute::Status ClPooling2dWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const Pooling2dDescriptor &descriptor)
A PadDescriptor for the PadLayer.
bool IsElementwiseUnarySupported(const TensorInfo &input, const TensorInfo &ouput, const ElementwiseUnaryDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClLogicalNotWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
bool IsGatherSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const GatherDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported) const override
arm_compute::Status ClDepthToSpaceWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const DepthToSpaceDescriptor &descriptor)
DataType
Definition: Types.hpp:48
const TensorInfo const TensorInfo & cellStateIn
bool IsBatchNormalizationSupported(const TensorInfo &input, const TensorInfo &output, const TensorInfo &mean, const TensorInfo &var, const TensorInfo &beta, const TensorInfo &gamma, const BatchNormalizationDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
An LstmDescriptor for the LstmLayer.
bool IsConvertFp16ToFp32Supported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsDepthToSpaceSupported(const TensorInfo &input, const TensorInfo &output, const DepthToSpaceDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClStackWorkloadValidate(const std::vector< const TensorInfo *> &inputs, const TensorInfo &output, const StackDescriptor &descriptor)
arm_compute::Status ClConstantWorkloadValidate(const TensorInfo &output)
bool IsSpaceToBatchNdSupported(const TensorInfo &input, const TensorInfo &output, const SpaceToBatchNdDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsResizeSupported(const TensorInfo &input, const TensorInfo &output, const ResizeDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
std::shared_ptr< IBackendModelContext > IBackendSpecificModelContextPtr
arm_compute::Status ClPadValidate(const TensorInfo &input, const TensorInfo &output, const PadDescriptor &descriptor)
A L2NormalizationDescriptor for the L2NormalizationLayer.
const TensorInfo const TensorInfo const TensorInfo & var
arm_compute::Status ClSpaceToBatchNdWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const SpaceToBatchNdDescriptor &descriptor)
An ArgMinMaxDescriptor for ArgMinMaxLayer.
Definition: Descriptors.hpp:67
DataType GetDataType() const
Definition: Tensor.hpp:198
An OriginsDescriptor for the ConcatLayer.
A ReduceDescriptor for the REDUCE operators.
A FullyConnectedDescriptor for the FullyConnectedLayer.
arm_compute::Status ClStridedSliceWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const StridedSliceDescriptor &descriptor)
const TensorInfo const TensorInfo const TensorInfo const TensorInfo & outputStateOut
arm_compute::Status ClMultiplicationWorkloadValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, const ActivationDescriptor *activationDescriptor)
const TensorInfo const TensorInfo const TensorInfo const TensorInfo const TensorInfo & cellStateOut
A GatherDescriptor for the GatherLayer.
arm_compute::Status ClPooling3dWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const Pooling3dDescriptor &descriptor)
arm_compute::Status ClConvertFp16ToFp32WorkloadValidate(const TensorInfo &input, const TensorInfo &output)
bool IsSplitterSupported(const TensorInfo &input, const std::vector< std::reference_wrapper< TensorInfo >> &outputs, const ViewsDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
Status
enumeration
Definition: Types.hpp:42
arm_compute::Status ClGatherWorkloadValidate(const TensorInfo &input, const TensorInfo &indices, const TensorInfo &output, const GatherDescriptor &descriptor)
bool IsFillSupported(const TensorInfo &input, const TensorInfo &output, const FillDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
const TensorInfo const TensorInfo const TensorInfo const TensorInfo & beta
bool IsStackSupported(const std::vector< const TensorInfo *> &inputs, const TensorInfo &output, const StackDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsReshapeSupported(const TensorInfo &input, const TensorInfo &output, const ReshapeDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo &input, const TensorInfo &output, const DepthwiseConvolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, Optional< std::string &> reason=EmptyOptional()) const override
A QLstmDescriptor for the QLstmLayer.
bool IsMergeSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClFullyConnectedWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const TensorInfo &weights, const Optional< TensorInfo > &biases, const FullyConnectedDescriptor &descriptor, const ActivationDescriptor *activationDescriptor)
DestType PolymorphicDowncast(SourceType *value)
Polymorphic downcast for build in pointers only.
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:36
arm_compute::Status ClSpaceToDepthWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const SpaceToDepthDescriptor &descriptor)
bool IsChannelShuffleSupported(const TensorInfo &input, const TensorInfo &output, const ChannelShuffleDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsQLstmSupported(const TensorInfo &input, const TensorInfo &previousOutputIn, const TensorInfo &previousCellStateIn, const TensorInfo &outputStateOut, const TensorInfo &cellStateOut, const TensorInfo &output, const QLstmDescriptor &descriptor, const LstmInputParamsInfo &paramsInfo, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClBatchNormalizationValidate(const TensorInfo &input, const TensorInfo &output, const TensorInfo &mean, const TensorInfo &var, const TensorInfo &beta, const TensorInfo &gamma, const BatchNormalizationDescriptor &descriptor, const ActivationDescriptor *activationDescriptor)
bool IsMemCopySupported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A SliceDescriptor for the SliceLayer.
A Convolution3dDescriptor for the Convolution3dLayer.
bool IsDivisionSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
const TensorInfo & previousOutputIn
bool IsMultiplicationSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClResizeWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const ResizeDescriptor &descriptor)
bool IsGatherNdSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported) const
bool IsFullyConnectedSupported(const TensorInfo &input, const TensorInfo &output, const TensorInfo &weights, const TensorInfo &biases, const FullyConnectedDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A Pooling3dDescriptor for the Pooling3dLayer.
void SetValueChecked(Optional< T &> optionalRef, V &&val)
bool IsDequantizeSupported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A SpaceToBatchNdDescriptor for the SpaceToBatchNdLayer.
bool IsConvertBf16ToFp32Supported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsCastSupported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
EmptyOptional is used to initialize the Optional class in case we want to have default value for an O...
Definition: Optional.hpp:32
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
bool IsAdditionSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsMaximumSupported(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClPreluWorkloadValidate(const TensorInfo &input, const TensorInfo &alpha, const TensorInfo &output)
arm_compute::Status ClCastValidate(const TensorInfo &input, const TensorInfo &output)
arm_compute::Status ClAbsWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
bool IsMeanSupported(const TensorInfo &input, const TensorInfo &output, const MeanDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
const TensorInfo const Convolution2dDescriptor const TensorInfo const Optional< TensorInfo > & biases
arm_compute::Status ClMinimumWorkloadValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output)
uint32_t GetNumDimensions() const
Get the number of dimensions.
A MeanDescriptor for the MeanLayer.
arm_compute::Status ClNegWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
bool IsInputSupported(const TensorInfo &input, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClUnidirectionalSequenceLstmFloatWorkloadValidate(const TensorInfo &input, const TensorInfo &outputStateIn, const TensorInfo &cellStateIn, const TensorInfo &output, const Optional< TensorInfo > &hiddenStateOutput, const Optional< TensorInfo > &cellStateOutput, const UnidirectionalSequenceLstmDescriptor &descriptor, const LstmInputParamsInfo &paramsInfo)
arm_compute::Status ClArgMinMaxWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const ArgMinMaxDescriptor &descriptor)
A TransposeDescriptor for the TransposeLayer.
A StridedSliceDescriptor for the StridedSliceLayer.
arm_compute::Status ClConcatWorkloadValidate(const std::vector< const TensorInfo *> &inputs, const TensorInfo &output, const OriginsDescriptor &descriptor)
bool IsSoftmaxSupported(const TensorInfo &input, const TensorInfo &output, const SoftmaxDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClExpWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
arm_compute::Status ClQLstmWorkloadValidate(const TensorInfo &input, const TensorInfo &cellStateIn, const TensorInfo &outputStateIn, const TensorInfo &cellStateOut, const TensorInfo &outputStateOut, const TensorInfo &output, const QLstmDescriptor &descriptor, const LstmInputParamsInfo &paramsInfo)
const TensorInfo & input1
arm_compute::Status ClTransposeConvolution2dWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const TransposeConvolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases)
bool IsL2NormalizationSupported(const TensorInfo &input, const TensorInfo &output, const L2NormalizationDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClActivationWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const ActivationDescriptor &descriptor)
bool IsDepthwiseConvolutionSupported(const TensorInfo &input, const TensorInfo &output, const DepthwiseConvolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A Pooling2dDescriptor for the Pooling2dLayer.
A NormalizationDescriptor for the NormalizationLayer.
bool IsConvertFp32ToBf16Supported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClLogWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
The ClBackendModelContext is used to pass in CL specific backend ModelOptions.
const TensorInfo const TensorInfo const TensorInfo & scratchBuffer
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
bool IsConvertFp32ToFp16Supported(const TensorInfo &input, const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
unsigned int GetConcatAxis() const
Get the concatenation axis value.
bool IsInstanceNormalizationSupported(const TensorInfo &input, const TensorInfo &output, const InstanceNormalizationDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A ChannelShuffleDescriptor for the ChannelShuffle operator.
bool IsPooling2dSupported(const TensorInfo &input, const TensorInfo &output, const Pooling2dDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClMaximumWorkloadValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output)
bool IsActivationSupported(const TensorInfo &input, const TensorInfo &output, const ActivationDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsSupportedForDataTypeGeneric(Optional< std::string &> reasonIfUnsupported, DataType dataType, Float16Func float16FuncPtr, Float32Func float32FuncPtr, Uint8Func uint8FuncPtr, Int32Func int32FuncPtr, BooleanFunc booleanFuncPtr, Params &&... params)
A SoftmaxDescriptor for the SoftmaxLayer.
bool IsLayerSupported(const LayerType &type, const std::vector< TensorInfo > &infos, const BaseDescriptor &descriptor, const Optional< LstmInputParamsInfo > &lstmParamsInfo, const Optional< QuantizedLstmInputParamsInfo > &quantizedLstmParamsInfo, Optional< std::string &> reasonIfUnsupported) const override
arm_compute::Status ClDepthwiseConvolutionWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const DepthwiseConvolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, const ActivationDescriptor *activationDescriptor)
const TensorInfo const Convolution2dDescriptor const TensorInfo & weights
arm_compute::Status ClQuantizedLstmWorkloadValidate(const TensorInfo &input, const TensorInfo &previousCellStateIn, const TensorInfo &previousOutputIn, const TensorInfo &cellStateOut, const TensorInfo &output, const QuantizedLstmInputParamsInfo &paramsInfo)
arm_compute::Status ClFloorWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
arm_compute::Status ClRsqrtWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
bool IsPooling3dSupported(const TensorInfo &input, const TensorInfo &output, const Pooling3dDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsSpaceToDepthSupported(const TensorInfo &input, const TensorInfo &output, const SpaceToDepthDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A FillDescriptor for the FillLayer.
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
arm_compute::Status ClLogicalAndWorkloadValidate(const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output)
arm_compute::Status ClQuantizeWorkloadValidate(const TensorInfo &input, const TensorInfo &output)
const TensorInfo const TensorInfo & mean
A PermuteDescriptor for the PermuteLayer.
bool IsBatchToSpaceNdSupported(const TensorInfo &input, const TensorInfo &output, const BatchToSpaceNdDescriptor &descriptor, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
LayerType
When adding a new layer, adapt also the LastLayer enum value in the enum class LayerType below...
Definition: Types.hpp:467
bool IsConstantSupported(const TensorInfo &output, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
bool IsTransposeConvolution2dSupported(const TensorInfo &input, const TensorInfo &output, const TransposeConvolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, Optional< std::string &> reasonIfUnsupported=EmptyOptional()) const override
arm_compute::Status ClReduceWorkloadValidate(const TensorInfo &input, const TensorInfo &output, const ReduceDescriptor &descriptor)