blob: 3e35f9d52d38b5d07d61656d123e589aacc220d9 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. 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"
arovir017c22c702018-10-09 11:16:46 +01008
David Beck3cc9a622018-10-12 10:38:31 +01009#include <armnn/Descriptors.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <InternalTypes.hpp>
11#include <LayerSupportCommon.hpp>
telsoa014fcda012018-03-09 14:13:49 +000012
David Beck111b5d92018-11-12 14:59:37 +000013#include <backendsCommon/BackendRegistry.hpp>
David Beck3e9e1152018-10-17 14:17:50 +010014
telsoa014fcda012018-03-09 14:13:49 +000015#include <boost/core/ignore_unused.hpp>
16
17#ifdef ARMCOMPUTECL_ENABLED
David Beckac42efd2018-09-26 17:41:13 +010018#include "workloads/ClAdditionWorkload.hpp"
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010019#include "workloads/ClActivationWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010020#include "workloads/ClBatchNormalizationFloatWorkload.hpp"
Mike Kelly831faed2018-11-28 11:52:08 +000021#include "workloads/ClBatchToSpaceNdWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010022#include "workloads/ClConvertFp16ToFp32Workload.hpp"
23#include "workloads/ClConvertFp32ToFp16Workload.hpp"
Matthew Benthamd8067922018-10-03 17:18:04 +010024#include "workloads/ClConvolution2dWorkload.hpp"
Matthew Benthamd8777392018-10-08 09:38:55 +010025#include "workloads/ClDepthwiseConvolutionWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010026#include "workloads/ClDivisionFloatWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010027#include "workloads/ClFullyConnectedWorkload.hpp"
arovir01085f0a42018-10-08 14:48:19 +010028#include "workloads/ClL2NormalizationFloatWorkload.hpp"
29#include "workloads/ClLstmFloatWorkload.hpp"
keidav01a959ee52018-12-19 10:04:58 +000030#include "workloads/ClMaximumWorkload.hpp"
Matteo Martincigh28dcab62018-10-19 16:40:03 +010031#include "workloads/ClMeanWorkload.hpp"
Nikhil Raj8599a412018-11-19 14:51:07 +000032#include "workloads/ClMergerWorkload.hpp"
saoste019292aa32019-01-08 13:55:59 +000033#include "workloads/ClMinimumWorkload.hpp"
arovir01085f0a42018-10-08 14:48:19 +010034#include "workloads/ClMultiplicationWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010035#include "workloads/ClNormalizationFloatWorkload.hpp"
arovir01085f0a42018-10-08 14:48:19 +010036#include "workloads/ClPadWorkload.hpp"
37#include "workloads/ClPermuteWorkload.hpp"
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +010038#include "workloads/ClPooling2dWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010039#include "workloads/ClSoftmaxBaseWorkload.hpp"
Sadik Armaganf4464322018-12-20 16:19:12 +000040#include "workloads/ClSpaceToBatchNdWorkload.hpp"
keidav01d74dc912018-12-10 18:16:07 +000041#include "workloads/ClStridedSliceWorkload.hpp"
David Beckac42efd2018-09-26 17:41:13 +010042#include "workloads/ClSubtractionWorkload.hpp"
telsoa014fcda012018-03-09 14:13:49 +000043#endif
44
45using namespace boost;
46
47namespace armnn
48{
arovir017c22c702018-10-09 11:16:46 +010049
telsoa014fcda012018-03-09 14:13:49 +000050namespace
51{
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +010052
telsoa014fcda012018-03-09 14:13:49 +000053template<unsigned int FilterSize>
54bool IsMatchingSize2d(const TensorInfo& weightInfo)
55{
telsoa01c577f2c2018-08-31 09:22:23 +010056 // Width & Height must match.
telsoa014fcda012018-03-09 14:13:49 +000057 return (weightInfo.GetShape()[3] == FilterSize) && (weightInfo.GetShape()[2] == FilterSize);
58}
59
60template<uint32_t ValidStride>
61bool IsMatchingStride(uint32_t actualStride)
62{
63 return ValidStride == actualStride;
64}
65
66template<uint32_t FirstStride, uint32_t SecondStride, uint32_t... ValidStrides>
67bool IsMatchingStride(uint32_t actualStride)
68{
69 return IsMatchingStride<FirstStride>(actualStride) || IsMatchingStride<SecondStride, ValidStrides...>(actualStride);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +010070}
telsoa014fcda012018-03-09 14:13:49 +000071
arovir01085f0a42018-10-08 14:48:19 +010072bool IsClBackendSupported(Optional<std::string&> reasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +000073{
74#if ARMCOMPUTECL_ENABLED
75 return true;
76#else
arovir01085f0a42018-10-08 14:48:19 +010077 if (reasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +000078 {
arovir01085f0a42018-10-08 14:48:19 +010079 reasonIfUnsupported.value() = "The armnn library has been built without CL support";
telsoa014fcda012018-03-09 14:13:49 +000080 }
81 return false;
82#endif
83}
84
85#if ARMCOMPUTECL_ENABLED
86#define FORWARD_CL_LAYER_SUPPORT_FUNC(expr) (expr)
87#else
88#define FORWARD_CL_LAYER_SUPPORT_FUNC(expr) IsClBackendSupported(reasonIfUnsupported)
89#endif
90
91#if ARMCOMPUTECL_ENABLED
92template<class FuncType, class... Args>
arovir01085f0a42018-10-08 14:48:19 +010093inline bool IsWorkloadSupported(FuncType&& func, Optional<std::string&> reasonIfUnsupported, Args&&... args)
telsoa014fcda012018-03-09 14:13:49 +000094{
95 arm_compute::Status aclStatus = func(std::forward<Args>(args)...);
96 const bool supported = (aclStatus.error_code() == arm_compute::ErrorCode::OK);
97 if (!supported && reasonIfUnsupported)
98 {
arovir01085f0a42018-10-08 14:48:19 +010099 reasonIfUnsupported.value() = aclStatus.error_description();
telsoa014fcda012018-03-09 14:13:49 +0000100 }
101 return supported;
102}
103
104#define FORWARD_WORKLOAD_VALIDATE_FUNC(func, reasonIfUnsupported, ...) \
105 return IsWorkloadSupported(func, reasonIfUnsupported, __VA_ARGS__);
106#else
107#define FORWARD_WORKLOAD_VALIDATE_FUNC(func, reasonIfUnsupported, ...) \
108 return IsClBackendSupported(reasonIfUnsupported);
109#endif
110
telsoa01c577f2c2018-08-31 09:22:23 +0100111template<typename FloatFunc, typename Uint8Func, typename ... Params>
arovir01085f0a42018-10-08 14:48:19 +0100112bool IsSupportedForDataTypeCl(Optional<std::string&> reasonIfUnsupported,
telsoa014fcda012018-03-09 14:13:49 +0000113 DataType dataType,
telsoa01c577f2c2018-08-31 09:22:23 +0100114 FloatFunc floatFuncPtr,
telsoa014fcda012018-03-09 14:13:49 +0000115 Uint8Func uint8FuncPtr,
116 Params&&... params)
117{
118 return IsClBackendSupported(reasonIfUnsupported) &&
119 IsSupportedForDataTypeGeneric(reasonIfUnsupported,
120 dataType,
121 floatFuncPtr,
telsoa01c577f2c2018-08-31 09:22:23 +0100122 floatFuncPtr,
telsoa014fcda012018-03-09 14:13:49 +0000123 uint8FuncPtr,
narpra01db2b1602019-01-23 15:23:11 +0000124 &FalseFunc<>,
telsoa014fcda012018-03-09 14:13:49 +0000125 std::forward<Params>(params)...);
126}
127
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100128} // anonymous namespace
129
130bool ClLayerSupport::IsActivationSupported(const TensorInfo& input,
131 const TensorInfo& output,
132 const ActivationDescriptor& descriptor,
133 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000134{
telsoa01c577f2c2018-08-31 09:22:23 +0100135 FORWARD_WORKLOAD_VALIDATE_FUNC(ClActivationWorkloadValidate,
136 reasonIfUnsupported,
137 input,
138 output,
139 descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000140}
141
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100142bool ClLayerSupport::IsAdditionSupported(const TensorInfo& input0,
143 const TensorInfo& input1,
144 const TensorInfo& output,
145 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000146{
arovir01085f0a42018-10-08 14:48:19 +0100147 FORWARD_WORKLOAD_VALIDATE_FUNC(ClAdditionValidate,
148 reasonIfUnsupported,
149 input0,
150 input1,
151 output);
telsoa014fcda012018-03-09 14:13:49 +0000152}
153
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100154bool ClLayerSupport::IsBatchNormalizationSupported(const TensorInfo& input,
155 const TensorInfo& output,
156 const TensorInfo& mean,
157 const TensorInfo& var,
158 const TensorInfo& beta,
159 const TensorInfo& gamma,
160 const BatchNormalizationDescriptor& descriptor,
161 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000162{
telsoa01c577f2c2018-08-31 09:22:23 +0100163 FORWARD_WORKLOAD_VALIDATE_FUNC(ClBatchNormalizationValidate,
164 reasonIfUnsupported,
165 input,
166 output,
167 mean,
168 var,
169 beta,
170 gamma,
171 descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000172}
173
Mike Kelly831faed2018-11-28 11:52:08 +0000174bool ClLayerSupport::IsBatchToSpaceNdSupported(const TensorInfo& input,
175 const TensorInfo& output,
176 const BatchToSpaceNdDescriptor& descriptor,
177 Optional<std::string&> reasonIfUnsupported) const
178{
179 FORWARD_WORKLOAD_VALIDATE_FUNC(ClBatchToSpaceNdWorkloadValidate,
180 reasonIfUnsupported,
181 input,
182 output,
183 descriptor);
184}
185
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100186bool ClLayerSupport::IsConstantSupported(const TensorInfo& output,
187 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000188{
189 return IsSupportedForDataTypeCl(reasonIfUnsupported,
190 output.GetDataType(),
191 &TrueFunc<>,
192 &FalseFuncU8<>);
193}
194
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100195bool ClLayerSupport::IsConvertFp16ToFp32Supported(const TensorInfo& input,
196 const TensorInfo& output,
197 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000198{
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100199 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConvertFp16ToFp32WorkloadValidate,
200 reasonIfUnsupported,
201 input,
202 output);
telsoa014fcda012018-03-09 14:13:49 +0000203}
204
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100205bool ClLayerSupport::IsConvertFp32ToFp16Supported(const TensorInfo& input,
206 const TensorInfo& output,
207 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000208{
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100209 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConvertFp32ToFp16WorkloadValidate,
210 reasonIfUnsupported,
211 input,
212 output);
telsoa014fcda012018-03-09 14:13:49 +0000213}
214
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100215bool ClLayerSupport::IsConvolution2dSupported(const TensorInfo& input,
216 const TensorInfo& output,
217 const Convolution2dDescriptor& descriptor,
218 const TensorInfo& weights,
219 const Optional<TensorInfo>& biases,
220 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000221{
surmeh013537c2c2018-05-18 16:31:43 +0100222 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConvolution2dWorkloadValidate,
223 reasonIfUnsupported,
224 input,
225 output,
226 descriptor,
227 weights,
228 biases);
telsoa014fcda012018-03-09 14:13:49 +0000229}
230
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100231bool ClLayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input,
232 const TensorInfo& output,
233 const DepthwiseConvolution2dDescriptor& descriptor,
234 const TensorInfo& weights,
235 const Optional<TensorInfo>& biases,
236 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000237{
telsoa01c577f2c2018-08-31 09:22:23 +0100238 FORWARD_WORKLOAD_VALIDATE_FUNC(ClDepthwiseConvolutionWorkloadValidate,
239 reasonIfUnsupported,
240 input,
241 output,
242 descriptor,
243 weights,
244 biases);
telsoa014fcda012018-03-09 14:13:49 +0000245}
246
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100247bool ClLayerSupport::IsDivisionSupported(const TensorInfo& input0,
248 const TensorInfo& input1,
249 const TensorInfo& output,
250 Optional<std::string&> reasonIfUnsupported) const
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100251{
252 FORWARD_WORKLOAD_VALIDATE_FUNC(ClDivisionWorkloadValidate,
253 reasonIfUnsupported,
254 input0,
255 input1,
256 output);
257}
258
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100259bool ClLayerSupport::IsFloorSupported(const TensorInfo& input,
260 const TensorInfo& output,
261 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000262{
263 ignore_unused(output);
telsoa01c577f2c2018-08-31 09:22:23 +0100264 return IsClBackendSupported(reasonIfUnsupported) &&
265 IsSupportedForDataTypeGeneric(reasonIfUnsupported,
266 input.GetDataType(),
267 &FalseFuncF16<>,
268 &TrueFunc<>,
narpra01db2b1602019-01-23 15:23:11 +0000269 &FalseFuncU8<>,
270 &FalseFuncI32<>);
telsoa01c577f2c2018-08-31 09:22:23 +0100271}
272
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100273bool ClLayerSupport::IsFullyConnectedSupported(const TensorInfo& input,
274 const TensorInfo& output,
275 const TensorInfo& weights,
276 const TensorInfo& biases,
277 const FullyConnectedDescriptor& descriptor,
278 Optional<std::string&> reasonIfUnsupported) const
279{
280 FORWARD_WORKLOAD_VALIDATE_FUNC(ClFullyConnectedWorkloadValidate,
281 reasonIfUnsupported,
282 input,
283 output,
284 weights,
285 biases,
286 descriptor);
287}
288
289bool ClLayerSupport::IsInputSupported(const TensorInfo& input,
290 Optional<std::string&> reasonIfUnsupported) const
291{
292 return IsSupportedForDataTypeCl(reasonIfUnsupported,
293 input.GetDataType(),
294 &TrueFunc<>,
295 &TrueFunc<>);
296}
297
298bool ClLayerSupport::IsL2NormalizationSupported(const TensorInfo& input,
299 const TensorInfo& output,
300 const L2NormalizationDescriptor& descriptor,
301 Optional<std::string&> reasonIfUnsupported) const
302{
303 FORWARD_WORKLOAD_VALIDATE_FUNC(ClL2NormalizationWorkloadValidate,
304 reasonIfUnsupported,
305 input,
306 output,
307 descriptor);
308}
309
310bool ClLayerSupport::IsLstmSupported(const TensorInfo& input,
311 const TensorInfo& outputStateIn,
312 const TensorInfo& cellStateIn,
313 const TensorInfo& scratchBuffer,
314 const TensorInfo& outputStateOut,
315 const TensorInfo& cellStateOut,
316 const TensorInfo& output,
317 const LstmDescriptor& descriptor,
318 const TensorInfo& inputToForgetWeights,
319 const TensorInfo& inputToCellWeights,
320 const TensorInfo& inputToOutputWeights,
321 const TensorInfo& recurrentToForgetWeights,
322 const TensorInfo& recurrentToCellWeights,
323 const TensorInfo& recurrentToOutputWeights,
324 const TensorInfo& forgetGateBias,
325 const TensorInfo& cellBias,
326 const TensorInfo& outputGateBias,
327 const TensorInfo* inputToInputWeights,
328 const TensorInfo* recurrentToInputWeights,
329 const TensorInfo* cellToInputWeights,
330 const TensorInfo* inputGateBias,
331 const TensorInfo* projectionWeights,
332 const TensorInfo* projectionBias,
333 const TensorInfo* cellToForgetWeights,
334 const TensorInfo* cellToOutputWeights,
335 Optional<std::string&> reasonIfUnsupported) const
telsoa01c577f2c2018-08-31 09:22:23 +0100336{
arovir01085f0a42018-10-08 14:48:19 +0100337 FORWARD_WORKLOAD_VALIDATE_FUNC(ClLstmFloatWorkloadValidate,
338 reasonIfUnsupported,
339 input,
340 outputStateIn,
341 cellStateIn,
342 scratchBuffer,
343 outputStateOut,
344 cellStateOut,
345 output,
346 descriptor,
347 inputToForgetWeights,
348 inputToCellWeights,
349 inputToOutputWeights,
350 recurrentToForgetWeights,
351 recurrentToCellWeights,
352 recurrentToOutputWeights,
353 forgetGateBias,
354 cellBias,
355 outputGateBias,
356 inputToInputWeights,
357 recurrentToInputWeights,
358 cellToInputWeights,
359 inputGateBias,
360 projectionWeights,
361 projectionBias,
362 cellToForgetWeights,
363 cellToOutputWeights);
telsoa01c577f2c2018-08-31 09:22:23 +0100364}
365
keidav01a959ee52018-12-19 10:04:58 +0000366bool ClLayerSupport::IsMaximumSupported(const TensorInfo& input0,
367 const TensorInfo& input1,
368 const TensorInfo& output,
369 Optional<std::string&> reasonIfUnsupported) const
370{
371 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMaximumWorkloadValidate,
372 reasonIfUnsupported,
373 input0,
374 input1,
375 output);
376}
377
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100378bool ClLayerSupport::IsMeanSupported(const TensorInfo& input,
379 const TensorInfo& output,
380 const MeanDescriptor& descriptor,
381 Optional<std::string&> reasonIfUnsupported) const
narpra0132b90462018-09-13 11:07:48 +0100382{
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100383 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMeanValidate,
384 reasonIfUnsupported,
385 input,
386 output,
387 descriptor);
narpra0132b90462018-09-13 11:07:48 +0100388}
389
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000390bool ClLayerSupport::IsMemCopySupported(const TensorInfo &input,
391 const TensorInfo &output,
392 Optional<std::string &> reasonIfUnsupported) const
393{
394 ignore_unused(input);
395 ignore_unused(output);
396 return true;
397}
398
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100399bool ClLayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
Nikhil Raj8599a412018-11-19 14:51:07 +0000400 const TensorInfo& output,
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100401 const OriginsDescriptor& descriptor,
402 Optional<std::string&> reasonIfUnsupported) const
403{
Nikhil Raj8599a412018-11-19 14:51:07 +0000404 if(descriptor.GetNumDimensions() - descriptor.GetConcatAxis() == 1)
405 {
406 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMergerWorkloadValidate,
407 reasonIfUnsupported,
408 inputs,
409 output,
410 descriptor);
411 }
412 else
413 {
414 return IsSupportedForDataTypeCl(reasonIfUnsupported,
415 inputs[0]->GetDataType(),
416 &TrueFunc<>,
narpra0163b08822018-11-20 11:29:12 +0000417 &TrueFunc<>);
Nikhil Raj8599a412018-11-19 14:51:07 +0000418 }
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100419}
420
saoste019292aa32019-01-08 13:55:59 +0000421bool ClLayerSupport::IsMinimumSupported(const TensorInfo& input0,
422 const TensorInfo& input1,
423 const TensorInfo& output,
424 Optional<std::string&> reasonIfUnsupported) const
425{
426 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMinimumWorkloadValidate,
427 reasonIfUnsupported,
428 input0,
429 input1,
430 output);
431}
432
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100433bool ClLayerSupport::IsMultiplicationSupported(const TensorInfo& input0,
434 const TensorInfo& input1,
435 const TensorInfo& output,
436 Optional<std::string&> reasonIfUnsupported) const
437{
438 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMultiplicationWorkloadValidate,
439 reasonIfUnsupported,
440 input0,
441 input1,
442 output);
443}
444
445bool ClLayerSupport::IsNormalizationSupported(const TensorInfo& input,
446 const TensorInfo& output,
447 const NormalizationDescriptor& descriptor,
448 Optional<std::string&> reasonIfUnsupported) const
449{
450 FORWARD_WORKLOAD_VALIDATE_FUNC(ClNormalizationWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
451}
452
453bool ClLayerSupport::IsOutputSupported(const TensorInfo& output,
454 Optional<std::string&> reasonIfUnsupported) const
455{
456 return IsSupportedForDataTypeCl(reasonIfUnsupported,
457 output.GetDataType(),
458 &TrueFunc<>,
459 &TrueFunc<>);
460}
461
462bool ClLayerSupport::IsPadSupported(const TensorInfo& input,
463 const TensorInfo& output,
464 const PadDescriptor& descriptor,
465 Optional<std::string&> reasonIfUnsupported) const
arovir01085f0a42018-10-08 14:48:19 +0100466{
467 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPadValidate,
468 reasonIfUnsupported,
469 input,
470 output,
471 descriptor);
472}
473
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100474bool ClLayerSupport::IsPermuteSupported(const TensorInfo& input,
475 const TensorInfo& output,
476 const PermuteDescriptor& descriptor,
477 Optional<std::string&> reasonIfUnsupported) const
478{
479 ignore_unused(input);
480 ignore_unused(output);
481 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPermuteWorkloadValidate, reasonIfUnsupported, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000482}
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100483
484bool ClLayerSupport::IsPooling2dSupported(const TensorInfo& input,
485 const TensorInfo& output,
486 const Pooling2dDescriptor& descriptor,
487 Optional<std::string&> reasonIfUnsupported) const
488{
489 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPooling2dWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
490}
491
492bool ClLayerSupport::IsReshapeSupported(const TensorInfo& input,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000493 const ReshapeDescriptor& descriptor,
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100494 Optional<std::string&> reasonIfUnsupported) const
495{
496 ignore_unused(input);
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000497 ignore_unused(descriptor);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100498 ignore_unused(reasonIfUnsupported);
499 return true;
500}
501
502bool ClLayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
Sadik Armaganc625f002018-12-17 11:32:16 +0000503 const TensorInfo& output,
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100504 Optional<std::string&> reasonIfUnsupported) const
505{
Sadik Armaganc625f002018-12-17 11:32:16 +0000506 ignore_unused(output);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100507 return IsSupportedForDataTypeCl(reasonIfUnsupported,
508 input.GetDataType(),
509 &TrueFunc<>,
510 &FalseFuncU8<>);
511}
512
513bool ClLayerSupport::IsSoftmaxSupported(const TensorInfo& input,
514 const TensorInfo& output,
515 const SoftmaxDescriptor& descriptor,
516 Optional<std::string&> reasonIfUnsupported) const
517{
518 ignore_unused(descriptor);
519 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSoftmaxWorkloadValidate, reasonIfUnsupported, input, output);
520}
521
Sadik Armaganf4464322018-12-20 16:19:12 +0000522bool ClLayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input,
523 const TensorInfo& output,
524 const SpaceToBatchNdDescriptor& descriptor,
525 Optional<std::string&> reasonIfUnsupported) const
526{
527 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSpaceToBatchNdWorkloadValidate,
528 reasonIfUnsupported,
529 input,
530 output,
531 descriptor);
532}
533
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100534bool ClLayerSupport::IsSplitterSupported(const TensorInfo& input,
535 const ViewsDescriptor& descriptor,
536 Optional<std::string&> reasonIfUnsupported) const
537{
538 ignore_unused(descriptor);
539 return IsSupportedForDataTypeCl(reasonIfUnsupported,
540 input.GetDataType(),
541 &TrueFunc<>,
542 &TrueFunc<>);
543}
544
keidav01d74dc912018-12-10 18:16:07 +0000545bool ClLayerSupport::IsStridedSliceSupported(const TensorInfo& input,
546 const TensorInfo& output,
547 const StridedSliceDescriptor& descriptor,
548 Optional<std::string&> reasonIfUnsupported) const
549{
550 FORWARD_WORKLOAD_VALIDATE_FUNC(ClStridedSliceWorkloadValidate,
551 reasonIfUnsupported,
552 input,
553 output,
554 descriptor);
555}
556
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100557bool ClLayerSupport::IsSubtractionSupported(const TensorInfo& input0,
558 const TensorInfo& input1,
559 const TensorInfo& output,
560 Optional<std::string&> reasonIfUnsupported) const
561{
562 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSubtractionValidate,
563 reasonIfUnsupported,
564 input0,
565 input1,
566 output);
567}
568
569} // namespace armnn