1 // 2 // Copyright © 2017-2023 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 ClLayerSupport : public LayerSupportBase 15 { 16 public: 17 explicit ClLayerSupport(const IBackendInternal::IBackendSpecificModelContextPtr& modelContextPtr); 18 ClLayerSupport(); ~ClLayerSupport()19 ~ClLayerSupport() {} 20 21 bool IsLayerSupported(const LayerType& type, 22 const std::vector<TensorInfo>& infos, 23 const BaseDescriptor& descriptor, 24 const Optional<LstmInputParamsInfo>& lstmParamsInfo, 25 const Optional<QuantizedLstmInputParamsInfo>& quantizedLstmParamsInfo, 26 Optional<std::string&> reasonIfUnsupported) const override; 27 28 bool IsActivationSupported(const TensorInfo& input, 29 const TensorInfo& output, 30 const ActivationDescriptor& descriptor, 31 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 32 33 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("Use IsLayerSupported instead", "24.02") 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& ouput, 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 IsDequantizeSupported(const TensorInfo& input, 110 const TensorInfo& output, 111 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 112 113 bool IsDepthToSpaceSupported(const TensorInfo& input, 114 const TensorInfo& output, 115 const DepthToSpaceDescriptor& descriptor, 116 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 117 118 bool IsDepthwiseConvolutionSupported(const TensorInfo& input, 119 const TensorInfo& output, 120 const DepthwiseConvolution2dDescriptor& descriptor, 121 const TensorInfo& weights, 122 const Optional<TensorInfo>& biases, 123 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 124 125 bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input, 126 const TensorInfo& output, 127 const DepthwiseConvolution2dDescriptor& descriptor, 128 const TensorInfo& weights, 129 const Optional<TensorInfo>& biases, 130 Optional<std::string&> reason = EmptyOptional()) const override; 131 132 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("Use IsLayerSupported instead", "24.02") 133 bool IsDivisionSupported(const TensorInfo& input0, 134 const TensorInfo& input1, 135 const TensorInfo& output, 136 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 137 138 bool IsElementwiseUnarySupported(const TensorInfo& input, 139 const TensorInfo& output, 140 const ElementwiseUnaryDescriptor& descriptor, 141 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 142 143 bool IsFillSupported(const TensorInfo& input, 144 const TensorInfo& output, 145 const FillDescriptor& descriptor, 146 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 147 148 bool IsFloorSupported(const TensorInfo& input, 149 const TensorInfo& output, 150 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 151 152 bool IsFullyConnectedSupported(const TensorInfo& input, 153 const TensorInfo& output, 154 const TensorInfo& weights, 155 const TensorInfo& biases, 156 const FullyConnectedDescriptor& descriptor, 157 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 158 159 bool IsGatherNdSupported(const TensorInfo& input0, 160 const TensorInfo& input1, 161 const TensorInfo& output, 162 Optional<std::string&> reasonIfUnsupported) const; 163 164 bool IsGatherSupported(const TensorInfo& input0, 165 const TensorInfo& input1, 166 const TensorInfo& output, 167 const GatherDescriptor& descriptor, 168 Optional<std::string&> reasonIfUnsupported) const override; 169 170 bool IsInputSupported(const TensorInfo& input, 171 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 172 173 bool IsInstanceNormalizationSupported(const TensorInfo& input, 174 const TensorInfo& output, 175 const InstanceNormalizationDescriptor& descriptor, 176 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 177 178 bool IsL2NormalizationSupported(const TensorInfo& input, 179 const TensorInfo& output, 180 const L2NormalizationDescriptor& descriptor, 181 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 182 183 bool IsLogicalBinarySupported(const TensorInfo& input0, 184 const TensorInfo& input1, 185 const TensorInfo& output, 186 const LogicalBinaryDescriptor& descriptor, 187 Optional<std::string&> reasonIfUnsupported) const override; 188 189 bool IsLogSoftmaxSupported(const TensorInfo& input, 190 const TensorInfo& output, 191 const LogSoftmaxDescriptor& descriptor, 192 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 193 194 bool IsLstmSupported(const TensorInfo& input, 195 const TensorInfo& outputStateIn, 196 const TensorInfo& cellStateIn, 197 const TensorInfo& scratchBuffer, 198 const TensorInfo& outputStateOut, 199 const TensorInfo& cellStateOut, 200 const TensorInfo& output, 201 const LstmDescriptor& descriptor, 202 const LstmInputParamsInfo& paramsInfo, 203 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 204 205 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("Use IsLayerSupported instead", "24.02") 206 bool IsMaximumSupported(const TensorInfo& input0, 207 const TensorInfo& input1, 208 const TensorInfo& output, 209 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 210 211 bool IsMeanSupported(const TensorInfo& input, 212 const TensorInfo& output, 213 const MeanDescriptor& descriptor, 214 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 215 216 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("Use IsLayerSupported instead", "24.02") 217 bool IsMinimumSupported(const TensorInfo& input0, 218 const TensorInfo& input1, 219 const TensorInfo& output, 220 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 221 222 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("Use IsLayerSupported instead", "24.02") 223 bool IsMultiplicationSupported(const TensorInfo& input0, 224 const TensorInfo& input1, 225 const TensorInfo& output, 226 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 227 228 bool IsNormalizationSupported(const TensorInfo& input, 229 const TensorInfo& output, 230 const NormalizationDescriptor& descriptor, 231 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 232 233 bool IsOutputSupported(const TensorInfo& output, 234 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 235 236 bool IsPadSupported(const TensorInfo& input, 237 const TensorInfo& output, 238 const PadDescriptor& descriptor, 239 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 240 241 bool IsPermuteSupported(const TensorInfo& input, 242 const TensorInfo& output, 243 const PermuteDescriptor& descriptor, 244 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 245 246 bool IsPooling2dSupported(const TensorInfo& input, 247 const TensorInfo& output, 248 const Pooling2dDescriptor& descriptor, 249 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 250 251 bool IsPooling3dSupported(const TensorInfo& input, 252 const TensorInfo& output, 253 const Pooling3dDescriptor& descriptor, 254 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 255 256 bool IsPreluSupported(const TensorInfo& input, 257 const TensorInfo& alpha, 258 const TensorInfo& output, 259 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 260 261 bool IsQLstmSupported(const TensorInfo& input, 262 const TensorInfo& previousOutputIn, 263 const TensorInfo& previousCellStateIn, 264 const TensorInfo& outputStateOut, 265 const TensorInfo& cellStateOut, 266 const TensorInfo& output, 267 const QLstmDescriptor& descriptor, 268 const LstmInputParamsInfo& paramsInfo, 269 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 270 271 bool IsQuantizedLstmSupported(const TensorInfo& input, 272 const TensorInfo& previousCellStateIn, 273 const TensorInfo& previousOutputIn, 274 const TensorInfo& cellStateOut, 275 const TensorInfo& output, 276 const QuantizedLstmInputParamsInfo& paramsInfo, 277 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 278 279 bool IsQuantizeSupported(const TensorInfo& input, 280 const TensorInfo& output, 281 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 282 283 bool IsReduceSupported(const TensorInfo& input, 284 const TensorInfo& output, 285 const ReduceDescriptor& descriptor, 286 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 287 288 bool IsReshapeSupported(const TensorInfo& input, 289 const TensorInfo& output, 290 const ReshapeDescriptor& descriptor, 291 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 292 293 bool IsResizeSupported(const TensorInfo& input, 294 const TensorInfo& output, 295 const ResizeDescriptor& descriptor, 296 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 297 298 bool IsSliceSupported(const TensorInfo& input, 299 const TensorInfo& output, 300 const SliceDescriptor& descriptor, 301 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 302 303 bool IsSoftmaxSupported(const TensorInfo& input, 304 const TensorInfo& output, 305 const SoftmaxDescriptor& descriptor, 306 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 307 308 bool IsSpaceToBatchNdSupported(const TensorInfo& input, 309 const TensorInfo& output, 310 const SpaceToBatchNdDescriptor& descriptor, 311 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 312 313 bool IsSpaceToDepthSupported(const TensorInfo& input, 314 const TensorInfo& output, 315 const SpaceToDepthDescriptor& descriptor, 316 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 317 318 bool IsSplitterSupported(const TensorInfo& input, 319 const std::vector<std::reference_wrapper<TensorInfo>>& outputs, 320 const ViewsDescriptor& descriptor, 321 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 322 323 bool IsStackSupported(const std::vector<const TensorInfo*>& inputs, 324 const TensorInfo& output, 325 const StackDescriptor& descriptor, 326 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 327 328 bool IsStridedSliceSupported(const TensorInfo& input, 329 const TensorInfo& output, 330 const StridedSliceDescriptor& descriptor, 331 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 332 333 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("Use IsLayerSupported instead", "24.02") 334 bool IsSubtractionSupported(const TensorInfo& input0, 335 const TensorInfo& input1, 336 const TensorInfo& output, 337 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 338 339 bool IsTransposeConvolution2dSupported(const TensorInfo& input, 340 const TensorInfo& output, 341 const TransposeConvolution2dDescriptor& descriptor, 342 const TensorInfo& weights, 343 const Optional<TensorInfo>& biases, 344 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 345 346 bool IsTransposeSupported(const TensorInfo& input, 347 const TensorInfo& output, 348 const TransposeDescriptor& descriptor, 349 Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; 350 351 bool IsUnidirectionalSequenceLstmSupported(const TensorInfo& input, 352 const TensorInfo& outputStateIn, 353 const TensorInfo& cellStateIn, 354 const TensorInfo& outputStateOut, 355 const TensorInfo& cellStateOut, 356 const TensorInfo& output, 357 const UnidirectionalSequenceLstmDescriptor& descriptor, 358 const LstmInputParamsInfo& paramsInfo, 359 Optional<std::string&> reasonIfUnsupported) const override; 360 361 private: 362 const IBackendInternal::IBackendSpecificModelContextPtr m_ModelContextPtr; 363 364 }; 365 366 } // namespace armnn 367