blob: 8d2a2b1edfb72914b6ac5c52477d1f14984082e9 [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>
8#include <backendsCommon/MakeWorkloadHelper.hpp>
telsoa014fcda012018-03-09 14:13:49 +00009#include "RefWorkloadFactory.hpp"
David Beck79141b92018-10-23 16:09:36 +010010#include "RefBackendId.hpp"
David Beckb4540be2018-09-24 13:18:27 +010011#include "workloads/RefWorkloads.hpp"
Matthew Bentham4cefc412019-06-18 16:14:34 +010012#include "RefTensorHandle.hpp"
telsoa014fcda012018-03-09 14:13:49 +000013
14#include <boost/log/trivial.hpp>
15
16namespace armnn
17{
18
David Beck79141b92018-10-23 16:09:36 +010019namespace
20{
21static const BackendId s_Id{RefBackendId()};
22}
telsoa014fcda012018-03-09 14:13:49 +000023template <typename F32Workload, typename U8Workload, typename QueueDescriptorType>
24std::unique_ptr<IWorkload> RefWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
25 const WorkloadInfo& info) const
26{
kevmay012b4d88e2019-01-24 14:05:09 +000027 return armnn::MakeWorkloadHelper<NullWorkload, F32Workload, U8Workload, NullWorkload, NullWorkload>(descriptor,
28 info);
telsoa014fcda012018-03-09 14:13:49 +000029}
30
Ferran Balaguerd73d14f2019-06-10 10:29:54 +010031template <DataType ArmnnType>
32bool IsDataType(const WorkloadInfo& info)
Jim Flynn82fbe7c2019-04-02 15:19:08 +010033{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +010034 auto checkType = [](const TensorInfo& tensorInfo) {return tensorInfo.GetDataType() == ArmnnType;};
35 auto it = std::find_if(std::begin(info.m_InputTensorInfos), std::end(info.m_InputTensorInfos), checkType);
Jim Flynn82fbe7c2019-04-02 15:19:08 +010036 if (it != std::end(info.m_InputTensorInfos))
37 {
38 return true;
39 }
Ferran Balaguerd73d14f2019-06-10 10:29:54 +010040 it = std::find_if(std::begin(info.m_OutputTensorInfos), std::end(info.m_OutputTensorInfos), checkType);
Jim Flynn82fbe7c2019-04-02 15:19:08 +010041 if (it != std::end(info.m_OutputTensorInfos))
42 {
43 return true;
44 }
45 return false;
46}
47
Ferran Balaguerd73d14f2019-06-10 10:29:54 +010048bool IsFloat16(const WorkloadInfo& info)
49{
50 return IsDataType<DataType::Float16>(info);
51}
52
nikraj0199a66312019-06-06 10:31:27 +010053bool IsUint8(const WorkloadInfo& info)
54{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +010055 return IsDataType<DataType::QuantisedAsymm8>(info);
nikraj0199a66312019-06-06 10:31:27 +010056}
57
telsoa01c577f2c2018-08-31 09:22:23 +010058RefWorkloadFactory::RefWorkloadFactory()
telsoa014fcda012018-03-09 14:13:49 +000059{
60}
61
David Beck79141b92018-10-23 16:09:36 +010062const BackendId& RefWorkloadFactory::GetBackendId() const
63{
64 return s_Id;
65}
66
David Beck29c75de2018-10-23 13:35:58 +010067bool RefWorkloadFactory::IsLayerSupported(const Layer& layer,
68 Optional<DataType> dataType,
telsoa01c577f2c2018-08-31 09:22:23 +010069 std::string& outReasonIfUnsupported)
telsoa014fcda012018-03-09 14:13:49 +000070{
David Beck79141b92018-10-23 16:09:36 +010071 return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
telsoa014fcda012018-03-09 14:13:49 +000072}
73
74std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo) const
75{
Matthew Bentham4cefc412019-06-18 16:14:34 +010076 return std::make_unique<RefTensorHandle>(tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +000077}
78
Francis Murtagh351d13d2018-09-24 15:01:18 +010079std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
80 DataLayout dataLayout) const
81{
Matthew Bentham4cefc412019-06-18 16:14:34 +010082 return std::make_unique<RefTensorHandle>(tensorInfo);
Francis Murtagh351d13d2018-09-24 15:01:18 +010083}
84
telsoa014fcda012018-03-09 14:13:49 +000085std::unique_ptr<IWorkload> RefWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
86 const WorkloadInfo& info) const
87{
88 if (info.m_InputTensorInfos.empty() )
89 {
90 throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Input cannot be zero length");
91 }
92 if (info.m_OutputTensorInfos.empty())
93 {
94 throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Output cannot be zero length");
95 }
96
97 if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
98 {
99 throw InvalidArgumentException("RefWorkloadFactory::CreateInput: data input and output differ in byte count.");
100 }
101
Narumol Prangnawaratb6441e42019-06-04 11:22:00 +0100102 return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000103}
104
105std::unique_ptr<IWorkload> RefWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
106 const WorkloadInfo& info) const
107{
108 if (info.m_InputTensorInfos.empty() )
109 {
110 throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Input cannot be zero length");
111 }
112 if (info.m_OutputTensorInfos.empty())
113 {
114 throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Output cannot be zero length");
115 }
116 if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
117 {
118 throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: data input and output differ in byte count.");
119 }
120
Narumol Prangnawaratb6441e42019-06-04 11:22:00 +0100121 return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000122}
123
124std::unique_ptr<IWorkload> RefWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
125 const WorkloadInfo& info) const
126{
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +0100127 if (IsFloat16(info))
128 {
129 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
130 }
131 return std::make_unique<RefActivationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000132}
133
134std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
135 const WorkloadInfo& info) const
136{
nikraj01a121de32019-05-29 10:51:05 +0100137 if (IsFloat16(info))
138 {
139 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
140 }
141 return std::make_unique<RefSoftmaxWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000142}
143
144std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
145 const WorkloadInfo& info) const
146{
Ruomei Yan25339c32019-05-28 16:48:20 +0100147 if (IsFloat16(info))
148 {
149 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
150 }
151 return std::make_unique<RefSplitterWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000152}
153
154std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
155 const WorkloadInfo& info) const
156{
Jim Flynn4ed6c832019-05-20 11:02:46 +0100157 return CreateConcat(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000158}
159
160std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateFullyConnected(
161 const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
162{
Francis Murtagh43aec582019-05-27 12:14:10 +0100163 return std::make_unique<RefFullyConnectedWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000164}
165
166std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
167 const WorkloadInfo& info) const
168{
narpra01db2b1602019-01-23 15:23:11 +0000169 return MakeWorkloadHelper<RefPermuteFloat16Workload, RefPermuteFloat32Workload, RefPermuteUint8Workload,
kevmay012b4d88e2019-01-24 14:05:09 +0000170 NullWorkload, NullWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000171}
172
173std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
174 const WorkloadInfo& info) const
175{
Teresa Charlina3b20472019-06-06 11:12:32 +0100176 if (IsFloat16(info))
177 {
178 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
179 }
180 return std::make_unique<RefPooling2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000181}
182
183std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateConvolution2d(
184 const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
185{
Mike Kelly9b398322019-05-22 17:21:49 +0100186 return std::make_unique<RefConvolution2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000187}
188
Ruomei Yan495852f2019-05-23 11:37:33 +0100189std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateDepthwiseConvolution2d(
telsoa014fcda012018-03-09 14:13:49 +0000190 const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
191{
Ruomei Yan495852f2019-05-23 11:37:33 +0100192 return std::make_unique<RefDepthwiseConvolution2dWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000193}
194
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000195std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDetectionPostProcess(
196 const armnn::DetectionPostProcessQueueDescriptor& descriptor, const armnn::WorkloadInfo& info) const
197{
Aron Virginas-Tar6331f912019-06-03 17:10:02 +0100198 return std::make_unique<RefDetectionPostProcessWorkload>(descriptor, info);
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000199}
200
telsoa014fcda012018-03-09 14:13:49 +0000201std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateNormalization(
202 const NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
203{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100204 return std::make_unique<RefNormalizationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000205}
206
207std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
208 const WorkloadInfo& info) const
209{
Jim Flynn82fbe7c2019-04-02 15:19:08 +0100210 if (IsFloat16(info))
211 {
212 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
213 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100214 return std::make_unique<RefAdditionWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000215}
216
217std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMultiplication(
218 const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
219{
Jim Flynn82fbe7c2019-04-02 15:19:08 +0100220 if (IsFloat16(info))
221 {
222 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
223 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100224 return std::make_unique<RefMultiplicationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000225}
226
227std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateBatchNormalization(
228 const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
229{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100230 return std::make_unique<RefBatchNormalizationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000231}
232
233std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
234 const WorkloadInfo& info) const
235{
236 if (descriptor.m_Inputs.empty())
237 {
238 throw InvalidArgumentException("RefWorkloadFactory: CreateMemCopy() expected an input tensor.");
239 }
telsoa01c577f2c2018-08-31 09:22:23 +0100240 return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000241}
242
Teresa Charlin970f43b2019-07-01 13:51:07 +0100243std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
244 const WorkloadInfo& info) const
245{
246 if (IsFloat16(info))
247 {
248 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
249 }
250 return std::make_unique<RefResizeWorkload>(descriptor, info);
251}
252
telsoa014fcda012018-03-09 14:13:49 +0000253std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
254 const WorkloadInfo& info) const
255{
Ellen Norris-Thompson719d2a92019-06-12 10:23:57 +0100256 if (IsFloat16(info))
257 {
258 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
259 }
260 return std::make_unique<RefResizeBilinearWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000261}
262
263std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFakeQuantization(
264 const FakeQuantizationQueueDescriptor& descriptor,
265 const WorkloadInfo& info) const
266{
267 return MakeWorkload<RefFakeQuantizationFloat32Workload, NullWorkload>(descriptor, info);
268}
269
270std::unique_ptr<IWorkload> RefWorkloadFactory::CreateL2Normalization(const L2NormalizationQueueDescriptor& descriptor,
271 const WorkloadInfo& info) const
272{
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100273 if (IsFloat16(info))
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100274 {
275 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
276 }
277 return std::make_unique<RefL2NormalizationWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000278}
279
Jim Flynne242f2d2019-05-22 14:24:13 +0100280std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& descriptor,
Jim Flynn4ed6c832019-05-20 11:02:46 +0100281 const WorkloadInfo& info) const
282{
283 if (IsFloat16(info))
284 {
285 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
286 }
287 return std::make_unique<RefConcatWorkload>(descriptor, info);
288}
289
telsoa014fcda012018-03-09 14:13:49 +0000290std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
291 const WorkloadInfo& info) const
292{
Nina Drozd58ef2c62019-05-16 12:09:18 +0100293 return std::make_unique<RefConstantWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000294}
295
296std::unique_ptr<IWorkload> RefWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
297 const WorkloadInfo& info) const
298{
Nina Drozd2f2778f2019-05-27 10:37:05 +0100299 return std::make_unique<RefReshapeWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000300}
301
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000302std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
303 const WorkloadInfo& info) const
304{
nikraj0122f0f2b2019-05-30 17:29:32 +0100305 if (IsFloat16(info))
306 {
307 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
308 }
309 return std::make_unique<RefSpaceToBatchNdWorkload>(descriptor, info);
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000310}
311
Keith Davisa57eccb2019-06-14 17:33:22 +0100312std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToDepth(const armnn::SpaceToDepthQueueDescriptor& descriptor,
313 const armnn::WorkloadInfo& info) const
314{
315 if (IsFloat16(info))
316 {
317 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
318 }
319 return std::make_unique<RefSpaceToDepthWorkload>(descriptor, info);
320}
321
telsoa014fcda012018-03-09 14:13:49 +0000322std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
telsoa01c577f2c2018-08-31 09:22:23 +0100323 const WorkloadInfo& info) const
telsoa014fcda012018-03-09 14:13:49 +0000324{
James Conroy83735b12019-05-30 16:36:59 +0100325 return std::make_unique<RefFloorWorkload>(descriptor, info);
telsoa014fcda012018-03-09 14:13:49 +0000326}
327
telsoa01c577f2c2018-08-31 09:22:23 +0100328std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
329 const WorkloadInfo& info) const
330{
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100331 return std::make_unique<RefLstmWorkload>(descriptor, info);
telsoa01c577f2c2018-08-31 09:22:23 +0100332}
333
334std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvertFp16ToFp32(
335 const ConvertFp16ToFp32QueueDescriptor& descriptor,
336 const WorkloadInfo& info) const
337{
338 return std::make_unique<RefConvertFp16ToFp32Workload>(descriptor, info);
339}
340
341std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvertFp32ToFp16(
342 const ConvertFp32ToFp16QueueDescriptor& descriptor,
343 const WorkloadInfo& info) const
344{
345 return std::make_unique<RefConvertFp32ToFp16Workload>(descriptor, info);
346}
347
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100348std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateDivision(
349 const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
350{
Jim Flynn82fbe7c2019-04-02 15:19:08 +0100351 if (IsFloat16(info))
352 {
353 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
354 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100355 return std::make_unique<RefDivisionWorkload>(descriptor, info);
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100356}
357
David Beckc2044fe2018-09-05 15:00:38 +0100358std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateSubtraction(
359 const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const
360{
Jim Flynn82fbe7c2019-04-02 15:19:08 +0100361 if (IsFloat16(info))
362 {
363 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
364 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100365 return std::make_unique<RefSubtractionWorkload>(descriptor, info);
David Beckc2044fe2018-09-05 15:00:38 +0100366}
367
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000368std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMaximum(
369 const MaximumQueueDescriptor& descriptor, const WorkloadInfo& info) const
370{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100371 return std::make_unique<RefMaximumWorkload>(descriptor, info);
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000372}
373
narpra01a6bf9122018-09-10 09:50:09 +0100374std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMean(
375 const MeanQueueDescriptor& descriptor, const WorkloadInfo& info) const
376{
James Conroy4d1ff582019-06-10 17:06:39 +0100377 if (IsFloat16(info))
378 {
379 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
380 }
381 return std::make_unique<RefMeanWorkload>(descriptor, info);
narpra01a6bf9122018-09-10 09:50:09 +0100382}
383
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000384std::unique_ptr<armnn::IWorkload> RefWorkloadFactory::CreateMinimum(
385 const MinimumQueueDescriptor& descriptor, const WorkloadInfo& info) const
386{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100387 return std::make_unique<RefMinimumWorkload>(descriptor, info);
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000388}
389
jimfly012c9322a2018-09-19 10:59:49 +0100390std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
391 const WorkloadInfo& info) const
392{
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +0100393 return MakeWorkload<RefPadFloat32Workload, RefPadUint8Workload>(descriptor, info);
jimfly012c9322a2018-09-19 10:59:49 +0100394}
395
FrancisMurtagh20995952018-12-17 12:11:36 +0000396std::unique_ptr<IWorkload> RefWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor,
397 const WorkloadInfo& info) const
398{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100399 return std::make_unique<RefEqualWorkload>(descriptor, info);
FrancisMurtagh20995952018-12-17 12:11:36 +0000400}
401
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000402std::unique_ptr<IWorkload> RefWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor,
403 const WorkloadInfo& info) const
404{
Francis Murtagh47ea3c02019-06-20 12:07:19 +0100405 if (IsFloat16(info))
406 {
407 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
408 }
409 return std::make_unique<RefBatchToSpaceNdWorkload>(descriptor, info);
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000410}
jimfly012c9322a2018-09-19 10:59:49 +0100411
Conor Kennedy430b5d82018-11-14 15:28:28 +0000412std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
413 const WorkloadInfo& info) const
414{
Matteo Martincighe851b3d2019-05-28 14:31:20 +0100415 return std::make_unique<RefStridedSliceWorkload>(descriptor, info);
Conor Kennedy430b5d82018-11-14 15:28:28 +0000416}
417
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000418std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
419 const WorkloadInfo& info) const
420{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100421 return std::make_unique<RefGreaterWorkload>(descriptor, info);
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000422}
423
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000424std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor,
425 const WorkloadInfo& info) const
426{
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000427 return MakeWorkload<RefDebugFloat32Workload, RefDebugUint8Workload>(descriptor, info);
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000428}
429
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000430std::unique_ptr<IWorkload> RefWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor& descriptor,
431 const WorkloadInfo& info) const
432{
nikraj0199a66312019-06-06 10:31:27 +0100433 if (IsFloat16(info))
434 {
435 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
436 }
nikraj0199a66312019-06-06 10:31:27 +0100437 return std::make_unique<RefRsqrtWorkload>(descriptor, info);
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000438}
439
narpra014951d842019-01-18 16:53:53 +0000440std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGather(const armnn::GatherQueueDescriptor& descriptor,
441 const armnn::WorkloadInfo& info) const
442{
Ellen Norris-Thompson6858d3f2019-06-21 15:50:00 +0100443 if (IsFloat16(info))
444 {
445 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
446 }
447 return std::make_unique<RefGatherWorkload>(descriptor, info);
narpra014951d842019-01-18 16:53:53 +0000448}
449
Matteo Martincigh49124022019-01-11 13:25:59 +0000450std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor,
451 const WorkloadInfo& info) const
452{
453 return nullptr;
454}
455
Derek Lamberti5f400d62019-03-25 15:41:58 +0000456std::unique_ptr<IWorkload> RefWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
457 const WorkloadInfo& info) const
458{
459 return std::make_unique<RefQuantizeWorkload>(descriptor, info);
460}
461
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +0000462std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDequantize(const DequantizeQueueDescriptor& descriptor,
463 const WorkloadInfo& info) const
464{
Nattapat Chaimanowongafa4e3a2019-04-02 11:41:45 +0100465 return std::make_unique<RefDequantizeWorkload>(descriptor, info);
Nattapat Chaimanowong8a54ac02019-03-29 15:25:04 +0000466}
467
Matteo Martincighab9e5252019-06-13 17:27:46 +0100468std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePrelu(const PreluQueueDescriptor& descriptor,
469 const WorkloadInfo& info) const
470{
471 if (IsFloat16(info))
472 {
473 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
474 }
475 return std::make_unique<RefPreluWorkload>(descriptor, info);
476}
477
Aron Virginas-Tar735a4502019-06-26 15:02:47 +0100478std::unique_ptr<IWorkload> RefWorkloadFactory::CreateTransposeConvolution2d(
479 const TransposeConvolution2dQueueDescriptor& descriptor,
480 const WorkloadInfo& info) const
481{
Aron Virginas-Tar98180ef2019-06-26 15:02:47 +0100482 if (IsFloat16(info))
483 {
484 return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
485 }
Aron Virginas-Tar735a4502019-06-26 15:02:47 +0100486 return std::make_unique<RefTransposeConvolution2dWorkload>(descriptor, info);
487}
488
Matteo Martincigh49124022019-01-11 13:25:59 +0000489} // namespace armnn