blob: 0b7e539202da5377b3475882d7ee2cc3ff80a586 [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{
Matthew Benthame2ec3302018-10-01 11:32:48 +0100173 return std::make_unique<ClMultiplicationWorkload>(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{
Matthew Bentham092b3042018-10-01 16:39:28 +0100185 return std::make_unique<ClSubtractionWorkload>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100186}
187
telsoa014fcda012018-03-09 14:13:49 +0000188std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateBatchNormalization(
189 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
190{
arovir019e53a352018-08-31 15:26:35 +0100191 return MakeWorkload<ClBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000192}
193
194std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
195 const WorkloadInfo& info) const
196{
197 if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
198 {
199 throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemCopy workload");
200 }
201
telsoa01c577f2c2018-08-31 09:22:23 +0100202 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000203}
204
205std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateResizeBilinear(
206 const ResizeBilinearQueueDescriptor& descriptor,
207 const WorkloadInfo& info) const
208{
arovir019e53a352018-08-31 15:26:35 +0100209 return MakeWorkload<ClResizeBilinearFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000210}
211
212std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(
213 const FakeQuantizationQueueDescriptor& descriptor,
214 const WorkloadInfo& info) const
215{
216 return nullptr;
217}
218
219std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
220 const WorkloadInfo& info) const
221{
arovir019e53a352018-08-31 15:26:35 +0100222 return MakeWorkload<ClL2NormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000223}
224
225std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
226 const WorkloadInfo& info) const
227{
arovir019e53a352018-08-31 15:26:35 +0100228 return MakeWorkload<ClConstantFloatWorkload, ClConstantUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000229}
230
231std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
232 const WorkloadInfo& info) const
233{
arovir019e53a352018-08-31 15:26:35 +0100234 return MakeWorkload<ClReshapeFloatWorkload, ClReshapeUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000235}
236
237std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
238 const WorkloadInfo& info) const
239{
arovir019e53a352018-08-31 15:26:35 +0100240 return MakeWorkload<ClFloorFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000241}
242
telsoa01c577f2c2018-08-31 09:22:23 +0100243std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
244 const WorkloadInfo& info) const
245{
arovir019e53a352018-08-31 15:26:35 +0100246 return MakeWorkload<ClLstmFloatWorkload, NullWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100247}
248
249std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
250 const ConvertFp16ToFp32QueueDescriptor& descriptor,
251 const WorkloadInfo& info) const
252{
253 return std::make_unique<ClConvertFp16ToFp32Workload>(descriptor, info);
254}
255
256std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
257 const ConvertFp32ToFp16QueueDescriptor& descriptor,
258 const WorkloadInfo& info) const
259{
260 return std::make_unique<ClConvertFp32ToFp16Workload>(descriptor, info);
261}
262
narpra01a6bf9122018-09-10 09:50:09 +0100263std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
264 const WorkloadInfo& info) const
265{
266 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
267}
268
jimfly012c9322a2018-09-19 10:59:49 +0100269std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
270 const WorkloadInfo& info) const
271{
jimfly01e1fa50c2018-09-21 12:09:51 +0100272 return MakeWorkload<ClPadWorkload<armnn::DataType::Float16, armnn::DataType::Float32>,
273 ClPadWorkload<armnn::DataType::QuantisedAsymm8>>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100274}
275
surmeh013537c2c2018-05-18 16:31:43 +0100276void ClWorkloadFactory::Finalize()
277{
278 m_MemoryManager.Finalize();
279}
280
telsoa01c577f2c2018-08-31 09:22:23 +0100281void ClWorkloadFactory::Release()
282{
283 m_MemoryManager.Release();
284}
285
286void ClWorkloadFactory::Acquire()
287{
288 m_MemoryManager.Acquire();
289}
290
telsoa014fcda012018-03-09 14:13:49 +0000291#else // #if ARMCOMPUTECL_ENABLED
292
surmeh013537c2c2018-05-18 16:31:43 +0100293ClWorkloadFactory::ClWorkloadFactory()
surmeh01bceff2f2018-03-29 16:29:27 +0100294{
telsoa014fcda012018-03-09 14:13:49 +0000295}
296
297std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
298{
299 return nullptr;
300}
301
Francis Murtagh351d13d2018-09-24 15:01:18 +0100302std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
303 DataLayout dataLayout) const
304{
305 return nullptr;
306}
307
telsoa014fcda012018-03-09 14:13:49 +0000308std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
309 TensorShape const& subTensorShape,
310 unsigned int const* subTensorOrigin) const
311{
312 return nullptr;
313}
314
315std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
316 const WorkloadInfo& info) const
317{
318 return nullptr;
319}
320
321std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
322 const WorkloadInfo& info) const
323{
324 return nullptr;
325}
326
327std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
328 const WorkloadInfo& info) const
329{
330 return nullptr;
331}
332
333std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
334 const WorkloadInfo& info) const
335{
336 return nullptr;
337}
338
339std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
340 const WorkloadInfo& info) const
341{
342 return nullptr;
343}
344
345std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
346 const WorkloadInfo& info) const
347{
348 return nullptr;
349}
350
351std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
352 const WorkloadInfo& info) const
353{
354 return nullptr;
355}
356
357std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
358 const WorkloadInfo& info) const
359{
360 return nullptr;
361}
362
363std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
364 const WorkloadInfo& info) const
365{
366 return nullptr;
367}
368
369std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
370 const WorkloadInfo& info) const
371{
372 return nullptr;
373}
374
375std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
376 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
377{
378 return nullptr;
379}
380
381std::unique_ptr<IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
382 const WorkloadInfo& info) const
383{
384 return nullptr;
385}
386
387std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
388 const WorkloadInfo& info) const
389{
390 return nullptr;
391}
392
393std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
394 const WorkloadInfo& info) const
395{
396 return nullptr;
397}
398
399std::unique_ptr<IWorkload> ClWorkloadFactory::CreateBatchNormalization(
400 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
401{
402 return nullptr;
403}
404
405std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
406 const WorkloadInfo& info) const
407{
408 return nullptr;
409}
410
411std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
412 const WorkloadInfo& info) const
413{
414 return nullptr;
415}
416
417std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor,
418 const WorkloadInfo& info) const
419{
420 return nullptr;
421}
422
423std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
424 const WorkloadInfo& info) const
425{
426 return nullptr;
427}
428
429std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
430 const WorkloadInfo& info) const
431{
432 return nullptr;
433}
434
435std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
436 const WorkloadInfo& info) const
437{
438 return nullptr;
439}
440
441std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
442 const WorkloadInfo& info) const
443{
444 return nullptr;
445}
446
telsoa01c577f2c2018-08-31 09:22:23 +0100447std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
448 const WorkloadInfo& info) const
449{
450 return nullptr;
451}
452
453std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
454 const ConvertFp16ToFp32QueueDescriptor& descriptor,
455 const WorkloadInfo& info) const
456{
457 return nullptr;
458}
459
460std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
461 const ConvertFp32ToFp16QueueDescriptor& descriptor,
462 const WorkloadInfo& info) const
463{
464 return nullptr;
465}
466
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100467std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
468 const WorkloadInfo& info) const
469{
470 return nullptr;
471}
472
David Beckc2044fe2018-09-05 15:00:38 +0100473std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
474 const WorkloadInfo& info) const
475{
476 return nullptr;
477}
478
narpra01a6bf9122018-09-10 09:50:09 +0100479std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
480 const WorkloadInfo& info) const
481{
482 return nullptr;
483}
484
jimfly012c9322a2018-09-19 10:59:49 +0100485std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
486 const WorkloadInfo& info) const
487{
488 return nullptr;
489}
490
surmeh013537c2c2018-05-18 16:31:43 +0100491void ClWorkloadFactory::Finalize()
492{
493}
494
telsoa01c577f2c2018-08-31 09:22:23 +0100495void ClWorkloadFactory::Release()
496{
497}
498
499void ClWorkloadFactory::Acquire()
500{
501}
502
telsoa014fcda012018-03-09 14:13:49 +0000503#endif // #if ARMCOMPUTECL_ENABLED
504
telsoa014fcda012018-03-09 14:13:49 +0000505} // namespace armnn