blob: 2772b77631229e0d2c7191facc9d0972eb64a6fc [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"
David Beck279f8722018-09-12 13:50:03 +010013
14namespace armnn
15{
16
17template <typename Functor,
18 typename armnn::DataType DataType,
19 typename ParentDescriptor,
20 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000021class RefElementwiseWorkload
David Beck279f8722018-09-12 13:50:03 +010022{
23 // Needs specialization. The default is empty on purpose.
24};
25
26template <typename ParentDescriptor, typename Functor>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000027class BaseFloat32ElementwiseWorkload : public Float32Workload<ParentDescriptor>
David Beck279f8722018-09-12 13:50:03 +010028{
29public:
30 using Float32Workload<ParentDescriptor>::Float32Workload;
31 void ExecuteImpl(const char * debugString) const;
32};
33
34template <typename Functor,
35 typename ParentDescriptor,
36 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000037class RefElementwiseWorkload<Functor, armnn::DataType::Float32, ParentDescriptor, DebugString>
38 : public BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>
David Beck279f8722018-09-12 13:50:03 +010039{
40public:
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000041 using BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>::BaseFloat32ElementwiseWorkload;
David Beck279f8722018-09-12 13:50:03 +010042
43 virtual void Execute() const override
44 {
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000045 using Parent = BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>;
David Beck279f8722018-09-12 13:50:03 +010046 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
47 }
48};
49
50template <typename ParentDescriptor, typename Functor>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000051class BaseUint8ElementwiseWorkload : public Uint8Workload<ParentDescriptor>
David Beck279f8722018-09-12 13:50:03 +010052{
53public:
54 using Uint8Workload<ParentDescriptor>::Uint8Workload;
55 void ExecuteImpl(const char * debugString) const;
56};
57
58template <typename Functor,
59 typename ParentDescriptor,
60 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000061class RefElementwiseWorkload<Functor, armnn::DataType::QuantisedAsymm8, ParentDescriptor, DebugString>
62 : public BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>
David Beck279f8722018-09-12 13:50:03 +010063{
64public:
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000065 using BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>::BaseUint8ElementwiseWorkload;
David Beck279f8722018-09-12 13:50:03 +010066
67 virtual void Execute() const override
68 {
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000069 using Parent = BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>;
David Beck279f8722018-09-12 13:50:03 +010070 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
71 }
72};
73
74using RefAdditionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000075 RefElementwiseWorkload<std::plus<float>,
David Beck279f8722018-09-12 13:50:03 +010076 DataType::Float32,
77 AdditionQueueDescriptor,
78 StringMapping::RefAdditionWorkload_Execute>;
79
80using RefAdditionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000081 RefElementwiseWorkload<std::plus<float>,
David Beck279f8722018-09-12 13:50:03 +010082 DataType::QuantisedAsymm8,
83 AdditionQueueDescriptor,
84 StringMapping::RefAdditionWorkload_Execute>;
85
86
87using 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>,
132 DataType::QuantisedAsymm8,
133 MaximumQueueDescriptor,
134 StringMapping::RefMaximumWorkload_Execute>;
135
David Beck279f8722018-09-12 13:50:03 +0100136} // armnn