blob: 46a96559bf0d696ee71fdd3a33e8deaa02031663 [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#include "ClWorkloadFactory.hpp"
6
David Beck0dbe0ee2018-09-24 15:59:27 +01007#include <armnn/Exceptions.hpp>
8#include <armnn/Utils.hpp>
telsoa014fcda012018-03-09 14:13:49 +00009
10#include <string>
David Beck0dbe0ee2018-09-24 15:59:27 +010011#include <backends/CpuTensorHandle.hpp>
12#include <Layer.hpp>
telsoa014fcda012018-03-09 14:13:49 +000013
14#ifdef ARMCOMPUTECL_ENABLED
15#include <arm_compute/core/CL/CLKernelLibrary.h>
surmeh013537c2c2018-05-18 16:31:43 +010016#include <arm_compute/runtime/CL/CLBufferAllocator.h>
telsoa014fcda012018-03-09 14:13:49 +000017#include <arm_compute/runtime/CL/CLScheduler.h>
telsoa01c577f2c2018-08-31 09:22:23 +010018
David Beckac42efd2018-09-26 17:41:13 +010019#include <backends/cl/workloads/ClWorkloads.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +010020
David Beck0dbe0ee2018-09-24 15:59:27 +010021#include <backends/MemCopyWorkload.hpp>
David Beckac42efd2018-09-26 17:41:13 +010022#include <backends/cl/ClTensorHandle.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +010023
David Beck0dbe0ee2018-09-24 15:59:27 +010024#include <memory/IPoolManager.hpp>
telsoa014fcda012018-03-09 14:13:49 +000025#endif
26
David Beckac42efd2018-09-26 17:41:13 +010027#include <backends/MakeWorkloadHelper.hpp>
telsoa014fcda012018-03-09 14:13:49 +000028
29#include <boost/polymorphic_cast.hpp>
30#include <boost/format.hpp>
surmeh013537c2c2018-05-18 16:31:43 +010031#include <boost/log/trivial.hpp>
telsoa014fcda012018-03-09 14:13:49 +000032
33namespace armnn
34{
35
telsoa01c577f2c2018-08-31 09:22:23 +010036bool ClWorkloadFactory::IsLayerSupported(const Layer& layer,
37 boost::optional<DataType> dataType,
38 std::string& outReasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +000039{
40 return IWorkloadFactory::IsLayerSupported(Compute::GpuAcc, layer, dataType, outReasonIfUnsupported);
41}
42
43#ifdef ARMCOMPUTECL_ENABLED
44
surmeh013537c2c2018-05-18 16:31:43 +010045ClWorkloadFactory::ClWorkloadFactory()
46: m_MemoryManager(std::make_unique<arm_compute::CLBufferAllocator>())
telsoa014fcda012018-03-09 14:13:49 +000047{
telsoa014fcda012018-03-09 14:13:49 +000048}
49
50std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
51{
telsoa01c577f2c2018-08-31 09:22:23 +010052 std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo);
53 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
54
55 return tensorHandle;
telsoa014fcda012018-03-09 14:13:49 +000056}
57
Francis Murtagh351d13d2018-09-24 15:01:18 +010058std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
59 DataLayout dataLayout) const
60{
61 std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo, dataLayout);
62 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
63
64 return tensorHandle;
65}
66
telsoa014fcda012018-03-09 14:13:49 +000067std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
68 TensorShape const& subTensorShape,
69 unsigned int const* subTensorOrigin) const
70{
71 BOOST_ASSERT(parent.GetType() == ITensorHandle::CL);
72
73 arm_compute::Coordinates coords;
74 arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
75
76 coords.set_num_dimensions(subTensorShape.GetNumDimensions());
77 for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++)
78 {
telsoa01c577f2c2018-08-31 09:22:23 +010079 // Arm compute indexes tensor coords in reverse order.
telsoa014fcda012018-03-09 14:13:49 +000080 unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
81 coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex]));
82 }
83
telsoa01c577f2c2018-08-31 09:22:23 +010084 return std::make_unique<ClSubTensorHandle>(
85 boost::polymorphic_downcast<IClTensorHandle*>(&parent), shape, coords);
telsoa014fcda012018-03-09 14:13:49 +000086}
87
88std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
89 const WorkloadInfo& info) const
90{
telsoa01c577f2c2018-08-31 09:22:23 +010091 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +000092}
93
94std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
95 const WorkloadInfo& info) const
96{
telsoa01c577f2c2018-08-31 09:22:23 +010097 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +000098}
99
100std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
101 const WorkloadInfo& info) const
102{
arovir019e53a352018-08-31 15:26:35 +0100103 return MakeWorkload<ClActivationFloatWorkload, ClActivationUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000104}
105
106std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
107 const WorkloadInfo& info) const
108{
arovir019e53a352018-08-31 15:26:35 +0100109 return MakeWorkload<ClSoftmaxFloatWorkload, ClSoftmaxUint8Workload>(descriptor, info,
telsoa01c577f2c2018-08-31 09:22:23 +0100110 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000111}
112
113std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
114 const WorkloadInfo& info) const
115{
arovir019e53a352018-08-31 15:26:35 +0100116 return MakeWorkload<ClSplitterFloatWorkload, ClSplitterUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000117}
118
119std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
120 const WorkloadInfo& info) const
121{
arovir019e53a352018-08-31 15:26:35 +0100122 return MakeWorkload<ClMergerFloatWorkload, ClMergerUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000123}
124
125std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateFullyConnected(
126 const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
127{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100128 return MakeWorkload<ClFullyConnectedWorkload, ClFullyConnectedWorkload>(descriptor, info,
129 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000130}
131
132std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
133 const WorkloadInfo& info) const
134{
telsoa01c577f2c2018-08-31 09:22:23 +0100135 return MakeWorkload<ClPermuteFloatWorkload, ClPermuteUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000136}
137
138std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
139 const WorkloadInfo& info) const
140{
arovir019e53a352018-08-31 15:26:35 +0100141 return MakeWorkload<ClPooling2dFloatWorkload, ClPooling2dUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000142}
143
144std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
145 const WorkloadInfo& info) const
146{
arovir019e53a352018-08-31 15:26:35 +0100147 return MakeWorkload<ClConvolution2dFloatWorkload, ClConvolution2dUint8Workload>(descriptor, info,
telsoa01c577f2c2018-08-31 09:22:23 +0100148 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000149}
150
151std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
152 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
153{
arovir019e53a352018-08-31 15:26:35 +0100154 return MakeWorkload<ClDepthwiseConvolutionFloatWorkload, ClDepthwiseConvolutionUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000155}
156
157std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
158 const WorkloadInfo& info) const
159{
arovir019e53a352018-08-31 15:26:35 +0100160 return MakeWorkload<ClNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000161}
162
163std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
164 const WorkloadInfo& info) const
165{
David Beck0a710c42018-09-11 15:21:14 +0100166 return MakeWorkload<ClAdditionWorkload<armnn::DataType::Float16, armnn::DataType::Float32>,
167 ClAdditionWorkload<armnn::DataType::QuantisedAsymm8>>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000168}
169
170std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMultiplication(
171 const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
172{
jimfly019fc824a2018-09-24 12:47:14 +0100173 return MakeWorkload<ClMultiplicationFloatWorkload, ClMultiplicationFloatWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000174}
175
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100176std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateDivision(
177 const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
178{
179 return MakeWorkload<ClDivisionFloatWorkload, NullWorkload>(descriptor, info);
180}
181
David Beckc2044fe2018-09-05 15:00:38 +0100182std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
183 const WorkloadInfo& info) const
184{
David Beck0a710c42018-09-11 15:21:14 +0100185 return MakeWorkload<ClSubtractionWorkload<armnn::DataType::Float16, armnn::DataType::Float32>,
186 ClSubtractionWorkload<armnn::DataType::QuantisedAsymm8>>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100187}
188
telsoa014fcda012018-03-09 14:13:49 +0000189std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateBatchNormalization(
190 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
191{
arovir019e53a352018-08-31 15:26:35 +0100192 return MakeWorkload<ClBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000193}
194
195std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
196 const WorkloadInfo& info) const
197{
198 if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
199 {
200 throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemCopy workload");
201 }
202
telsoa01c577f2c2018-08-31 09:22:23 +0100203 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000204}
205
206std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateResizeBilinear(
207 const ResizeBilinearQueueDescriptor& descriptor,
208 const WorkloadInfo& info) const
209{
arovir019e53a352018-08-31 15:26:35 +0100210 return MakeWorkload<ClResizeBilinearFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000211}
212
213std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(
214 const FakeQuantizationQueueDescriptor& descriptor,
215 const WorkloadInfo& info) const
216{
217 return nullptr;
218}
219
220std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
221 const WorkloadInfo& info) const
222{
arovir019e53a352018-08-31 15:26:35 +0100223 return MakeWorkload<ClL2NormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000224}
225
226std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
227 const WorkloadInfo& info) const
228{
arovir019e53a352018-08-31 15:26:35 +0100229 return MakeWorkload<ClConstantFloatWorkload, ClConstantUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000230}
231
232std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
233 const WorkloadInfo& info) const
234{
arovir019e53a352018-08-31 15:26:35 +0100235 return MakeWorkload<ClReshapeFloatWorkload, ClReshapeUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000236}
237
238std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
239 const WorkloadInfo& info) const
240{
arovir019e53a352018-08-31 15:26:35 +0100241 return MakeWorkload<ClFloorFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000242}
243
telsoa01c577f2c2018-08-31 09:22:23 +0100244std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
245 const WorkloadInfo& info) const
246{
arovir019e53a352018-08-31 15:26:35 +0100247 return MakeWorkload<ClLstmFloatWorkload, NullWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100248}
249
250std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
251 const ConvertFp16ToFp32QueueDescriptor& descriptor,
252 const WorkloadInfo& info) const
253{
254 return std::make_unique<ClConvertFp16ToFp32Workload>(descriptor, info);
255}
256
257std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
258 const ConvertFp32ToFp16QueueDescriptor& descriptor,
259 const WorkloadInfo& info) const
260{
261 return std::make_unique<ClConvertFp32ToFp16Workload>(descriptor, info);
262}
263
narpra01a6bf9122018-09-10 09:50:09 +0100264std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
265 const WorkloadInfo& info) const
266{
267 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
268}
269
jimfly012c9322a2018-09-19 10:59:49 +0100270std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
271 const WorkloadInfo& info) const
272{
jimfly01e1fa50c2018-09-21 12:09:51 +0100273 return MakeWorkload<ClPadWorkload<armnn::DataType::Float16, armnn::DataType::Float32>,
274 ClPadWorkload<armnn::DataType::QuantisedAsymm8>>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100275}
276
surmeh013537c2c2018-05-18 16:31:43 +0100277void ClWorkloadFactory::Finalize()
278{
279 m_MemoryManager.Finalize();
280}
281
telsoa01c577f2c2018-08-31 09:22:23 +0100282void ClWorkloadFactory::Release()
283{
284 m_MemoryManager.Release();
285}
286
287void ClWorkloadFactory::Acquire()
288{
289 m_MemoryManager.Acquire();
290}
291
telsoa014fcda012018-03-09 14:13:49 +0000292#else // #if ARMCOMPUTECL_ENABLED
293
surmeh013537c2c2018-05-18 16:31:43 +0100294ClWorkloadFactory::ClWorkloadFactory()
surmeh01bceff2f2018-03-29 16:29:27 +0100295{
telsoa014fcda012018-03-09 14:13:49 +0000296}
297
298std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
299{
300 return nullptr;
301}
302
Francis Murtagh351d13d2018-09-24 15:01:18 +0100303std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
304 DataLayout dataLayout) const
305{
306 return nullptr;
307}
308
telsoa014fcda012018-03-09 14:13:49 +0000309std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
310 TensorShape const& subTensorShape,
311 unsigned int const* subTensorOrigin) const
312{
313 return nullptr;
314}
315
316std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
317 const WorkloadInfo& info) const
318{
319 return nullptr;
320}
321
322std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
323 const WorkloadInfo& info) const
324{
325 return nullptr;
326}
327
328std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
329 const WorkloadInfo& info) const
330{
331 return nullptr;
332}
333
334std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
335 const WorkloadInfo& info) const
336{
337 return nullptr;
338}
339
340std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
341 const WorkloadInfo& info) const
342{
343 return nullptr;
344}
345
346std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
347 const WorkloadInfo& info) const
348{
349 return nullptr;
350}
351
352std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
353 const WorkloadInfo& info) const
354{
355 return nullptr;
356}
357
358std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
359 const WorkloadInfo& info) const
360{
361 return nullptr;
362}
363
364std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
365 const WorkloadInfo& info) const
366{
367 return nullptr;
368}
369
370std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
371 const WorkloadInfo& info) const
372{
373 return nullptr;
374}
375
376std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
377 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
378{
379 return nullptr;
380}
381
382std::unique_ptr<IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
383 const WorkloadInfo& info) const
384{
385 return nullptr;
386}
387
388std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
389 const WorkloadInfo& info) const
390{
391 return nullptr;
392}
393
394std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
395 const WorkloadInfo& info) const
396{
397 return nullptr;
398}
399
400std::unique_ptr<IWorkload> ClWorkloadFactory::CreateBatchNormalization(
401 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
402{
403 return nullptr;
404}
405
406std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
407 const WorkloadInfo& info) const
408{
409 return nullptr;
410}
411
412std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
413 const WorkloadInfo& info) const
414{
415 return nullptr;
416}
417
418std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor,
419 const WorkloadInfo& info) const
420{
421 return nullptr;
422}
423
424std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
425 const WorkloadInfo& info) const
426{
427 return nullptr;
428}
429
430std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
431 const WorkloadInfo& info) const
432{
433 return nullptr;
434}
435
436std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
437 const WorkloadInfo& info) const
438{
439 return nullptr;
440}
441
442std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
443 const WorkloadInfo& info) const
444{
445 return nullptr;
446}
447
telsoa01c577f2c2018-08-31 09:22:23 +0100448std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
449 const WorkloadInfo& info) const
450{
451 return nullptr;
452}
453
454std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
455 const ConvertFp16ToFp32QueueDescriptor& descriptor,
456 const WorkloadInfo& info) const
457{
458 return nullptr;
459}
460
461std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
462 const ConvertFp32ToFp16QueueDescriptor& descriptor,
463 const WorkloadInfo& info) const
464{
465 return nullptr;
466}
467
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100468std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
469 const WorkloadInfo& info) const
470{
471 return nullptr;
472}
473
David Beckc2044fe2018-09-05 15:00:38 +0100474std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
475 const WorkloadInfo& info) const
476{
477 return nullptr;
478}
479
narpra01a6bf9122018-09-10 09:50:09 +0100480std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
481 const WorkloadInfo& info) const
482{
483 return nullptr;
484}
485
jimfly012c9322a2018-09-19 10:59:49 +0100486std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
487 const WorkloadInfo& info) const
488{
489 return nullptr;
490}
491
surmeh013537c2c2018-05-18 16:31:43 +0100492void ClWorkloadFactory::Finalize()
493{
494}
495
telsoa01c577f2c2018-08-31 09:22:23 +0100496void ClWorkloadFactory::Release()
497{
498}
499
500void ClWorkloadFactory::Acquire()
501{
502}
503
telsoa014fcda012018-03-09 14:13:49 +0000504#endif // #if ARMCOMPUTECL_ENABLED
505
telsoa014fcda012018-03-09 14:13:49 +0000506} // namespace armnn