blob: 08ee9e922dba201bda1a8861e7e9f3d672fdbe97 [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"
David Beck79141b92018-10-23 16:09:36 +01006#include "ClBackendId.hpp"
telsoa014fcda012018-03-09 14:13:49 +00007
David Beck0dbe0ee2018-09-24 15:59:27 +01008#include <armnn/Exceptions.hpp>
9#include <armnn/Utils.hpp>
telsoa014fcda012018-03-09 14:13:49 +000010
11#include <string>
David Beck0dbe0ee2018-09-24 15:59:27 +010012#include <backends/CpuTensorHandle.hpp>
13#include <Layer.hpp>
telsoa014fcda012018-03-09 14:13:49 +000014
15#ifdef ARMCOMPUTECL_ENABLED
16#include <arm_compute/core/CL/CLKernelLibrary.h>
surmeh013537c2c2018-05-18 16:31:43 +010017#include <arm_compute/runtime/CL/CLBufferAllocator.h>
telsoa014fcda012018-03-09 14:13:49 +000018#include <arm_compute/runtime/CL/CLScheduler.h>
telsoa01c577f2c2018-08-31 09:22:23 +010019
David Beck0dbe0ee2018-09-24 15:59:27 +010020#include <backends/MemCopyWorkload.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +010021
Aron Virginas-Tarf9aeef02018-10-12 15:18:03 +010022#include <backends/aclCommon/memory/IPoolManager.hpp>
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +010023
24#include <backends/cl/ClTensorHandle.hpp>
25#include <backends/cl/workloads/ClWorkloads.hpp>
26#include <backends/cl/workloads/ClWorkloadUtils.hpp>
telsoa014fcda012018-03-09 14:13:49 +000027#endif
28
David Beckac42efd2018-09-26 17:41:13 +010029#include <backends/MakeWorkloadHelper.hpp>
telsoa014fcda012018-03-09 14:13:49 +000030
31#include <boost/polymorphic_cast.hpp>
32#include <boost/format.hpp>
surmeh013537c2c2018-05-18 16:31:43 +010033#include <boost/log/trivial.hpp>
telsoa014fcda012018-03-09 14:13:49 +000034
35namespace armnn
36{
37
David Beck79141b92018-10-23 16:09:36 +010038namespace
39{
40static const BackendId s_Id{ClBackendId()};
41}
42
telsoa01c577f2c2018-08-31 09:22:23 +010043bool ClWorkloadFactory::IsLayerSupported(const Layer& layer,
David Beck29c75de2018-10-23 13:35:58 +010044 Optional<DataType> dataType,
telsoa01c577f2c2018-08-31 09:22:23 +010045 std::string& outReasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +000046{
David Beck79141b92018-10-23 16:09:36 +010047 return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
48}
49
50const BackendId& ClWorkloadFactory::GetBackendId() const
51{
52 return s_Id;
telsoa014fcda012018-03-09 14:13:49 +000053}
54
55#ifdef ARMCOMPUTECL_ENABLED
56
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +010057template <typename FloatWorkload, typename Uint8Workload, typename QueueDescriptorType, typename... Args>
58std::unique_ptr<IWorkload> ClWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
59 const WorkloadInfo& info,
60 Args&&... args)
61{
62 try
63 {
64 return MakeWorkloadHelper<FloatWorkload, Uint8Workload>(descriptor, info, std::forward<Args>(args)...);
65 }
66 catch (const cl::Error& clError)
67 {
68 throw WrapClError(clError, CHECK_LOCATION());
69 }
70}
71
72template <typename Workload, typename QueueDescriptorType, typename... Args>
73std::unique_ptr<IWorkload> ClWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
74 const WorkloadInfo& info,
75 Args&&... args)
76{
77 try
78 {
79 return std::make_unique<Workload>(descriptor, info, std::forward<Args>(args)...);
80 }
81 catch (const cl::Error& clError)
82 {
83 throw WrapClError(clError, CHECK_LOCATION());
84 }
85}
86
surmeh013537c2c2018-05-18 16:31:43 +010087ClWorkloadFactory::ClWorkloadFactory()
88: m_MemoryManager(std::make_unique<arm_compute::CLBufferAllocator>())
telsoa014fcda012018-03-09 14:13:49 +000089{
telsoa014fcda012018-03-09 14:13:49 +000090}
91
92std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
93{
telsoa01c577f2c2018-08-31 09:22:23 +010094 std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo);
95 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
96
97 return tensorHandle;
telsoa014fcda012018-03-09 14:13:49 +000098}
99
Francis Murtagh351d13d2018-09-24 15:01:18 +0100100std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
101 DataLayout dataLayout) const
102{
103 std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo, dataLayout);
104 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
105
106 return tensorHandle;
107}
108
telsoa014fcda012018-03-09 14:13:49 +0000109std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
110 TensorShape const& subTensorShape,
111 unsigned int const* subTensorOrigin) const
112{
113 BOOST_ASSERT(parent.GetType() == ITensorHandle::CL);
114
115 arm_compute::Coordinates coords;
116 arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
117
118 coords.set_num_dimensions(subTensorShape.GetNumDimensions());
119 for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++)
120 {
telsoa01c577f2c2018-08-31 09:22:23 +0100121 // Arm compute indexes tensor coords in reverse order.
telsoa014fcda012018-03-09 14:13:49 +0000122 unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
123 coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex]));
124 }
125
telsoa01c577f2c2018-08-31 09:22:23 +0100126 return std::make_unique<ClSubTensorHandle>(
127 boost::polymorphic_downcast<IClTensorHandle*>(&parent), shape, coords);
telsoa014fcda012018-03-09 14:13:49 +0000128}
129
130std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
131 const WorkloadInfo& info) const
132{
telsoa01c577f2c2018-08-31 09:22:23 +0100133 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000134}
135
136std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
137 const WorkloadInfo& info) const
138{
telsoa01c577f2c2018-08-31 09:22:23 +0100139 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000140}
141
142std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
143 const WorkloadInfo& info) const
144{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100145 return MakeWorkload<ClActivationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000146}
147
148std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
149 const WorkloadInfo& info) const
150{
arovir019e53a352018-08-31 15:26:35 +0100151 return MakeWorkload<ClSoftmaxFloatWorkload, ClSoftmaxUint8Workload>(descriptor, info,
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100152 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000153}
154
155std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
156 const WorkloadInfo& info) const
157{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100158 return MakeWorkload<ClSplitterWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000159}
160
161std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
162 const WorkloadInfo& info) const
163{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100164 return MakeWorkload<ClMergerWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000165}
166
167std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateFullyConnected(
168 const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
169{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100170 return MakeWorkload<ClFullyConnectedWorkload, ClFullyConnectedWorkload>(descriptor, info,
171 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000172}
173
174std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
175 const WorkloadInfo& info) const
176{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100177 return MakeWorkload<ClPermuteWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000178}
179
180std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
181 const WorkloadInfo& info) const
182{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100183 return MakeWorkload<ClPooling2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000184}
185
186std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
187 const WorkloadInfo& info) const
188{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100189 return MakeWorkload<ClConvolution2dWorkload>(descriptor, info, m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000190}
191
192std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
193 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
194{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100195 return MakeWorkload<ClDepthwiseConvolutionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000196}
197
198std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
199 const WorkloadInfo& info) const
200{
arovir019e53a352018-08-31 15:26:35 +0100201 return MakeWorkload<ClNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000202}
203
204std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
205 const WorkloadInfo& info) const
206{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100207 return MakeWorkload<ClAdditionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000208}
209
210std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMultiplication(
211 const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
212{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100213 return MakeWorkload<ClMultiplicationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000214}
215
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100216std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateDivision(
217 const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
218{
219 return MakeWorkload<ClDivisionFloatWorkload, NullWorkload>(descriptor, info);
220}
221
David Beckc2044fe2018-09-05 15:00:38 +0100222std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
223 const WorkloadInfo& info) const
224{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100225 return MakeWorkload<ClSubtractionWorkload>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100226}
227
telsoa014fcda012018-03-09 14:13:49 +0000228std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateBatchNormalization(
229 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
230{
arovir019e53a352018-08-31 15:26:35 +0100231 return MakeWorkload<ClBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000232}
233
234std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
235 const WorkloadInfo& info) const
236{
237 if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
238 {
239 throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemCopy workload");
240 }
241
telsoa01c577f2c2018-08-31 09:22:23 +0100242 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000243}
244
245std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateResizeBilinear(
246 const ResizeBilinearQueueDescriptor& descriptor,
247 const WorkloadInfo& info) const
248{
arovir019e53a352018-08-31 15:26:35 +0100249 return MakeWorkload<ClResizeBilinearFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000250}
251
252std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(
253 const FakeQuantizationQueueDescriptor& descriptor,
254 const WorkloadInfo& info) const
255{
256 return nullptr;
257}
258
259std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
260 const WorkloadInfo& info) const
261{
arovir019e53a352018-08-31 15:26:35 +0100262 return MakeWorkload<ClL2NormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000263}
264
265std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
266 const WorkloadInfo& info) const
267{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100268 return MakeWorkload<ClConstantWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000269}
270
271std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
272 const WorkloadInfo& info) const
273{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100274 return MakeWorkload<ClReshapeWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000275}
276
277std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
278 const WorkloadInfo& info) const
279{
arovir019e53a352018-08-31 15:26:35 +0100280 return MakeWorkload<ClFloorFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000281}
282
telsoa01c577f2c2018-08-31 09:22:23 +0100283std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
284 const WorkloadInfo& info) const
285{
arovir019e53a352018-08-31 15:26:35 +0100286 return MakeWorkload<ClLstmFloatWorkload, NullWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100287}
288
289std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
290 const ConvertFp16ToFp32QueueDescriptor& descriptor,
291 const WorkloadInfo& info) const
292{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100293 return MakeWorkload<ClConvertFp16ToFp32Workload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100294}
295
296std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
297 const ConvertFp32ToFp16QueueDescriptor& descriptor,
298 const WorkloadInfo& info) const
299{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100300 return MakeWorkload<ClConvertFp32ToFp16Workload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100301}
302
narpra01a6bf9122018-09-10 09:50:09 +0100303std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
304 const WorkloadInfo& info) const
305{
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100306 return std::make_unique<ClMeanWorkload>(descriptor, info);
narpra01a6bf9122018-09-10 09:50:09 +0100307}
308
jimfly012c9322a2018-09-19 10:59:49 +0100309std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
310 const WorkloadInfo& info) const
311{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100312 return MakeWorkload<ClPadWorkload>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100313}
314
surmeh013537c2c2018-05-18 16:31:43 +0100315void ClWorkloadFactory::Finalize()
316{
317 m_MemoryManager.Finalize();
318}
319
telsoa01c577f2c2018-08-31 09:22:23 +0100320void ClWorkloadFactory::Release()
321{
322 m_MemoryManager.Release();
323}
324
325void ClWorkloadFactory::Acquire()
326{
327 m_MemoryManager.Acquire();
328}
329
telsoa014fcda012018-03-09 14:13:49 +0000330#else // #if ARMCOMPUTECL_ENABLED
331
surmeh013537c2c2018-05-18 16:31:43 +0100332ClWorkloadFactory::ClWorkloadFactory()
surmeh01bceff2f2018-03-29 16:29:27 +0100333{
telsoa014fcda012018-03-09 14:13:49 +0000334}
335
336std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
337{
338 return nullptr;
339}
340
Francis Murtagh351d13d2018-09-24 15:01:18 +0100341std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
342 DataLayout dataLayout) const
343{
344 return nullptr;
345}
346
telsoa014fcda012018-03-09 14:13:49 +0000347std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
348 TensorShape const& subTensorShape,
349 unsigned int const* subTensorOrigin) const
350{
351 return nullptr;
352}
353
354std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
355 const WorkloadInfo& info) const
356{
357 return nullptr;
358}
359
360std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
361 const WorkloadInfo& info) const
362{
363 return nullptr;
364}
365
366std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
367 const WorkloadInfo& info) const
368{
369 return nullptr;
370}
371
372std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
373 const WorkloadInfo& info) const
374{
375 return nullptr;
376}
377
378std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
379 const WorkloadInfo& info) const
380{
381 return nullptr;
382}
383
384std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
385 const WorkloadInfo& info) const
386{
387 return nullptr;
388}
389
390std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
391 const WorkloadInfo& info) const
392{
393 return nullptr;
394}
395
396std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
397 const WorkloadInfo& info) const
398{
399 return nullptr;
400}
401
402std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
403 const WorkloadInfo& info) const
404{
405 return nullptr;
406}
407
408std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
409 const WorkloadInfo& info) const
410{
411 return nullptr;
412}
413
414std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
415 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
416{
417 return nullptr;
418}
419
420std::unique_ptr<IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
421 const WorkloadInfo& info) const
422{
423 return nullptr;
424}
425
426std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
427 const WorkloadInfo& info) const
428{
429 return nullptr;
430}
431
432std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
433 const WorkloadInfo& info) const
434{
435 return nullptr;
436}
437
438std::unique_ptr<IWorkload> ClWorkloadFactory::CreateBatchNormalization(
439 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
440{
441 return nullptr;
442}
443
444std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
445 const WorkloadInfo& info) const
446{
447 return nullptr;
448}
449
450std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
451 const WorkloadInfo& info) const
452{
453 return nullptr;
454}
455
456std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor,
457 const WorkloadInfo& info) const
458{
459 return nullptr;
460}
461
462std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
463 const WorkloadInfo& info) const
464{
465 return nullptr;
466}
467
468std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
469 const WorkloadInfo& info) const
470{
471 return nullptr;
472}
473
474std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
475 const WorkloadInfo& info) const
476{
477 return nullptr;
478}
479
480std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
481 const WorkloadInfo& info) const
482{
483 return nullptr;
484}
485
telsoa01c577f2c2018-08-31 09:22:23 +0100486std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
487 const WorkloadInfo& info) const
488{
489 return nullptr;
490}
491
492std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
493 const ConvertFp16ToFp32QueueDescriptor& descriptor,
494 const WorkloadInfo& info) const
495{
496 return nullptr;
497}
498
499std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
500 const ConvertFp32ToFp16QueueDescriptor& descriptor,
501 const WorkloadInfo& info) const
502{
503 return nullptr;
504}
505
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100506std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
507 const WorkloadInfo& info) const
508{
509 return nullptr;
510}
511
David Beckc2044fe2018-09-05 15:00:38 +0100512std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
513 const WorkloadInfo& info) const
514{
515 return nullptr;
516}
517
narpra01a6bf9122018-09-10 09:50:09 +0100518std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
519 const WorkloadInfo& info) const
520{
521 return nullptr;
522}
523
jimfly012c9322a2018-09-19 10:59:49 +0100524std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
525 const WorkloadInfo& info) const
526{
527 return nullptr;
528}
529
surmeh013537c2c2018-05-18 16:31:43 +0100530void ClWorkloadFactory::Finalize()
531{
532}
533
telsoa01c577f2c2018-08-31 09:22:23 +0100534void ClWorkloadFactory::Release()
535{
536}
537
538void ClWorkloadFactory::Acquire()
539{
540}
541
telsoa014fcda012018-03-09 14:13:49 +0000542#endif // #if ARMCOMPUTECL_ENABLED
543
telsoa014fcda012018-03-09 14:13:49 +0000544} // namespace armnn