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