blob: dc97356d57fdc378c798f897fe9e9ed74761fd6a [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//
Matthew Bentham4cefc412019-06-18 16:14:34 +01005#include <Layer.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00006#include <backendsCommon/CpuTensorHandle.hpp>
7#include <backendsCommon/MemCopyWorkload.hpp>
Derek Lambertif674aa02019-08-01 15:56:25 +01008#include <backendsCommon/MemImportWorkload.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <backendsCommon/MakeWorkloadHelper.hpp>
telsoa014fcda012018-03-09 14:13:49 +000010#include "RefWorkloadFactory.hpp"
David Beck79141b92018-10-23 16:09:36 +010011#include "RefBackendId.hpp"
David Beckb4540be2018-09-24 13:18:27 +010012#include "workloads/RefWorkloads.hpp"
Matthew Bentham4cefc412019-06-18 16:14:34 +010013#include "RefTensorHandle.hpp"
telsoa014fcda012018-03-09 14:13:49 +000014
15#include <boost/log/trivial.hpp>
16
17namespace armnn
18{
19
David Beck79141b92018-10-23 16:09:36 +010020namespace
21{
22static const BackendId s_Id{RefBackendId()};
23}
telsoa014fcda012018-03-09 14:13:49 +000024template <typename F32Workload, typename U8Workload, typename QueueDescriptorType>
25std::unique_ptr<IWorkload> RefWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
26 const WorkloadInfo& info) const
27{
kevmay012b4d88e2019-01-24 14:05:09 +000028 return armnn::MakeWorkloadHelper<NullWorkload, F32Workload, U8Workload, NullWorkload, NullWorkload>(descriptor,
29 info);
telsoa014fcda012018-03-09 14:13:49 +000030}
31
Ferran Balaguerd73d14f2019-06-10 10:29:54 +010032template <DataType ArmnnType>
33bool IsDataType(const WorkloadInfo& info)
Jim Flynn82fbe7c2019-04-02 15:19:08 +010034{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +010035 auto checkType = [](const TensorInfo& tensorInfo) {return tensorInfo.GetDataType() == ArmnnType;};
36 auto it = std::find_if(std::begin(info.m_InputTensorInfos), std::end(info.m_InputTensorInfos), checkType);
Jim Flynn82fbe7c2019-04-02 15:19:08 +010037 if (it != std::end(info.m_InputTensorInfos))
38 {
39 return true;
40 }
Ferran Balaguerd73d14f2019-06-10 10:29:54 +010041 it = std::find_if(std::begin(info.m_OutputTensorInfos), std::end(info.m_OutputTensorInfos), checkType);
Jim Flynn82fbe7c2019-04-02 15:19:08 +010042 if (it != std::end(info.m_OutputTensorInfos))
43 {
44 return true;
45 }
46 return false;
47}
48
Ferran Balaguerd73d14f2019-06-10 10:29:54 +010049bool IsFloat16(const WorkloadInfo& info)
50{
51 return IsDataType<DataType::Float16>(info);
52}
53
Narumol Prangnawarat47cfee92019-07-04 10:29:00 +010054bool IsQSymm16(const WorkloadInfo& info)
nikraj0199a66312019-06-06 10:31:27 +010055{
Narumol Prangnawarat47cfee92019-07-04 10:29:00 +010056 return IsDataType<DataType::QuantisedSymm16>(info);
nikraj0199a66312019-06-06 10:31:27 +010057}
58
Matthew Bentham7c1603a2019-06-21 17:22:23 +010059RefWorkloadFactory::RefWorkloadFactory(const std::shared_ptr<RefMemoryManager>& memoryManager)
60 : m_MemoryManager(memoryManager)
61{
62}
63
telsoa01c577f2c2018-08-31 09:22:23 +010064RefWorkloadFactory::RefWorkloadFactory()
Matthew Bentham7c1603a2019-06-21 17:22:23 +010065 : m_MemoryManager(new RefMemoryManager())
telsoa014fcda012018-03-09 14:13:49 +000066{
67}
68
David Beck79141b92018-10-23 16:09:36 +010069const BackendId& RefWorkloadFactory::GetBackendId() const
70{
71 return s_Id;
72}
73
David Beck29c75de2018-10-23 13:35:58 +010074bool RefWorkloadFactory::IsLayerSupported(const Layer& layer,
75 Optional<DataType> dataType,
telsoa01c577f2c2018-08-31 09:22:23 +010076 std::string& outReasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +000077{
David Beck79141b92018-10-23 16:09:36 +010078 return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
telsoa014fcda012018-03-09 14:13:49 +000079}
80
81std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
82{
Matthew Bentham7c1603a2019-06-21 17:22:23 +010083 return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
telsoa014fcda012018-03-09 14:13:49 +000084}
85
Francis Murtagh351d13d2018-09-24 15:01:18 +010086std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
87 DataLayout dataLayout) const
88{
Matthew Bentham7c1603a2019-06-21 17:22:23 +010089 return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
Francis Murtagh351d13d2018-09-24 15:01:18 +010090}
91
telsoa014fcda012018-03-09 14:13:49 +000092std::unique_ptr<IWorkload> RefWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
93 const WorkloadInfo& info) const
94{
95 if (info.m_InputTensorInfos.empty() )
96 {
97 throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Input cannot be zero length");
98 }
99 if (info.m_OutputTensorInfos.empty())
100 {
101 throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Output cannot be zero length");
102 }
103
104 if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
105 {
106 throw InvalidArgumentException("RefWorkloadFactory::CreateInput: data input and output differ in byte count.");
107 }
108
Narumol Prangnawaratb6441e42019-06-04 11:22:00 +0100109 return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000110}
111
112std::unique_ptr<IWorkload> RefWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
113 const WorkloadInfo& info) const
114{
115 if (info.m_InputTensorInfos.empty() )
116 {
117 throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Input cannot be zero length");
118 }
119 if (info.m_OutputTensorInfos.empty())
120 {
121 throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Output cannot be zero length");
122 }
123 if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
124 {
125 throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: data input and output differ in byte count.");
126 }
127
Narumol Prangnawaratb6441e42019-06-04 11:22:00 +0100128 return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000129}
130
131std::unique_ptr<IWorkload> RefWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
132 const WorkloadInfo& info) const
133{
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +0100134 if (IsFloat16(info))
135 {
136 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
137 }
138 return std::make_unique<RefActivationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000139}
140
141std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
142 const WorkloadInfo& info) const
143{
nikraj01a121de32019-05-29 10:51:05 +0100144 if (IsFloat16(info))
145 {
146 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
147 }
148 return std::make_unique<RefSoftmaxWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000149}
150
151std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
152 const WorkloadInfo& info) const
153{
Ruomei Yan25339c32019-05-28 16:48:20 +0100154 if (IsFloat16(info))
155 {
156 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
157 }
158 return std::make_unique<RefSplitterWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000159}
160
161std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
162 const WorkloadInfo& info) const
163{
Jim Flynn4ed6c832019-05-20 11:02:46 +0100164 return CreateConcat(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000165}
166
167std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateFullyConnected(
168 const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
169{
Francis Murtagh43aec582019-05-27 12:14:10 +0100170 return std::make_unique<RefFullyConnectedWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000171}
172
173std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
174 const WorkloadInfo& info) const
175{
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100176 if (IsQSymm16(info))
177 {
178 return std::make_unique<RefPermuteQSymm16Workload>(descriptor, info);
179 }
180 return MakeWorkloadHelper<RefPermuteFloat16Workload, RefPermuteFloat32Workload, RefPermuteQAsymm8Workload,
kevmay012b4d88e2019-01-24 14:05:09 +0000181 NullWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000182}
183
184std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
185 const WorkloadInfo& info) const
186{
Teresa Charlina3b20472019-06-06 11:12:32 +0100187 if (IsFloat16(info))
188 {
189 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
190 }
191 return std::make_unique<RefPooling2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000192}
193
194std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateConvolution2d(
195 const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
196{
Mike Kelly9b398322019-05-22 17:21:49 +0100197 return std::make_unique<RefConvolution2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000198}
199
Ruomei Yan495852f2019-05-23 11:37:33 +0100200std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateDepthwiseConvolution2d(
telsoa014fcda012018-03-09 14:13:49 +0000201 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
202{
Ruomei Yan495852f2019-05-23 11:37:33 +0100203 return std::make_unique<RefDepthwiseConvolution2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000204}
205
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000206std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDetectionPostProcess(
207 const armnn::DetectionPostProcessQueueDescriptor& descriptor, const armnn::WorkloadInfo& info) const
208{
Aron Virginas-Tar6331f912019-06-03 17:10:02 +0100209 return std::make_unique<RefDetectionPostProcessWorkload>(descriptor, info);
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000210}
211
telsoa014fcda012018-03-09 14:13:49 +0000212std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateNormalization(
213 const NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
214{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100215 return std::make_unique<RefNormalizationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000216}
217
218std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
219 const WorkloadInfo& info) const
220{
Jim Flynn82fbe7c2019-04-02 15:19:08 +0100221 if (IsFloat16(info))
222 {
223 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
224 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100225 return std::make_unique<RefAdditionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000226}
227
228std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMultiplication(
229 const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
230{
Jim Flynn82fbe7c2019-04-02 15:19:08 +0100231 if (IsFloat16(info))
232 {
233 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
234 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100235 return std::make_unique<RefMultiplicationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000236}
237
238std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateBatchNormalization(
239 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
240{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100241 return std::make_unique<RefBatchNormalizationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000242}
243
244std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
245 const WorkloadInfo& info) const
246{
247 if (descriptor.m_Inputs.empty())
248 {
249 throw InvalidArgumentException("RefWorkloadFactory: CreateMemCopy() expected an input tensor.");
250 }
telsoa01c577f2c2018-08-31 09:22:23 +0100251 return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000252}
253
Derek Lambertif674aa02019-08-01 15:56:25 +0100254std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& descriptor,
255 const WorkloadInfo& info) const
256{
257 if (descriptor.m_Inputs.empty())
258 {
259 throw InvalidArgumentException("RefWorkloadFactory: CreateMemImport() expected an input tensor.");
260 }
261 return std::make_unique<ImportMemGenericWorkload>(descriptor, info);
262}
263
Teresa Charlin970f43b2019-07-01 13:51:07 +0100264std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
265 const WorkloadInfo& info) const
266{
267 if (IsFloat16(info))
268 {
269 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
270 }
271 return std::make_unique<RefResizeWorkload>(descriptor, info);
272}
273
telsoa014fcda012018-03-09 14:13:49 +0000274std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
275 const WorkloadInfo& info) const
276{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100277 ResizeQueueDescriptor resizeDescriptor;
278 resizeDescriptor.m_Parameters.m_Method = ResizeMethod::Bilinear;
279 resizeDescriptor.m_Parameters.m_DataLayout = descriptor.m_Parameters.m_DataLayout;
280 resizeDescriptor.m_Parameters.m_TargetWidth = descriptor.m_Parameters.m_TargetWidth;
281 resizeDescriptor.m_Parameters.m_TargetHeight = descriptor.m_Parameters.m_TargetHeight;
282
283 return CreateResize(resizeDescriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000284}
285
286std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFakeQuantization(
287 const FakeQuantizationQueueDescriptor& descriptor,
288 const WorkloadInfo& info) const
289{
290 return MakeWorkload<RefFakeQuantizationFloat32Workload, NullWorkload>(descriptor, info);
291}
292
293std::unique_ptr<IWorkload> RefWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
294 const WorkloadInfo& info) const
295{
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100296 if (IsFloat16(info))
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100297 {
298 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
299 }
300 return std::make_unique<RefL2NormalizationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000301}
302
Jim Flynne242f2d2019-05-22 14:24:13 +0100303std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& descriptor,
Jim Flynn4ed6c832019-05-20 11:02:46 +0100304 const WorkloadInfo& info) const
305{
306 if (IsFloat16(info))
307 {
308 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
309 }
310 return std::make_unique<RefConcatWorkload>(descriptor, info);
311}
312
telsoa014fcda012018-03-09 14:13:49 +0000313std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
314 const WorkloadInfo& info) const
315{
Nina Drozd58ef2c62019-05-16 12:09:18 +0100316 return std::make_unique<RefConstantWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000317}
318
319std::unique_ptr<IWorkload> RefWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
320 const WorkloadInfo& info) const
321{
Nina Drozd2f2778f2019-05-27 10:37:05 +0100322 return std::make_unique<RefReshapeWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000323}
324
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000325std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
326 const WorkloadInfo& info) const
327{
nikraj0122f0f2b2019-05-30 17:29:32 +0100328 if (IsFloat16(info))
329 {
330 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
331 }
332 return std::make_unique<RefSpaceToBatchNdWorkload>(descriptor, info);
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000333}
334
Keith Davisa57eccb2019-06-14 17:33:22 +0100335std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToDepth(const armnn::SpaceToDepthQueueDescriptor& descriptor,
336 const armnn::WorkloadInfo& info) const
337{
338 if (IsFloat16(info))
339 {
340 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
341 }
342 return std::make_unique<RefSpaceToDepthWorkload>(descriptor, info);
343}
344
telsoa014fcda012018-03-09 14:13:49 +0000345std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
telsoa01c577f2c2018-08-31 09:22:23 +0100346 const WorkloadInfo& info) const
telsoa014fcda012018-03-09 14:13:49 +0000347{
James Conroy83735b12019-05-30 16:36:59 +0100348 return std::make_unique<RefFloorWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000349}
350
telsoa01c577f2c2018-08-31 09:22:23 +0100351std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
352 const WorkloadInfo& info) const
353{
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100354 return std::make_unique<RefLstmWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100355}
356
357std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvertFp16ToFp32(
358 const ConvertFp16ToFp32QueueDescriptor& descriptor,
359 const WorkloadInfo& info) const
360{
361 return std::make_unique<RefConvertFp16ToFp32Workload>(descriptor, info);
362}
363
364std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvertFp32ToFp16(
365 const ConvertFp32ToFp16QueueDescriptor& descriptor,
366 const WorkloadInfo& info) const
367{
368 return std::make_unique<RefConvertFp32ToFp16Workload>(descriptor, info);
369}
370
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100371std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateDivision(
372 const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
373{
Jim Flynn82fbe7c2019-04-02 15:19:08 +0100374 if (IsFloat16(info))
375 {
376 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
377 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100378 return std::make_unique<RefDivisionWorkload>(descriptor, info);
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100379}
380
David Beckc2044fe2018-09-05 15:00:38 +0100381std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateSubtraction(
382 const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const
383{
Jim Flynn82fbe7c2019-04-02 15:19:08 +0100384 if (IsFloat16(info))
385 {
386 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
387 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100388 return std::make_unique<RefSubtractionWorkload>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100389}
390
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000391std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMaximum(
392 const MaximumQueueDescriptor& descriptor, const WorkloadInfo& info) const
393{
Mike Kelly1da02362019-08-01 08:43:57 +0100394 if (IsFloat16(info))
395 {
396 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
397 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100398 return std::make_unique<RefMaximumWorkload>(descriptor, info);
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000399}
400
narpra01a6bf9122018-09-10 09:50:09 +0100401std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMean(
402 const MeanQueueDescriptor& descriptor, const WorkloadInfo& info) const
403{
James Conroy4d1ff582019-06-10 17:06:39 +0100404 if (IsFloat16(info))
405 {
406 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
407 }
408 return std::make_unique<RefMeanWorkload>(descriptor, info);
narpra01a6bf9122018-09-10 09:50:09 +0100409}
410
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000411std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMinimum(
412 const MinimumQueueDescriptor& descriptor, const WorkloadInfo& info) const
413{
Mike Kelly1da02362019-08-01 08:43:57 +0100414 if (IsFloat16(info))
415 {
416 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
417 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100418 return std::make_unique<RefMinimumWorkload>(descriptor, info);
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000419}
420
jimfly012c9322a2018-09-19 10:59:49 +0100421std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
422 const WorkloadInfo& info) const
423{
Narumol Prangnawarate6eaf662019-07-08 08:57:17 +0100424 if (IsQSymm16(info))
425 {
426 return std::make_unique<RefPadQSymm16Workload>(descriptor, info);
427 }
428 return MakeWorkload<RefPadFloat32Workload, RefPadQAsymm8Workload>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100429}
430
FrancisMurtagh20995952018-12-17 12:11:36 +0000431std::unique_ptr<IWorkload> RefWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor,
432 const WorkloadInfo& info) const
433{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100434 return std::make_unique<RefEqualWorkload>(descriptor, info);
FrancisMurtagh20995952018-12-17 12:11:36 +0000435}
436
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000437std::unique_ptr<IWorkload> RefWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor,
438 const WorkloadInfo& info) const
439{
Francis Murtagh47ea3c02019-06-20 12:07:19 +0100440 if (IsFloat16(info))
441 {
442 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
443 }
444 return std::make_unique<RefBatchToSpaceNdWorkload>(descriptor, info);
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000445}
jimfly012c9322a2018-09-19 10:59:49 +0100446
Conor Kennedy430b5d82018-11-14 15:28:28 +0000447std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
448 const WorkloadInfo& info) const
449{
Matteo Martincighe851b3d2019-05-28 14:31:20 +0100450 return std::make_unique<RefStridedSliceWorkload>(descriptor, info);
Conor Kennedy430b5d82018-11-14 15:28:28 +0000451}
452
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000453std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
454 const WorkloadInfo& info) const
455{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100456 return std::make_unique<RefGreaterWorkload>(descriptor, info);
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000457}
458
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000459std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor,
460 const WorkloadInfo& info) const
461{
Narumol Prangnawarat47cfee92019-07-04 10:29:00 +0100462 if (IsQSymm16(info))
463 {
464 return std::make_unique<RefDebugQSymm16Workload>(descriptor, info);
465 }
466 return MakeWorkload<RefDebugFloat32Workload, RefDebugQAsymm8Workload>(descriptor, info);
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000467}
468
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000469std::unique_ptr<IWorkload> RefWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor& descriptor,
470 const WorkloadInfo& info) const
471{
nikraj0199a66312019-06-06 10:31:27 +0100472 if (IsFloat16(info))
473 {
474 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
475 }
nikraj0199a66312019-06-06 10:31:27 +0100476 return std::make_unique<RefRsqrtWorkload>(descriptor, info);
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000477}
478
narpra014951d842019-01-18 16:53:53 +0000479std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGather(const armnn::GatherQueueDescriptor& descriptor,
480 const armnn::WorkloadInfo& info) const
481{
Ellen Norris-Thompson6858d3f2019-06-21 15:50:00 +0100482 if (IsFloat16(info))
483 {
484 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
485 }
486 return std::make_unique<RefGatherWorkload>(descriptor, info);
narpra014951d842019-01-18 16:53:53 +0000487}
488
Matteo Martincigh49124022019-01-11 13:25:59 +0000489std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor,
490 const WorkloadInfo& info) const
491{
492 return nullptr;
493}
494
Derek Lamberti5f400d62019-03-25 15:41:58 +0000495std::unique_ptr<IWorkload> RefWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
496 const WorkloadInfo& info) const
497{
498 return std::make_unique<RefQuantizeWorkload>(descriptor, info);
499}
500
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +0000501std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDequantize(const DequantizeQueueDescriptor& descriptor,
502 const WorkloadInfo& info) const
503{
Nattapat Chaimanowongafa4e3a2019-04-02 11:41:45 +0100504 return std::make_unique<RefDequantizeWorkload>(descriptor, info);
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +0000505}
506
Matteo Martincighab9e5252019-06-13 17:27:46 +0100507std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePrelu(const PreluQueueDescriptor& descriptor,
508 const WorkloadInfo& info) const
509{
510 if (IsFloat16(info))
511 {
512 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
513 }
514 return std::make_unique<RefPreluWorkload>(descriptor, info);
515}
516
Aron Virginas-Tar735a4502019-06-26 15:02:47 +0100517std::unique_ptr<IWorkload> RefWorkloadFactory::CreateTransposeConvolution2d(
518 const TransposeConvolution2dQueueDescriptor& descriptor,
519 const WorkloadInfo& info) const
520{
Aron Virginas-Tar98180ef2019-06-26 15:02:47 +0100521 if (IsFloat16(info))
522 {
523 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
524 }
Aron Virginas-Tar735a4502019-06-26 15:02:47 +0100525 return std::make_unique<RefTransposeConvolution2dWorkload>(descriptor, info);
526}
527
Matthew Jackson81e601c2019-07-11 12:07:09 +0100528std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStack(const StackQueueDescriptor& descriptor,
529 const WorkloadInfo& info) const
530{
531 if (IsFloat16(info))
532 {
533 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
534 }
535 return std::make_unique<RefStackWorkload>(descriptor, info);
536}
537
Sadik Armagan9199e582019-09-05 17:35:31 +0100538std::unique_ptr<IWorkload> RefWorkloadFactory::CreateAbs(const AbsQueueDescriptor& descriptor,
539 const WorkloadInfo& info) const
540{
541 if (IsFloat16(info))
542 {
543 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
544 }
545 return std::make_unique<RefAbsWorkload>(descriptor, info);
546}
547
Matteo Martincigh49124022019-01-11 13:25:59 +0000548} // namespace armnn