blob: 651942e9e59a4147a13f440fa331950a06c879f3 [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>
Derek Lambertif30f7d32019-04-09 10:25:02 +010011#include "BaseIterator.hpp"
12#include "ElementwiseFunction.hpp"
saoste012df12b32018-11-28 16:57:20 +000013#include "Maximum.hpp"
Éanna Ó Catháin20e58802018-12-04 10:29:06 +000014#include "Minimum.hpp"
ruoyan01f9426b32019-01-03 15:10:00 +000015#include "StringMapping.hpp"
Éanna Ó Catháin20e58802018-12-04 10:29:06 +000016
David Beck279f8722018-09-12 13:50:03 +010017namespace armnn
18{
19
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010020template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
21class RefElementwiseWorkload : public BaseWorkload<ParentDescriptor>
David Beck279f8722018-09-12 13:50:03 +010022{
23public:
Derek Lambertif30f7d32019-04-09 10:25:02 +010024 using InType = typename ElementwiseFunction<Functor>::InType;
25 using OutType = typename ElementwiseFunction<Functor>::OutType;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010026 using BaseWorkload<ParentDescriptor>::m_Data;
David Beck279f8722018-09-12 13:50:03 +010027
Derek Lambertif30f7d32019-04-09 10:25:02 +010028 RefElementwiseWorkload(const ParentDescriptor& descriptor, const WorkloadInfo& info);
29 void PostAllocationConfigure() override;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000030 void Execute() const override;
Derek Lambertif30f7d32019-04-09 10:25:02 +010031
32private:
33 std::unique_ptr<Decoder<InType>> m_Input0;
34 std::unique_ptr<Decoder<InType>> m_Input1;
35 std::unique_ptr<Encoder<OutType>> m_Output;
David Beck279f8722018-09-12 13:50:03 +010036};
37
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010038using RefAdditionWorkload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000039 RefElementwiseWorkload<std::plus<float>,
David Beck279f8722018-09-12 13:50:03 +010040 AdditionQueueDescriptor,
41 StringMapping::RefAdditionWorkload_Execute>;
42
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010043using RefSubtractionWorkload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000044 RefElementwiseWorkload<std::minus<float>,
David Beck279f8722018-09-12 13:50:03 +010045 SubtractionQueueDescriptor,
46 StringMapping::RefSubtractionWorkload_Execute>;
47
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010048using RefMultiplicationWorkload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000049 RefElementwiseWorkload<std::multiplies<float>,
David Beck279f8722018-09-12 13:50:03 +010050 MultiplicationQueueDescriptor,
51 StringMapping::RefMultiplicationWorkload_Execute>;
52
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010053using RefDivisionWorkload =
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000054 RefElementwiseWorkload<std::divides<float>,
David Beck279f8722018-09-12 13:50:03 +010055 DivisionQueueDescriptor,
56 StringMapping::RefDivisionWorkload_Execute>;
57
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010058using RefMaximumWorkload =
saoste012df12b32018-11-28 16:57:20 +000059 RefElementwiseWorkload<armnn::maximum<float>,
saoste012df12b32018-11-28 16:57:20 +000060 MaximumQueueDescriptor,
61 StringMapping::RefMaximumWorkload_Execute>;
62
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010063using RefMinimumWorkload =
64 RefElementwiseWorkload<armnn::minimum<float>,
Éanna Ó Catháin20e58802018-12-04 10:29:06 +000065 MinimumQueueDescriptor,
66 StringMapping::RefMinimumWorkload_Execute>;
Derek Lambertif30f7d32019-04-09 10:25:02 +010067
68using RefEqualWorkload =
69 RefElementwiseWorkload<std::equal_to<float>,
70 armnn::EqualQueueDescriptor,
71 armnn::StringMapping::RefEqualWorkload_Execute>;
72
73using RefGreaterWorkload =
74 RefElementwiseWorkload<std::greater<float>,
75 armnn::GreaterQueueDescriptor,
76 armnn::StringMapping::RefGreaterWorkload_Execute>;
David Beck279f8722018-09-12 13:50:03 +010077} // armnn