blob: 6dd6865f53250c4c09e84bae71ba069f63f98113 [file] [log] [blame]
David Beck279f8722018-09-12 13:50:03 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include <armnn/Types.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <backendsCommon/Workload.hpp>
10#include <backendsCommon/WorkloadData.hpp>
saoste012df12b32018-11-28 16:57:20 +000011#include "Maximum.hpp"
Éanna Ó Catháin20e58802018-12-04 10:29:06 +000012#include "Minimum.hpp"
ruoyan01f9426b32019-01-03 15:10:00 +000013#include "StringMapping.hpp"
Éanna Ó Catháin20e58802018-12-04 10:29:06 +000014
David Beck279f8722018-09-12 13:50:03 +010015namespace armnn
16{
17
18template <typename Functor,
19 typename armnn::DataType DataType,
20 typename ParentDescriptor,
21 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000022class RefElementwiseWorkload
David Beck279f8722018-09-12 13:50:03 +010023{
24 // Needs specialization. The default is empty on purpose.
25};
26
27template <typename ParentDescriptor, typename Functor>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000028class BaseFloat32ElementwiseWorkload : public Float32Workload<ParentDescriptor>
David Beck279f8722018-09-12 13:50:03 +010029{
30public:
31 using Float32Workload<ParentDescriptor>::Float32Workload;
32 void ExecuteImpl(const char * debugString) const;
33};
34
35template <typename Functor,
36 typename ParentDescriptor,
37 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000038class RefElementwiseWorkload<Functor, armnn::DataType::Float32, ParentDescriptor, DebugString>
39 : public BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>
David Beck279f8722018-09-12 13:50:03 +010040{
41public:
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000042 using BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>::BaseFloat32ElementwiseWorkload;
David Beck279f8722018-09-12 13:50:03 +010043
44 virtual void Execute() const override
45 {
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000046 using Parent = BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>;
David Beck279f8722018-09-12 13:50:03 +010047 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
48 }
49};
50
51template <typename ParentDescriptor, typename Functor>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000052class BaseUint8ElementwiseWorkload : public Uint8Workload<ParentDescriptor>
David Beck279f8722018-09-12 13:50:03 +010053{
54public:
55 using Uint8Workload<ParentDescriptor>::Uint8Workload;
56 void ExecuteImpl(const char * debugString) const;
57};
58
59template <typename Functor,
60 typename ParentDescriptor,
61 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000062class RefElementwiseWorkload<Functor, armnn::DataType::QuantisedAsymm8, ParentDescriptor, DebugString>
63 : public BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>
David Beck279f8722018-09-12 13:50:03 +010064{
65public:
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000066 using BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>::BaseUint8ElementwiseWorkload;
David Beck279f8722018-09-12 13:50:03 +010067
68 virtual void Execute() const override
69 {
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000070 using Parent = BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>;
David Beck279f8722018-09-12 13:50:03 +010071 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
72 }
73};
74
75using RefAdditionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000076 RefElementwiseWorkload<std::plus<float>,
David Beck279f8722018-09-12 13:50:03 +010077 DataType::Float32,
78 AdditionQueueDescriptor,
79 StringMapping::RefAdditionWorkload_Execute>;
80
81using RefAdditionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000082 RefElementwiseWorkload<std::plus<float>,
David Beck279f8722018-09-12 13:50:03 +010083 DataType::QuantisedAsymm8,
84 AdditionQueueDescriptor,
85 StringMapping::RefAdditionWorkload_Execute>;
86
David Beck279f8722018-09-12 13:50:03 +010087using RefSubtractionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000088 RefElementwiseWorkload<std::minus<float>,
David Beck279f8722018-09-12 13:50:03 +010089 DataType::Float32,
90 SubtractionQueueDescriptor,
91 StringMapping::RefSubtractionWorkload_Execute>;
92
93using RefSubtractionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000094 RefElementwiseWorkload<std::minus<float>,
David Beck279f8722018-09-12 13:50:03 +010095 DataType::QuantisedAsymm8,
96 SubtractionQueueDescriptor,
97 StringMapping::RefSubtractionWorkload_Execute>;
98
99using RefMultiplicationFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000100 RefElementwiseWorkload<std::multiplies<float>,
David Beck279f8722018-09-12 13:50:03 +0100101 DataType::Float32,
102 MultiplicationQueueDescriptor,
103 StringMapping::RefMultiplicationWorkload_Execute>;
104
105using RefMultiplicationUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000106 RefElementwiseWorkload<std::multiplies<float>,
David Beck279f8722018-09-12 13:50:03 +0100107 DataType::QuantisedAsymm8,
108 MultiplicationQueueDescriptor,
109 StringMapping::RefMultiplicationWorkload_Execute>;
110
111using RefDivisionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000112 RefElementwiseWorkload<std::divides<float>,
David Beck279f8722018-09-12 13:50:03 +0100113 DataType::Float32,
114 DivisionQueueDescriptor,
115 StringMapping::RefDivisionWorkload_Execute>;
116
117using RefDivisionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000118 RefElementwiseWorkload<std::divides<float>,
David Beck279f8722018-09-12 13:50:03 +0100119 DataType::QuantisedAsymm8,
120 DivisionQueueDescriptor,
121 StringMapping::RefDivisionWorkload_Execute>;
122
saoste012df12b32018-11-28 16:57:20 +0000123
124using RefMaximumFloat32Workload =
125 RefElementwiseWorkload<armnn::maximum<float>,
126 DataType::Float32,
127 MaximumQueueDescriptor,
128 StringMapping::RefMaximumWorkload_Execute>;
129
130using RefMaximumUint8Workload =
131 RefElementwiseWorkload<armnn::maximum<float>,
FrancisMurtagh878f0232018-12-19 10:56:15 +0000132 DataType::QuantisedAsymm8,
133 MaximumQueueDescriptor,
134 StringMapping::RefMaximumWorkload_Execute>;
saoste012df12b32018-11-28 16:57:20 +0000135
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000136using RefMinimumFloat32Workload =
137 RefElementwiseWorkload<minimum<float>,
138 DataType::Float32,
139 MinimumQueueDescriptor,
140 StringMapping::RefMinimumWorkload_Execute>;
141
142using RefMinimumUint8Workload =
143 RefElementwiseWorkload<minimum<float>,
144 DataType::QuantisedAsymm8,
145 MinimumQueueDescriptor,
146 StringMapping::RefMinimumWorkload_Execute>;
FrancisMurtagh30cdfca2018-12-18 12:57:35 +0000147
148using RefEqualFloat32Workload =
149 RefElementwiseWorkload<std::equal_to<float>,
150 DataType::Float32,
151 EqualQueueDescriptor,
152 StringMapping::RefEqualWorkload_Execute>;
153
154using RefEqualUint8Workload =
155 RefElementwiseWorkload<std::equal_to<float>,
156 DataType::QuantisedAsymm8,
157 EqualQueueDescriptor,
158 StringMapping::RefEqualWorkload_Execute>;
FrancisMurtagh878f0232018-12-19 10:56:15 +0000159
160using RefGreaterFloat32Workload =
161 RefElementwiseWorkload<std::greater<float>,
162 DataType::Float32,
163 GreaterQueueDescriptor,
164 StringMapping::RefGreaterWorkload_Execute>;
165
166using RefGreaterUint8Workload =
167 RefElementwiseWorkload<std::greater<float>,
168 DataType::QuantisedAsymm8,
169 GreaterQueueDescriptor,
170 StringMapping::RefGreaterWorkload_Execute>;
David Beck279f8722018-09-12 13:50:03 +0100171} // armnn