ArmNN
 21.02
LayerSupport.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 <armnn/LayerSupport.hpp>
7 #include <armnn/Optional.hpp>
10 
12 
13 #include <armnn/utility/Assert.hpp>
14 
15 #include <cstring>
16 #include <algorithm>
17 #include <unordered_map>
18 
19 namespace
20 {
21 
22 /// Helper function to copy a full string to a truncated version.
23 void CopyErrorMessage(char* truncatedString, const char* fullString, size_t maxLength)
24 {
25  if(truncatedString != nullptr)
26  {
27  std::snprintf(truncatedString, maxLength, "%s", fullString);
28  }
29 }
30 
31 } // anonymous namespace
32 
33 namespace armnn
34 {
35 
36 // Helper macro to avoid code duplication.
37 // Forwards function func to funcRef, funcNeon or funcCl, depending on the value of backendId.
38 #define FORWARD_LAYER_SUPPORT_FUNC(backendId, func, ...) \
39  std::string reasonIfUnsupportedFull; \
40  bool isSupported; \
41  try { \
42  auto const& backendRegistry = BackendRegistryInstance(); \
43  if (!backendRegistry.IsBackendRegistered(backendId)) \
44  { \
45  std::stringstream ss; \
46  ss << __func__ << " is not supported on " << backendId << " because this backend is not registered."; \
47  reasonIfUnsupportedFull = ss.str(); \
48  isSupported = false; \
49  } \
50  else \
51  { \
52  auto factoryFunc = backendRegistry.GetFactory(backendId); \
53  auto backendObject = factoryFunc(); \
54  auto layerSupportObject = backendObject->GetLayerSupport(); \
55  isSupported = layerSupportObject->func(__VA_ARGS__, Optional<std::string&>(reasonIfUnsupportedFull)); \
56  CopyErrorMessage(reasonIfUnsupported, reasonIfUnsupportedFull.c_str(), reasonIfUnsupportedMaxLength); \
57  } \
58  } catch (const InvalidArgumentException &e) { \
59  /* re-throwing with more context information */ \
60  throw InvalidArgumentException(e, "Failed to check layer support", CHECK_LOCATION()); \
61  } \
62  return isSupported;
63 
64 bool CheckTensorDataTypesEqual(const TensorInfo& input0, const TensorInfo& input1)
65 {
66  return input0.GetDataType() == input1.GetDataType();
67 }
68 
69 bool IsActivationSupported(const BackendId& backend,
70  const TensorInfo& input,
71  const TensorInfo& output,
72  const ActivationDescriptor& descriptor,
73  char* reasonIfUnsupported,
74  size_t reasonIfUnsupportedMaxLength)
75 {
76  FORWARD_LAYER_SUPPORT_FUNC(backend, IsActivationSupported, input, output, descriptor);
77 }
78 
79 bool IsAdditionSupported(const BackendId& backend,
80  const TensorInfo& input0,
81  const TensorInfo& input1,
82  const TensorInfo& output,
83  char* reasonIfUnsupported,
84  size_t reasonIfUnsupportedMaxLength)
85 {
86  if(!CheckTensorDataTypesEqual(input0, input1))
87  {
88  return false;
89  }
90 
91  FORWARD_LAYER_SUPPORT_FUNC(backend, IsAdditionSupported, input0, input1, output);
92 }
93 
94 bool IsArgMinMaxSupported(const BackendId& backend,
95  const TensorInfo& input,
96  const TensorInfo& output,
97  const ArgMinMaxDescriptor& descriptor,
98  char* reasonIfUnsupported,
99  size_t reasonIfUnsupportedMaxLength)
100 {
101  FORWARD_LAYER_SUPPORT_FUNC(backend, IsArgMinMaxSupported, input, output, descriptor);
102 }
103 
105  const TensorInfo& input,
106  const TensorInfo& output,
107  const TensorInfo& mean,
108  const TensorInfo& var,
109  const TensorInfo& beta,
110  const TensorInfo& gamma,
111  const BatchNormalizationDescriptor& descriptor,
112  char* reasonIfUnsupported,
113  size_t reasonIfUnsupportedMaxLength)
114 {
117  input,
118  output,
119  mean,
120  var,
121  beta,
122  gamma,
123  descriptor);
124 }
125 
127  const TensorInfo& input,
128  const TensorInfo& output,
129  const BatchToSpaceNdDescriptor& descriptor,
130  char* reasonIfUnsupported,
131  size_t reasonIfUnsupportedMaxLength)
132 {
135  input,
136  output,
137  descriptor);
138 }
139 
140 bool IsConcatSupported(const BackendId& backend,
141  std::vector<const TensorInfo*> inputs,
142  const TensorInfo& output,
143  const OriginsDescriptor& descriptor,
144  char* reasonIfUnsupported,
145  size_t reasonIfUnsupportedMaxLength)
146 {
147  ARMNN_ASSERT(inputs.size() > 0);
148 
149  FORWARD_LAYER_SUPPORT_FUNC(backend, IsConcatSupported, inputs, output, descriptor);
150 }
151 
152 bool IsConstantSupported(const BackendId& backend,
153  const TensorInfo& output,
154  char* reasonIfUnsupported,
155  size_t reasonIfUnsupportedMaxLength)
156 {
158 }
159 
161  const TensorInfo& input,
162  const TensorInfo& output,
163  char* reasonIfUnsupported,
164  size_t reasonIfUnsupportedMaxLength)
165 {
167 }
168 
170  const TensorInfo& input,
171  const TensorInfo& output,
172  char* reasonIfUnsupported,
173  size_t reasonIfUnsupportedMaxLength)
174 {
176 }
177 
179  const TensorInfo& input,
180  const TensorInfo& output,
181  const Convolution2dDescriptor& descriptor,
182  const TensorInfo& weights,
183  const Optional<TensorInfo>& biases,
184  char* reasonIfUnsupported,
185  size_t reasonIfUnsupportedMaxLength)
186 {
187  FORWARD_LAYER_SUPPORT_FUNC(backend, IsConvolution2dSupported, input, output, descriptor, weights, biases);
188 }
189 
190 bool IsDebugSupported(const BackendId& backend,
191  const TensorInfo& input,
192  const TensorInfo& output,
193  char* reasonIfUnsupported,
194  size_t reasonIfUnsupportedMaxLength)
195 {
196  FORWARD_LAYER_SUPPORT_FUNC(backend, IsDebugSupported, input, output);
197 }
198 
200  const TensorInfo& input,
201  const TensorInfo& output,
202  const DepthwiseConvolution2dDescriptor& descriptor,
203  const TensorInfo& weights,
204  const Optional<TensorInfo>& biases,
205  char* reasonIfUnsupported,
206  size_t reasonIfUnsupportedMaxLength)
207 {
208  if (descriptor.m_DilationX == 1 && descriptor.m_DilationY == 1)
209  {
210  // Pre 19.05 ArmNN did not have the dilation parameters.
211  // This version of IsDepthwiseConvolutionSupported is called for backwards-compatibility
214  input,
215  output,
216  descriptor,
217  weights,
218  biases);
219  }
220  else
221  {
223  IsDilatedDepthwiseConvolutionSupported,
224  input,
225  output,
226  descriptor,
227  weights,
228  biases);
229  }
230 }
231 
232 bool IsDequantizeSupported(const BackendId& backend,
233  const TensorInfo& input,
234  const TensorInfo& output,
235  char* reasonIfUnsupported,
236  size_t reasonIfUnsupportedMaxLength)
237 {
238  FORWARD_LAYER_SUPPORT_FUNC(backend, IsDequantizeSupported, input, output);
239 }
240 
241 bool IsDetectionPostProcessSupported(const BackendId& backend,
242  const TensorInfo& input0,
243  const TensorInfo& input1,
244  const DetectionPostProcessDescriptor& descriptor,
245  char* reasonIfUnsupported,
246  size_t reasonIfUnsupportedMaxLength);
247 
248 bool IsDivisionSupported(const BackendId& backend,
249  const TensorInfo& input0,
250  const TensorInfo& input1,
251  const TensorInfo& output,
252  char* reasonIfUnsupported,
253  size_t reasonIfUnsupportedMaxLength)
254 {
255  FORWARD_LAYER_SUPPORT_FUNC(backend, IsDivisionSupported, input0, input1, output);
256 }
257 
258 bool IsEqualSupported(const BackendId& backend,
259  const TensorInfo& input0,
260  const TensorInfo& input1,
261  const TensorInfo& output,
262  char* reasonIfUnsupported,
263  size_t reasonIfUnsupportedMaxLength)
264 {
266  IsComparisonSupported,
267  input0,
268  input1,
269  output,
271 }
272 
274  const TensorInfo& input,
275  const FakeQuantizationDescriptor& descriptor,
276  char* reasonIfUnsupported,
277  size_t reasonIfUnsupportedMaxLength)
278 {
279  FORWARD_LAYER_SUPPORT_FUNC(backend, IsFakeQuantizationSupported, input, descriptor);
280 }
281 
282 bool IsFloorSupported(const BackendId& backend,
283  const TensorInfo& input,
284  const TensorInfo& output,
285  char* reasonIfUnsupported,
286  size_t reasonIfUnsupportedMaxLength)
287 {
288  // By definition (that is, regardless of compute device), shapes and data type must match.
289  if (input.GetShape() != output.GetShape() || input.GetDataType() != output.GetDataType())
290  {
291  return false;
292  }
293 
294  FORWARD_LAYER_SUPPORT_FUNC(backend, IsFloorSupported, input, output);
295 }
297  const TensorInfo& input,
298  const TensorInfo& output,
299  const TensorInfo& weights,
300  const TensorInfo& biases,
301  const FullyConnectedDescriptor& descriptor,
302  char* reasonIfUnsupported,
303  size_t reasonIfUnsupportedMaxLength)
304 {
305  FORWARD_LAYER_SUPPORT_FUNC(backend, IsFullyConnectedSupported, input, output, weights, biases, descriptor);
306 }
307 
308 ARMNN_DEPRECATED_MSG("Use IsGatherSupported with descriptor instead")
309 bool IsGatherSupported(const BackendId& backend,
310  const TensorInfo& input0,
311  const TensorInfo& input1,
312  const TensorInfo& output,
313  char* reasonIfUnsupported,
314  size_t reasonIfUnsupportedMaxLength)
315 {
316  const GatherDescriptor descriptor{};
317  FORWARD_LAYER_SUPPORT_FUNC(backend, IsGatherSupported, input0, input1, output, descriptor);
318 }
319 
320 bool IsGatherSupported(const BackendId& backend,
321  const TensorInfo& input0,
322  const TensorInfo& input1,
323  const TensorInfo& output,
324  const GatherDescriptor& descriptor,
325  char* reasonIfUnsupported,
326  size_t reasonIfUnsupportedMaxLength)
327 {
328  FORWARD_LAYER_SUPPORT_FUNC(backend, IsGatherSupported, input0, input1, output, descriptor);
329 }
330 
331 bool IsGreaterSupported(const BackendId& backend,
332  const TensorInfo& input0,
333  const TensorInfo& input1,
334  const TensorInfo& output,
335  char* reasonIfUnsupported,
336  size_t reasonIfUnsupportedMaxLength)
337 {
339  IsComparisonSupported,
340  input0,
341  input1,
342  output,
344 }
345 
346 bool IsInputSupported(const BackendId& backend,
347  const TensorInfo& input,
348  char* reasonIfUnsupported,
349  size_t reasonIfUnsupportedMaxLength)
350 {
352 }
353 
354 
356  const TensorInfo& input,
357  const TensorInfo& output,
358  const L2NormalizationDescriptor& descriptor,
359  char* reasonIfUnsupported,
360  size_t reasonIfUnsupportedMaxLength)
361 {
362  FORWARD_LAYER_SUPPORT_FUNC(backend, IsL2NormalizationSupported, input, output, descriptor);
363 }
364 
365 bool IsLstmSupported(const BackendId& backend, const TensorInfo& input, const TensorInfo& outputStateIn,
366  const TensorInfo& cellStateIn, const TensorInfo& scratchBuffer,
367  const TensorInfo& outputStateOut, const TensorInfo& cellStateOut,
368  const TensorInfo& output, const LstmDescriptor& descriptor,
369  const LstmInputParamsInfo& paramsInfo, char* reasonIfUnsupported,
370  size_t reasonIfUnsupportedMaxLength)
371 
372 {
373  FORWARD_LAYER_SUPPORT_FUNC(backend, IsLstmSupported, input, outputStateIn, cellStateIn,
374  scratchBuffer, outputStateOut, cellStateOut,
375  output, descriptor, paramsInfo);
376 }
377 
378 bool IsMaximumSupported(const BackendId& backend,
379  const TensorInfo& input0,
380  const TensorInfo& input1,
381  const TensorInfo& output,
382  char* reasonIfUnsupported,
383  size_t reasonIfUnsupportedMaxLength)
384 {
385  FORWARD_LAYER_SUPPORT_FUNC(backend, IsMaximumSupported, input0, input1, output);
386 }
387 
388 bool IsMeanSupported(const BackendId& backend,
389  const TensorInfo& input,
390  const TensorInfo& output,
391  const MeanDescriptor& descriptor,
392  char* reasonIfUnsupported,
393  size_t reasonIfUnsupportedMaxLength)
394 {
395  FORWARD_LAYER_SUPPORT_FUNC(backend, IsMeanSupported, input, output, descriptor);
396 }
397 
398 bool IsMemCopySupported(const BackendId &backend,
399  const TensorInfo &input,
400  const TensorInfo &output,
401  char *reasonIfUnsupported,
402  size_t reasonIfUnsupportedMaxLength)
403 {
404  FORWARD_LAYER_SUPPORT_FUNC(backend, IsMemCopySupported, input, output);
405 }
406 
407 bool IsMemImportSupported(const BackendId &backend,
408  const TensorInfo &input,
409  const TensorInfo &output,
410  char *reasonIfUnsupported,
411  size_t reasonIfUnsupportedMaxLength)
412 {
413  FORWARD_LAYER_SUPPORT_FUNC(backend, IsMemImportSupported, input, output);
414 }
415 
416 bool IsMergeSupported(const BackendId& backend,
417  const TensorInfo& input0,
418  const TensorInfo& input1,
419  const TensorInfo& output,
420  char* reasonIfUnsupported,
421  size_t reasonIfUnsupportedMaxLength)
422 {
423  FORWARD_LAYER_SUPPORT_FUNC(backend, IsMergeSupported, input0, input1, output);
424 }
425 
426 ARMNN_DEPRECATED_MSG("Use IsConcatSupported instead")
427 bool IsMergerSupported(const BackendId& backend,
428  std::vector<const TensorInfo*> inputs,
429  const TensorInfo& output,
430  const OriginsDescriptor& descriptor,
431  char* reasonIfUnsupported,
432  size_t reasonIfUnsupportedMaxLength)
433 {
434  ARMNN_ASSERT(inputs.size() > 0);
435 
437  FORWARD_LAYER_SUPPORT_FUNC(backend, IsMergerSupported, inputs, output, descriptor);
439 }
440 
441 bool IsMinimumSupported(const BackendId& backend,
442  const TensorInfo& input0,
443  const TensorInfo& input1,
444  const TensorInfo& output,
445  char* reasonIfUnsupported,
446  size_t reasonIfUnsupportedMaxLength)
447 {
448  FORWARD_LAYER_SUPPORT_FUNC(backend, IsMinimumSupported, input0, input1, output);
449 }
450 
452  const TensorInfo& input0,
453  const TensorInfo& input1,
454  const TensorInfo& output,
455  char* reasonIfUnsupported,
456  size_t reasonIfUnsupportedMaxLength)
457 {
458  FORWARD_LAYER_SUPPORT_FUNC(backend, IsMultiplicationSupported, input0, input1, output);
459 }
460 
462  const TensorInfo& input,
463  const TensorInfo& output,
464  const NormalizationDescriptor& descriptor,
465  char* reasonIfUnsupported,
466  size_t reasonIfUnsupportedMaxLength)
467 {
468  FORWARD_LAYER_SUPPORT_FUNC(backend, IsNormalizationSupported, input, output, descriptor);
469 }
470 
471 bool IsOutputSupported(const BackendId& backend,
472  const TensorInfo& output,
473  char* reasonIfUnsupported,
474  size_t reasonIfUnsupportedMaxLength)
475 {
477 }
478 
479 bool IsPadSupported(const BackendId& backend,
480  const TensorInfo& input,
481  const TensorInfo& output,
482  const PadDescriptor& descriptor,
483  char* reasonIfUnsupported,
484  size_t reasonIfUnsupportedMaxLength)
485 {
486 
487  FORWARD_LAYER_SUPPORT_FUNC(backend, IsPadSupported, input, output, descriptor);
488 }
489 
490 bool IsQuantizeSupported(const BackendId& backend,
491  const TensorInfo& input,
492  const TensorInfo& output,
493  char* reasonIfUnsupported,
494  size_t reasonIfUnsupportedMaxLength)
495 {
496  FORWARD_LAYER_SUPPORT_FUNC(backend, IsQuantizeSupported, input, output);
497 }
498 
499 bool IsQLstmSupported(const BackendId& backend,
500  const TensorInfo& input,
501  const TensorInfo& previousOutputIn,
502  const TensorInfo& previousCellStateIn,
503  const TensorInfo& outputStateOut,
504  const TensorInfo& cellStateOut,
505  const TensorInfo& output,
506  const QLstmDescriptor& descriptor,
507  const LstmInputParamsInfo& paramsInfo,
508  char* reasonIfUnsupported,
509  size_t reasonIfUnsupportedMaxLength)
510 
511 {
512  FORWARD_LAYER_SUPPORT_FUNC(backend, IsQLstmSupported, input, previousOutputIn, previousCellStateIn,
513  outputStateOut, cellStateOut, output, descriptor, paramsInfo);
514 }
515 
517  const TensorInfo& input,
518  const TensorInfo& previousCellStateIn,
519  const TensorInfo& previousOutputIn,
520  const TensorInfo& cellStateOut,
521  const TensorInfo& output,
522  const QuantizedLstmInputParamsInfo& paramsInfo,
523  char* reasonIfUnsupported,
524  size_t reasonIfUnsupportedMaxLength)
525 
526 {
527  FORWARD_LAYER_SUPPORT_FUNC(backend, IsQuantizedLstmSupported, input, previousCellStateIn, previousOutputIn,
528  cellStateOut, output, paramsInfo);
529 }
530 
531 
532 bool IsPermuteSupported(const BackendId& backend,
533  const TensorInfo& input,
534  const TensorInfo& output,
535  const PermuteDescriptor& descriptor,
536  char* reasonIfUnsupported,
537  size_t reasonIfUnsupportedMaxLength)
538 {
539  FORWARD_LAYER_SUPPORT_FUNC(backend, IsPermuteSupported, input, output, descriptor);
540 }
541 
542 bool IsPooling2dSupported(const BackendId& backend,
543  const TensorInfo& input,
544  const TensorInfo& output,
545  const Pooling2dDescriptor& descriptor,
546  char* reasonIfUnsupported,
547  size_t reasonIfUnsupportedMaxLength)
548 {
549  FORWARD_LAYER_SUPPORT_FUNC(backend, IsPooling2dSupported, input, output, descriptor);
550 }
551 
552 bool IsPreluSupported(const BackendId& backend,
553  const TensorInfo& input,
554  const TensorInfo& alpha,
555  const TensorInfo& output,
556  char* reasonIfUnsupported,
557  size_t reasonIfUnsupportedMaxLength)
558 {
559  FORWARD_LAYER_SUPPORT_FUNC(backend, IsPreluSupported, input, alpha, output);
560 }
561 
562 bool IsReduceSupported(const BackendId& backend,
563  const TensorInfo& input,
564  const TensorInfo& output,
565  const ReduceDescriptor& descriptor,
566  char* reasonIfUnsupported,
567  size_t reasonIfUnsupportedMaxLength)
568 {
569  FORWARD_LAYER_SUPPORT_FUNC(backend, IsReduceSupported, input, output, descriptor);
570 }
571 
572 bool IsReshapeSupported(const BackendId& backend,
573  const TensorInfo& input,
574  const TensorInfo& output,
575  const ReshapeDescriptor& descriptor,
576  char* reasonIfUnsupported,
577  size_t reasonIfUnsupportedMaxLength)
578 {
579  FORWARD_LAYER_SUPPORT_FUNC(backend, IsReshapeSupported, input, output, descriptor);
580 }
581 
582 bool IsResizeSupported(const BackendId& backend,
583  const TensorInfo& input,
584  const TensorInfo& output,
585  const ResizeDescriptor& descriptor,
586  char* reasonIfUnsupported,
587  size_t reasonIfUnsupportedMaxLength)
588 {
589  FORWARD_LAYER_SUPPORT_FUNC(backend, IsResizeSupported, input, output, descriptor);
590 }
591 
592 ARMNN_DEPRECATED_MSG("Use IsResizeSupported instead")
594  const TensorInfo& input,
595  const TensorInfo& output,
596  char* reasonIfUnsupported,
597  size_t reasonIfUnsupportedMaxLength)
598 {
599  ResizeDescriptor descriptor;
600  descriptor.m_Method = ResizeMethod::Bilinear;
601 
602  const TensorShape& outputShape = output.GetShape();
603  descriptor.m_TargetWidth = outputShape[3];
604  descriptor.m_TargetHeight = outputShape[2];
605 
606  FORWARD_LAYER_SUPPORT_FUNC(backend, IsResizeSupported, input, output, descriptor);
607 }
608 
609 bool IsRsqrtSupported(const BackendId& backend,
610  const TensorInfo& input,
611  const TensorInfo& output,
612  char* reasonIfUnsupported,
613  size_t reasonIfUnsupportedMaxLength)
614 {
616  IsElementwiseUnarySupported,
617  input,
618  output,
620 }
621 
622 bool IsSoftmaxSupported(const BackendId& backend,
623  const TensorInfo& input,
624  const TensorInfo& output,
625  const SoftmaxDescriptor& descriptor,
626  char* reasonIfUnsupported,
627  size_t reasonIfUnsupportedMaxLength)
628 {
629  FORWARD_LAYER_SUPPORT_FUNC(backend, IsSoftmaxSupported, input, output, descriptor);
630 }
631 
633  const TensorInfo& input,
634  const TensorInfo& output,
635  const SpaceToBatchNdDescriptor& descriptor,
636  char* reasonIfUnsupported,
637  size_t reasonIfUnsupportedMaxLength)
638 {
639  FORWARD_LAYER_SUPPORT_FUNC(backend, IsSpaceToBatchNdSupported, input, output, descriptor);
640 }
641 
642 bool IsSpaceToDepthSupported(const BackendId& backend,
643  const TensorInfo& input,
644  const TensorInfo& output,
645  const SpaceToDepthDescriptor& descriptor,
646  char* reasonIfUnsupported,
647  size_t reasonIfUnsupportedMaxLength)
648 {
649  FORWARD_LAYER_SUPPORT_FUNC(backend, IsSpaceToDepthSupported, input, output, descriptor);
650 }
651 
652 ARMNN_DEPRECATED_MSG("Use IsSplitterSupported with outputs instead")
653 bool IsSplitterSupported(const BackendId& backend,
654  const TensorInfo& input,
655  const ViewsDescriptor& descriptor,
656  char* reasonIfUnsupported,
657  size_t reasonIfUnsupportedMaxLength)
658 {
660  FORWARD_LAYER_SUPPORT_FUNC(backend, IsSplitterSupported, input, descriptor);
662 }
663 
664 bool IsSplitterSupported(const BackendId& backend,
665  const TensorInfo& input,
666  const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
667  const ViewsDescriptor& descriptor,
668  char* reasonIfUnsupported,
669  size_t reasonIfUnsupportedMaxLength)
670 {
671  FORWARD_LAYER_SUPPORT_FUNC(backend, IsSplitterSupported, input, outputs, descriptor);
672 }
673 
674 bool IsStridedSliceSupported(const BackendId& backend,
675  const TensorInfo& input,
676  const TensorInfo& output,
677  const StridedSliceDescriptor& descriptor,
678  char* reasonIfUnsupported,
679  size_t reasonIfUnsupportedMaxLength)
680 {
681  FORWARD_LAYER_SUPPORT_FUNC(backend, IsStridedSliceSupported, input, output, descriptor);
682 }
683 
684 bool IsSubtractionSupported(const BackendId& backend,
685  const TensorInfo& input0,
686  const TensorInfo& input1,
687  const TensorInfo& output,
688  char* reasonIfUnsupported,
689  size_t reasonIfUnsupportedMaxLength)
690 {
691  FORWARD_LAYER_SUPPORT_FUNC(backend, IsSubtractionSupported, input0, input1, output);
692 }
693 
694 bool IsSwitchSupported(const BackendId& backend,
695  const TensorInfo& input0,
696  const TensorInfo& input1,
697  const TensorInfo& output0,
698  const TensorInfo& output1,
699  char* reasonIfUnsupported,
700  size_t reasonIfUnsupportedMaxLength)
701 {
702  FORWARD_LAYER_SUPPORT_FUNC(backend, IsSwitchSupported, input0, input1, output0, output1);
703 }
704 
705 } // namespace armnn
bool IsSoftmaxSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const SoftmaxDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsDequantizeSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsDivisionSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsConvertFp32ToFp16Supported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsConcatSupported(const BackendId &backend, const std::vector< const TensorInfo *> inputs, const TensorInfo &output, const OriginsDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A ViewsDescriptor for the SplitterLayer.
bool IsPooling2dSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const Pooling2dDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
const TensorShape & GetShape() const
Definition: Tensor.hpp:187
bool IsL2NormalizationSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const L2NormalizationDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A ReshapeDescriptor for the ReshapeLayer.
bool IsReduceSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const ReduceDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsArgMinMaxSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const ArgMinMaxDescriptor &descriptor, char *reasonIfUnsupported, size_t reasonIfUnsupportedMaxLength)
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
Definition: Deprecated.hpp:33
bool IsBatchToSpaceNdSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const BatchToSpaceNdDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:78
bool IsMeanSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const MeanDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsMultiplicationSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A Convolution2dDescriptor for the Convolution2dLayer.
bool IsDebugSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsConvertFp16ToFp32Supported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsPreluSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &alpha, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
ResizeMethod m_Method
The Interpolation method to use (Bilinear, NearestNeighbor).
bool IsFullyConnectedSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const TensorInfo &weights, const TensorInfo &biases, const FullyConnectedDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsEqualSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsDepthwiseConvolutionSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const DepthwiseConvolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsGreaterSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsPadSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const PadDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
Copyright (c) 2021 ARM Limited and Contributors.
bool IsNormalizationSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const NormalizationDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
#define FORWARD_LAYER_SUPPORT_FUNC(backendId, func,...)
A SpaceToDepthDescriptor for the SpaceToDepthLayer.
uint32_t m_DilationY
Dilation factor value for height dimension.
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
bool IsAdditionSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A ResizeDescriptor for the ResizeLayer.
bool IsResizeSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const ResizeDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsFloorSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsInputSupported(const BackendId &backend, const TensorInfo &input, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsMemCopySupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A PadDescriptor for the PadLayer.
bool IsConstantSupported(const BackendId &backend, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsQLstmSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &previousOutputIn, const TensorInfo &previousCellStateIn, const TensorInfo &outputStateOut, const TensorInfo &cellStateOut, const TensorInfo &output, const QLstmDescriptor &descriptor, const LstmInputParamsInfo &paramsInfo, char *reasonIfUnsupported, size_t reasonIfUnsupportedMaxLength)
An LstmDescriptor for the LstmLayer.
#define ARMNN_NO_DEPRECATE_WARN_END
Definition: Deprecated.hpp:34
uint32_t m_DilationX
Dilation factor value for width dimension.
bool IsRsqrtSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A L2NormalizationDescriptor for the L2NormalizationLayer.
An ArgMinMaxDescriptor for ArgMinMaxLayer.
Definition: Descriptors.hpp:56
bool IsOutputSupported(const BackendId &backend, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
DataType GetDataType() const
Definition: Tensor.hpp:194
An OriginsDescriptor for the ConcatLayer.
A ReduceDescriptor for the REDUCE operators.
bool IsLstmSupported(const BackendId &backend, 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, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A FullyConnectedDescriptor for the FullyConnectedLayer.
bool IsFakeQuantizationSupported(const BackendId &backend, const TensorInfo &input, const FakeQuantizationDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsStridedSliceSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const StridedSliceDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsSubtractionSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A FakeQuantizationDescriptor for the FakeQuantizationLayer.
bool IsResizeBilinearSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
uint32_t m_TargetWidth
Target width value.
A GatherDescriptor for the GatherLayer.
bool IsPermuteSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const PermuteDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsQuantizeSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported, size_t reasonIfUnsupportedMaxLength)
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
A QLstmDescriptor for the QLstmLayer.
bool IsSwitchSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output0, const TensorInfo &output1, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsSpaceToBatchNdSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const SpaceToBatchNdDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsBatchNormalizationSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const TensorInfo &mean, const TensorInfo &var, const TensorInfo &beta, const TensorInfo &gamma, const BatchNormalizationDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsActivationSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const ActivationDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:25
bool IsSplitterSupported(const BackendId &backend, const TensorInfo &input, const ViewsDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
uint32_t m_TargetHeight
Target height value.
bool CheckTensorDataTypesEqual(const TensorInfo &input0, const TensorInfo &input1)
bool IsQuantizedLstmSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &previousCellStateIn, const TensorInfo &previousOutputIn, const TensorInfo &cellStateOut, const TensorInfo &output, const QuantizedLstmInputParamsInfo &paramsInfo, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A SpaceToBatchNdDescriptor for the SpaceToBatchNdLayer.
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
Definition: Descriptors.hpp:98
bool IsConvolution2dSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const Convolution2dDescriptor &descriptor, const TensorInfo &weights, const Optional< TensorInfo > &biases, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A MeanDescriptor for the MeanLayer.
bool IsMergerSupported(const BackendId &backend, const std::vector< const TensorInfo *> inputs, const TensorInfo &output, const OriginsDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
bool IsMaximumSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnSupported=nullptr, size_t reasonIfUnSupportedMaxLength=0)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A StridedSliceDescriptor for the StridedSliceLayer.
#define ARMNN_DEPRECATED_MSG(message)
Definition: Deprecated.hpp:43
bool IsGatherSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnsupported, size_t reasonIfUnsupportedMaxLength)
A Pooling2dDescriptor for the Pooling2dLayer.
bool IsSpaceToDepthSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, const SpaceToDepthDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A NormalizationDescriptor for the NormalizationLayer.
bool IsMergeSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A SoftmaxDescriptor for the SoftmaxLayer.
bool IsMemImportSupported(const BackendId &backend, const TensorInfo &input, const TensorInfo &output, char *reasonIfUnsupported, size_t reasonIfUnsupportedMaxLength)
bool IsMinimumSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const TensorInfo &output, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
bool IsDetectionPostProcessSupported(const BackendId &backend, const TensorInfo &input0, const TensorInfo &input1, const DetectionPostProcessDescriptor &descriptor, char *reasonIfUnsupported, size_t reasonIfUnsupportedMaxLength)
A PermuteDescriptor for the PermuteLayer.
bool IsReshapeSupported(const BackendId &backend, const TensorInfo &input, const ReshapeDescriptor &descriptor, char *reasonIfUnsupported=nullptr, size_t reasonIfUnsupportedMaxLength=1024)
Deprecated in favor of IBackend and ILayerSupport interfaces.