blob: 0e069a2f648658e192018e7087f5dc1f6f591133 [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 Beck0dbe0ee2018-09-24 15:59:27 +01006#include <armnn/Utils.hpp>
7#include <backends/CpuTensorHandle.hpp>
8#include <Layer.hpp>
telsoa014fcda012018-03-09 14:13:49 +00009
10#ifdef ARMCOMPUTENEON_ENABLED
David Beck0dbe0ee2018-09-24 15:59:27 +010011#include <arm_compute/runtime/Allocator.h>
telsoa01c577f2c2018-08-31 09:22:23 +010012
David Beck0dbe0ee2018-09-24 15:59:27 +010013#include <backends/MemCopyWorkload.hpp>
telsoa014fcda012018-03-09 14:13:49 +000014#include "NeonTensorHandle.hpp"
David Beck0dbe0ee2018-09-24 15:59:27 +010015#include "workloads/NeonWorkloadUtils.hpp"
16#include "workloads/NeonWorkloads.hpp"
telsoa01c577f2c2018-08-31 09:22:23 +010017
Aron Virginas-Tarf9aeef02018-10-12 15:18:03 +010018#include <backends/aclCommon/memory/IPoolManager.hpp>
telsoa014fcda012018-03-09 14:13:49 +000019#endif
20
David Beck0dbe0ee2018-09-24 15:59:27 +010021#include <backends/MakeWorkloadHelper.hpp>
telsoa014fcda012018-03-09 14:13:49 +000022
23#include <boost/polymorphic_cast.hpp>
24
25namespace armnn
26{
27
telsoa01c577f2c2018-08-31 09:22:23 +010028bool NeonWorkloadFactory::IsLayerSupported(const Layer& layer, boost::optional<DataType> dataType,
29 std::string& outReasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +000030{
31 return IWorkloadFactory::IsLayerSupported(Compute::CpuAcc, layer, dataType, outReasonIfUnsupported);
32}
33
34#ifdef ARMCOMPUTENEON_ENABLED
35
surmeh013537c2c2018-05-18 16:31:43 +010036NeonWorkloadFactory::NeonWorkloadFactory()
telsoa01c577f2c2018-08-31 09:22:23 +010037 : m_MemoryManager(std::make_unique<arm_compute::Allocator>(), BaseMemoryManager::MemoryAffinity::Offset)
surmeh013537c2c2018-05-18 16:31:43 +010038{
39}
40
telsoa014fcda012018-03-09 14:13:49 +000041std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
42 TensorShape const& subTensorShape,
43 unsigned int const* subTensorOrigin) const
44{
45 BOOST_ASSERT(parent.GetType() == ITensorHandle::Neon);
46
47 const arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
48
49 arm_compute::Coordinates coords;
50 coords.set_num_dimensions(subTensorShape.GetNumDimensions());
51 for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++)
52 {
telsoa01c577f2c2018-08-31 09:22:23 +010053 // Arm compute indexes tensor coords in reverse order.
telsoa014fcda012018-03-09 14:13:49 +000054 unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
55 coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex]));
56 }
57
telsoa01c577f2c2018-08-31 09:22:23 +010058 return std::make_unique<NeonSubTensorHandle>(
59 boost::polymorphic_downcast<INeonTensorHandle*>(&parent), shape, coords);
telsoa014fcda012018-03-09 14:13:49 +000060}
61
62std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
63{
telsoa01c577f2c2018-08-31 09:22:23 +010064 auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo);
65 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
66
67 return tensorHandle;
telsoa014fcda012018-03-09 14:13:49 +000068}
69
Francis Murtagh351d13d2018-09-24 15:01:18 +010070std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
71 DataLayout dataLayout) const
72{
73 auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo, dataLayout);
74 tensorHandle->SetMemoryGroup(m_MemoryManager.GetInterLayerMemoryGroup());
75
76 return tensorHandle;
77}
78
telsoa014fcda012018-03-09 14:13:49 +000079std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
80 const WorkloadInfo& info) const
81{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +010082 return MakeWorkloadHelper<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +000083}
84
85std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
86 const WorkloadInfo& info) const
87{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +010088 return MakeWorkloadHelper<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +000089}
90
91std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
92 const WorkloadInfo& info) const
93{
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010094 return std::make_unique<NeonActivationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +000095}
96
97std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
98 const WorkloadInfo& info) const
99{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100100 return MakeWorkloadHelper<NeonSoftmaxFloatWorkload, NeonSoftmaxUint8Workload>(descriptor, info,
101 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000102}
103
104std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
105 const WorkloadInfo& info) const
106{
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100107 return std::make_unique<NeonSplitterWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000108}
109
110std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
111 const WorkloadInfo& info) const
112{
Nattapat Chaimanowongf3eb46d2018-10-12 13:54:09 +0100113 return std::make_unique<NeonMergerWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000114}
115
116std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateFullyConnected(
117 const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
118{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100119 return MakeWorkloadHelper<NeonFullyConnectedWorkload, NeonFullyConnectedWorkload>(descriptor, info,
120 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000121}
122
123std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
124 const WorkloadInfo& info) const
125{
Nattapat Chaimanowong1d320062018-10-12 14:14:44 +0100126 return std::make_unique<NeonPermuteWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000127}
128
129std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
130 const WorkloadInfo& info) const
131{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100132 return std::make_unique<NeonPooling2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000133}
134
135std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateConvolution2d(
136 const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
137{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100138 return std::make_unique<NeonConvolution2dWorkload>(descriptor, info,
139 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000140}
141
142std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDepthwiseConvolution2d(
143 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
144{
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100145 return std::make_unique<NeonDepthwiseConvolutionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000146}
147
148std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateNormalization(
149 const NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
150{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100151 return MakeWorkloadHelper<NeonNormalizationFloatWorkload, NullWorkload>(descriptor, info,
152 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000153}
154
155std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
156 const WorkloadInfo& info) const
157{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100158 return MakeWorkloadHelper<NeonAdditionFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000159}
160
161std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMultiplication(
162 const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
163{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100164 return MakeWorkloadHelper<NeonMultiplicationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000165}
166
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100167std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateDivision(
168 const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
169{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100170 return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100171}
172
David Beckc2044fe2018-09-05 15:00:38 +0100173std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateSubtraction(
174 const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const
175{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100176 return MakeWorkloadHelper<NeonSubtractionFloatWorkload, NullWorkload>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100177}
178
telsoa014fcda012018-03-09 14:13:49 +0000179std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateBatchNormalization(
180 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
181{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100182 return MakeWorkloadHelper<NeonBatchNormalizationFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000183}
184
185std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
186 const WorkloadInfo& info) const
187{
188 if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
189 {
190 throw InvalidArgumentException("NeonWorkloadFactory: Invalid null input for MemCopy workload");
191 }
192
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100193 return MakeWorkloadHelper<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000194}
195
196std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateResizeBilinear(
197 const ResizeBilinearQueueDescriptor& descriptor,
198 const WorkloadInfo& info) const
199{
200 return nullptr;
201}
202
203std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFakeQuantization(
204 const FakeQuantizationQueueDescriptor& descriptor,
205 const WorkloadInfo& info) const
206{
207 return nullptr;
208}
209
210std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
211 const WorkloadInfo& info) const
212{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100213 return MakeWorkloadHelper<NeonL2NormalizationFloatWorkload, NullWorkload>(descriptor, info,
214 m_MemoryManager.GetIntraLayerManager());
telsoa014fcda012018-03-09 14:13:49 +0000215}
216
217std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
218 const WorkloadInfo& info) const
219{
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +0100220 return std::make_unique<NeonConstantWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000221}
222
223std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
224 const WorkloadInfo& info) const
225{
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100226 return std::make_unique<NeonReshapeWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000227}
228
229std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
230 const WorkloadInfo& info) const
231{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100232 return MakeWorkloadHelper<NeonFloorFloatWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000233}
234
telsoa01c577f2c2018-08-31 09:22:23 +0100235std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
236 const WorkloadInfo& info) const
237{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100238 return MakeWorkloadHelper<NeonLstmFloatWorkload, NullWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100239}
240
241std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp16ToFp32(
242 const ConvertFp16ToFp32QueueDescriptor& descriptor,
243 const WorkloadInfo& info) const
244{
245 return std::make_unique<NeonConvertFp16ToFp32Workload>(descriptor, info);
246}
247
248std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp32ToFp16(
249 const ConvertFp32ToFp16QueueDescriptor& descriptor,
250 const WorkloadInfo& info) const
251{
252 return std::make_unique<NeonConvertFp32ToFp16Workload>(descriptor, info);
253}
254
narpra01a6bf9122018-09-10 09:50:09 +0100255std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
256 const WorkloadInfo& info) const
257{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100258 return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
narpra01a6bf9122018-09-10 09:50:09 +0100259}
260
jimfly012c9322a2018-09-19 10:59:49 +0100261std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
262 const WorkloadInfo& info) const
263{
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +0100264 return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100265}
266
surmeh013537c2c2018-05-18 16:31:43 +0100267void NeonWorkloadFactory::Finalize()
268{
269 m_MemoryManager.Finalize();
270}
271
telsoa01c577f2c2018-08-31 09:22:23 +0100272void NeonWorkloadFactory::Release()
273{
274 m_MemoryManager.Release();
275}
276
277void NeonWorkloadFactory::Acquire()
278{
279 m_MemoryManager.Acquire();
280}
281
telsoa014fcda012018-03-09 14:13:49 +0000282#else // Compiled without ArmCompute libs
283
surmeh013537c2c2018-05-18 16:31:43 +0100284NeonWorkloadFactory::NeonWorkloadFactory()
285{
286}
287
telsoa014fcda012018-03-09 14:13:49 +0000288std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
289 TensorShape const& subTensorShape,
290 unsigned int const* subTensorOrigin) const
291{
292 return nullptr;
293}
294
295std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
296{
297 return nullptr;
298}
299
Francis Murtagh351d13d2018-09-24 15:01:18 +0100300std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
301 DataLayout dataLayout) const
302{
303 return nullptr;
304}
305
telsoa014fcda012018-03-09 14:13:49 +0000306std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
307 const WorkloadInfo& info) const
308{
309 return nullptr;
310}
311
312std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
313 const WorkloadInfo& info) const
314{
315 return nullptr;
316}
317
318std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
319 const WorkloadInfo& info) const
320{
321 return nullptr;
322}
323
324std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
325 const WorkloadInfo& info) const
326{
327 return nullptr;
328}
329
330std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
331 const WorkloadInfo& info) const
332{
333 return nullptr;
334}
335
336std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
337 const WorkloadInfo& info) const
338{
339 return nullptr;
340}
341
342std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFullyConnected(const FullyConnectedQueueDescriptor& descriptor,
343 const WorkloadInfo& info) const
344{
345 return nullptr;
346}
347
348std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
349 const WorkloadInfo& info) const
350{
351 return nullptr;
352}
353
354std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
355 const WorkloadInfo& info) const
356{
357 return nullptr;
358}
359
360std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
361 const WorkloadInfo& info) const
362{
363 return nullptr;
364}
365
366std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDepthwiseConvolution2d(
367 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
368{
369 return nullptr;
370}
371
372std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
373 const WorkloadInfo& info) const
374{
375 return nullptr;
376}
377
378std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
379 const WorkloadInfo& info) const
380{
381 return nullptr;
382}
383
384std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateBatchNormalization(const BatchNormalizationQueueDescriptor& data,
385 const WorkloadInfo& info) const
386{
387 return nullptr;
388}
389
390std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& data,
391 const WorkloadInfo& info) const
392{
393 return nullptr;
394}
395
396std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
397 const WorkloadInfo& info) const
398{
399 return nullptr;
400}
401
402std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
403 const WorkloadInfo& info) const
404{
405 return nullptr;
406}
407
408std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFakeQuantization(
409 const FakeQuantizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
410{
411 return nullptr;
412}
413
414std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
415 const WorkloadInfo& info) const
416{
417 return nullptr;
418}
419
420std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
421 const WorkloadInfo& info) const
422{
423 return nullptr;
424}
425
426std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
427 const WorkloadInfo& info) const
428{
429 return nullptr;
430}
431
432std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
433 const WorkloadInfo& info) const
434{
435 return nullptr;
436}
437
telsoa01c577f2c2018-08-31 09:22:23 +0100438std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
439 const WorkloadInfo& info) const
440{
441 return nullptr;
442}
443
444std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp16ToFp32(
445 const ConvertFp16ToFp32QueueDescriptor& descriptor,
446 const WorkloadInfo& info) const
447{
448 return nullptr;
449}
450
451std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConvertFp32ToFp16(
452 const ConvertFp32ToFp16QueueDescriptor& descriptor,
453 const WorkloadInfo& info) const
454{
455 return nullptr;
456}
457
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100458std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& data,
459 const WorkloadInfo& info) const
460{
461 return nullptr;
462}
463
David Beckc2044fe2018-09-05 15:00:38 +0100464std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& data,
465 const WorkloadInfo& info) const
466{
467 return nullptr;
468}
469
narpra01a6bf9122018-09-10 09:50:09 +0100470std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
471 const WorkloadInfo& info) const
472{
473 return nullptr;
474}
475
jimfly012c9322a2018-09-19 10:59:49 +0100476std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
477 const WorkloadInfo& info) const
478{
479 return nullptr;
480}
481
surmeh013537c2c2018-05-18 16:31:43 +0100482void NeonWorkloadFactory::Finalize()
483{}
484
telsoa01c577f2c2018-08-31 09:22:23 +0100485void NeonWorkloadFactory::Release()
486{}
487
488void NeonWorkloadFactory::Acquire()
489{}
490
telsoa014fcda012018-03-09 14:13:49 +0000491#endif
492
493} //namespace armnn