blob: 156613a49fa31672915ef6f050b33292eeba712a [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>
David Beck279f8722018-09-12 13:50:03 +010012
13namespace armnn
14{
15
16template <typename Functor,
17 typename armnn::DataType DataType,
18 typename ParentDescriptor,
19 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000020class RefElementwiseWorkload
David Beck279f8722018-09-12 13:50:03 +010021{
22 // Needs specialization. The default is empty on purpose.
23};
24
25template <typename ParentDescriptor, typename Functor>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000026class BaseFloat32ElementwiseWorkload : public Float32Workload<ParentDescriptor>
David Beck279f8722018-09-12 13:50:03 +010027{
28public:
29 using Float32Workload<ParentDescriptor>::Float32Workload;
30 void ExecuteImpl(const char * debugString) const;
31};
32
33template <typename Functor,
34 typename ParentDescriptor,
35 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000036class RefElementwiseWorkload<Functor, armnn::DataType::Float32, ParentDescriptor, DebugString>
37 : public BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>
David Beck279f8722018-09-12 13:50:03 +010038{
39public:
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000040 using BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>::BaseFloat32ElementwiseWorkload;
David Beck279f8722018-09-12 13:50:03 +010041
42 virtual void Execute() const override
43 {
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000044 using Parent = BaseFloat32ElementwiseWorkload<ParentDescriptor, Functor>;
David Beck279f8722018-09-12 13:50:03 +010045 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
46 }
47};
48
49template <typename ParentDescriptor, typename Functor>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000050class BaseUint8ElementwiseWorkload : public Uint8Workload<ParentDescriptor>
David Beck279f8722018-09-12 13:50:03 +010051{
52public:
53 using Uint8Workload<ParentDescriptor>::Uint8Workload;
54 void ExecuteImpl(const char * debugString) const;
55};
56
57template <typename Functor,
58 typename ParentDescriptor,
59 typename armnn::StringMapping::Id DebugString>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000060class RefElementwiseWorkload<Functor, armnn::DataType::QuantisedAsymm8, ParentDescriptor, DebugString>
61 : public BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>
David Beck279f8722018-09-12 13:50:03 +010062{
63public:
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000064 using BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>::BaseUint8ElementwiseWorkload;
David Beck279f8722018-09-12 13:50:03 +010065
66 virtual void Execute() const override
67 {
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000068 using Parent = BaseUint8ElementwiseWorkload<ParentDescriptor, Functor>;
David Beck279f8722018-09-12 13:50:03 +010069 Parent::ExecuteImpl(StringMapping::Instance().Get(DebugString));
70 }
71};
72
73using RefAdditionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000074 RefElementwiseWorkload<std::plus<float>,
David Beck279f8722018-09-12 13:50:03 +010075 DataType::Float32,
76 AdditionQueueDescriptor,
77 StringMapping::RefAdditionWorkload_Execute>;
78
79using RefAdditionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000080 RefElementwiseWorkload<std::plus<float>,
David Beck279f8722018-09-12 13:50:03 +010081 DataType::QuantisedAsymm8,
82 AdditionQueueDescriptor,
83 StringMapping::RefAdditionWorkload_Execute>;
84
85
86using RefSubtractionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000087 RefElementwiseWorkload<std::minus<float>,
David Beck279f8722018-09-12 13:50:03 +010088 DataType::Float32,
89 SubtractionQueueDescriptor,
90 StringMapping::RefSubtractionWorkload_Execute>;
91
92using RefSubtractionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000093 RefElementwiseWorkload<std::minus<float>,
David Beck279f8722018-09-12 13:50:03 +010094 DataType::QuantisedAsymm8,
95 SubtractionQueueDescriptor,
96 StringMapping::RefSubtractionWorkload_Execute>;
97
98using RefMultiplicationFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000099 RefElementwiseWorkload<std::multiplies<float>,
David Beck279f8722018-09-12 13:50:03 +0100100 DataType::Float32,
101 MultiplicationQueueDescriptor,
102 StringMapping::RefMultiplicationWorkload_Execute>;
103
104using RefMultiplicationUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000105 RefElementwiseWorkload<std::multiplies<float>,
David Beck279f8722018-09-12 13:50:03 +0100106 DataType::QuantisedAsymm8,
107 MultiplicationQueueDescriptor,
108 StringMapping::RefMultiplicationWorkload_Execute>;
109
110using RefDivisionFloat32Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000111 RefElementwiseWorkload<std::divides<float>,
David Beck279f8722018-09-12 13:50:03 +0100112 DataType::Float32,
113 DivisionQueueDescriptor,
114 StringMapping::RefDivisionWorkload_Execute>;
115
116using RefDivisionUint8Workload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000117 RefElementwiseWorkload<std::divides<float>,
David Beck279f8722018-09-12 13:50:03 +0100118 DataType::QuantisedAsymm8,
119 DivisionQueueDescriptor,
120 StringMapping::RefDivisionWorkload_Execute>;
121
122} // armnn