blob: c16d383554fc8aa37631014b1091fec4c236a843 [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
241std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
242 const WorkloadInfo& info) const
243{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100244 return MakeWorkloadHelper<NeonFloorFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000245}
246
telsoa01c577f2c2018-08-31 09:22:23 +0100247std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
248 const WorkloadInfo& info) const
249{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100250 return MakeWorkloadHelper<NeonLstmFloatWorkload, NullWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100251}
252
253std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp16ToFp32(
254 const ConvertFp16ToFp32QueueDescriptor& descriptor,
255 const WorkloadInfo& info) const
256{
257 return std::make_unique<NeonConvertFp16ToFp32Workload>(descriptor, info);
258}
259
260std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp32ToFp16(
261 const ConvertFp32ToFp16QueueDescriptor& descriptor,
262 const WorkloadInfo& info) const
263{
264 return std::make_unique<NeonConvertFp32ToFp16Workload>(descriptor, info);
265}
266
narpra01a6bf9122018-09-10 09:50:09 +0100267std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
268 const WorkloadInfo& info) const
269{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100270 return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
narpra01a6bf9122018-09-10 09:50:09 +0100271}
272
jimfly012c9322a2018-09-19 10:59:49 +0100273std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
274 const WorkloadInfo& info) const
275{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100276 return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100277}
278
surmeh013537c2c2018-05-18 16:31:43 +0100279void NeonWorkloadFactory::Finalize()
280{
281 m_MemoryManager.Finalize();
282}
283
telsoa01c577f2c2018-08-31 09:22:23 +0100284void NeonWorkloadFactory::Release()
285{
286 m_MemoryManager.Release();
287}
288
289void NeonWorkloadFactory::Acquire()
290{
291 m_MemoryManager.Acquire();
292}
293
telsoa014fcda012018-03-09 14:13:49 +0000294#else // Compiled without ArmCompute libs
295
surmeh013537c2c2018-05-18 16:31:43 +0100296NeonWorkloadFactory::NeonWorkloadFactory()
297{
298}
299
telsoa014fcda012018-03-09 14:13:49 +0000300std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
301 TensorShape const& subTensorShape,
302 unsigned int const* subTensorOrigin) const
303{
304 return nullptr;
305}
306
307std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
308{
309 return nullptr;
310}
311
Francis Murtagh351d13d2018-09-24 15:01:18 +0100312std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
313 DataLayout dataLayout) const
314{
315 return nullptr;
316}
317
telsoa014fcda012018-03-09 14:13:49 +0000318std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
319 const WorkloadInfo& info) const
320{
321 return nullptr;
322}
323
324std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
325 const WorkloadInfo& info) const
326{
327 return nullptr;
328}
329
330std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
331 const WorkloadInfo& info) const
332{
333 return nullptr;
334}
335
336std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
337 const WorkloadInfo& info) const
338{
339 return nullptr;
340}
341
342std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
343 const WorkloadInfo& info) const
344{
345 return nullptr;
346}
347
348std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
349 const WorkloadInfo& info) const
350{
351 return nullptr;
352}
353
354std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
355 const WorkloadInfo& info) const
356{
357 return nullptr;
358}
359
360std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
361 const WorkloadInfo& info) const
362{
363 return nullptr;
364}
365
366std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
367 const WorkloadInfo& info) const
368{
369 return nullptr;
370}
371
372std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
373 const WorkloadInfo& info) const
374{
375 return nullptr;
376}
377
378std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDepthwiseConvolution2d(
379 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
380{
381 return nullptr;
382}
383
384std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
385 const WorkloadInfo& info) const
386{
387 return nullptr;
388}
389
390std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
391 const WorkloadInfo& info) const
392{
393 return nullptr;
394}
395
396std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateBatchNormalization(const BatchNormalizationQueueDescriptor& data,
397 const WorkloadInfo& info) const
398{
399 return nullptr;
400}
401
402std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& data,
403 const WorkloadInfo& info) const
404{
405 return nullptr;
406}
407
408std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
409 const WorkloadInfo& info) const
410{
411 return nullptr;
412}
413
414std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
415 const WorkloadInfo& info) const
416{
417 return nullptr;
418}
419
420std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFakeQuantization(
421 const FakeQuantizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
422{
423 return nullptr;
424}
425
426std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
427 const WorkloadInfo& info) const
428{
429 return nullptr;
430}
431
432std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
433 const WorkloadInfo& info) const
434{
435 return nullptr;
436}
437
438std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
439 const WorkloadInfo& info) const
440{
441 return nullptr;
442}
443
444std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
445 const WorkloadInfo& info) const
446{
447 return nullptr;
448}
449
telsoa01c577f2c2018-08-31 09:22:23 +0100450std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
451 const WorkloadInfo& info) const
452{
453 return nullptr;
454}
455
456std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp16ToFp32(
457 const ConvertFp16ToFp32QueueDescriptor& descriptor,
458 const WorkloadInfo& info) const
459{
460 return nullptr;
461}
462
463std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp32ToFp16(
464 const ConvertFp32ToFp16QueueDescriptor& descriptor,
465 const WorkloadInfo& info) const
466{
467 return nullptr;
468}
469
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100470std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& data,
471 const WorkloadInfo& info) const
472{
473 return nullptr;
474}
475
David Beckc2044fe2018-09-05 15:00:38 +0100476std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& data,
477 const WorkloadInfo& info) const
478{
479 return nullptr;
480}
481
narpra01a6bf9122018-09-10 09:50:09 +0100482std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
483 const WorkloadInfo& info) const
484{
485 return nullptr;
486}
487
jimfly012c9322a2018-09-19 10:59:49 +0100488std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
489 const WorkloadInfo& info) const
490{
491 return nullptr;
492}
493
surmeh013537c2c2018-05-18 16:31:43 +0100494void NeonWorkloadFactory::Finalize()
495{}
496
telsoa01c577f2c2018-08-31 09:22:23 +0100497void NeonWorkloadFactory::Release()
498{}
499
500void NeonWorkloadFactory::Acquire()
501{}
502
telsoa014fcda012018-03-09 14:13:49 +0000503#endif
504
505} //namespace armnn