blob: 410cb042884f4219ba52a3333d017e21edd7df69 [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<>,
kevmay012b4d88e2019-01-24 14:05:09 +0000125 &FalseFunc<>,
telsoa014fcda012018-03-09 14:13:49 +0000126 std::forward<Params>(params)...);
127}
128
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100129} // anonymous namespace
130
131bool ClLayerSupport::IsActivationSupported(const TensorInfo& input,
132 const TensorInfo& output,
133 const ActivationDescriptor& descriptor,
134 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000135{
telsoa01c577f2c2018-08-31 09:22:23 +0100136 FORWARD_WORKLOAD_VALIDATE_FUNC(ClActivationWorkloadValidate,
137 reasonIfUnsupported,
138 input,
139 output,
140 descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000141}
142
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100143bool ClLayerSupport::IsAdditionSupported(const TensorInfo& input0,
144 const TensorInfo& input1,
145 const TensorInfo& output,
146 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000147{
arovir01085f0a42018-10-08 14:48:19 +0100148 FORWARD_WORKLOAD_VALIDATE_FUNC(ClAdditionValidate,
149 reasonIfUnsupported,
150 input0,
151 input1,
152 output);
telsoa014fcda012018-03-09 14:13:49 +0000153}
154
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100155bool ClLayerSupport::IsBatchNormalizationSupported(const TensorInfo& input,
156 const TensorInfo& output,
157 const TensorInfo& mean,
158 const TensorInfo& var,
159 const TensorInfo& beta,
160 const TensorInfo& gamma,
161 const BatchNormalizationDescriptor& descriptor,
162 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000163{
telsoa01c577f2c2018-08-31 09:22:23 +0100164 FORWARD_WORKLOAD_VALIDATE_FUNC(ClBatchNormalizationValidate,
165 reasonIfUnsupported,
166 input,
167 output,
168 mean,
169 var,
170 beta,
171 gamma,
172 descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000173}
174
Mike Kelly831faed2018-11-28 11:52:08 +0000175bool ClLayerSupport::IsBatchToSpaceNdSupported(const TensorInfo& input,
176 const TensorInfo& output,
177 const BatchToSpaceNdDescriptor& descriptor,
178 Optional<std::string&> reasonIfUnsupported) const
179{
180 FORWARD_WORKLOAD_VALIDATE_FUNC(ClBatchToSpaceNdWorkloadValidate,
181 reasonIfUnsupported,
182 input,
183 output,
184 descriptor);
185}
186
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100187bool ClLayerSupport::IsConstantSupported(const TensorInfo& output,
188 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000189{
190 return IsSupportedForDataTypeCl(reasonIfUnsupported,
191 output.GetDataType(),
192 &TrueFunc<>,
193 &FalseFuncU8<>);
194}
195
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100196bool ClLayerSupport::IsConvertFp16ToFp32Supported(const TensorInfo& input,
197 const TensorInfo& output,
198 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000199{
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100200 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConvertFp16ToFp32WorkloadValidate,
201 reasonIfUnsupported,
202 input,
203 output);
telsoa014fcda012018-03-09 14:13:49 +0000204}
205
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100206bool ClLayerSupport::IsConvertFp32ToFp16Supported(const TensorInfo& input,
207 const TensorInfo& output,
208 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000209{
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100210 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConvertFp32ToFp16WorkloadValidate,
211 reasonIfUnsupported,
212 input,
213 output);
telsoa014fcda012018-03-09 14:13:49 +0000214}
215
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100216bool ClLayerSupport::IsConvolution2dSupported(const TensorInfo& input,
217 const TensorInfo& output,
218 const Convolution2dDescriptor& descriptor,
219 const TensorInfo& weights,
220 const Optional<TensorInfo>& biases,
221 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000222{
surmeh013537c2c2018-05-18 16:31:43 +0100223 FORWARD_WORKLOAD_VALIDATE_FUNC(ClConvolution2dWorkloadValidate,
224 reasonIfUnsupported,
225 input,
226 output,
227 descriptor,
228 weights,
229 biases);
telsoa014fcda012018-03-09 14:13:49 +0000230}
231
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100232bool ClLayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input,
233 const TensorInfo& output,
234 const DepthwiseConvolution2dDescriptor& descriptor,
235 const TensorInfo& weights,
236 const Optional<TensorInfo>& biases,
237 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000238{
telsoa01c577f2c2018-08-31 09:22:23 +0100239 FORWARD_WORKLOAD_VALIDATE_FUNC(ClDepthwiseConvolutionWorkloadValidate,
240 reasonIfUnsupported,
241 input,
242 output,
243 descriptor,
244 weights,
245 biases);
telsoa014fcda012018-03-09 14:13:49 +0000246}
247
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100248bool ClLayerSupport::IsDivisionSupported(const TensorInfo& input0,
249 const TensorInfo& input1,
250 const TensorInfo& output,
251 Optional<std::string&> reasonIfUnsupported) const
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100252{
253 FORWARD_WORKLOAD_VALIDATE_FUNC(ClDivisionWorkloadValidate,
254 reasonIfUnsupported,
255 input0,
256 input1,
257 output);
258}
259
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100260bool ClLayerSupport::IsFloorSupported(const TensorInfo& input,
261 const TensorInfo& output,
262 Optional<std::string&> reasonIfUnsupported) const
telsoa014fcda012018-03-09 14:13:49 +0000263{
264 ignore_unused(output);
telsoa01c577f2c2018-08-31 09:22:23 +0100265 return IsClBackendSupported(reasonIfUnsupported) &&
266 IsSupportedForDataTypeGeneric(reasonIfUnsupported,
267 input.GetDataType(),
268 &FalseFuncF16<>,
269 &TrueFunc<>,
narpra01db2b1602019-01-23 15:23:11 +0000270 &FalseFuncU8<>,
kevmay012b4d88e2019-01-24 14:05:09 +0000271 &FalseFuncI32<>,
272 &FalseFuncU8<>);
telsoa01c577f2c2018-08-31 09:22:23 +0100273}
274
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100275bool ClLayerSupport::IsFullyConnectedSupported(const TensorInfo& input,
276 const TensorInfo& output,
277 const TensorInfo& weights,
278 const TensorInfo& biases,
279 const FullyConnectedDescriptor& descriptor,
280 Optional<std::string&> reasonIfUnsupported) const
281{
282 FORWARD_WORKLOAD_VALIDATE_FUNC(ClFullyConnectedWorkloadValidate,
283 reasonIfUnsupported,
284 input,
285 output,
286 weights,
287 biases,
288 descriptor);
289}
290
291bool ClLayerSupport::IsInputSupported(const TensorInfo& input,
292 Optional<std::string&> reasonIfUnsupported) const
293{
294 return IsSupportedForDataTypeCl(reasonIfUnsupported,
295 input.GetDataType(),
296 &TrueFunc<>,
297 &TrueFunc<>);
298}
299
300bool ClLayerSupport::IsL2NormalizationSupported(const TensorInfo& input,
301 const TensorInfo& output,
302 const L2NormalizationDescriptor& descriptor,
303 Optional<std::string&> reasonIfUnsupported) const
304{
305 FORWARD_WORKLOAD_VALIDATE_FUNC(ClL2NormalizationWorkloadValidate,
306 reasonIfUnsupported,
307 input,
308 output,
309 descriptor);
310}
311
312bool ClLayerSupport::IsLstmSupported(const TensorInfo& input,
313 const TensorInfo& outputStateIn,
314 const TensorInfo& cellStateIn,
315 const TensorInfo& scratchBuffer,
316 const TensorInfo& outputStateOut,
317 const TensorInfo& cellStateOut,
318 const TensorInfo& output,
319 const LstmDescriptor& descriptor,
320 const TensorInfo& inputToForgetWeights,
321 const TensorInfo& inputToCellWeights,
322 const TensorInfo& inputToOutputWeights,
323 const TensorInfo& recurrentToForgetWeights,
324 const TensorInfo& recurrentToCellWeights,
325 const TensorInfo& recurrentToOutputWeights,
326 const TensorInfo& forgetGateBias,
327 const TensorInfo& cellBias,
328 const TensorInfo& outputGateBias,
329 const TensorInfo* inputToInputWeights,
330 const TensorInfo* recurrentToInputWeights,
331 const TensorInfo* cellToInputWeights,
332 const TensorInfo* inputGateBias,
333 const TensorInfo* projectionWeights,
334 const TensorInfo* projectionBias,
335 const TensorInfo* cellToForgetWeights,
336 const TensorInfo* cellToOutputWeights,
337 Optional<std::string&> reasonIfUnsupported) const
telsoa01c577f2c2018-08-31 09:22:23 +0100338{
arovir01085f0a42018-10-08 14:48:19 +0100339 FORWARD_WORKLOAD_VALIDATE_FUNC(ClLstmFloatWorkloadValidate,
340 reasonIfUnsupported,
341 input,
342 outputStateIn,
343 cellStateIn,
344 scratchBuffer,
345 outputStateOut,
346 cellStateOut,
347 output,
348 descriptor,
349 inputToForgetWeights,
350 inputToCellWeights,
351 inputToOutputWeights,
352 recurrentToForgetWeights,
353 recurrentToCellWeights,
354 recurrentToOutputWeights,
355 forgetGateBias,
356 cellBias,
357 outputGateBias,
358 inputToInputWeights,
359 recurrentToInputWeights,
360 cellToInputWeights,
361 inputGateBias,
362 projectionWeights,
363 projectionBias,
364 cellToForgetWeights,
365 cellToOutputWeights);
telsoa01c577f2c2018-08-31 09:22:23 +0100366}
367
keidav01a959ee52018-12-19 10:04:58 +0000368bool ClLayerSupport::IsMaximumSupported(const TensorInfo& input0,
369 const TensorInfo& input1,
370 const TensorInfo& output,
371 Optional<std::string&> reasonIfUnsupported) const
372{
373 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMaximumWorkloadValidate,
374 reasonIfUnsupported,
375 input0,
376 input1,
377 output);
378}
379
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100380bool ClLayerSupport::IsMeanSupported(const TensorInfo& input,
381 const TensorInfo& output,
382 const MeanDescriptor& descriptor,
383 Optional<std::string&> reasonIfUnsupported) const
narpra0132b90462018-09-13 11:07:48 +0100384{
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100385 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMeanValidate,
386 reasonIfUnsupported,
387 input,
388 output,
389 descriptor);
narpra0132b90462018-09-13 11:07:48 +0100390}
391
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000392bool ClLayerSupport::IsMemCopySupported(const TensorInfo &input,
393 const TensorInfo &output,
394 Optional<std::string &> reasonIfUnsupported) const
395{
396 ignore_unused(input);
397 ignore_unused(output);
398 return true;
399}
400
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100401bool ClLayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> inputs,
Nikhil Raj8599a412018-11-19 14:51:07 +0000402 const TensorInfo& output,
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100403 const OriginsDescriptor& descriptor,
404 Optional<std::string&> reasonIfUnsupported) const
405{
Nikhil Raj8599a412018-11-19 14:51:07 +0000406 if(descriptor.GetNumDimensions() - descriptor.GetConcatAxis() == 1)
407 {
408 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMergerWorkloadValidate,
409 reasonIfUnsupported,
410 inputs,
411 output,
412 descriptor);
413 }
414 else
415 {
416 return IsSupportedForDataTypeCl(reasonIfUnsupported,
417 inputs[0]->GetDataType(),
418 &TrueFunc<>,
narpra0163b08822018-11-20 11:29:12 +0000419 &TrueFunc<>);
Nikhil Raj8599a412018-11-19 14:51:07 +0000420 }
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100421}
422
saoste019292aa32019-01-08 13:55:59 +0000423bool ClLayerSupport::IsMinimumSupported(const TensorInfo& input0,
424 const TensorInfo& input1,
425 const TensorInfo& output,
426 Optional<std::string&> reasonIfUnsupported) const
427{
428 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMinimumWorkloadValidate,
429 reasonIfUnsupported,
430 input0,
431 input1,
432 output);
433}
434
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100435bool ClLayerSupport::IsMultiplicationSupported(const TensorInfo& input0,
436 const TensorInfo& input1,
437 const TensorInfo& output,
438 Optional<std::string&> reasonIfUnsupported) const
439{
440 FORWARD_WORKLOAD_VALIDATE_FUNC(ClMultiplicationWorkloadValidate,
441 reasonIfUnsupported,
442 input0,
443 input1,
444 output);
445}
446
447bool ClLayerSupport::IsNormalizationSupported(const TensorInfo& input,
448 const TensorInfo& output,
449 const NormalizationDescriptor& descriptor,
450 Optional<std::string&> reasonIfUnsupported) const
451{
452 FORWARD_WORKLOAD_VALIDATE_FUNC(ClNormalizationWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
453}
454
455bool ClLayerSupport::IsOutputSupported(const TensorInfo& output,
456 Optional<std::string&> reasonIfUnsupported) const
457{
kevmay012b4d88e2019-01-24 14:05:09 +0000458 return IsClBackendSupported(reasonIfUnsupported) &&
459 IsSupportedForDataTypeGeneric(reasonIfUnsupported,
460 output.GetDataType(),
461 &TrueFunc<>,
462 &TrueFunc<>,
463 &TrueFunc<>,
464 &FalseFuncI32<>,
465 &TrueFunc<>);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100466}
467
468bool ClLayerSupport::IsPadSupported(const TensorInfo& input,
469 const TensorInfo& output,
470 const PadDescriptor& descriptor,
471 Optional<std::string&> reasonIfUnsupported) const
arovir01085f0a42018-10-08 14:48:19 +0100472{
473 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPadValidate,
474 reasonIfUnsupported,
475 input,
476 output,
477 descriptor);
478}
479
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100480bool ClLayerSupport::IsPermuteSupported(const TensorInfo& input,
481 const TensorInfo& output,
482 const PermuteDescriptor& descriptor,
483 Optional<std::string&> reasonIfUnsupported) const
484{
485 ignore_unused(input);
486 ignore_unused(output);
487 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPermuteWorkloadValidate, reasonIfUnsupported, descriptor);
telsoa014fcda012018-03-09 14:13:49 +0000488}
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100489
490bool ClLayerSupport::IsPooling2dSupported(const TensorInfo& input,
491 const TensorInfo& output,
492 const Pooling2dDescriptor& descriptor,
493 Optional<std::string&> reasonIfUnsupported) const
494{
495 FORWARD_WORKLOAD_VALIDATE_FUNC(ClPooling2dWorkloadValidate, reasonIfUnsupported, input, output, descriptor);
496}
497
498bool ClLayerSupport::IsReshapeSupported(const TensorInfo& input,
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000499 const ReshapeDescriptor& descriptor,
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100500 Optional<std::string&> reasonIfUnsupported) const
501{
502 ignore_unused(input);
Matteo Martincigh992d6dc2019-01-10 17:34:20 +0000503 ignore_unused(descriptor);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100504 ignore_unused(reasonIfUnsupported);
505 return true;
506}
507
508bool ClLayerSupport::IsResizeBilinearSupported(const TensorInfo& input,
Sadik Armaganc625f002018-12-17 11:32:16 +0000509 const TensorInfo& output,
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100510 Optional<std::string&> reasonIfUnsupported) const
511{
Sadik Armaganc625f002018-12-17 11:32:16 +0000512 ignore_unused(output);
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100513 return IsSupportedForDataTypeCl(reasonIfUnsupported,
514 input.GetDataType(),
515 &TrueFunc<>,
516 &FalseFuncU8<>);
517}
518
519bool ClLayerSupport::IsSoftmaxSupported(const TensorInfo& input,
520 const TensorInfo& output,
521 const SoftmaxDescriptor& descriptor,
522 Optional<std::string&> reasonIfUnsupported) const
523{
524 ignore_unused(descriptor);
525 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSoftmaxWorkloadValidate, reasonIfUnsupported, input, output);
526}
527
Sadik Armaganf4464322018-12-20 16:19:12 +0000528bool ClLayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input,
529 const TensorInfo& output,
530 const SpaceToBatchNdDescriptor& descriptor,
531 Optional<std::string&> reasonIfUnsupported) const
532{
533 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSpaceToBatchNdWorkloadValidate,
534 reasonIfUnsupported,
535 input,
536 output,
537 descriptor);
538}
539
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100540bool ClLayerSupport::IsSplitterSupported(const TensorInfo& input,
541 const ViewsDescriptor& descriptor,
542 Optional<std::string&> reasonIfUnsupported) const
543{
544 ignore_unused(descriptor);
545 return IsSupportedForDataTypeCl(reasonIfUnsupported,
546 input.GetDataType(),
547 &TrueFunc<>,
548 &TrueFunc<>);
549}
550
keidav01d74dc912018-12-10 18:16:07 +0000551bool ClLayerSupport::IsStridedSliceSupported(const TensorInfo& input,
552 const TensorInfo& output,
553 const StridedSliceDescriptor& descriptor,
554 Optional<std::string&> reasonIfUnsupported) const
555{
556 FORWARD_WORKLOAD_VALIDATE_FUNC(ClStridedSliceWorkloadValidate,
557 reasonIfUnsupported,
558 input,
559 output,
560 descriptor);
561}
562
Aron Virginas-Tarbcf9f162018-10-15 11:47:37 +0100563bool ClLayerSupport::IsSubtractionSupported(const TensorInfo& input0,
564 const TensorInfo& input1,
565 const TensorInfo& output,
566 Optional<std::string&> reasonIfUnsupported) const
567{
568 FORWARD_WORKLOAD_VALIDATE_FUNC(ClSubtractionValidate,
569 reasonIfUnsupported,
570 input0,
571 input1,
572 output);
573}
574
575} // namespace armnn