blob: fa86840e5fd1100cece59a61e37ce73c95c3ba5a [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{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100103 return std::make_unique<ClActivationWorkload>(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{
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100122 return std::make_unique<ClMergerWorkload>(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{
Nattapat Chaimanowong157d94f2018-10-10 15:47:15 +0100135 return std::make_unique<ClPermuteWorkload>(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{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100141 return std::make_unique<ClPooling2dWorkload>(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{
Nattapat Chaimanowong55b1cda2018-10-10 14:51:27 +0100226 return std::make_unique<ClConstantWorkload>(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{
Nattapat Chaimanowong4e00a3d2018-10-09 17:05:24 +0100270 return std::make_unique<ClPadWorkload>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100271}
272
surmeh013537c2c2018-05-18 16:31:43 +0100273void ClWorkloadFactory::Finalize()
274{
275 m_MemoryManager.Finalize();
276}
277
telsoa01c577f2c2018-08-31 09:22:23 +0100278void ClWorkloadFactory::Release()
279{
280 m_MemoryManager.Release();
281}
282
283void ClWorkloadFactory::Acquire()
284{
285 m_MemoryManager.Acquire();
286}
287
telsoa014fcda012018-03-09 14:13:49 +0000288#else // #if ARMCOMPUTECL_ENABLED
289
surmeh013537c2c2018-05-18 16:31:43 +0100290ClWorkloadFactory::ClWorkloadFactory()
surmeh01bceff2f2018-03-29 16:29:27 +0100291{
telsoa014fcda012018-03-09 14:13:49 +0000292}
293
294std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
295{
296 return nullptr;
297}
298
Francis Murtagh351d13d2018-09-24 15:01:18 +0100299std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
300 DataLayout dataLayout) const
301{
302 return nullptr;
303}
304
telsoa014fcda012018-03-09 14:13:49 +0000305std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
306 TensorShape const& subTensorShape,
307 unsigned int const* subTensorOrigin) const
308{
309 return nullptr;
310}
311
312std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
313 const WorkloadInfo& info) const
314{
315 return nullptr;
316}
317
318std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
319 const WorkloadInfo& info) const
320{
321 return nullptr;
322}
323
324std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
325 const WorkloadInfo& info) const
326{
327 return nullptr;
328}
329
330std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
331 const WorkloadInfo& info) const
332{
333 return nullptr;
334}
335
336std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
337 const WorkloadInfo& info) const
338{
339 return nullptr;
340}
341
342std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
343 const WorkloadInfo& info) const
344{
345 return nullptr;
346}
347
348std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
349 const WorkloadInfo& info) const
350{
351 return nullptr;
352}
353
354std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
355 const WorkloadInfo& info) const
356{
357 return nullptr;
358}
359
360std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
361 const WorkloadInfo& info) const
362{
363 return nullptr;
364}
365
366std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
367 const WorkloadInfo& info) const
368{
369 return nullptr;
370}
371
372std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
373 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
374{
375 return nullptr;
376}
377
378std::unique_ptr<IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
379 const WorkloadInfo& info) const
380{
381 return nullptr;
382}
383
384std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
385 const WorkloadInfo& info) const
386{
387 return nullptr;
388}
389
390std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
391 const WorkloadInfo& info) const
392{
393 return nullptr;
394}
395
396std::unique_ptr<IWorkload> ClWorkloadFactory::CreateBatchNormalization(
397 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
398{
399 return nullptr;
400}
401
402std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
403 const WorkloadInfo& info) const
404{
405 return nullptr;
406}
407
408std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
409 const WorkloadInfo& info) const
410{
411 return nullptr;
412}
413
414std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor,
415 const WorkloadInfo& info) const
416{
417 return nullptr;
418}
419
420std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
421 const WorkloadInfo& info) const
422{
423 return nullptr;
424}
425
426std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
427 const WorkloadInfo& info) const
428{
429 return nullptr;
430}
431
432std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
433 const WorkloadInfo& info) const
434{
435 return nullptr;
436}
437
438std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
439 const WorkloadInfo& info) const
440{
441 return nullptr;
442}
443
telsoa01c577f2c2018-08-31 09:22:23 +0100444std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
445 const WorkloadInfo& info) const
446{
447 return nullptr;
448}
449
450std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
451 const ConvertFp16ToFp32QueueDescriptor& descriptor,
452 const WorkloadInfo& info) const
453{
454 return nullptr;
455}
456
457std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
458 const ConvertFp32ToFp16QueueDescriptor& descriptor,
459 const WorkloadInfo& info) const
460{
461 return nullptr;
462}
463
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100464std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
465 const WorkloadInfo& info) const
466{
467 return nullptr;
468}
469
David Beckc2044fe2018-09-05 15:00:38 +0100470std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
471 const WorkloadInfo& info) const
472{
473 return nullptr;
474}
475
narpra01a6bf9122018-09-10 09:50:09 +0100476std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
477 const WorkloadInfo& info) const
478{
479 return nullptr;
480}
481
jimfly012c9322a2018-09-19 10:59:49 +0100482std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
483 const WorkloadInfo& info) const
484{
485 return nullptr;
486}
487
surmeh013537c2c2018-05-18 16:31:43 +0100488void ClWorkloadFactory::Finalize()
489{
490}
491
telsoa01c577f2c2018-08-31 09:22:23 +0100492void ClWorkloadFactory::Release()
493{
494}
495
496void ClWorkloadFactory::Acquire()
497{
498}
499
telsoa014fcda012018-03-09 14:13:49 +0000500#endif // #if ARMCOMPUTECL_ENABLED
501
telsoa014fcda012018-03-09 14:13:49 +0000502} // namespace armnn