blob: 155d96acdce28c090b1f1a2e5e01fd75ce520bed [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
Aron Virginas-Tar2f00b742019-09-30 13:28:08 +010097 bool IsDepthToSpaceSupported(const TensorInfo& input,
98 const TensorInfo& output,
99 const DepthToSpaceDescriptor& descriptor,
100 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
101
102
arovir017ff76c52018-10-09 09:40:58 +0100103 bool IsDepthwiseConvolutionSupported(const TensorInfo& input,
104 const TensorInfo& output,
105 const DepthwiseConvolution2dDescriptor& descriptor,
106 const TensorInfo& weights,
107 const Optional<TensorInfo>& biases,
108 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
109
Narumol Prangnawarat01961a72019-05-30 16:47:12 +0100110 bool IsDequantizeSupported(const TensorInfo& input,
111 const TensorInfo& output,
112 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
113
Pablo Tellof0bd6832019-04-26 17:58:13 +0100114 bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input,
115 const TensorInfo& output,
116 const DepthwiseConvolution2dDescriptor& descriptor,
117 const TensorInfo& weights,
118 const Optional<TensorInfo>& biases,
119 Optional<std::string&> reason = EmptyOptional()) const override;
120
josh minor4a3c6102020-01-06 16:40:46 -0600121 bool IsElementwiseUnarySupported(const TensorInfo& input,
122 const TensorInfo& output,
123 const ElementwiseUnaryDescriptor& descriptor,
124 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
125
Sadik Armagana792a052020-06-23 16:22:23 +0100126 bool IsFillSupported(const TensorInfo& input,
127 const TensorInfo& output,
128 const FillDescriptor& descriptor,
129 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
130
arovir017ff76c52018-10-09 09:40:58 +0100131 bool IsFloorSupported(const TensorInfo& input,
132 const TensorInfo& output,
133 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
134
135 bool IsFullyConnectedSupported(const TensorInfo& input,
136 const TensorInfo& output,
137 const TensorInfo& weights,
138 const TensorInfo& biases,
139 const FullyConnectedDescriptor& descriptor,
140 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
141
Teresa Charlinf540eb82020-04-10 19:24:55 +0100142 bool IsGatherSupported(const TensorInfo& input0,
143 const TensorInfo& input1,
144 const TensorInfo& output,
Teresa Charlin52664732020-06-29 16:27:03 +0100145 const GatherDescriptor& descriptor,
Teresa Charlinf540eb82020-04-10 19:24:55 +0100146 Optional<std::string&> reasonIfUnsupported) const override;
147
arovir017ff76c52018-10-09 09:40:58 +0100148 bool IsInputSupported(const TensorInfo& input,
149 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
150
Sadik Armagan0d4863d2019-10-09 14:26:32 +0100151 bool IsInstanceNormalizationSupported(const TensorInfo& input,
152 const TensorInfo& output,
153 const InstanceNormalizationDescriptor& descriptor,
154 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
155
arovir017ff76c52018-10-09 09:40:58 +0100156 bool IsL2NormalizationSupported(const TensorInfo& input,
157 const TensorInfo& output,
158 const L2NormalizationDescriptor& descriptor,
159 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
160
James Conroy177df1e2020-11-13 10:18:51 +0000161 bool IsLogicalBinarySupported(const TensorInfo& input0,
162 const TensorInfo& input1,
163 const TensorInfo& output,
164 const LogicalBinaryDescriptor& descriptor,
165 Optional<std::string&> reasonIfUnsupported) const override;
166
Keith Davis69e653f2020-07-02 11:49:26 +0100167 bool IsLogSoftmaxSupported(const TensorInfo& input,
168 const TensorInfo& output,
169 const LogSoftmaxDescriptor& descriptor,
170 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
171
Jan Eilersad5293a2019-07-08 09:57:55 +0100172 bool IsLstmSupported(const TensorInfo& input,
173 const TensorInfo& outputStateIn,
174 const TensorInfo& cellStateIn,
175 const TensorInfo& scratchBuffer,
176 const TensorInfo& outputStateOut,
177 const TensorInfo& cellStateOut,
178 const TensorInfo& output,
179 const LstmDescriptor& descriptor,
180 const LstmInputParamsInfo& paramsInfo,
181 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
182
Nattapat Chaimanowong4e6597a2018-12-20 14:14:06 +0000183 bool IsMaximumSupported(const TensorInfo& input0,
184 const TensorInfo& input1,
185 const TensorInfo& output,
186 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
187
arovir017ff76c52018-10-09 09:40:58 +0100188 bool IsMeanSupported(const TensorInfo& input,
189 const TensorInfo& output,
190 const MeanDescriptor& descriptor,
191 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
192
Conor Kennedy54b21692019-01-09 07:57:38 +0000193 bool IsMinimumSupported(const TensorInfo& input0,
194 const TensorInfo& input1,
195 const TensorInfo& output,
196 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
197
arovir017ff76c52018-10-09 09:40:58 +0100198 bool IsMultiplicationSupported(const TensorInfo& input0,
199 const TensorInfo& input1,
200 const TensorInfo& output,
201 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
202
Pablo Telloe61f0712020-01-23 10:37:17 +0000203 bool IsDivisionSupported(const TensorInfo& input0,
204 const TensorInfo& input1,
205 const TensorInfo& output,
206 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
207
arovir017ff76c52018-10-09 09:40:58 +0100208 bool IsNormalizationSupported(const TensorInfo& input,
209 const TensorInfo& output,
210 const NormalizationDescriptor& descriptor,
211 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
212
213 bool IsOutputSupported(const TensorInfo& output,
214 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
215
Éanna Ó Catháin12055742019-01-25 10:01:40 +0000216 bool IsPadSupported(const TensorInfo& input,
217 const TensorInfo& output,
218 const PadDescriptor& descriptor,
219 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
220
arovir017ff76c52018-10-09 09:40:58 +0100221 bool IsPermuteSupported(const TensorInfo& input,
222 const TensorInfo& output,
223 const PermuteDescriptor& descriptor,
224 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
225
226 bool IsPooling2dSupported(const TensorInfo& input,
227 const TensorInfo& output,
228 const Pooling2dDescriptor& descriptor,
229 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
230
Nikhil Raj9b461482019-07-03 15:58:31 +0100231 bool IsPreluSupported(const TensorInfo& input,
232 const TensorInfo& alpha,
233 const TensorInfo& output,
234 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
235
James Conroycc340932020-05-12 18:08:52 +0100236 bool IsQLstmSupported(const TensorInfo& input,
237 const TensorInfo& previousOutputIn,
238 const TensorInfo& previousCellStateIn,
239 const TensorInfo& outputStateOut,
240 const TensorInfo& cellStateOut,
241 const TensorInfo& output,
242 const QLstmDescriptor& descriptor,
243 const LstmInputParamsInfo& paramsInfo,
244 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
245
Sadik Armaganfabc2892019-05-31 09:05:11 +0100246 bool IsQuantizeSupported(const TensorInfo& input,
247 const TensorInfo& output,
248 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
249
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100250 bool IsQuantizedLstmSupported(const TensorInfo& input,
251 const TensorInfo& cellStateIn,
252 const TensorInfo& outputStateIn,
253 const TensorInfo& cellStateOut,
254 const TensorInfo& outputStateOut,
255 const QuantizedLstmInputParamsInfo& paramsInfo,
256 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
257
Sadik Armagana2747482021-02-09 10:28:54 +0000258 bool IsReduceSupported(const TensorInfo& input,
259 const TensorInfo& output,
260 const ReduceDescriptor& descriptor,
261 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
262
arovir017ff76c52018-10-09 09:40:58 +0100263 bool IsReshapeSupported(const TensorInfo& input,
Kevin Maya023c402019-12-12 17:28:05 +0000264 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000265 const ReshapeDescriptor& descriptor,
arovir017ff76c52018-10-09 09:40:58 +0100266 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
267
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100268 bool IsResizeSupported(const TensorInfo& input,
269 const TensorInfo& output,
270 const ResizeDescriptor& descriptor,
271 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
272
josh minor036f02d2019-11-15 14:53:22 -0600273 bool IsSliceSupported(const TensorInfo& input,
274 const TensorInfo& output,
275 const SliceDescriptor& descriptor,
276 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
277
arovir017ff76c52018-10-09 09:40:58 +0100278 bool IsSoftmaxSupported(const TensorInfo& input,
279 const TensorInfo& output,
280 const SoftmaxDescriptor& descriptor,
281 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
282
Mike Kelly0be3a882020-01-24 11:27:50 +0000283 bool IsSpaceToBatchNdSupported(const TensorInfo& input,
284 const TensorInfo& output,
285 const SpaceToBatchNdDescriptor& descriptor,
286 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
287
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100288 bool IsSpaceToDepthSupported(const TensorInfo& input,
289 const TensorInfo& output,
290 const SpaceToDepthDescriptor& descriptor,
291 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
292
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100293 bool IsSplitterSupported(const TensorInfo& input,
294 const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
295 const ViewsDescriptor& descriptor,
296 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
297
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100298 bool IsStackSupported(const std::vector<const TensorInfo*>& inputs,
299 const TensorInfo& output,
300 const StackDescriptor& descriptor,
301 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
302
FinnWilliamsArm1fa19192019-08-02 17:26:31 +0100303 bool IsStridedSliceSupported(const TensorInfo& input,
304 const TensorInfo& output,
305 const StridedSliceDescriptor& descriptor,
306 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
307
arovir017ff76c52018-10-09 09:40:58 +0100308 bool IsSubtractionSupported(const TensorInfo& input0,
309 const TensorInfo& input1,
310 const TensorInfo& output,
311 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
Sadik Armagan581742d2019-08-12 14:11:37 +0100312
313 bool IsTransposeConvolution2dSupported(const TensorInfo& input,
314 const TensorInfo& output,
315 const TransposeConvolution2dDescriptor& descriptor,
316 const TensorInfo& weights,
317 const Optional<TensorInfo>& biases,
318 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
319
Mike Kellyc9ea45a2020-02-28 18:11:58 +0000320 bool IsTransposeSupported(const TensorInfo& input,
321 const TensorInfo& output,
322 const TransposeDescriptor& descriptor,
323 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override;
324
Sadik Armagan045f6be2020-09-10 13:37:32 +0100325private:
326 const IBackendInternal::IBackendSpecificModelContextPtr m_ModelContextPtr;
327
Aron Virginas-Tarfc824312018-10-15 15:00:13 +0100328}; // class NeonLayerSupport
arovir014424b0a2018-10-04 10:46:04 +0100329
arovir017ff76c52018-10-09 09:40:58 +0100330} // namespace armnn