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