blob: c00d0ba5f043df10a4f6c0a81ecd3450a7e751ca [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{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100116 return std::make_unique<ClSplitterWorkload>(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{
Matthew Benthamd8067922018-10-03 17:18:04 +0100147 return std::make_unique<ClConvolution2dWorkload>(descriptor, info, m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000148}
149
150std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
151 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
152{
Matthew Benthamd8777392018-10-08 09:38:55 +0100153 return std::make_unique<ClDepthwiseConvolutionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000154}
155
156std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
157 const WorkloadInfo& info) const
158{
arovir019e53a352018-08-31 15:26:35 +0100159 return MakeWorkload<ClNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000160}
161
162std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
163 const WorkloadInfo& info) const
164{
David Beck0a710c42018-09-11 15:21:14 +0100165 return MakeWorkload<ClAdditionWorkload<armnn::DataType::Float16, armnn::DataType::Float32>,
166 ClAdditionWorkload<armnn::DataType::QuantisedAsymm8>>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000167}
168
169std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMultiplication(
170 const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
171{
Matthew Benthame2ec3302018-10-01 11:32:48 +0100172 return std::make_unique<ClMultiplicationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000173}
174
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100175std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateDivision(
176 const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
177{
178 return MakeWorkload<ClDivisionFloatWorkload, NullWorkload>(descriptor, info);
179}
180
David Beckc2044fe2018-09-05 15:00:38 +0100181std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
182 const WorkloadInfo& info) const
183{
Matthew Bentham092b3042018-10-01 16:39:28 +0100184 return std::make_unique<ClSubtractionWorkload>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100185}
186
telsoa014fcda012018-03-09 14:13:49 +0000187std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateBatchNormalization(
188 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
189{
arovir019e53a352018-08-31 15:26:35 +0100190 return MakeWorkload<ClBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000191}
192
193std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
194 const WorkloadInfo& info) const
195{
196 if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
197 {
198 throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemCopy workload");
199 }
200
telsoa01c577f2c2018-08-31 09:22:23 +0100201 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000202}
203
204std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateResizeBilinear(
205 const ResizeBilinearQueueDescriptor& descriptor,
206 const WorkloadInfo& info) const
207{
arovir019e53a352018-08-31 15:26:35 +0100208 return MakeWorkload<ClResizeBilinearFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000209}
210
211std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(
212 const FakeQuantizationQueueDescriptor& descriptor,
213 const WorkloadInfo& info) const
214{
215 return nullptr;
216}
217
218std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
219 const WorkloadInfo& info) const
220{
arovir019e53a352018-08-31 15:26:35 +0100221 return MakeWorkload<ClL2NormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000222}
223
224std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
225 const WorkloadInfo& info) const
226{
arovir019e53a352018-08-31 15:26:35 +0100227 return MakeWorkload<ClConstantFloatWorkload, ClConstantUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000228}
229
230std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
231 const WorkloadInfo& info) const
232{
arovir019e53a352018-08-31 15:26:35 +0100233 return MakeWorkload<ClReshapeFloatWorkload, ClReshapeUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000234}
235
236std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
237 const WorkloadInfo& info) const
238{
arovir019e53a352018-08-31 15:26:35 +0100239 return MakeWorkload<ClFloorFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000240}
241
telsoa01c577f2c2018-08-31 09:22:23 +0100242std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
243 const WorkloadInfo& info) const
244{
arovir019e53a352018-08-31 15:26:35 +0100245 return MakeWorkload<ClLstmFloatWorkload, NullWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100246}
247
248std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
249 const ConvertFp16ToFp32QueueDescriptor& descriptor,
250 const WorkloadInfo& info) const
251{
252 return std::make_unique<ClConvertFp16ToFp32Workload>(descriptor, info);
253}
254
255std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
256 const ConvertFp32ToFp16QueueDescriptor& descriptor,
257 const WorkloadInfo& info) const
258{
259 return std::make_unique<ClConvertFp32ToFp16Workload>(descriptor, info);
260}
261
narpra01a6bf9122018-09-10 09:50:09 +0100262std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
263 const WorkloadInfo& info) const
264{
265 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
266}
267
jimfly012c9322a2018-09-19 10:59:49 +0100268std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
269 const WorkloadInfo& info) const
270{
jimfly01e1fa50c2018-09-21 12:09:51 +0100271 return MakeWorkload<ClPadWorkload<armnn::DataType::Float16, armnn::DataType::Float32>,
272 ClPadWorkload<armnn::DataType::QuantisedAsymm8>>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100273}
274
surmeh013537c2c2018-05-18 16:31:43 +0100275void ClWorkloadFactory::Finalize()
276{
277 m_MemoryManager.Finalize();
278}
279
telsoa01c577f2c2018-08-31 09:22:23 +0100280void ClWorkloadFactory::Release()
281{
282 m_MemoryManager.Release();
283}
284
285void ClWorkloadFactory::Acquire()
286{
287 m_MemoryManager.Acquire();
288}
289
telsoa014fcda012018-03-09 14:13:49 +0000290#else // #if ARMCOMPUTECL_ENABLED
291
surmeh013537c2c2018-05-18 16:31:43 +0100292ClWorkloadFactory::ClWorkloadFactory()
surmeh01bceff2f2018-03-29 16:29:27 +0100293{
telsoa014fcda012018-03-09 14:13:49 +0000294}
295
296std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
297{
298 return nullptr;
299}
300
Francis Murtagh351d13d2018-09-24 15:01:18 +0100301std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
302 DataLayout dataLayout) const
303{
304 return nullptr;
305}
306
telsoa014fcda012018-03-09 14:13:49 +0000307std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
308 TensorShape const& subTensorShape,
309 unsigned int const* subTensorOrigin) const
310{
311 return nullptr;
312}
313
314std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
315 const WorkloadInfo& info) const
316{
317 return nullptr;
318}
319
320std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
321 const WorkloadInfo& info) const
322{
323 return nullptr;
324}
325
326std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
327 const WorkloadInfo& info) const
328{
329 return nullptr;
330}
331
332std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
333 const WorkloadInfo& info) const
334{
335 return nullptr;
336}
337
338std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
339 const WorkloadInfo& info) const
340{
341 return nullptr;
342}
343
344std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
345 const WorkloadInfo& info) const
346{
347 return nullptr;
348}
349
350std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
351 const WorkloadInfo& info) const
352{
353 return nullptr;
354}
355
356std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
357 const WorkloadInfo& info) const
358{
359 return nullptr;
360}
361
362std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
363 const WorkloadInfo& info) const
364{
365 return nullptr;
366}
367
368std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
369 const WorkloadInfo& info) const
370{
371 return nullptr;
372}
373
374std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
375 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
376{
377 return nullptr;
378}
379
380std::unique_ptr<IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
381 const WorkloadInfo& info) const
382{
383 return nullptr;
384}
385
386std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
387 const WorkloadInfo& info) const
388{
389 return nullptr;
390}
391
392std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
393 const WorkloadInfo& info) const
394{
395 return nullptr;
396}
397
398std::unique_ptr<IWorkload> ClWorkloadFactory::CreateBatchNormalization(
399 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
400{
401 return nullptr;
402}
403
404std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
405 const WorkloadInfo& info) const
406{
407 return nullptr;
408}
409
410std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
411 const WorkloadInfo& info) const
412{
413 return nullptr;
414}
415
416std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor,
417 const WorkloadInfo& info) const
418{
419 return nullptr;
420}
421
422std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
423 const WorkloadInfo& info) const
424{
425 return nullptr;
426}
427
428std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
429 const WorkloadInfo& info) const
430{
431 return nullptr;
432}
433
434std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
435 const WorkloadInfo& info) const
436{
437 return nullptr;
438}
439
440std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
441 const WorkloadInfo& info) const
442{
443 return nullptr;
444}
445
telsoa01c577f2c2018-08-31 09:22:23 +0100446std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
447 const WorkloadInfo& info) const
448{
449 return nullptr;
450}
451
452std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
453 const ConvertFp16ToFp32QueueDescriptor& descriptor,
454 const WorkloadInfo& info) const
455{
456 return nullptr;
457}
458
459std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
460 const ConvertFp32ToFp16QueueDescriptor& descriptor,
461 const WorkloadInfo& info) const
462{
463 return nullptr;
464}
465
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100466std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
467 const WorkloadInfo& info) const
468{
469 return nullptr;
470}
471
David Beckc2044fe2018-09-05 15:00:38 +0100472std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
473 const WorkloadInfo& info) const
474{
475 return nullptr;
476}
477
narpra01a6bf9122018-09-10 09:50:09 +0100478std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
479 const WorkloadInfo& info) const
480{
481 return nullptr;
482}
483
jimfly012c9322a2018-09-19 10:59:49 +0100484std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
485 const WorkloadInfo& info) const
486{
487 return nullptr;
488}
489
surmeh013537c2c2018-05-18 16:31:43 +0100490void ClWorkloadFactory::Finalize()
491{
492}
493
telsoa01c577f2c2018-08-31 09:22:23 +0100494void ClWorkloadFactory::Release()
495{
496}
497
498void ClWorkloadFactory::Acquire()
499{
500}
501
telsoa014fcda012018-03-09 14:13:49 +0000502#endif // #if ARMCOMPUTECL_ENABLED
503
telsoa014fcda012018-03-09 14:13:49 +0000504} // namespace armnn