blob: eece934ea33beb0d0dca1f8841df5489f01ef5a6 [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>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <backendsCommon/CpuTensorHandle.hpp>
David Beck0dbe0ee2018-09-24 15:59:27 +010013#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
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000020#include <backendsCommon/MemCopyWorkload.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +010021
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000022#include <cl/ClTensorHandle.hpp>
23#include <cl/workloads/ClWorkloads.hpp>
24#include <cl/workloads/ClWorkloadUtils.hpp>
telsoa014fcda012018-03-09 14:13:49 +000025#endif
26
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000027#include <backendsCommon/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
David Beck79141b92018-10-23 16:09:36 +010036namespace
37{
38static const BackendId s_Id{ClBackendId()};
39}
40
telsoa01c577f2c2018-08-31 09:22:23 +010041bool ClWorkloadFactory::IsLayerSupported(const Layer& layer,
David Beck29c75de2018-10-23 13:35:58 +010042 Optional<DataType> dataType,
telsoa01c577f2c2018-08-31 09:22:23 +010043 std::string& outReasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +000044{
David Beck79141b92018-10-23 16:09:36 +010045 return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
46}
47
48const BackendId& ClWorkloadFactory::GetBackendId() const
49{
50 return s_Id;
telsoa014fcda012018-03-09 14:13:49 +000051}
52
53#ifdef ARMCOMPUTECL_ENABLED
54
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +010055template <typename FloatWorkload, typename Uint8Workload, typename QueueDescriptorType, typename... Args>
56std::unique_ptr<IWorkload> ClWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
57 const WorkloadInfo& info,
58 Args&&... args)
59{
60 try
61 {
62 return MakeWorkloadHelper<FloatWorkload, Uint8Workload>(descriptor, info, std::forward<Args>(args)...);
63 }
64 catch (const cl::Error& clError)
65 {
66 throw WrapClError(clError, CHECK_LOCATION());
67 }
68}
69
70template <typename Workload, typename QueueDescriptorType, typename... Args>
71std::unique_ptr<IWorkload> ClWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
72 const WorkloadInfo& info,
73 Args&&... args)
74{
75 try
76 {
77 return std::make_unique<Workload>(descriptor, info, std::forward<Args>(args)...);
78 }
79 catch (const cl::Error& clError)
80 {
81 throw WrapClError(clError, CHECK_LOCATION());
82 }
83}
84
surmeh013537c2c2018-05-18 16:31:43 +010085ClWorkloadFactory::ClWorkloadFactory()
86: m_MemoryManager(std::make_unique<arm_compute::CLBufferAllocator>())
telsoa014fcda012018-03-09 14:13:49 +000087{
telsoa014fcda012018-03-09 14:13:49 +000088}
89
90std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
91{
telsoa01c577f2c2018-08-31 09:22:23 +010092 std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo);
93 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
94
95 return tensorHandle;
telsoa014fcda012018-03-09 14:13:49 +000096}
97
Francis Murtagh351d13d2018-09-24 15:01:18 +010098std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
99 DataLayout dataLayout) const
100{
101 std::unique_ptr<ClTensorHandle> tensorHandle = std::make_unique<ClTensorHandle>(tensorInfo, dataLayout);
102 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
103
104 return tensorHandle;
105}
106
telsoa014fcda012018-03-09 14:13:49 +0000107std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
108 TensorShape const& subTensorShape,
109 unsigned int const* subTensorOrigin) const
110{
telsoa014fcda012018-03-09 14:13:49 +0000111 arm_compute::Coordinates coords;
112 arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
113
114 coords.set_num_dimensions(subTensorShape.GetNumDimensions());
115 for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++)
116 {
telsoa01c577f2c2018-08-31 09:22:23 +0100117 // Arm compute indexes tensor coords in reverse order.
telsoa014fcda012018-03-09 14:13:49 +0000118 unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
119 coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex]));
120 }
121
telsoa01c577f2c2018-08-31 09:22:23 +0100122 return std::make_unique<ClSubTensorHandle>(
123 boost::polymorphic_downcast<IClTensorHandle*>(&parent), shape, coords);
telsoa014fcda012018-03-09 14:13:49 +0000124}
125
126std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
127 const WorkloadInfo& info) const
128{
telsoa01c577f2c2018-08-31 09:22:23 +0100129 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000130}
131
132std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
133 const WorkloadInfo& info) const
134{
telsoa01c577f2c2018-08-31 09:22:23 +0100135 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000136}
137
138std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
139 const WorkloadInfo& info) const
140{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100141 return MakeWorkload<ClActivationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000142}
143
144std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
145 const WorkloadInfo& info) const
146{
arovir019e53a352018-08-31 15:26:35 +0100147 return MakeWorkload<ClSoftmaxFloatWorkload, ClSoftmaxUint8Workload>(descriptor, info,
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100148 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000149}
150
151std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
152 const WorkloadInfo& info) const
153{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100154 return MakeWorkload<ClSplitterWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000155}
156
157std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
158 const WorkloadInfo& info) const
159{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100160 return MakeWorkload<ClMergerWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000161}
162
163std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateFullyConnected(
164 const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
165{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100166 return MakeWorkload<ClFullyConnectedWorkload, ClFullyConnectedWorkload>(descriptor, info,
167 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000168}
169
170std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
171 const WorkloadInfo& info) const
172{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100173 return MakeWorkload<ClPermuteWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000174}
175
176std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
177 const WorkloadInfo& info) const
178{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100179 return MakeWorkload<ClPooling2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000180}
181
182std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
183 const WorkloadInfo& info) const
184{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100185 return MakeWorkload<ClConvolution2dWorkload>(descriptor, info, m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000186}
187
188std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
189 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
190{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100191 return MakeWorkload<ClDepthwiseConvolutionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000192}
193
194std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
195 const WorkloadInfo& info) const
196{
arovir019e53a352018-08-31 15:26:35 +0100197 return MakeWorkload<ClNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000198}
199
200std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
201 const WorkloadInfo& info) const
202{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100203 return MakeWorkload<ClAdditionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000204}
205
206std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMultiplication(
207 const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
208{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100209 return MakeWorkload<ClMultiplicationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000210}
211
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100212std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateDivision(
213 const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
214{
215 return MakeWorkload<ClDivisionFloatWorkload, NullWorkload>(descriptor, info);
216}
217
David Beckc2044fe2018-09-05 15:00:38 +0100218std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
219 const WorkloadInfo& info) const
220{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100221 return MakeWorkload<ClSubtractionWorkload>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100222}
223
telsoa014fcda012018-03-09 14:13:49 +0000224std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateBatchNormalization(
225 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
226{
arovir019e53a352018-08-31 15:26:35 +0100227 return MakeWorkload<ClBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000228}
229
230std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
231 const WorkloadInfo& info) const
232{
233 if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
234 {
235 throw InvalidArgumentException("ClWorkloadFactory: Invalid null input for MemCopy workload");
236 }
237
telsoa01c577f2c2018-08-31 09:22:23 +0100238 return MakeWorkload<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000239}
240
241std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreateResizeBilinear(
242 const ResizeBilinearQueueDescriptor& descriptor,
243 const WorkloadInfo& info) const
244{
arovir019e53a352018-08-31 15:26:35 +0100245 return MakeWorkload<ClResizeBilinearFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000246}
247
248std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(
249 const FakeQuantizationQueueDescriptor& descriptor,
250 const WorkloadInfo& info) const
251{
252 return nullptr;
253}
254
255std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
256 const WorkloadInfo& info) const
257{
arovir019e53a352018-08-31 15:26:35 +0100258 return MakeWorkload<ClL2NormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000259}
260
261std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
262 const WorkloadInfo& info) const
263{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100264 return MakeWorkload<ClConstantWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000265}
266
267std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
268 const WorkloadInfo& info) const
269{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100270 return MakeWorkload<ClReshapeWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000271}
272
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000273std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
274 const WorkloadInfo& info) const
275{
276 return nullptr;
277}
278
telsoa014fcda012018-03-09 14:13:49 +0000279std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
280 const WorkloadInfo& info) const
281{
arovir019e53a352018-08-31 15:26:35 +0100282 return MakeWorkload<ClFloorFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000283}
284
telsoa01c577f2c2018-08-31 09:22:23 +0100285std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
286 const WorkloadInfo& info) const
287{
arovir019e53a352018-08-31 15:26:35 +0100288 return MakeWorkload<ClLstmFloatWorkload, NullWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100289}
290
291std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
292 const ConvertFp16ToFp32QueueDescriptor& descriptor,
293 const WorkloadInfo& info) const
294{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100295 return MakeWorkload<ClConvertFp16ToFp32Workload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100296}
297
298std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
299 const ConvertFp32ToFp16QueueDescriptor& descriptor,
300 const WorkloadInfo& info) const
301{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100302 return MakeWorkload<ClConvertFp32ToFp16Workload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100303}
304
narpra01a6bf9122018-09-10 09:50:09 +0100305std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
306 const WorkloadInfo& info) const
307{
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100308 return std::make_unique<ClMeanWorkload>(descriptor, info);
narpra01a6bf9122018-09-10 09:50:09 +0100309}
310
jimfly012c9322a2018-09-19 10:59:49 +0100311std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
312 const WorkloadInfo& info) const
313{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100314 return MakeWorkload<ClPadWorkload>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100315}
316
telsoa01c577f2c2018-08-31 09:22:23 +0100317void ClWorkloadFactory::Release()
318{
319 m_MemoryManager.Release();
320}
321
322void ClWorkloadFactory::Acquire()
323{
324 m_MemoryManager.Acquire();
325}
326
telsoa014fcda012018-03-09 14:13:49 +0000327#else // #if ARMCOMPUTECL_ENABLED
328
surmeh013537c2c2018-05-18 16:31:43 +0100329ClWorkloadFactory::ClWorkloadFactory()
surmeh01bceff2f2018-03-29 16:29:27 +0100330{
telsoa014fcda012018-03-09 14:13:49 +0000331}
332
333std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
334{
335 return nullptr;
336}
337
Francis Murtagh351d13d2018-09-24 15:01:18 +0100338std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
339 DataLayout dataLayout) const
340{
341 return nullptr;
342}
343
telsoa014fcda012018-03-09 14:13:49 +0000344std::unique_ptr<ITensorHandle> ClWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
345 TensorShape const& subTensorShape,
346 unsigned int const* subTensorOrigin) const
347{
348 return nullptr;
349}
350
351std::unique_ptr<IWorkload> ClWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
352 const WorkloadInfo& info) const
353{
354 return nullptr;
355}
356
357std::unique_ptr<IWorkload> ClWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
358 const WorkloadInfo& info) const
359{
360 return nullptr;
361}
362
363std::unique_ptr<IWorkload> ClWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
364 const WorkloadInfo& info) const
365{
366 return nullptr;
367}
368
369std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
370 const WorkloadInfo& info) const
371{
372 return nullptr;
373}
374
375std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
376 const WorkloadInfo& info) const
377{
378 return nullptr;
379}
380
381std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
382 const WorkloadInfo& info) const
383{
384 return nullptr;
385}
386
387std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
388 const WorkloadInfo& info) const
389{
390 return nullptr;
391}
392
393std::unique_ptr<armnn::IWorkload> ClWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
394 const WorkloadInfo& info) const
395{
396 return nullptr;
397}
398
399std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
400 const WorkloadInfo& info) const
401{
402 return nullptr;
403}
404
405std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
406 const WorkloadInfo& info) const
407{
408 return nullptr;
409}
410
411std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDepthwiseConvolution2d(
412 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
413{
414 return nullptr;
415}
416
417std::unique_ptr<IWorkload> ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
418 const WorkloadInfo& info) const
419{
420 return nullptr;
421}
422
423std::unique_ptr<IWorkload> ClWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
424 const WorkloadInfo& info) const
425{
426 return nullptr;
427}
428
429std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
430 const WorkloadInfo& info) const
431{
432 return nullptr;
433}
434
435std::unique_ptr<IWorkload> ClWorkloadFactory::CreateBatchNormalization(
436 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
437{
438 return nullptr;
439}
440
441std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
442 const WorkloadInfo& info) const
443{
444 return nullptr;
445}
446
447std::unique_ptr<IWorkload> ClWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
448 const WorkloadInfo& info) const
449{
450 return nullptr;
451}
452
453std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFakeQuantization(const FakeQuantizationQueueDescriptor& descriptor,
454 const WorkloadInfo& info) const
455{
456 return nullptr;
457}
458
459std::unique_ptr<IWorkload> ClWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
460 const WorkloadInfo& info) const
461{
462 return nullptr;
463}
464
465std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
466 const WorkloadInfo& info) const
467{
468 return nullptr;
469}
470
471std::unique_ptr<IWorkload> ClWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
472 const WorkloadInfo& info) const
473{
474 return nullptr;
475}
476
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000477std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
478 const WorkloadInfo& info) const
479{
480 return nullptr;
481}
482
telsoa014fcda012018-03-09 14:13:49 +0000483std::unique_ptr<IWorkload> ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
484 const WorkloadInfo& info) const
485{
486 return nullptr;
487}
488
telsoa01c577f2c2018-08-31 09:22:23 +0100489std::unique_ptr<IWorkload> ClWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
490 const WorkloadInfo& info) const
491{
492 return nullptr;
493}
494
495std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp16ToFp32(
496 const ConvertFp16ToFp32QueueDescriptor& descriptor,
497 const WorkloadInfo& info) const
498{
499 return nullptr;
500}
501
502std::unique_ptr<IWorkload> ClWorkloadFactory::CreateConvertFp32ToFp16(
503 const ConvertFp32ToFp16QueueDescriptor& descriptor,
504 const WorkloadInfo& info) const
505{
506 return nullptr;
507}
508
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100509std::unique_ptr<IWorkload> ClWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
510 const WorkloadInfo& info) const
511{
512 return nullptr;
513}
514
David Beckc2044fe2018-09-05 15:00:38 +0100515std::unique_ptr<IWorkload> ClWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
516 const WorkloadInfo& info) const
517{
518 return nullptr;
519}
520
narpra01a6bf9122018-09-10 09:50:09 +0100521std::unique_ptr<IWorkload> ClWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
522 const WorkloadInfo& info) const
523{
524 return nullptr;
525}
526
jimfly012c9322a2018-09-19 10:59:49 +0100527std::unique_ptr<IWorkload> ClWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
528 const WorkloadInfo& info) const
529{
530 return nullptr;
531}
532
telsoa01c577f2c2018-08-31 09:22:23 +0100533void ClWorkloadFactory::Release()
534{
535}
536
537void ClWorkloadFactory::Acquire()
538{
539}
540
telsoa014fcda012018-03-09 14:13:49 +0000541#endif // #if ARMCOMPUTECL_ENABLED
542
telsoa014fcda012018-03-09 14:13:49 +0000543} // namespace armnn