blob: 16507c595e4d5fd64b9eda1184717ebbe7abd92e [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Keith Davis69e653f2020-07-02 11:49:26 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#pragma once
6
Sadik Armagan045f6be2020-09-10 13:37:32 +01007#include <armnn/backends/IBackendInternal.hpp>
8
Matteo Martincigh992d6dc2019-01-10 17:34:20 +00009#include <backendsCommon/LayerSupportBase.hpp>
telsoa014fcda012018-03-09 14:13:49 +000010
11namespace armnn
12{
13
Matteo Martincigh992d6dc2019-01-10 17:34:20 +000014class NeonLayerSupport : public LayerSupportBase
arovir014424b0a2018-10-04 10:46:04 +010015{
arovir017ff76c52018-10-09 09:40:58 +010016public:
Sadik Armagan045f6be2020-09-10 13:37:32 +010017 explicit NeonLayerSupport(const IBackendInternal::IBackendSpecificModelContextPtr& modelContextPtr);
18 NeonLayerSupport();
19
20 ~NeonLayerSupport() {}
21
arovir017ff76c52018-10-09 09:40:58 +010022 bool IsActivationSupported(const TensorInfo& input,
23 const TensorInfo& output,
24 const ActivationDescriptor& descriptor,
25 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
26
27 bool IsAdditionSupported(const TensorInfo& input0,
28 const TensorInfo& input1,
29 const TensorInfo& output,
30 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
31
James Conroyd47a0642019-09-17 14:22:06 +010032 bool IsArgMinMaxSupported(const TensorInfo& input,
33 const TensorInfo& output,
34 const ArgMinMaxDescriptor& descriptor,
35 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
36
arovir017ff76c52018-10-09 09:40:58 +010037 bool IsBatchNormalizationSupported(const TensorInfo& input,
38 const TensorInfo& output,
39 const TensorInfo& mean,
40 const TensorInfo& var,
41 const TensorInfo& beta,
42 const TensorInfo& gamma,
43 const BatchNormalizationDescriptor& descriptor,
44 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
45
Mike Kelly56858022020-01-27 12:14:47 +000046 bool IsBatchToSpaceNdSupported(const TensorInfo& input,
47 const TensorInfo& output,
48 const BatchToSpaceNdDescriptor& descriptor,
49 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
50
Sadik Armagan48f011e2021-04-21 10:50:34 +010051 bool IsCastSupported(const TensorInfo& input,
52 const TensorInfo& output,
53 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
54
Teresa Charline89dd692021-09-01 16:30:34 +010055 bool IsChannelShuffleSupported(const TensorInfo& input,
56 const TensorInfo& output,
57 const ChannelShuffleDescriptor& descriptor,
58 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
59
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010060 bool IsComparisonSupported(const TensorInfo& input0,
61 const TensorInfo& input1,
62 const TensorInfo& output,
63 const ComparisonDescriptor& descriptor,
64 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
65
Jim Flynn906f9462019-05-10 13:55:21 +010066 bool IsConcatSupported(const std::vector<const TensorInfo*> inputs,
67 const TensorInfo& output,
Jim Flynne242f2d2019-05-22 14:24:13 +010068 const ConcatDescriptor& descriptor,
Jim Flynn906f9462019-05-10 13:55:21 +010069 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
70
arovir017ff76c52018-10-09 09:40:58 +010071 bool IsConstantSupported(const TensorInfo& output,
72 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
73
Narumol Prangnawarat250d3922020-03-30 16:11:04 +010074 bool IsConvertBf16ToFp32Supported(const TensorInfo& input,
75 const TensorInfo& output,
76 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
77
arovir017ff76c52018-10-09 09:40:58 +010078 bool IsConvertFp16ToFp32Supported(const TensorInfo& input,
79 const TensorInfo& output,
80 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
81
Narumol Prangnawarat250d3922020-03-30 16:11:04 +010082 bool IsConvertFp32ToBf16Supported(const TensorInfo& input,
83 const TensorInfo& output,
84 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
85
arovir017ff76c52018-10-09 09:40:58 +010086 bool IsConvertFp32ToFp16Supported(const TensorInfo& input,
87 const TensorInfo& output,
88 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
89
90 bool IsConvolution2dSupported(const TensorInfo& input,
91 const TensorInfo& output,
92 const Convolution2dDescriptor& descriptor,
93 const TensorInfo& weights,
94 const Optional<TensorInfo>& biases,
95 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
96
Teresa Charlinec5f7d12021-10-22 17:15:00 +010097 bool IsConvolution3dSupported(const TensorInfo& input,
98 const TensorInfo& output,
99 const Convolution3dDescriptor& descriptor,
100 const TensorInfo& weights,
101 const Optional<TensorInfo>& biases,
102 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
103
Aron Virginas-Tar2f00b742019-09-30 13:28:08 +0100104 bool IsDepthToSpaceSupported(const TensorInfo& input,
105 const TensorInfo& output,
106 const DepthToSpaceDescriptor& descriptor,
107 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
108
109
arovir017ff76c52018-10-09 09:40:58 +0100110 bool IsDepthwiseConvolutionSupported(const TensorInfo& input,
111 const TensorInfo& output,
112 const DepthwiseConvolution2dDescriptor& descriptor,
113 const TensorInfo& weights,
114 const Optional<TensorInfo>& biases,
115 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
116
Narumol Prangnawarat01961a72019-05-30 16:47:12 +0100117 bool IsDequantizeSupported(const TensorInfo& input,
118 const TensorInfo& output,
119 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
120
Pablo Tellof0bd6832019-04-26 17:58:13 +0100121 bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input,
122 const TensorInfo& output,
123 const DepthwiseConvolution2dDescriptor& descriptor,
124 const TensorInfo& weights,
125 const Optional<TensorInfo>& biases,
126 Optional<std::string&> reason = EmptyOptional()) const override;
127
josh minor4a3c6102020-01-06 16:40:46 -0600128 bool IsElementwiseUnarySupported(const TensorInfo& input,
129 const TensorInfo& output,
130 const ElementwiseUnaryDescriptor& descriptor,
131 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
132
Sadik Armagana792a052020-06-23 16:22:23 +0100133 bool IsFillSupported(const TensorInfo& input,
134 const TensorInfo& output,
135 const FillDescriptor& descriptor,
136 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
137
arovir017ff76c52018-10-09 09:40:58 +0100138 bool IsFloorSupported(const TensorInfo& input,
139 const TensorInfo& output,
140 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
141
142 bool IsFullyConnectedSupported(const TensorInfo& input,
143 const TensorInfo& output,
144 const TensorInfo& weights,
145 const TensorInfo& biases,
146 const FullyConnectedDescriptor& descriptor,
147 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
148
Teresa Charlinf540eb82020-04-10 19:24:55 +0100149 bool IsGatherSupported(const TensorInfo& input0,
150 const TensorInfo& input1,
151 const TensorInfo& output,
Teresa Charlin52664732020-06-29 16:27:03 +0100152 const GatherDescriptor& descriptor,
Teresa Charlinf540eb82020-04-10 19:24:55 +0100153 Optional<std::string&> reasonIfUnsupported) const override;
154
arovir017ff76c52018-10-09 09:40:58 +0100155 bool IsInputSupported(const TensorInfo& input,
156 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
157
Sadik Armagan0d4863d2019-10-09 14:26:32 +0100158 bool IsInstanceNormalizationSupported(const TensorInfo& input,
159 const TensorInfo& output,
160 const InstanceNormalizationDescriptor& descriptor,
161 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
162
arovir017ff76c52018-10-09 09:40:58 +0100163 bool IsL2NormalizationSupported(const TensorInfo& input,
164 const TensorInfo& output,
165 const L2NormalizationDescriptor& descriptor,
166 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
167
James Conroy177df1e2020-11-13 10:18:51 +0000168 bool IsLogicalBinarySupported(const TensorInfo& input0,
169 const TensorInfo& input1,
170 const TensorInfo& output,
171 const LogicalBinaryDescriptor& descriptor,
172 Optional<std::string&> reasonIfUnsupported) const override;
173
Keith Davis69e653f2020-07-02 11:49:26 +0100174 bool IsLogSoftmaxSupported(const TensorInfo& input,
175 const TensorInfo& output,
176 const LogSoftmaxDescriptor& descriptor,
177 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
178
Jan Eilersad5293a2019-07-08 09:57:55 +0100179 bool IsLstmSupported(const TensorInfo& input,
180 const TensorInfo& outputStateIn,
181 const TensorInfo& cellStateIn,
182 const TensorInfo& scratchBuffer,
183 const TensorInfo& outputStateOut,
184 const TensorInfo& cellStateOut,
185 const TensorInfo& output,
186 const LstmDescriptor& descriptor,
187 const LstmInputParamsInfo& paramsInfo,
188 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
189
Nattapat Chaimanowong4e6597a2018-12-20 14:14:06 +0000190 bool IsMaximumSupported(const TensorInfo& input0,
191 const TensorInfo& input1,
192 const TensorInfo& output,
193 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
194
arovir017ff76c52018-10-09 09:40:58 +0100195 bool IsMeanSupported(const TensorInfo& input,
196 const TensorInfo& output,
197 const MeanDescriptor& descriptor,
198 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
199
Conor Kennedy54b21692019-01-09 07:57:38 +0000200 bool IsMinimumSupported(const TensorInfo& input0,
201 const TensorInfo& input1,
202 const TensorInfo& output,
203 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
204
arovir017ff76c52018-10-09 09:40:58 +0100205 bool IsMultiplicationSupported(const TensorInfo& input0,
206 const TensorInfo& input1,
207 const TensorInfo& output,
208 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
209
Pablo Telloe61f0712020-01-23 10:37:17 +0000210 bool IsDivisionSupported(const TensorInfo& input0,
211 const TensorInfo& input1,
212 const TensorInfo& output,
213 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
214
arovir017ff76c52018-10-09 09:40:58 +0100215 bool IsNormalizationSupported(const TensorInfo& input,
216 const TensorInfo& output,
217 const NormalizationDescriptor& descriptor,
218 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
219
220 bool IsOutputSupported(const TensorInfo& output,
221 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
222
Éanna Ó Catháin12055742019-01-25 10:01:40 +0000223 bool IsPadSupported(const TensorInfo& input,
224 const TensorInfo& output,
225 const PadDescriptor& descriptor,
226 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
227
arovir017ff76c52018-10-09 09:40:58 +0100228 bool IsPermuteSupported(const TensorInfo& input,
229 const TensorInfo& output,
230 const PermuteDescriptor& descriptor,
231 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
232
233 bool IsPooling2dSupported(const TensorInfo& input,
234 const TensorInfo& output,
235 const Pooling2dDescriptor& descriptor,
236 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
237
Nikhil Raj9b461482019-07-03 15:58:31 +0100238 bool IsPreluSupported(const TensorInfo& input,
239 const TensorInfo& alpha,
240 const TensorInfo& output,
241 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
242
James Conroycc340932020-05-12 18:08:52 +0100243 bool IsQLstmSupported(const TensorInfo& input,
244 const TensorInfo& previousOutputIn,
245 const TensorInfo& previousCellStateIn,
246 const TensorInfo& outputStateOut,
247 const TensorInfo& cellStateOut,
248 const TensorInfo& output,
249 const QLstmDescriptor& descriptor,
250 const LstmInputParamsInfo& paramsInfo,
251 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
252
Sadik Armaganfabc2892019-05-31 09:05:11 +0100253 bool IsQuantizeSupported(const TensorInfo& input,
254 const TensorInfo& output,
255 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
256
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100257 bool IsQuantizedLstmSupported(const TensorInfo& input,
258 const TensorInfo& cellStateIn,
259 const TensorInfo& outputStateIn,
260 const TensorInfo& cellStateOut,
261 const TensorInfo& outputStateOut,
262 const QuantizedLstmInputParamsInfo& paramsInfo,
263 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
264
Sadik Armagana2747482021-02-09 10:28:54 +0000265 bool IsReduceSupported(const TensorInfo& input,
266 const TensorInfo& output,
267 const ReduceDescriptor& descriptor,
268 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
269
arovir017ff76c52018-10-09 09:40:58 +0100270 bool IsReshapeSupported(const TensorInfo& input,
Kevin Maya023c402019-12-12 17:28:05 +0000271 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000272 const ReshapeDescriptor& descriptor,
arovir017ff76c52018-10-09 09:40:58 +0100273 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
274
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100275 bool IsResizeSupported(const TensorInfo& input,
276 const TensorInfo& output,
277 const ResizeDescriptor& descriptor,
278 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
279
josh minor036f02d2019-11-15 14:53:22 -0600280 bool IsSliceSupported(const TensorInfo& input,
281 const TensorInfo& output,
282 const SliceDescriptor& descriptor,
283 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
284
arovir017ff76c52018-10-09 09:40:58 +0100285 bool IsSoftmaxSupported(const TensorInfo& input,
286 const TensorInfo& output,
287 const SoftmaxDescriptor& descriptor,
288 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
289
Mike Kelly0be3a882020-01-24 11:27:50 +0000290 bool IsSpaceToBatchNdSupported(const TensorInfo& input,
291 const TensorInfo& output,
292 const SpaceToBatchNdDescriptor& descriptor,
293 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
294
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100295 bool IsSpaceToDepthSupported(const TensorInfo& input,
296 const TensorInfo& output,
297 const SpaceToDepthDescriptor& descriptor,
298 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
299
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100300 bool IsSplitterSupported(const TensorInfo& input,
301 const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
302 const ViewsDescriptor& descriptor,
303 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
304
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100305 bool IsStackSupported(const std::vector<const TensorInfo*>& inputs,
306 const TensorInfo& output,
307 const StackDescriptor& descriptor,
308 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
309
FinnWilliamsArm1fa19192019-08-02 17:26:31 +0100310 bool IsStridedSliceSupported(const TensorInfo& input,
311 const TensorInfo& output,
312 const StridedSliceDescriptor& descriptor,
313 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
314
arovir017ff76c52018-10-09 09:40:58 +0100315 bool IsSubtractionSupported(const TensorInfo& input0,
316 const TensorInfo& input1,
317 const TensorInfo& output,
318 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Sadik Armagan581742d2019-08-12 14:11:37 +0100319
320 bool IsTransposeConvolution2dSupported(const TensorInfo& input,
321 const TensorInfo& output,
322 const TransposeConvolution2dDescriptor& descriptor,
323 const TensorInfo& weights,
324 const Optional<TensorInfo>& biases,
325 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
326
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000327 bool IsTransposeSupported(const TensorInfo& input,
328 const TensorInfo& output,
329 const TransposeDescriptor& descriptor,
330 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
331
Sadik Armagan045f6be2020-09-10 13:37:32 +0100332private:
333 const IBackendInternal::IBackendSpecificModelContextPtr m_ModelContextPtr;
334
Aron Virginas-Tarfc824312018-10-15 15:00:13 +0100335}; // class NeonLayerSupport
arovir014424b0a2018-10-04 10:46:04 +0100336
arovir017ff76c52018-10-09 09:40:58 +0100337} // namespace armnn