blob: b5205938b276c44f8a1234f8110bfc6dfcc0803c [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/StringMapping.hpp>
10#include <backendsCommon/Workload.hpp>
11#include <backendsCommon/WorkloadData.hpp>
saoste012df12b32018-11-28 16:57:20 +000012#include "Maximum.hpp"
Éanna Ó Catháin20e58802018-12-04 10:29:06 +000013#include "Minimum.hpp"
14
15
David Beck279f8722018-09-12 13:50:03 +010016
17namespace armnn
18{
19
20template <typename Functor,
21 typename armnn::DataType DataType,
22 typename ParentDescriptor,
23 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000024class RefElementwiseWorkload
David Beck279f8722018-09-12 13:50:03 +010025{
26 // Needs specialization. The default is empty on purpose.
27};
28
29template <typename ParentDescriptor, typename Functor>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000030class BaseFloat32ElementwiseWorkload : public Float32Workload<ParentDescriptor>
David Beck279f8722018-09-12 13:50:03 +010031{
32public:
33 using Float32Workload<ParentDescriptor>::Float32Workload;
34 void ExecuteImpl(const char * debugString) const;
35};
36
37template <typename Functor,
38 typename ParentDescriptor,
39 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000040class RefElementwiseWorkload<Functor, armnn::DataType::Float32, ParentDescriptor, DebugString>
41 : public BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>
David Beck279f8722018-09-12 13:50:03 +010042{
43public:
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000044 using BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>::BaseFloat32ElementwiseWorkload;
David Beck279f8722018-09-12 13:50:03 +010045
46 virtual void Execute() const override
47 {
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000048 using Parent = BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>;
David Beck279f8722018-09-12 13:50:03 +010049 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
50 }
51};
52
53template <typename ParentDescriptor, typename Functor>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000054class BaseUint8ElementwiseWorkload : public Uint8Workload<ParentDescriptor>
David Beck279f8722018-09-12 13:50:03 +010055{
56public:
57 using Uint8Workload<ParentDescriptor>::Uint8Workload;
58 void ExecuteImpl(const char * debugString) const;
59};
60
61template <typename Functor,
62 typename ParentDescriptor,
63 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000064class RefElementwiseWorkload<Functor, armnn::DataType::QuantisedAsymm8, ParentDescriptor, DebugString>
65 : public BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>
David Beck279f8722018-09-12 13:50:03 +010066{
67public:
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000068 using BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>::BaseUint8ElementwiseWorkload;
David Beck279f8722018-09-12 13:50:03 +010069
70 virtual void Execute() const override
71 {
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000072 using Parent = BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>;
David Beck279f8722018-09-12 13:50:03 +010073 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
74 }
75};
76
77using RefAdditionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000078 RefElementwiseWorkload<std::plus<float>,
David Beck279f8722018-09-12 13:50:03 +010079 DataType::Float32,
80 AdditionQueueDescriptor,
81 StringMapping::RefAdditionWorkload_Execute>;
82
83using RefAdditionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000084 RefElementwiseWorkload<std::plus<float>,
David Beck279f8722018-09-12 13:50:03 +010085 DataType::QuantisedAsymm8,
86 AdditionQueueDescriptor,
87 StringMapping::RefAdditionWorkload_Execute>;
88
89
90using RefSubtractionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000091 RefElementwiseWorkload<std::minus<float>,
David Beck279f8722018-09-12 13:50:03 +010092 DataType::Float32,
93 SubtractionQueueDescriptor,
94 StringMapping::RefSubtractionWorkload_Execute>;
95
96using RefSubtractionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000097 RefElementwiseWorkload<std::minus<float>,
David Beck279f8722018-09-12 13:50:03 +010098 DataType::QuantisedAsymm8,
99 SubtractionQueueDescriptor,
100 StringMapping::RefSubtractionWorkload_Execute>;
101
102using RefMultiplicationFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000103 RefElementwiseWorkload<std::multiplies<float>,
David Beck279f8722018-09-12 13:50:03 +0100104 DataType::Float32,
105 MultiplicationQueueDescriptor,
106 StringMapping::RefMultiplicationWorkload_Execute>;
107
108using RefMultiplicationUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000109 RefElementwiseWorkload<std::multiplies<float>,
David Beck279f8722018-09-12 13:50:03 +0100110 DataType::QuantisedAsymm8,
111 MultiplicationQueueDescriptor,
112 StringMapping::RefMultiplicationWorkload_Execute>;
113
114using RefDivisionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000115 RefElementwiseWorkload<std::divides<float>,
David Beck279f8722018-09-12 13:50:03 +0100116 DataType::Float32,
117 DivisionQueueDescriptor,
118 StringMapping::RefDivisionWorkload_Execute>;
119
120using RefDivisionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000121 RefElementwiseWorkload<std::divides<float>,
David Beck279f8722018-09-12 13:50:03 +0100122 DataType::QuantisedAsymm8,
123 DivisionQueueDescriptor,
124 StringMapping::RefDivisionWorkload_Execute>;
125
saoste012df12b32018-11-28 16:57:20 +0000126
127using RefMaximumFloat32Workload =
128 RefElementwiseWorkload<armnn::maximum<float>,
129 DataType::Float32,
130 MaximumQueueDescriptor,
131 StringMapping::RefMaximumWorkload_Execute>;
132
133using RefMaximumUint8Workload =
134 RefElementwiseWorkload<armnn::maximum<float>,
135 DataType::QuantisedAsymm8,
136 MaximumQueueDescriptor,
137 StringMapping::RefMaximumWorkload_Execute>;
138
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000139using RefMinimumFloat32Workload =
140 RefElementwiseWorkload<minimum<float>,
141 DataType::Float32,
142 MinimumQueueDescriptor,
143 StringMapping::RefMinimumWorkload_Execute>;
144
145using RefMinimumUint8Workload =
146 RefElementwiseWorkload<minimum<float>,
147 DataType::QuantisedAsymm8,
148 MinimumQueueDescriptor,
149 StringMapping::RefMinimumWorkload_Execute>;
David Beck279f8722018-09-12 13:50:03 +0100150} // armnn