• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include <armnn/backends/IBackendInternal.hpp>
8 
9 #include <backendsCommon/LayerSupportBase.hpp>
10 
11 namespace armnn
12 {
13 
14 class NeonLayerSupport : public LayerSupportBase
15 {
16 public:
17     explicit NeonLayerSupport(const IBackendInternal::IBackendSpecificModelContextPtr& modelContextPtr);
18     NeonLayerSupport();
19 
~NeonLayerSupport()20     ~NeonLayerSupport() {}
21 
22     ARMNN_DEPRECATED_MSG("Use IsElementwiseUnarySupported instead")
23     bool IsAbsSupported(const TensorInfo& input,
24                         const TensorInfo& output,
25                         Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
26 
27     bool IsActivationSupported(const TensorInfo& input,
28                                const TensorInfo& output,
29                                const ActivationDescriptor& descriptor,
30                                Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
31 
32     bool IsAdditionSupported(const TensorInfo& input0,
33                              const TensorInfo& input1,
34                              const TensorInfo& output,
35                              Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
36 
37     bool IsArgMinMaxSupported(const TensorInfo& input,
38                               const TensorInfo& output,
39                               const ArgMinMaxDescriptor& descriptor,
40                               Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
41 
42     bool IsBatchNormalizationSupported(const TensorInfo& input,
43                                        const TensorInfo& output,
44                                        const TensorInfo& mean,
45                                        const TensorInfo& var,
46                                        const TensorInfo& beta,
47                                        const TensorInfo& gamma,
48                                        const BatchNormalizationDescriptor& descriptor,
49                                        Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
50 
51     bool IsBatchToSpaceNdSupported(const TensorInfo& input,
52                                    const TensorInfo& output,
53                                    const BatchToSpaceNdDescriptor& descriptor,
54                                    Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
55 
56     bool IsComparisonSupported(const TensorInfo& input0,
57                                const TensorInfo& input1,
58                                const TensorInfo& output,
59                                const ComparisonDescriptor& descriptor,
60                                Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
61 
62     bool IsConcatSupported(const std::vector<const TensorInfo*> inputs,
63                            const TensorInfo& output,
64                            const ConcatDescriptor& descriptor,
65                            Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
66 
67     bool IsConstantSupported(const TensorInfo& output,
68                              Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
69 
70     bool IsConvertBf16ToFp32Supported(const TensorInfo& input,
71                                       const TensorInfo& output,
72                                       Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
73 
74     bool IsConvertFp16ToFp32Supported(const TensorInfo& input,
75                                       const TensorInfo& output,
76                                       Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
77 
78     bool IsConvertFp32ToBf16Supported(const TensorInfo& input,
79                                       const TensorInfo& output,
80                                       Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
81 
82     bool IsConvertFp32ToFp16Supported(const TensorInfo& input,
83                                       const TensorInfo& output,
84                                       Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
85 
86     bool IsConvolution2dSupported(const TensorInfo& input,
87                                   const TensorInfo& output,
88                                   const Convolution2dDescriptor& descriptor,
89                                   const TensorInfo& weights,
90                                   const Optional<TensorInfo>& biases,
91                                   Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
92 
93     bool IsDepthToSpaceSupported(const TensorInfo& input,
94                                  const TensorInfo& output,
95                                  const DepthToSpaceDescriptor& descriptor,
96                                  Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
97 
98 
99     bool IsDepthwiseConvolutionSupported(const TensorInfo& input,
100                                          const TensorInfo& output,
101                                          const DepthwiseConvolution2dDescriptor& descriptor,
102                                          const TensorInfo& weights,
103                                          const Optional<TensorInfo>& biases,
104                                          Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
105 
106     bool IsDequantizeSupported(const TensorInfo& input,
107                                const TensorInfo& output,
108                                Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
109 
110     bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input,
111                                                 const TensorInfo& output,
112                                                 const DepthwiseConvolution2dDescriptor& descriptor,
113                                                 const TensorInfo& weights,
114                                                 const Optional<TensorInfo>& biases,
115                                                 Optional<std::string&> reason = EmptyOptional()) const override;
116 
117     bool IsElementwiseUnarySupported(const TensorInfo& input,
118                                const TensorInfo& output,
119                                const ElementwiseUnaryDescriptor& descriptor,
120                                Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
121 
122     bool IsFillSupported(const TensorInfo& input,
123                          const TensorInfo& output,
124                          const FillDescriptor& descriptor,
125                          Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
126 
127     bool IsFloorSupported(const TensorInfo& input,
128                           const TensorInfo& output,
129                           Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
130 
131     bool IsFullyConnectedSupported(const TensorInfo& input,
132                                    const TensorInfo& output,
133                                    const TensorInfo& weights,
134                                    const TensorInfo& biases,
135                                    const FullyConnectedDescriptor& descriptor,
136                                    Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
137 
138     bool IsGatherSupported(const TensorInfo& input0,
139                            const TensorInfo& input1,
140                            const TensorInfo& output,
141                            const GatherDescriptor& descriptor,
142                            Optional<std::string&> reasonIfUnsupported) const override;
143 
144     ARMNN_DEPRECATED_MSG("Use IsComparisonSupported instead")
145     bool IsGreaterSupported(const TensorInfo& input0,
146                             const TensorInfo& input1,
147                             const TensorInfo& output,
148                             Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
149 
150     bool IsInputSupported(const TensorInfo& input,
151                           Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
152 
153     bool IsInstanceNormalizationSupported(const TensorInfo& input,
154                                           const TensorInfo& output,
155                                           const InstanceNormalizationDescriptor& descriptor,
156                                           Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
157 
158     bool IsL2NormalizationSupported(const TensorInfo& input,
159                                     const TensorInfo& output,
160                                     const L2NormalizationDescriptor& descriptor,
161                                     Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
162 
163     bool IsLogicalBinarySupported(const TensorInfo& input0,
164                                   const TensorInfo& input1,
165                                   const TensorInfo& output,
166                                   const LogicalBinaryDescriptor& descriptor,
167                                   Optional<std::string&> reasonIfUnsupported) const override;
168 
169     bool IsLogSoftmaxSupported(const TensorInfo& input,
170                                const TensorInfo& output,
171                                const LogSoftmaxDescriptor& descriptor,
172                                Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
173 
174     bool IsLstmSupported(const TensorInfo& input,
175                          const TensorInfo& outputStateIn,
176                          const TensorInfo& cellStateIn,
177                          const TensorInfo& scratchBuffer,
178                          const TensorInfo& outputStateOut,
179                          const TensorInfo& cellStateOut,
180                          const TensorInfo& output,
181                          const LstmDescriptor& descriptor,
182                          const LstmInputParamsInfo& paramsInfo,
183                          Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
184 
185     bool IsMaximumSupported(const TensorInfo& input0,
186                             const TensorInfo& input1,
187                             const TensorInfo& output,
188                             Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
189 
190     bool IsMeanSupported(const TensorInfo& input,
191                          const TensorInfo& output,
192                          const MeanDescriptor& descriptor,
193                          Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
194 
195     ARMNN_DEPRECATED_MSG("Use IsConcatSupported instead")
196     bool IsMergerSupported(const std::vector<const TensorInfo*> inputs,
197                            const TensorInfo& output,
198                            const MergerDescriptor& descriptor,
199                            Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
200 
201     bool IsMinimumSupported(const TensorInfo& input0,
202                             const TensorInfo& input1,
203                             const TensorInfo& output,
204                             Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
205 
206     bool IsMultiplicationSupported(const TensorInfo& input0,
207                                    const TensorInfo& input1,
208                                    const TensorInfo& output,
209                                    Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
210 
211     bool IsDivisionSupported(const TensorInfo& input0,
212                              const TensorInfo& input1,
213                              const TensorInfo& output,
214                              Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
215 
216     bool IsNormalizationSupported(const TensorInfo& input,
217                                   const TensorInfo& output,
218                                   const NormalizationDescriptor& descriptor,
219                                   Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
220 
221     bool IsOutputSupported(const TensorInfo& output,
222                            Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
223 
224     bool IsPadSupported(const TensorInfo& input,
225                         const TensorInfo& output,
226                         const PadDescriptor& descriptor,
227                         Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
228 
229     bool IsPermuteSupported(const TensorInfo& input,
230                             const TensorInfo& output,
231                             const PermuteDescriptor& descriptor,
232                             Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
233 
234     bool IsPooling2dSupported(const TensorInfo& input,
235                               const TensorInfo& output,
236                               const Pooling2dDescriptor& descriptor,
237                               Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
238 
239     bool IsPreluSupported(const TensorInfo& input,
240                           const TensorInfo& alpha,
241                           const TensorInfo& output,
242                           Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
243 
244     bool IsQLstmSupported(const TensorInfo& input,
245                           const TensorInfo& previousOutputIn,
246                           const TensorInfo& previousCellStateIn,
247                           const TensorInfo& outputStateOut,
248                           const TensorInfo& cellStateOut,
249                           const TensorInfo& output,
250                           const QLstmDescriptor& descriptor,
251                           const LstmInputParamsInfo& paramsInfo,
252                           Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
253 
254     bool IsQuantizeSupported(const TensorInfo& input,
255                              const TensorInfo& output,
256                              Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
257 
258     bool IsQuantizedLstmSupported(const TensorInfo& input,
259                                   const TensorInfo& cellStateIn,
260                                   const TensorInfo& outputStateIn,
261                                   const TensorInfo& cellStateOut,
262                                   const TensorInfo& outputStateOut,
263                                   const QuantizedLstmInputParamsInfo& paramsInfo,
264                                   Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
265 
266     bool IsReshapeSupported(const TensorInfo& input,
267                             const TensorInfo& output,
268                             const ReshapeDescriptor& descriptor,
269                             Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
270 
271     bool IsResizeSupported(const TensorInfo& input,
272                            const TensorInfo& output,
273                            const ResizeDescriptor& descriptor,
274                            Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
275 
276     ARMNN_DEPRECATED_MSG("Use IsResizeSupported instead")
277     bool IsResizeBilinearSupported(const TensorInfo& input,
278                                    const TensorInfo& output,
279                                    Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
280 
281     ARMNN_DEPRECATED_MSG("Use IsElementwiseUnarySupported instead")
282     bool IsRsqrtSupported(const TensorInfo& input,
283                           const TensorInfo& output,
284                           Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
285 
286     bool IsSliceSupported(const TensorInfo& input,
287                           const TensorInfo& output,
288                           const SliceDescriptor& descriptor,
289                           Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
290 
291     bool IsSoftmaxSupported(const TensorInfo& input,
292                             const TensorInfo& output,
293                             const SoftmaxDescriptor& descriptor,
294                             Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
295 
296     bool IsSpaceToBatchNdSupported(const TensorInfo& input,
297                                    const TensorInfo& output,
298                                    const SpaceToBatchNdDescriptor& descriptor,
299                                    Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
300 
301     bool IsSpaceToDepthSupported(const TensorInfo& input,
302                                  const TensorInfo& output,
303                                  const SpaceToDepthDescriptor& descriptor,
304                                  Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
305 
306     ARMNN_DEPRECATED_MSG("Use IsSplitterSupported with outputs instead")
307     bool IsSplitterSupported(const TensorInfo& input,
308                              const ViewsDescriptor& descriptor,
309                              Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
310 
311     bool IsSplitterSupported(const TensorInfo& input,
312                              const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
313                              const ViewsDescriptor& descriptor,
314                              Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
315 
316     bool IsStackSupported(const std::vector<const TensorInfo*>& inputs,
317                           const TensorInfo& output,
318                           const StackDescriptor& descriptor,
319                           Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
320 
321     bool IsStridedSliceSupported(const TensorInfo& input,
322                                  const TensorInfo& output,
323                                  const StridedSliceDescriptor& descriptor,
324                                  Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
325 
326     bool IsSubtractionSupported(const TensorInfo& input0,
327                                 const TensorInfo& input1,
328                                 const TensorInfo& output,
329                                 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
330 
331     bool IsTransposeConvolution2dSupported(const TensorInfo& input,
332                                            const TensorInfo& output,
333                                            const TransposeConvolution2dDescriptor& descriptor,
334                                            const TensorInfo& weights,
335                                            const Optional<TensorInfo>& biases,
336                                            Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
337 
338     bool IsTransposeSupported(const TensorInfo& input,
339                               const TensorInfo& output,
340                               const TransposeDescriptor& descriptor,
341                               Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
342 
343 private:
344     const IBackendInternal::IBackendSpecificModelContextPtr m_ModelContextPtr;
345 
346 }; // class NeonLayerSupport
347 
348 } // namespace armnn
349