blob: 81d088b5aadef09aa52dfbb61b5b2ab2134f79c5 [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 "NeonWorkloadFactory.hpp"
David Beck79141b92018-10-23 16:09:36 +01006#include "NeonBackendId.hpp"
David Beck0dbe0ee2018-09-24 15:59:27 +01007#include <armnn/Utils.hpp>
8#include <backends/CpuTensorHandle.hpp>
9#include <Layer.hpp>
telsoa014fcda012018-03-09 14:13:49 +000010
11#ifdef ARMCOMPUTENEON_ENABLED
David Beck0dbe0ee2018-09-24 15:59:27 +010012#include <arm_compute/runtime/Allocator.h>
telsoa01c577f2c2018-08-31 09:22:23 +010013
David Beck0dbe0ee2018-09-24 15:59:27 +010014#include <backends/MemCopyWorkload.hpp>
telsoa014fcda012018-03-09 14:13:49 +000015#include "NeonTensorHandle.hpp"
David Beck0dbe0ee2018-09-24 15:59:27 +010016#include "workloads/NeonWorkloadUtils.hpp"
17#include "workloads/NeonWorkloads.hpp"
telsoa01c577f2c2018-08-31 09:22:23 +010018
Aron Virginas-Tarf9aeef02018-10-12 15:18:03 +010019#include <backends/aclCommon/memory/IPoolManager.hpp>
telsoa014fcda012018-03-09 14:13:49 +000020#endif
21
David Beck0dbe0ee2018-09-24 15:59:27 +010022#include <backends/MakeWorkloadHelper.hpp>
telsoa014fcda012018-03-09 14:13:49 +000023
24#include <boost/polymorphic_cast.hpp>
25
26namespace armnn
27{
28
David Beck79141b92018-10-23 16:09:36 +010029namespace
30{
31static const BackendId s_Id{NeonBackendId()};
32}
33
David Beck29c75de2018-10-23 13:35:58 +010034bool NeonWorkloadFactory::IsLayerSupported(const Layer& layer,
35 Optional<DataType> dataType,
telsoa01c577f2c2018-08-31 09:22:23 +010036 std::string& outReasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +000037{
David Beck79141b92018-10-23 16:09:36 +010038 return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
39}
40
41const BackendId& NeonWorkloadFactory::GetBackendId() const
42{
43 return s_Id;
telsoa014fcda012018-03-09 14:13:49 +000044}
45
46#ifdef ARMCOMPUTENEON_ENABLED
47
surmeh013537c2c2018-05-18 16:31:43 +010048NeonWorkloadFactory::NeonWorkloadFactory()
telsoa01c577f2c2018-08-31 09:22:23 +010049 : m_MemoryManager(std::make_unique<arm_compute::Allocator>(), BaseMemoryManager::MemoryAffinity::Offset)
surmeh013537c2c2018-05-18 16:31:43 +010050{
51}
52
telsoa014fcda012018-03-09 14:13:49 +000053std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
54 TensorShape const& subTensorShape,
55 unsigned int const* subTensorOrigin) const
56{
57 BOOST_ASSERT(parent.GetType() == ITensorHandle::Neon);
58
59 const arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
60
61 arm_compute::Coordinates coords;
62 coords.set_num_dimensions(subTensorShape.GetNumDimensions());
63 for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++)
64 {
telsoa01c577f2c2018-08-31 09:22:23 +010065 // Arm compute indexes tensor coords in reverse order.
telsoa014fcda012018-03-09 14:13:49 +000066 unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
67 coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex]));
68 }
69
telsoa01c577f2c2018-08-31 09:22:23 +010070 return std::make_unique<NeonSubTensorHandle>(
71 boost::polymorphic_downcast<INeonTensorHandle*>(&parent), shape, coords);
telsoa014fcda012018-03-09 14:13:49 +000072}
73
74std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
75{
telsoa01c577f2c2018-08-31 09:22:23 +010076 auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo);
77 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
78
79 return tensorHandle;
telsoa014fcda012018-03-09 14:13:49 +000080}
81
Francis Murtagh351d13d2018-09-24 15:01:18 +010082std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
83 DataLayout dataLayout) const
84{
85 auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo, dataLayout);
86 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
87
88 return tensorHandle;
89}
90
telsoa014fcda012018-03-09 14:13:49 +000091std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
92 const WorkloadInfo& info) const
93{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +010094 return MakeWorkloadHelper<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +000095}
96
97std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
98 const WorkloadInfo& info) const
99{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100100 return MakeWorkloadHelper<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000101}
102
103std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
104 const WorkloadInfo& info) const
105{
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +0100106 return std::make_unique<NeonActivationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000107}
108
109std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
110 const WorkloadInfo& info) const
111{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100112 return MakeWorkloadHelper<NeonSoftmaxFloatWorkload, NeonSoftmaxUint8Workload>(descriptor, info,
113 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000114}
115
116std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
117 const WorkloadInfo& info) const
118{
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100119 return std::make_unique<NeonSplitterWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000120}
121
122std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
123 const WorkloadInfo& info) const
124{
Nattapat Chaimanowongf3eb46d2018-10-12 13:54:09 +0100125 return std::make_unique<NeonMergerWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000126}
127
128std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateFullyConnected(
129 const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
130{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100131 return MakeWorkloadHelper<NeonFullyConnectedWorkload, NeonFullyConnectedWorkload>(descriptor, info,
132 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000133}
134
135std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
136 const WorkloadInfo& info) const
137{
Nattapat Chaimanowong1d320062018-10-12 14:14:44 +0100138 return std::make_unique<NeonPermuteWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000139}
140
141std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
142 const WorkloadInfo& info) const
143{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100144 return std::make_unique<NeonPooling2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000145}
146
147std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateConvolution2d(
148 const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
149{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100150 return std::make_unique<NeonConvolution2dWorkload>(descriptor, info,
151 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000152}
153
154std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDepthwiseConvolution2d(
155 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
156{
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100157 return std::make_unique<NeonDepthwiseConvolutionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000158}
159
160std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateNormalization(
161 const NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
162{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100163 return MakeWorkloadHelper<NeonNormalizationFloatWorkload, NullWorkload>(descriptor, info,
164 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000165}
166
167std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
168 const WorkloadInfo& info) const
169{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100170 return MakeWorkloadHelper<NeonAdditionFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000171}
172
173std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMultiplication(
174 const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
175{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100176 return MakeWorkloadHelper<NeonMultiplicationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000177}
178
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100179std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateDivision(
180 const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
181{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100182 return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100183}
184
David Beckc2044fe2018-09-05 15:00:38 +0100185std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateSubtraction(
186 const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const
187{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100188 return MakeWorkloadHelper<NeonSubtractionFloatWorkload, NullWorkload>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100189}
190
telsoa014fcda012018-03-09 14:13:49 +0000191std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateBatchNormalization(
192 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
193{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100194 return MakeWorkloadHelper<NeonBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000195}
196
197std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
198 const WorkloadInfo& info) const
199{
200 if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
201 {
202 throw InvalidArgumentException("NeonWorkloadFactory: Invalid null input for MemCopy workload");
203 }
204
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100205 return MakeWorkloadHelper<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000206}
207
208std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateResizeBilinear(
209 const ResizeBilinearQueueDescriptor& descriptor,
210 const WorkloadInfo& info) const
211{
212 return nullptr;
213}
214
215std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFakeQuantization(
216 const FakeQuantizationQueueDescriptor& descriptor,
217 const WorkloadInfo& info) const
218{
219 return nullptr;
220}
221
222std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
223 const WorkloadInfo& info) const
224{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100225 return MakeWorkloadHelper<NeonL2NormalizationFloatWorkload, NullWorkload>(descriptor, info,
226 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000227}
228
229std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
230 const WorkloadInfo& info) const
231{
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +0100232 return std::make_unique<NeonConstantWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000233}
234
235std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
236 const WorkloadInfo& info) const
237{
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100238 return std::make_unique<NeonReshapeWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000239}
240
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000241std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
242 const WorkloadInfo& info) const
243{
244 return nullptr;
245}
246
telsoa014fcda012018-03-09 14:13:49 +0000247std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
248 const WorkloadInfo& info) const
249{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100250 return MakeWorkloadHelper<NeonFloorFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000251}
252
telsoa01c577f2c2018-08-31 09:22:23 +0100253std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
254 const WorkloadInfo& info) const
255{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100256 return MakeWorkloadHelper<NeonLstmFloatWorkload, NullWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100257}
258
259std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp16ToFp32(
260 const ConvertFp16ToFp32QueueDescriptor& descriptor,
261 const WorkloadInfo& info) const
262{
263 return std::make_unique<NeonConvertFp16ToFp32Workload>(descriptor, info);
264}
265
266std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp32ToFp16(
267 const ConvertFp32ToFp16QueueDescriptor& descriptor,
268 const WorkloadInfo& info) const
269{
270 return std::make_unique<NeonConvertFp32ToFp16Workload>(descriptor, info);
271}
272
narpra01a6bf9122018-09-10 09:50:09 +0100273std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
274 const WorkloadInfo& info) const
275{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100276 return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
narpra01a6bf9122018-09-10 09:50:09 +0100277}
278
jimfly012c9322a2018-09-19 10:59:49 +0100279std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
280 const WorkloadInfo& info) const
281{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100282 return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100283}
284
surmeh013537c2c2018-05-18 16:31:43 +0100285void NeonWorkloadFactory::Finalize()
286{
287 m_MemoryManager.Finalize();
288}
289
telsoa01c577f2c2018-08-31 09:22:23 +0100290void NeonWorkloadFactory::Release()
291{
292 m_MemoryManager.Release();
293}
294
295void NeonWorkloadFactory::Acquire()
296{
297 m_MemoryManager.Acquire();
298}
299
telsoa014fcda012018-03-09 14:13:49 +0000300#else // Compiled without ArmCompute libs
301
surmeh013537c2c2018-05-18 16:31:43 +0100302NeonWorkloadFactory::NeonWorkloadFactory()
303{
304}
305
telsoa014fcda012018-03-09 14:13:49 +0000306std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
307 TensorShape const& subTensorShape,
308 unsigned int const* subTensorOrigin) const
309{
310 return nullptr;
311}
312
313std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
314{
315 return nullptr;
316}
317
Francis Murtagh351d13d2018-09-24 15:01:18 +0100318std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
319 DataLayout dataLayout) const
320{
321 return nullptr;
322}
323
telsoa014fcda012018-03-09 14:13:49 +0000324std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
325 const WorkloadInfo& info) const
326{
327 return nullptr;
328}
329
330std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
331 const WorkloadInfo& info) const
332{
333 return nullptr;
334}
335
336std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
337 const WorkloadInfo& info) const
338{
339 return nullptr;
340}
341
342std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
343 const WorkloadInfo& info) const
344{
345 return nullptr;
346}
347
348std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
349 const WorkloadInfo& info) const
350{
351 return nullptr;
352}
353
354std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
355 const WorkloadInfo& info) const
356{
357 return nullptr;
358}
359
360std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
361 const WorkloadInfo& info) const
362{
363 return nullptr;
364}
365
366std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
367 const WorkloadInfo& info) const
368{
369 return nullptr;
370}
371
372std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
373 const WorkloadInfo& info) const
374{
375 return nullptr;
376}
377
378std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
379 const WorkloadInfo& info) const
380{
381 return nullptr;
382}
383
384std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDepthwiseConvolution2d(
385 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
386{
387 return nullptr;
388}
389
390std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
391 const WorkloadInfo& info) const
392{
393 return nullptr;
394}
395
396std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
397 const WorkloadInfo& info) const
398{
399 return nullptr;
400}
401
402std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateBatchNormalization(const BatchNormalizationQueueDescriptor& data,
403 const WorkloadInfo& info) const
404{
405 return nullptr;
406}
407
408std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& data,
409 const WorkloadInfo& info) const
410{
411 return nullptr;
412}
413
414std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
415 const WorkloadInfo& info) const
416{
417 return nullptr;
418}
419
420std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
421 const WorkloadInfo& info) const
422{
423 return nullptr;
424}
425
426std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFakeQuantization(
427 const FakeQuantizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
428{
429 return nullptr;
430}
431
432std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
433 const WorkloadInfo& info) const
434{
435 return nullptr;
436}
437
438std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
439 const WorkloadInfo& info) const
440{
441 return nullptr;
442}
443
444std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
445 const WorkloadInfo& info) const
446{
447 return nullptr;
448}
449
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000450std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
451 const WorkloadInfo& info) const
452{
453 return nullptr;
454}
455
telsoa014fcda012018-03-09 14:13:49 +0000456std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
457 const WorkloadInfo& info) const
458{
459 return nullptr;
460}
461
telsoa01c577f2c2018-08-31 09:22:23 +0100462std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
463 const WorkloadInfo& info) const
464{
465 return nullptr;
466}
467
468std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp16ToFp32(
469 const ConvertFp16ToFp32QueueDescriptor& descriptor,
470 const WorkloadInfo& info) const
471{
472 return nullptr;
473}
474
475std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp32ToFp16(
476 const ConvertFp32ToFp16QueueDescriptor& descriptor,
477 const WorkloadInfo& info) const
478{
479 return nullptr;
480}
481
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100482std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& data,
483 const WorkloadInfo& info) const
484{
485 return nullptr;
486}
487
David Beckc2044fe2018-09-05 15:00:38 +0100488std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& data,
489 const WorkloadInfo& info) const
490{
491 return nullptr;
492}
493
narpra01a6bf9122018-09-10 09:50:09 +0100494std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
495 const WorkloadInfo& info) const
496{
497 return nullptr;
498}
499
jimfly012c9322a2018-09-19 10:59:49 +0100500std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
501 const WorkloadInfo& info) const
502{
503 return nullptr;
504}
505
surmeh013537c2c2018-05-18 16:31:43 +0100506void NeonWorkloadFactory::Finalize()
507{}
508
telsoa01c577f2c2018-08-31 09:22:23 +0100509void NeonWorkloadFactory::Release()
510{}
511
512void NeonWorkloadFactory::Acquire()
513{}
514
telsoa014fcda012018-03-09 14:13:49 +0000515#endif
516
517} //namespace armnn