2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
8 #include <armnn/Types.hpp>
9 #include <backendsCommon/StringMapping.hpp>
10 #include <backendsCommon/Workload.hpp>
11 #include <backendsCommon/WorkloadData.hpp>
16 template <typename Functor,
17 typename armnn::DataType DataType,
18 typename ParentDescriptor,
19 typename armnn::StringMapping::Id DebugString>
20 class RefArithmeticWorkload
22 // Needs specialization. The default is empty on purpose.
25 template <typename ParentDescriptor, typename Functor>
26 class BaseFloat32ArithmeticWorkload : public Float32Workload<ParentDescriptor>
29 using Float32Workload<ParentDescriptor>::Float32Workload;
30 void ExecuteImpl(const char * debugString) const;
33 template <typename Functor,
34 typename ParentDescriptor,
35 typename armnn::StringMapping::Id DebugString>
36 class RefArithmeticWorkload<Functor, armnn::DataType::Float32, ParentDescriptor, DebugString>
37 : public BaseFloat32ArithmeticWorkload<ParentDescriptor, Functor>
40 using BaseFloat32ArithmeticWorkload<ParentDescriptor, Functor>::BaseFloat32ArithmeticWorkload;
42 virtual void Execute() const override
44 using Parent = BaseFloat32ArithmeticWorkload<ParentDescriptor, Functor>;
45 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
49 template <typename ParentDescriptor, typename Functor>
50 class BaseUint8ArithmeticWorkload : public Uint8Workload<ParentDescriptor>
53 using Uint8Workload<ParentDescriptor>::Uint8Workload;
54 void ExecuteImpl(const char * debugString) const;
57 template <typename Functor,
58 typename ParentDescriptor,
59 typename armnn::StringMapping::Id DebugString>
60 class RefArithmeticWorkload<Functor, armnn::DataType::QuantisedAsymm8, ParentDescriptor, DebugString>
61 : public BaseUint8ArithmeticWorkload<ParentDescriptor, Functor>
64 using BaseUint8ArithmeticWorkload<ParentDescriptor, Functor>::BaseUint8ArithmeticWorkload;
66 virtual void Execute() const override
68 using Parent = BaseUint8ArithmeticWorkload<ParentDescriptor, Functor>;
69 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
73 using RefAdditionFloat32Workload =
74 RefArithmeticWorkload<std::plus<float>,
76 AdditionQueueDescriptor,
77 StringMapping::RefAdditionWorkload_Execute>;
79 using RefAdditionUint8Workload =
80 RefArithmeticWorkload<std::plus<float>,
81 DataType::QuantisedAsymm8,
82 AdditionQueueDescriptor,
83 StringMapping::RefAdditionWorkload_Execute>;
86 using RefSubtractionFloat32Workload =
87 RefArithmeticWorkload<std::minus<float>,
89 SubtractionQueueDescriptor,
90 StringMapping::RefSubtractionWorkload_Execute>;
92 using RefSubtractionUint8Workload =
93 RefArithmeticWorkload<std::minus<float>,
94 DataType::QuantisedAsymm8,
95 SubtractionQueueDescriptor,
96 StringMapping::RefSubtractionWorkload_Execute>;
98 using RefMultiplicationFloat32Workload =
99 RefArithmeticWorkload<std::multiplies<float>,
101 MultiplicationQueueDescriptor,
102 StringMapping::RefMultiplicationWorkload_Execute>;
104 using RefMultiplicationUint8Workload =
105 RefArithmeticWorkload<std::multiplies<float>,
106 DataType::QuantisedAsymm8,
107 MultiplicationQueueDescriptor,
108 StringMapping::RefMultiplicationWorkload_Execute>;
110 using RefDivisionFloat32Workload =
111 RefArithmeticWorkload<std::divides<float>,
113 DivisionQueueDescriptor,
114 StringMapping::RefDivisionWorkload_Execute>;
116 using RefDivisionUint8Workload =
117 RefArithmeticWorkload<std::divides<float>,
118 DataType::QuantisedAsymm8,
119 DivisionQueueDescriptor,
120 StringMapping::RefDivisionWorkload_Execute>;