blob: b4f4a72e9d54a5cb3bd3b1180eda65437cdd6a8e [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{
Nattapat Chaimanowongcd066ca2018-10-10 12:11:50 +0100165 return std::make_unique<ClAdditionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000166}
167
168std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMultiplication(
169 const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
170{
Matthew Benthame2ec3302018-10-01 11:32:48 +0100171 return std::make_unique<ClMultiplicationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000172}
173
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100174std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateDivision(
175 const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
176{
177 return MakeWorkload<ClDivisionFloatWorkload, NullWorkload>(descriptor, info);
178}
179
David Beckc2044fe2018-09-05 15:00:38 +0100180std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
181 const WorkloadInfo& info) const
182{
Matthew Bentham092b3042018-10-01 16:39:28 +0100183 return std::make_unique<ClSubtractionWorkload>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100184}
185
telsoa014fcda012018-03-09 14:13:49 +0000186std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateBatchNormalization(
187 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
188{
arovir019e53a352018-08-31 15:26:35 +0100189 return MakeWorkload<ClBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000190}
191
192std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
193 const WorkloadInfo& info) const
194{
195 if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
196 {
197 throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemCopy workload");
198 }
199
telsoa01c577f2c2018-08-31 09:22:23 +0100200 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000201}
202
203std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateResizeBilinear(
204 const ResizeBilinearQueueDescriptor& descriptor,
205 const WorkloadInfo& info) const
206{
arovir019e53a352018-08-31 15:26:35 +0100207 return MakeWorkload<ClResizeBilinearFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000208}
209
210std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(
211 const FakeQuantizationQueueDescriptor& descriptor,
212 const WorkloadInfo& info) const
213{
214 return nullptr;
215}
216
217std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
218 const WorkloadInfo& info) const
219{
arovir019e53a352018-08-31 15:26:35 +0100220 return MakeWorkload<ClL2NormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000221}
222
223std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
224 const WorkloadInfo& info) const
225{
arovir019e53a352018-08-31 15:26:35 +0100226 return MakeWorkload<ClConstantFloatWorkload, ClConstantUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000227}
228
229std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
230 const WorkloadInfo& info) const
231{
arovir019e53a352018-08-31 15:26:35 +0100232 return MakeWorkload<ClReshapeFloatWorkload, ClReshapeUint8Workload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000233}
234
235std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
236 const WorkloadInfo& info) const
237{
arovir019e53a352018-08-31 15:26:35 +0100238 return MakeWorkload<ClFloorFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000239}
240
telsoa01c577f2c2018-08-31 09:22:23 +0100241std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
242 const WorkloadInfo& info) const
243{
arovir019e53a352018-08-31 15:26:35 +0100244 return MakeWorkload<ClLstmFloatWorkload, NullWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100245}
246
247std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
248 const ConvertFp16ToFp32QueueDescriptor& descriptor,
249 const WorkloadInfo& info) const
250{
251 return std::make_unique<ClConvertFp16ToFp32Workload>(descriptor, info);
252}
253
254std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
255 const ConvertFp32ToFp16QueueDescriptor& descriptor,
256 const WorkloadInfo& info) const
257{
258 return std::make_unique<ClConvertFp32ToFp16Workload>(descriptor, info);
259}
260
narpra01a6bf9122018-09-10 09:50:09 +0100261std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
262 const WorkloadInfo& info) const
263{
264 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
265}
266
jimfly012c9322a2018-09-19 10:59:49 +0100267std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
268 const WorkloadInfo& info) const
269{
jimfly01e1fa50c2018-09-21 12:09:51 +0100270 return MakeWorkload<ClPadWorkload<armnn::DataType::Float16, armnn::DataType::Float32>,
271 ClPadWorkload<armnn::DataType::QuantisedAsymm8>>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100272}
273
surmeh013537c2c2018-05-18 16:31:43 +0100274void ClWorkloadFactory::Finalize()
275{
276 m_MemoryManager.Finalize();
277}
278
telsoa01c577f2c2018-08-31 09:22:23 +0100279void ClWorkloadFactory::Release()
280{
281 m_MemoryManager.Release();
282}
283
284void ClWorkloadFactory::Acquire()
285{
286 m_MemoryManager.Acquire();
287}
288
telsoa014fcda012018-03-09 14:13:49 +0000289#else // #if ARMCOMPUTECL_ENABLED
290
surmeh013537c2c2018-05-18 16:31:43 +0100291ClWorkloadFactory::ClWorkloadFactory()
surmeh01bceff2f2018-03-29 16:29:27 +0100292{
telsoa014fcda012018-03-09 14:13:49 +0000293}
294
295std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
296{
297 return nullptr;
298}
299
Francis Murtagh351d13d2018-09-24 15:01:18 +0100300std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
301 DataLayout dataLayout) const
302{
303 return nullptr;
304}
305
telsoa014fcda012018-03-09 14:13:49 +0000306std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
307 TensorShape const& subTensorShape,
308 unsigned int const* subTensorOrigin) const
309{
310 return nullptr;
311}
312
313std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
314 const WorkloadInfo& info) const
315{
316 return nullptr;
317}
318
319std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
320 const WorkloadInfo& info) const
321{
322 return nullptr;
323}
324
325std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
326 const WorkloadInfo& info) const
327{
328 return nullptr;
329}
330
331std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
332 const WorkloadInfo& info) const
333{
334 return nullptr;
335}
336
337std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
338 const WorkloadInfo& info) const
339{
340 return nullptr;
341}
342
343std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
344 const WorkloadInfo& info) const
345{
346 return nullptr;
347}
348
349std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
350 const WorkloadInfo& info) const
351{
352 return nullptr;
353}
354
355std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
356 const WorkloadInfo& info) const
357{
358 return nullptr;
359}
360
361std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
362 const WorkloadInfo& info) const
363{
364 return nullptr;
365}
366
367std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
368 const WorkloadInfo& info) const
369{
370 return nullptr;
371}
372
373std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
374 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
375{
376 return nullptr;
377}
378
379std::unique_ptr<IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
380 const WorkloadInfo& info) const
381{
382 return nullptr;
383}
384
385std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
386 const WorkloadInfo& info) const
387{
388 return nullptr;
389}
390
391std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
392 const WorkloadInfo& info) const
393{
394 return nullptr;
395}
396
397std::unique_ptr<IWorkload> ClWorkloadFactory::CreateBatchNormalization(
398 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
399{
400 return nullptr;
401}
402
403std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
404 const WorkloadInfo& info) const
405{
406 return nullptr;
407}
408
409std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
410 const WorkloadInfo& info) const
411{
412 return nullptr;
413}
414
415std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor,
416 const WorkloadInfo& info) const
417{
418 return nullptr;
419}
420
421std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
422 const WorkloadInfo& info) const
423{
424 return nullptr;
425}
426
427std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
428 const WorkloadInfo& info) const
429{
430 return nullptr;
431}
432
433std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
434 const WorkloadInfo& info) const
435{
436 return nullptr;
437}
438
439std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
440 const WorkloadInfo& info) const
441{
442 return nullptr;
443}
444
telsoa01c577f2c2018-08-31 09:22:23 +0100445std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
446 const WorkloadInfo& info) const
447{
448 return nullptr;
449}
450
451std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
452 const ConvertFp16ToFp32QueueDescriptor& descriptor,
453 const WorkloadInfo& info) const
454{
455 return nullptr;
456}
457
458std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
459 const ConvertFp32ToFp16QueueDescriptor& descriptor,
460 const WorkloadInfo& info) const
461{
462 return nullptr;
463}
464
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100465std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
466 const WorkloadInfo& info) const
467{
468 return nullptr;
469}
470
David Beckc2044fe2018-09-05 15:00:38 +0100471std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
472 const WorkloadInfo& info) const
473{
474 return nullptr;
475}
476
narpra01a6bf9122018-09-10 09:50:09 +0100477std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
478 const WorkloadInfo& info) const
479{
480 return nullptr;
481}
482
jimfly012c9322a2018-09-19 10:59:49 +0100483std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
484 const WorkloadInfo& info) const
485{
486 return nullptr;
487}
488
surmeh013537c2c2018-05-18 16:31:43 +0100489void ClWorkloadFactory::Finalize()
490{
491}
492
telsoa01c577f2c2018-08-31 09:22:23 +0100493void ClWorkloadFactory::Release()
494{
495}
496
497void ClWorkloadFactory::Acquire()
498{
499}
500
telsoa014fcda012018-03-09 14:13:49 +0000501#endif // #if ARMCOMPUTECL_ENABLED
502
telsoa014fcda012018-03-09 14:13:49 +0000503} // namespace armnn