blob: aa8382670834e5d66a1b09fe963dff0b098fece9 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Teresa Charlin8398edc2020-07-20 14:23:02 +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
telsoa014fcda012018-03-09 14:13:49 +00006#include "ClLayerSupport.hpp"
David Beck3e9e1152018-10-17 14:17:50 +01007#include "ClBackendId.hpp"
Sadik Armagan045f6be2020-09-10 13:37:32 +01008#include "ClBackendModelContext.hpp"
arovir017c22c702018-10-09 11:16:46 +01009
David Beck3cc9a622018-10-12 10:38:31 +010010#include <armnn/Descriptors.hpp>
Matteo Martincighc601aa62019-10-29 15:03:22 +000011#include <armnn/BackendRegistry.hpp>
12
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000013#include <InternalTypes.hpp>
14#include <LayerSupportCommon.hpp>
telsoa014fcda012018-03-09 14:13:49 +000015
Sadik Armagan045f6be2020-09-10 13:37:32 +010016#include <armnn/utility/IgnoreUnused.hpp>
17#include <armnn/utility/PolymorphicDowncast.hpp>
18
Matteo Martincighd95e9062019-01-31 15:35:59 +000019#if defined(ARMCOMPUTECL_ENABLED)
Narumol Prangnawarat74135832019-05-23 15:07:33 +010020#include <aclCommon/ArmComputeUtils.hpp>
Aron Virginas-Tar710f6642019-11-27 14:48:32 +000021#include <aclCommon/ArmComputeTensorUtils.hpp>
Aron Virginas-Tar82046942019-09-09 15:18:29 +010022#include "workloads/ClAbsWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010023#include "workloads/ClAdditionWorkload.hpp"
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010024#include "workloads/ClActivationWorkload.hpp"
James Conroy2dc05722019-09-19 17:00:31 +010025#include "workloads/ClArgMinMaxWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010026#include "workloads/ClBatchNormalizationFloatWorkload.hpp"
Mike Kelly831faed2018-11-28 11:52:08 +000027#include "workloads/ClBatchToSpaceNdWorkload.hpp"
Sadik Armaganf40d6d42021-04-22 09:12:11 +010028#include "workloads/ClCastWorkload.hpp"
Teresa Charlin2b030d92020-03-27 16:40:56 +000029#include "workloads/ClComparisonWorkload.hpp"
Mike Kelly0886ac42020-04-27 09:55:40 +010030#include "workloads/ClConstantWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010031#include "workloads/ClConvertFp16ToFp32Workload.hpp"
32#include "workloads/ClConvertFp32ToFp16Workload.hpp"
Matthew Benthamd8067922018-10-03 17:18:04 +010033#include "workloads/ClConvolution2dWorkload.hpp"
Aron Virginas-Tarb2801962019-09-30 11:24:53 +010034#include "workloads/ClDepthToSpaceWorkload.hpp"
Matthew Benthamd8777392018-10-08 09:38:55 +010035#include "workloads/ClDepthwiseConvolutionWorkload.hpp"
Aron Virginas-Tarb2801962019-09-30 11:24:53 +010036#include "workloads/ClDequantizeWorkload.hpp"
Teresa Charline11e63d2021-04-21 12:56:45 +010037#include "workloads/ClDivisionWorkload.hpp"
Sadik Armagan9fabf432020-05-27 13:40:58 +010038#include "workloads/ClExpWorkload.hpp"
Sadik Armagan66aecb02020-06-24 11:42:20 +010039#include "workloads/ClFillWorkload.hpp"
Sadik Armagan9be49162019-10-30 16:15:26 +000040#include "workloads/ClFloorFloatWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010041#include "workloads/ClFullyConnectedWorkload.hpp"
Teresa Charlin9ad2e5b2020-04-10 22:34:48 +010042#include "workloads/ClGatherWorkload.hpp"
Aron Virginas-Tar8168f402019-10-04 13:10:16 +010043#include "workloads/ClInstanceNormalizationWorkload.hpp"
arovir01085f0a42018-10-08 14:48:19 +010044#include "workloads/ClL2NormalizationFloatWorkload.hpp"
Teresa Charlin8398edc2020-07-20 14:23:02 +010045#include "workloads/ClLogSoftmaxWorkload.hpp"
James Conroyfe3ec942020-11-18 14:20:53 +000046#include "workloads/ClLogicalAndWorkload.hpp"
47#include "workloads/ClLogicalNotWorkload.hpp"
48#include "workloads/ClLogicalOrWorkload.hpp"
arovir01085f0a42018-10-08 14:48:19 +010049#include "workloads/ClLstmFloatWorkload.hpp"
keidav01a959ee52018-12-19 10:04:58 +000050#include "workloads/ClMaximumWorkload.hpp"
Matteo Martincigh28dcab62018-10-19 16:40:03 +010051#include "workloads/ClMeanWorkload.hpp"
Jim Flynn69059412019-05-17 13:03:57 +010052#include "workloads/ClConcatWorkload.hpp"
saoste019292aa32019-01-08 13:55:59 +000053#include "workloads/ClMinimumWorkload.hpp"
arovir01085f0a42018-10-08 14:48:19 +010054#include "workloads/ClMultiplicationWorkload.hpp"
Sadik Armaganac472102020-03-24 09:54:36 +000055#include "workloads/ClNegWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010056#include "workloads/ClNormalizationFloatWorkload.hpp"
arovir01085f0a42018-10-08 14:48:19 +010057#include "workloads/ClPadWorkload.hpp"
58#include "workloads/ClPermuteWorkload.hpp"
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +010059#include "workloads/ClPooling2dWorkload.hpp"
Nikhil Raj91e4c6d2019-07-05 12:22:58 +010060#include "workloads/ClPreluWorkload.hpp"
Ryan OShea2323af42020-05-13 16:36:19 +010061#include "workloads/ClQLstmWorkload.hpp"
62#include "workloads/ClQuantizedLstmWorkload.hpp"
63#include "workloads/ClQuantizeWorkload.hpp"
Sadik Armagana2747482021-02-09 10:28:54 +000064#include "workloads/ClReduceWorkload.hpp"
Kevin Maya023c402019-12-12 17:28:05 +000065#include "workloads/ClReshapeWorkload.hpp"
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +010066#include "workloads/ClResizeWorkload.hpp"
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +010067#include "workloads/ClRsqrtWorkload.hpp"
Aron Virginas-Tar94c4fef2019-11-25 15:37:08 +000068#include "workloads/ClSliceWorkload.hpp"
Teresa Charlinc1f6b092020-05-11 16:10:38 +010069#include "workloads/ClSoftmaxWorkload.hpp"
Sadik Armaganf4464322018-12-20 16:19:12 +000070#include "workloads/ClSpaceToBatchNdWorkload.hpp"
James Conroyd2aa85e2019-07-01 17:12:40 +010071#include "workloads/ClSpaceToDepthWorkload.hpp"
Narumol Prangnawarat74135832019-05-23 15:07:33 +010072#include "workloads/ClSplitterWorkload.hpp"
Matthew Jacksond5166102019-07-31 14:06:28 +010073#include "workloads/ClStackWorkload.hpp"
keidav01d74dc912018-12-10 18:16:07 +000074#include "workloads/ClStridedSliceWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010075#include "workloads/ClSubtractionWorkload.hpp"
Aron Virginas-Tar7a3e2fe2019-06-27 18:54:47 +010076#include "workloads/ClTransposeConvolution2dWorkload.hpp"
Mike Kellyc9ea45a2020-02-28 18:11:58 +000077#include "workloads/ClTransposeWorkload.hpp"
telsoa014fcda012018-03-09 14:13:49 +000078#endif
79
telsoa014fcda012018-03-09 14:13:49 +000080
81namespace armnn
82{
arovir017c22c702018-10-09 11:16:46 +010083
telsoa014fcda012018-03-09 14:13:49 +000084namespace
85{
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +010086
telsoa014fcda012018-03-09 14:13:49 +000087template<unsigned int FilterSize>
88bool IsMatchingSize2d(const TensorInfo& weightInfo)
89{
telsoa01c577f2c2018-08-31 09:22:23 +010090 // Width & Height must match.
telsoa014fcda012018-03-09 14:13:49 +000091 return (weightInfo.GetShape()[3] == FilterSize) && (weightInfo.GetShape()[2] == FilterSize);
92}
93
94template<uint32_t ValidStride>
95bool IsMatchingStride(uint32_t actualStride)
96{
97 return ValidStride == actualStride;
98}
99
100template<uint32_t FirstStride, uint32_t SecondStride, uint32_t... ValidStrides>
101bool IsMatchingStride(uint32_t actualStride)
102{
103 return IsMatchingStride<FirstStride>(actualStride) || IsMatchingStride<SecondStride, ValidStrides...>(actualStride);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100104}
telsoa014fcda012018-03-09 14:13:49 +0000105
Derek Lamberti901ea112019-12-10 22:07:09 +0000106template<typename ... Args>
107bool IsClBackendSupported(Optional<std::string&> reasonIfUnsupported, Args... args)
telsoa014fcda012018-03-09 14:13:49 +0000108{
Jan Eilers8eb25602020-03-09 12:13:48 +0000109 IgnoreUnused(reasonIfUnsupported, (args)...);
Matteo Martincighd95e9062019-01-31 15:35:59 +0000110#if defined(ARMCOMPUTECL_ENABLED)
telsoa014fcda012018-03-09 14:13:49 +0000111 return true;
112#else
arovir01085f0a42018-10-08 14:48:19 +0100113 if (reasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +0000114 {
arovir01085f0a42018-10-08 14:48:19 +0100115 reasonIfUnsupported.value() = "The armnn library has been built without CL support";
telsoa014fcda012018-03-09 14:13:49 +0000116 }
117 return false;
118#endif
119}
120
Matteo Martincighd95e9062019-01-31 15:35:59 +0000121#if defined(ARMCOMPUTECL_ENABLED)
telsoa014fcda012018-03-09 14:13:49 +0000122#define FORWARD_CL_LAYER_SUPPORT_FUNC(expr) (expr)
123#else
124#define FORWARD_CL_LAYER_SUPPORT_FUNC(expr) IsClBackendSupported(reasonIfUnsupported)
125#endif
126
Matteo Martincighd95e9062019-01-31 15:35:59 +0000127#if defined(ARMCOMPUTECL_ENABLED)
telsoa014fcda012018-03-09 14:13:49 +0000128template<class FuncType, class... Args>
arovir01085f0a42018-10-08 14:48:19 +0100129inline bool IsWorkloadSupported(FuncType&& func, Optional<std::string&> reasonIfUnsupported, Args&&... args)
telsoa014fcda012018-03-09 14:13:49 +0000130{
131 arm_compute::Status aclStatus = func(std::forward<Args>(args)...);
132 const bool supported = (aclStatus.error_code() == arm_compute::ErrorCode::OK);
133 if (!supported && reasonIfUnsupported)
134 {
arovir01085f0a42018-10-08 14:48:19 +0100135 reasonIfUnsupported.value() = aclStatus.error_description();
telsoa014fcda012018-03-09 14:13:49 +0000136 }
137 return supported;
138}
139
140#define FORWARD_WORKLOAD_VALIDATE_FUNC(func, reasonIfUnsupported, ...) \
141 return IsWorkloadSupported(func, reasonIfUnsupported, __VA_ARGS__);
142#else
143#define FORWARD_WORKLOAD_VALIDATE_FUNC(func, reasonIfUnsupported, ...) \
Derek Lamberti901ea112019-12-10 22:07:09 +0000144 return IsClBackendSupported(reasonIfUnsupported, __VA_ARGS__);
telsoa014fcda012018-03-09 14:13:49 +0000145#endif
146
telsoa01c577f2c2018-08-31 09:22:23 +0100147template<typename FloatFunc, typename Uint8Func, typename ... Params>
arovir01085f0a42018-10-08 14:48:19 +0100148bool IsSupportedForDataTypeCl(Optional<std::string&> reasonIfUnsupported,
telsoa014fcda012018-03-09 14:13:49 +0000149 DataType dataType,
telsoa01c577f2c2018-08-31 09:22:23 +0100150 FloatFunc floatFuncPtr,
telsoa014fcda012018-03-09 14:13:49 +0000151 Uint8Func uint8FuncPtr,
152 Params&&... params)
153{
154 return IsClBackendSupported(reasonIfUnsupported) &&
155 IsSupportedForDataTypeGeneric(reasonIfUnsupported,
156 dataType,
157 floatFuncPtr,
telsoa01c577f2c2018-08-31 09:22:23 +0100158 floatFuncPtr,
telsoa014fcda012018-03-09 14:13:49 +0000159 uint8FuncPtr,
narpra01db2b1602019-01-23 15:23:11 +0000160 &FalseFunc<>,
kevmay012b4d88e2019-01-24 14:05:09 +0000161 &FalseFunc<>,
telsoa014fcda012018-03-09 14:13:49 +0000162 std::forward<Params>(params)...);
163}
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100164} // anonymous namespace
165
Sadik Armagan045f6be2020-09-10 13:37:32 +0100166ClLayerSupport::ClLayerSupport(const IBackendInternal::IBackendSpecificModelContextPtr& modelContextPtr)
167 : m_ModelContextPtr(modelContextPtr)
168{
169}
170
171ClLayerSupport::ClLayerSupport()
172 : m_ModelContextPtr(nullptr)
173{
174}
175
Aron Virginas-Tar82046942019-09-09 15:18:29 +0100176bool ClLayerSupport::IsAbsSupported(const TensorInfo& input,
177 const TensorInfo& output,
178 Optional<std::string&> reasonIfUnsupported) const
179{
josh minor4a3c6102020-01-06 16:40:46 -0600180 ElementwiseUnaryDescriptor descriptor(UnaryOperation::Abs);
181 return IsElementwiseUnarySupported(input, output, descriptor, reasonIfUnsupported);
Aron Virginas-Tar82046942019-09-09 15:18:29 +0100182}
183
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100184bool ClLayerSupport::IsActivationSupported(const TensorInfo& input,
185 const TensorInfo& output,
186 const ActivationDescriptor& descriptor,
187 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000188{
telsoa01c577f2c2018-08-31 09:22:23 +0100189 FORWARD_WORKLOAD_VALIDATE_FUNC(ClActivationWorkloadValidate,
190 reasonIfUnsupported,
191 input,
192 output,
193 descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000194}
195
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100196bool ClLayerSupport::IsAdditionSupported(const TensorInfo& input0,
197 const TensorInfo& input1,
198 const TensorInfo& output,
199 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000200{
arovir01085f0a42018-10-08 14:48:19 +0100201 FORWARD_WORKLOAD_VALIDATE_FUNC(ClAdditionValidate,
202 reasonIfUnsupported,
203 input0,
204 input1,
Mike Kelly07810fc2020-11-12 10:58:48 +0000205 output,
206 nullptr);
telsoa014fcda012018-03-09 14:13:49 +0000207}
208
James Conroy2dc05722019-09-19 17:00:31 +0100209bool ClLayerSupport::IsArgMinMaxSupported(const TensorInfo& input,
210 const TensorInfo& output,
211 const ArgMinMaxDescriptor& descriptor,
212 Optional<std::string&> reasonIfUnsupported) const
213{
Francis Murtagh52ec3462019-11-19 12:24:19 +0000214
James Conroy2dc05722019-09-19 17:00:31 +0100215 FORWARD_WORKLOAD_VALIDATE_FUNC(ClArgMinMaxWorkloadValidate,
216 reasonIfUnsupported,
217 input,
218 output,
219 descriptor);
220}
221
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100222bool ClLayerSupport::IsBatchNormalizationSupported(const TensorInfo& input,
223 const TensorInfo& output,
224 const TensorInfo& mean,
225 const TensorInfo& var,
226 const TensorInfo& beta,
227 const TensorInfo& gamma,
228 const BatchNormalizationDescriptor& descriptor,
229 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000230{
telsoa01c577f2c2018-08-31 09:22:23 +0100231 FORWARD_WORKLOAD_VALIDATE_FUNC(ClBatchNormalizationValidate,
232 reasonIfUnsupported,
233 input,
234 output,
235 mean,
236 var,
237 beta,
238 gamma,
Mike Kelly07810fc2020-11-12 10:58:48 +0000239 descriptor,
240 nullptr);
telsoa014fcda012018-03-09 14:13:49 +0000241}
242
Sadik Armaganf40d6d42021-04-22 09:12:11 +0100243bool ClLayerSupport::IsCastSupported(const TensorInfo& input,
244 const TensorInfo& output,
245 Optional<std::string&> reasonIfUnsupported) const
246{
247 FORWARD_WORKLOAD_VALIDATE_FUNC(ClCastValidate,
248 reasonIfUnsupported,
249 input,
250 output);
251}
252
Mike Kelly831faed2018-11-28 11:52:08 +0000253bool ClLayerSupport::IsBatchToSpaceNdSupported(const TensorInfo& input,
254 const TensorInfo& output,
255 const BatchToSpaceNdDescriptor& descriptor,
256 Optional<std::string&> reasonIfUnsupported) const
257{
258 FORWARD_WORKLOAD_VALIDATE_FUNC(ClBatchToSpaceNdWorkloadValidate,
259 reasonIfUnsupported,
260 input,
261 output,
262 descriptor);
263}
264
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100265bool ClLayerSupport::IsComparisonSupported(const TensorInfo& input0,
266 const TensorInfo& input1,
267 const TensorInfo& output,
268 const ComparisonDescriptor& descriptor,
269 Optional<std::string&> reasonIfUnsupported) const
270{
Teresa Charlin2b030d92020-03-27 16:40:56 +0000271 FORWARD_WORKLOAD_VALIDATE_FUNC(ClComparisonWorkloadValidate,
272 reasonIfUnsupported,
273 input0,
274 input1,
275 output,
276 descriptor);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100277}
278
Jim Flynn906f9462019-05-10 13:55:21 +0100279bool ClLayerSupport::IsConcatSupported(const std::vector<const TensorInfo*> inputs,
280 const TensorInfo& output,
Jim Flynne242f2d2019-05-22 14:24:13 +0100281 const ConcatDescriptor& descriptor,
Jim Flynn906f9462019-05-10 13:55:21 +0100282 Optional<std::string&> reasonIfUnsupported) const
283{
Jim Flynne242f2d2019-05-22 14:24:13 +0100284 if (descriptor.GetNumDimensions() <= descriptor.GetConcatAxis())
285 {
286 SetValueChecked(reasonIfUnsupported, "Cl Concat: Concat axis > Number of dimensions.");
287 return false;
288 }
289
290 unsigned int concatInnerAxis = (descriptor.GetNumDimensions() - descriptor.GetConcatAxis()) - 1;
291 if(concatInnerAxis < 3) // Width, height, or channels
292 {
293 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConcatWorkloadValidate,
294 reasonIfUnsupported,
295 inputs,
296 output,
297 descriptor);
298 }
299 else if (concatInnerAxis == 3)
300 {
301 // We rely on the sub-tensor optimization to handle the batch dimension for 4D tensors. If we can't use
302 // sub-tensors for this then we can't support it. Here is where we check that the sub-tensors will work.
303 for (auto& input : inputs)
304 {
305 if (input && !output.IsTypeSpaceMatch(*input)) // Cannot use sub-tensors if the types are not same space
306 {
307 SetValueChecked(reasonIfUnsupported, "Cl Concat: Types and quantization parameters must match.");
308 return false;
309 }
310 }
311 return true; // Sub-tensors support concat along batch
312 }
313 else // > 4 dimensions not supported.
314 {
315 SetValueChecked(reasonIfUnsupported, "Cl Concat: Maximum of 4 dimensions supported.");
316 return false;
317 }
Jim Flynn906f9462019-05-10 13:55:21 +0100318}
319
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100320bool ClLayerSupport::IsConstantSupported(const TensorInfo& output,
321 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000322{
Mike Kelly0886ac42020-04-27 09:55:40 +0100323 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConstantWorkloadValidate,
324 reasonIfUnsupported,
325 output);
telsoa014fcda012018-03-09 14:13:49 +0000326}
327
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100328bool ClLayerSupport::IsConvertFp16ToFp32Supported(const TensorInfo& input,
329 const TensorInfo& output,
330 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000331{
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100332 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConvertFp16ToFp32WorkloadValidate,
333 reasonIfUnsupported,
334 input,
335 output);
telsoa014fcda012018-03-09 14:13:49 +0000336}
337
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100338bool ClLayerSupport::IsConvertFp32ToFp16Supported(const TensorInfo& input,
339 const TensorInfo& output,
340 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000341{
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100342 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConvertFp32ToFp16WorkloadValidate,
343 reasonIfUnsupported,
344 input,
345 output);
telsoa014fcda012018-03-09 14:13:49 +0000346}
347
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100348bool ClLayerSupport::IsConvolution2dSupported(const TensorInfo& input,
349 const TensorInfo& output,
350 const Convolution2dDescriptor& descriptor,
351 const TensorInfo& weights,
352 const Optional<TensorInfo>& biases,
353 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000354{
Sadik Armagan045f6be2020-09-10 13:37:32 +0100355 bool isFastMathEnabled = false;
356#if defined(ARMCOMPUTECL_ENABLED)
357 if (m_ModelContextPtr)
358 {
359 if (m_ModelContextPtr.get() != nullptr)
360 {
361 auto modelOptions = dynamic_cast<ClBackendModelContext*>(m_ModelContextPtr.get());
362 if (modelOptions)
363 {
364 isFastMathEnabled = modelOptions->IsFastMathEnabled();
365 }
366 }
367 }
368#endif
369
surmeh013537c2c2018-05-18 16:31:43 +0100370 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConvolution2dWorkloadValidate,
371 reasonIfUnsupported,
372 input,
373 output,
374 descriptor,
375 weights,
Sadik Armagan045f6be2020-09-10 13:37:32 +0100376 biases,
Mike Kelly07810fc2020-11-12 10:58:48 +0000377 isFastMathEnabled,
378 nullptr);
telsoa014fcda012018-03-09 14:13:49 +0000379}
380
Jim Flynn983daec2019-05-29 16:20:16 +0100381bool ClLayerSupport::IsDequantizeSupported(const TensorInfo& input,
382 const TensorInfo& output,
383 Optional<std::string&> reasonIfUnsupported) const
384{
385 FORWARD_WORKLOAD_VALIDATE_FUNC(ClDequantizeWorkloadValidate,
386 reasonIfUnsupported,
387 input,
388 output);
389}
390
Aron Virginas-Tarb2801962019-09-30 11:24:53 +0100391bool ClLayerSupport::IsDepthToSpaceSupported(const TensorInfo& input,
392 const TensorInfo& output,
393 const DepthToSpaceDescriptor& descriptor,
394 Optional<std::string&> reasonIfUnsupported) const
395{
396 FORWARD_WORKLOAD_VALIDATE_FUNC(ClDepthToSpaceWorkloadValidate,
397 reasonIfUnsupported,
398 input,
399 output,
400 descriptor);
401}
402
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100403bool ClLayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input,
404 const TensorInfo& output,
405 const DepthwiseConvolution2dDescriptor& descriptor,
406 const TensorInfo& weights,
407 const Optional<TensorInfo>& biases,
408 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000409{
telsoa01c577f2c2018-08-31 09:22:23 +0100410 FORWARD_WORKLOAD_VALIDATE_FUNC(ClDepthwiseConvolutionWorkloadValidate,
411 reasonIfUnsupported,
412 input,
413 output,
414 descriptor,
415 weights,
Mike Kelly07810fc2020-11-12 10:58:48 +0000416 biases,
417 nullptr);
telsoa014fcda012018-03-09 14:13:49 +0000418}
419
Pablo Tellof0bd6832019-04-26 17:58:13 +0100420bool ClLayerSupport::IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input,
421 const TensorInfo& output,
422 const DepthwiseConvolution2dDescriptor& descriptor,
423 const TensorInfo& weights,
424 const Optional<TensorInfo>& biases,
425 Optional<std::string&> reasonIfUnsupported) const
426{
427 FORWARD_WORKLOAD_VALIDATE_FUNC(ClDepthwiseConvolutionWorkloadValidate,
428 reasonIfUnsupported,
429 input,
430 output,
431 descriptor,
432 weights,
Mike Kelly07810fc2020-11-12 10:58:48 +0000433 biases,
434 nullptr);
Pablo Tellof0bd6832019-04-26 17:58:13 +0100435}
436
437
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100438bool ClLayerSupport::IsDivisionSupported(const TensorInfo& input0,
439 const TensorInfo& input1,
440 const TensorInfo& output,
441 Optional<std::string&> reasonIfUnsupported) const
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100442{
443 FORWARD_WORKLOAD_VALIDATE_FUNC(ClDivisionWorkloadValidate,
444 reasonIfUnsupported,
445 input0,
446 input1,
Mike Kelly07810fc2020-11-12 10:58:48 +0000447 output,
448 nullptr);
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100449}
450
josh minor4a3c6102020-01-06 16:40:46 -0600451bool ClLayerSupport::IsElementwiseUnarySupported(const TensorInfo& input,
452 const TensorInfo& output,
453 const ElementwiseUnaryDescriptor& descriptor,
454 Optional<std::string&> reasonIfUnsupported) const
455{
Sadik Armagan9fabf432020-05-27 13:40:58 +0100456 switch(descriptor.m_Operation)
josh minor4a3c6102020-01-06 16:40:46 -0600457 {
Sadik Armagan9fabf432020-05-27 13:40:58 +0100458 case UnaryOperation::Abs:
459 FORWARD_WORKLOAD_VALIDATE_FUNC(ClAbsWorkloadValidate,
460 reasonIfUnsupported,
461 input,
462 output);
463 case UnaryOperation::Exp:
464 FORWARD_WORKLOAD_VALIDATE_FUNC(ClExpWorkloadValidate,
465 reasonIfUnsupported,
466 input,
467 output);
468 case UnaryOperation::Neg:
469 FORWARD_WORKLOAD_VALIDATE_FUNC(ClNegWorkloadValidate,
470 reasonIfUnsupported,
471 input,
472 output);
473 case UnaryOperation::Rsqrt:
474 FORWARD_WORKLOAD_VALIDATE_FUNC(ClRsqrtWorkloadValidate,
475 reasonIfUnsupported,
476 input,
477 output);
James Conroyfe3ec942020-11-18 14:20:53 +0000478 case UnaryOperation::LogicalNot:
479 FORWARD_WORKLOAD_VALIDATE_FUNC(ClLogicalNotWorkloadValidate,
480 reasonIfUnsupported,
481 input,
482 output);
Sadik Armagan9fabf432020-05-27 13:40:58 +0100483 default:
484 return false;
josh minor4a3c6102020-01-06 16:40:46 -0600485 }
josh minor4a3c6102020-01-06 16:40:46 -0600486}
487
Teresa Charlin4b10fef2020-07-29 09:36:41 +0100488bool ClLayerSupport::IsFillSupported(const TensorInfo& input,
489 const TensorInfo& output,
490 const FillDescriptor& descriptor,
491 Optional<std::string&> reasonIfUnsupported) const
Sadik Armagan66aecb02020-06-24 11:42:20 +0100492{
Teresa Charlin4b10fef2020-07-29 09:36:41 +0100493 armnn::IgnoreUnused(input);
494 armnn::IgnoreUnused(output);
495 armnn::IgnoreUnused(descriptor);
496
497 return IsClBackendSupported(reasonIfUnsupported);
Sadik Armagan66aecb02020-06-24 11:42:20 +0100498}
499
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100500bool ClLayerSupport::IsFloorSupported(const TensorInfo& input,
501 const TensorInfo& output,
502 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000503{
Sadik Armagan9be49162019-10-30 16:15:26 +0000504 FORWARD_WORKLOAD_VALIDATE_FUNC(ClFloorWorkloadValidate,
505 reasonIfUnsupported,
506 input,
507 output);
telsoa01c577f2c2018-08-31 09:22:23 +0100508}
509
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100510bool ClLayerSupport::IsFullyConnectedSupported(const TensorInfo& input,
511 const TensorInfo& output,
512 const TensorInfo& weights,
513 const TensorInfo& biases,
514 const FullyConnectedDescriptor& descriptor,
515 Optional<std::string&> reasonIfUnsupported) const
516{
517 FORWARD_WORKLOAD_VALIDATE_FUNC(ClFullyConnectedWorkloadValidate,
518 reasonIfUnsupported,
519 input,
520 output,
521 weights,
522 biases,
Mike Kelly07810fc2020-11-12 10:58:48 +0000523 descriptor,
524 nullptr);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100525}
526
Teresa Charlin9ad2e5b2020-04-10 22:34:48 +0100527bool ClLayerSupport::IsGatherSupported(const TensorInfo& input0,
528 const TensorInfo& input1,
529 const TensorInfo& output,
Teresa Charlin52664732020-06-29 16:27:03 +0100530 const GatherDescriptor& descriptor,
Teresa Charlin9ad2e5b2020-04-10 22:34:48 +0100531 Optional<std::string&> reasonIfUnsupported) const
532{
533 FORWARD_WORKLOAD_VALIDATE_FUNC(ClGatherWorkloadValidate,
534 reasonIfUnsupported,
535 input0,
536 input1,
Teresa Charlin52664732020-06-29 16:27:03 +0100537 output,
538 descriptor);
Teresa Charlin9ad2e5b2020-04-10 22:34:48 +0100539}
540
Nattapat Chaimanowongc6a41ff2019-01-29 09:56:02 +0000541bool ClLayerSupport::IsGreaterSupported(const TensorInfo& input0,
542 const TensorInfo& input1,
543 const TensorInfo& output,
544 Optional<std::string&> reasonIfUnsupported) const
545{
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +0100546 ComparisonDescriptor descriptor(ComparisonOperation::Greater);
547 return IsComparisonSupported(input0, input1, output, descriptor, reasonIfUnsupported);
Nattapat Chaimanowongc6a41ff2019-01-29 09:56:02 +0000548}
549
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100550bool ClLayerSupport::IsInputSupported(const TensorInfo& input,
551 Optional<std::string&> reasonIfUnsupported) const
552{
Derek Lamberti901ea112019-12-10 22:07:09 +0000553 return IsClBackendSupported(reasonIfUnsupported, input);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100554}
555
Aron Virginas-Tar8168f402019-10-04 13:10:16 +0100556bool ClLayerSupport::IsInstanceNormalizationSupported(const TensorInfo& input,
557 const TensorInfo& output,
558 const InstanceNormalizationDescriptor& descriptor,
559 Optional<std::string&> reasonIfUnsupported) const
560{
561 FORWARD_WORKLOAD_VALIDATE_FUNC(ClInstanceNormalizationWorkloadValidate,
562 reasonIfUnsupported,
563 input,
564 output,
565 descriptor);
566}
567
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100568bool ClLayerSupport::IsL2NormalizationSupported(const TensorInfo& input,
569 const TensorInfo& output,
570 const L2NormalizationDescriptor& descriptor,
571 Optional<std::string&> reasonIfUnsupported) const
572{
573 FORWARD_WORKLOAD_VALIDATE_FUNC(ClL2NormalizationWorkloadValidate,
574 reasonIfUnsupported,
575 input,
576 output,
577 descriptor);
578}
579
James Conroyfe3ec942020-11-18 14:20:53 +0000580bool ClLayerSupport::IsLogicalBinarySupported(const TensorInfo& input0,
581 const TensorInfo& input1,
582 const TensorInfo& output,
583 const LogicalBinaryDescriptor& descriptor,
584 Optional<std::string&> reasonIfUnsupported) const
585{
586 IgnoreUnused(output);
587
588 switch(descriptor.m_Operation)
589 {
590 case LogicalBinaryOperation::LogicalAnd:
591 FORWARD_WORKLOAD_VALIDATE_FUNC(ClLogicalAndWorkloadValidate,
592 reasonIfUnsupported,
593 input0,
594 input1,
595 output);
596 case LogicalBinaryOperation::LogicalOr:
597 FORWARD_WORKLOAD_VALIDATE_FUNC(ClLogicalOrWorkloadValidate,
598 reasonIfUnsupported,
599 input0,
600 input1,
601 output);
602 default:
603 return false;
604 }
605}
606
607
Teresa Charlin8398edc2020-07-20 14:23:02 +0100608bool ClLayerSupport::IsLogSoftmaxSupported(const TensorInfo& input,
609 const TensorInfo& output,
610 const LogSoftmaxDescriptor& descriptor,
611 Optional<std::string&> reasonIfUnsupported) const
612{
613 FORWARD_WORKLOAD_VALIDATE_FUNC(ClLogSoftmaxWorkloadValidate,
614 reasonIfUnsupported,
615 input,
616 output,
617 descriptor);
618}
619
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100620bool ClLayerSupport::IsLstmSupported(const TensorInfo& input,
621 const TensorInfo& outputStateIn,
622 const TensorInfo& cellStateIn,
623 const TensorInfo& scratchBuffer,
624 const TensorInfo& outputStateOut,
625 const TensorInfo& cellStateOut,
626 const TensorInfo& output,
627 const LstmDescriptor& descriptor,
Jan Eilersd01a83c2019-07-03 18:20:40 +0100628 const LstmInputParamsInfo& paramsInfo,
629 Optional<std::string&> reasonIfUnsupported) const
telsoa01c577f2c2018-08-31 09:22:23 +0100630{
arovir01085f0a42018-10-08 14:48:19 +0100631 FORWARD_WORKLOAD_VALIDATE_FUNC(ClLstmFloatWorkloadValidate,
632 reasonIfUnsupported,
633 input,
634 outputStateIn,
635 cellStateIn,
636 scratchBuffer,
637 outputStateOut,
638 cellStateOut,
639 output,
640 descriptor,
Jan Eilersd01a83c2019-07-03 18:20:40 +0100641 paramsInfo);
telsoa01c577f2c2018-08-31 09:22:23 +0100642}
643
keidav01a959ee52018-12-19 10:04:58 +0000644bool ClLayerSupport::IsMaximumSupported(const TensorInfo& input0,
645 const TensorInfo& input1,
646 const TensorInfo& output,
647 Optional<std::string&> reasonIfUnsupported) const
648{
649 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMaximumWorkloadValidate,
650 reasonIfUnsupported,
651 input0,
652 input1,
653 output);
654}
655
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100656bool ClLayerSupport::IsMeanSupported(const TensorInfo& input,
657 const TensorInfo& output,
658 const MeanDescriptor& descriptor,
659 Optional<std::string&> reasonIfUnsupported) const
narpra0132b90462018-09-13 11:07:48 +0100660{
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100661 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMeanValidate,
662 reasonIfUnsupported,
663 input,
664 output,
665 descriptor);
narpra0132b90462018-09-13 11:07:48 +0100666}
667
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100668bool ClLayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
Nikhil Raj8599a412018-11-19 14:51:07 +0000669 const TensorInfo& output,
Jim Flynne242f2d2019-05-22 14:24:13 +0100670 const MergerDescriptor& descriptor,
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100671 Optional<std::string&> reasonIfUnsupported) const
672{
Jim Flynne242f2d2019-05-22 14:24:13 +0100673 return IsConcatSupported(inputs, output, descriptor, reasonIfUnsupported);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100674}
675
saoste019292aa32019-01-08 13:55:59 +0000676bool ClLayerSupport::IsMinimumSupported(const TensorInfo& input0,
677 const TensorInfo& input1,
678 const TensorInfo& output,
679 Optional<std::string&> reasonIfUnsupported) const
680{
681 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMinimumWorkloadValidate,
682 reasonIfUnsupported,
683 input0,
684 input1,
685 output);
686}
687
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100688bool ClLayerSupport::IsMultiplicationSupported(const TensorInfo& input0,
689 const TensorInfo& input1,
690 const TensorInfo& output,
691 Optional<std::string&> reasonIfUnsupported) const
692{
693 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMultiplicationWorkloadValidate,
694 reasonIfUnsupported,
695 input0,
696 input1,
Mike Kelly07810fc2020-11-12 10:58:48 +0000697 output,
698 nullptr);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100699}
700
701bool ClLayerSupport::IsNormalizationSupported(const TensorInfo& input,
702 const TensorInfo& output,
703 const NormalizationDescriptor& descriptor,
704 Optional<std::string&> reasonIfUnsupported) const
705{
706 FORWARD_WORKLOAD_VALIDATE_FUNC(ClNormalizationWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
707}
708
709bool ClLayerSupport::IsOutputSupported(const TensorInfo& output,
710 Optional<std::string&> reasonIfUnsupported) const
711{
Derek Lamberti901ea112019-12-10 22:07:09 +0000712 return IsClBackendSupported(reasonIfUnsupported, output);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100713}
714
715bool ClLayerSupport::IsPadSupported(const TensorInfo& input,
716 const TensorInfo& output,
717 const PadDescriptor& descriptor,
718 Optional<std::string&> reasonIfUnsupported) const
arovir01085f0a42018-10-08 14:48:19 +0100719{
720 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPadValidate,
721 reasonIfUnsupported,
722 input,
723 output,
724 descriptor);
725}
726
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100727bool ClLayerSupport::IsPermuteSupported(const TensorInfo& input,
728 const TensorInfo& output,
729 const PermuteDescriptor& descriptor,
730 Optional<std::string&> reasonIfUnsupported) const
731{
Matthew Bentham9820d302019-11-27 17:24:47 +0000732 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPermuteWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000733}
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100734
735bool ClLayerSupport::IsPooling2dSupported(const TensorInfo& input,
736 const TensorInfo& output,
737 const Pooling2dDescriptor& descriptor,
738 Optional<std::string&> reasonIfUnsupported) const
739{
740 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPooling2dWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
741}
742
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100743bool ClLayerSupport::IsPreluSupported(const armnn::TensorInfo &input,
744 const armnn::TensorInfo &alpha,
745 const armnn::TensorInfo &output,
746 armnn::Optional<std::string &> reasonIfUnsupported) const
747{
748 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPreluWorkloadValidate, reasonIfUnsupported, input, alpha, output);
749}
750
Ryan OShea2323af42020-05-13 16:36:19 +0100751bool ClLayerSupport::IsQLstmSupported(const TensorInfo& input,
752 const TensorInfo& previousOutputIn,
753 const TensorInfo& previousCellStateIn,
754 const TensorInfo& outputStateOut,
755 const TensorInfo& cellStateOut,
756 const TensorInfo& output,
757 const QLstmDescriptor& descriptor,
758 const LstmInputParamsInfo& paramsInfo,
759 Optional<std::string&> reasonIfUnsupported) const
760{
761 if (input.GetDataType() == armnn::DataType::QAsymmS8 &&
762 previousOutputIn.GetDataType() == armnn::DataType::QAsymmS8 &&
763 previousCellStateIn.GetDataType() == armnn::DataType::QSymmS16 &&
764 outputStateOut.GetDataType() == armnn::DataType::QAsymmS8 &&
765 cellStateOut.GetDataType() == armnn::DataType::QSymmS16 &&
766 output.GetDataType() == armnn::DataType::QAsymmS8)
767 {
768 FORWARD_WORKLOAD_VALIDATE_FUNC(ClQLstmWorkloadValidate,
769 reasonIfUnsupported,
770 input,
771 previousCellStateIn,
772 previousOutputIn,
773 cellStateOut,
774 outputStateOut,
775 output,
776 descriptor,
777 paramsInfo);
778 }
779 else
780 {
781 return false;
782 }
783}
784
Ferran Balaguer737d9ff2019-08-01 09:58:08 +0100785bool ClLayerSupport::IsQuantizedLstmSupported(const TensorInfo& input,
786 const TensorInfo& previousCellStateIn,
787 const TensorInfo& previousOutputIn,
788 const TensorInfo& cellStateOut,
789 const TensorInfo& output,
790 const QuantizedLstmInputParamsInfo& paramsInfo,
791 Optional<std::string&> reasonIfUnsupported) const
792{
793 FORWARD_WORKLOAD_VALIDATE_FUNC(ClQuantizedLstmWorkloadValidate,
794 reasonIfUnsupported,
795 input,
796 previousCellStateIn,
797 previousOutputIn,
798 cellStateOut,
799 output,
800 paramsInfo);
801}
802
Sadik Armagan20ec2492019-05-31 09:09:44 +0100803bool ClLayerSupport::IsQuantizeSupported(const TensorInfo& input,
804 const TensorInfo& output,
805 Optional<std::string&> reasonIfUnsupported) const
806{
807 FORWARD_WORKLOAD_VALIDATE_FUNC(ClQuantizeWorkloadValidate,
808 reasonIfUnsupported,
809 input,
810 output);
811}
812
Sadik Armagana2747482021-02-09 10:28:54 +0000813bool ClLayerSupport::IsReduceSupported(const TensorInfo& input,
814 const TensorInfo& output,
815 const ReduceDescriptor& descriptor,
816 Optional<std::string&> reasonIfUnsupported) const
817{
818 FORWARD_WORKLOAD_VALIDATE_FUNC(ClReduceWorkloadValidate,
819 reasonIfUnsupported,
820 input,
821 output,
822 descriptor);
823}
824
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100825bool ClLayerSupport::IsReshapeSupported(const TensorInfo& input,
Kevin Maya023c402019-12-12 17:28:05 +0000826 const TensorInfo& output,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000827 const ReshapeDescriptor& descriptor,
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100828 Optional<std::string&> reasonIfUnsupported) const
829{
Jan Eilers8eb25602020-03-09 12:13:48 +0000830 IgnoreUnused(descriptor);
Kevin Maya023c402019-12-12 17:28:05 +0000831 FORWARD_WORKLOAD_VALIDATE_FUNC(ClReshapeWorkloadValidate, reasonIfUnsupported, input, output);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100832}
833
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100834bool ClLayerSupport::IsResizeSupported(const TensorInfo& input,
835 const TensorInfo& output,
836 const ResizeDescriptor& descriptor,
837 Optional<std::string&> reasonIfUnsupported) const
838{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100839 FORWARD_WORKLOAD_VALIDATE_FUNC(ClResizeWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100840}
841
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100842bool ClLayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
Sadik Armaganc625f002018-12-17 11:32:16 +0000843 const TensorInfo& output,
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100844 Optional<std::string&> reasonIfUnsupported) const
845{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100846 ResizeDescriptor descriptor;
847 descriptor.m_Method = ResizeMethod::Bilinear;
848 descriptor.m_DataLayout = DataLayout::NCHW;
849
850 const TensorShape& outputShape = output.GetShape();
851 descriptor.m_TargetHeight = outputShape[2];
852 descriptor.m_TargetWidth = outputShape[3];
853
854 return IsResizeSupported(input, output, descriptor, reasonIfUnsupported);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100855}
856
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100857bool ClLayerSupport::IsRsqrtSupported(const TensorInfo& input,
858 const TensorInfo& output,
859 Optional<std::string&> reasonIfUnsupported) const
860{
josh minor4a3c6102020-01-06 16:40:46 -0600861 ElementwiseUnaryDescriptor descriptor(UnaryOperation::Rsqrt);
862 return IsElementwiseUnarySupported(input, output, descriptor, reasonIfUnsupported);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100863}
864
Aron Virginas-Tar94c4fef2019-11-25 15:37:08 +0000865bool ClLayerSupport::IsSliceSupported(const TensorInfo& input,
866 const TensorInfo& output,
867 const SliceDescriptor& descriptor,
868 Optional<std::string&> reasonIfUnsupported) const
869{
870 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSliceWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
871}
872
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100873bool ClLayerSupport::IsSoftmaxSupported(const TensorInfo& input,
874 const TensorInfo& output,
875 const SoftmaxDescriptor& descriptor,
876 Optional<std::string&> reasonIfUnsupported) const
877{
Francis Murtagh3b938352019-07-26 15:44:17 +0100878 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSoftmaxWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100879}
880
Sadik Armaganf4464322018-12-20 16:19:12 +0000881bool ClLayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input,
882 const TensorInfo& output,
883 const SpaceToBatchNdDescriptor& descriptor,
884 Optional<std::string&> reasonIfUnsupported) const
885{
886 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSpaceToBatchNdWorkloadValidate,
887 reasonIfUnsupported,
888 input,
889 output,
890 descriptor);
891}
892
James Conroyd2aa85e2019-07-01 17:12:40 +0100893bool ClLayerSupport::IsSpaceToDepthSupported(const TensorInfo& input,
894 const TensorInfo& output,
895 const SpaceToDepthDescriptor& descriptor,
896 Optional<std::string&> reasonIfUnsupported) const
897{
898 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSpaceToDepthWorkloadValidate,
899 reasonIfUnsupported,
900 input,
901 output,
902 descriptor);
903}
904
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100905bool ClLayerSupport::IsSplitterSupported(const TensorInfo& input,
906 const ViewsDescriptor& descriptor,
907 Optional<std::string&> reasonIfUnsupported) const
908{
Jan Eilers8eb25602020-03-09 12:13:48 +0000909 IgnoreUnused(descriptor);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100910 return IsSupportedForDataTypeCl(reasonIfUnsupported,
911 input.GetDataType(),
912 &TrueFunc<>,
913 &TrueFunc<>);
914}
915
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100916bool ClLayerSupport::IsSplitterSupported(const TensorInfo& input,
917 const std::vector<std::reference_wrapper<TensorInfo>>& outputs,
918 const ViewsDescriptor& descriptor,
919 Optional<std::string&> reasonIfUnsupported) const
920{
Narumol Prangnawarat74135832019-05-23 15:07:33 +0100921#if defined(ARMCOMPUTECL_ENABLED)
922 // Split along the last dimension, cannot use sub-tensors
923 // as width and height of the sub-tensors do not match
924 // the width and height of the parent tensor
925 // in case of input with more than 2D.
926 std::set<unsigned int> splitAxis = ComputeSplitAxis(descriptor, input.GetShape());
927 if (descriptor.GetNumDimensions() > 2 && splitAxis.size() == 1 &&
928 *splitAxis.begin() == descriptor.GetNumDimensions() - 1 )
929 {
930 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSplitterWorkloadValidate,
931 reasonIfUnsupported,
932 input,
933 outputs,
934 *splitAxis.begin());
935 }
936#endif
Jan Eilers8eb25602020-03-09 12:13:48 +0000937 IgnoreUnused(descriptor);
Narumol Prangnawarat74135832019-05-23 15:07:33 +0100938 for (auto output : outputs)
939 {
940 if (!input.IsTypeSpaceMatch(output)) // Cannot use sub-tensors if the types are not same space
941 {
942 SetValueChecked(reasonIfUnsupported, "Cl Splitter: Types and quantization parameters must match.");
943 return false;
944 }
945 }
946 return true;
Narumol Prangnawarat15eb5832019-05-20 15:31:05 +0100947}
948
Matthew Jacksond5166102019-07-31 14:06:28 +0100949bool ClLayerSupport::IsStackSupported(const std::vector<const TensorInfo*>& inputs,
950 const TensorInfo& output,
951 const StackDescriptor& descriptor,
952 Optional<std::string&> reasonIfUnsupported) const
953{
954 FORWARD_WORKLOAD_VALIDATE_FUNC(ClStackWorkloadValidate,
955 reasonIfUnsupported,
956 inputs,
957 output,
958 descriptor);
959}
960
keidav01d74dc912018-12-10 18:16:07 +0000961bool ClLayerSupport::IsStridedSliceSupported(const TensorInfo& input,
962 const TensorInfo& output,
963 const StridedSliceDescriptor& descriptor,
964 Optional<std::string&> reasonIfUnsupported) const
965{
966 FORWARD_WORKLOAD_VALIDATE_FUNC(ClStridedSliceWorkloadValidate,
967 reasonIfUnsupported,
968 input,
969 output,
970 descriptor);
971}
972
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100973bool ClLayerSupport::IsSubtractionSupported(const TensorInfo& input0,
974 const TensorInfo& input1,
975 const TensorInfo& output,
976 Optional<std::string&> reasonIfUnsupported) const
977{
978 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSubtractionValidate,
979 reasonIfUnsupported,
980 input0,
981 input1,
Mike Kelly07810fc2020-11-12 10:58:48 +0000982 output,
983 nullptr);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100984}
985
Aron Virginas-Tar7a3e2fe2019-06-27 18:54:47 +0100986bool ClLayerSupport::IsTransposeConvolution2dSupported(const TensorInfo& input,
987 const TensorInfo& output,
988 const TransposeConvolution2dDescriptor& descriptor,
989 const TensorInfo& weights,
990 const Optional<TensorInfo>& biases,
991 Optional<std::string&> reasonIfUnsupported) const
992{
993 FORWARD_WORKLOAD_VALIDATE_FUNC(ClTransposeConvolution2dWorkloadValidate,
994 reasonIfUnsupported,
995 input,
996 output,
997 descriptor,
998 weights,
999 biases);
1000}
1001
Mike Kellyc9ea45a2020-02-28 18:11:58 +00001002bool ClLayerSupport::IsTransposeSupported(const TensorInfo& input,
1003 const TensorInfo& output,
1004 const TransposeDescriptor& descriptor,
1005 Optional<std::string&> reasonIfUnsupported) const
1006{
1007 FORWARD_WORKLOAD_VALIDATE_FUNC(ClTransposeWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
1008}
1009
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +01001010} // namespace armnn