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