blob: 0cf20985f02c0214bea52b22fc2d0080ed0b8196 [file] [log] [blame]
Éanna Ó Catháind57415d2018-11-28 16:24:38 +00001//
Mike Kelly7cbe7812023-07-25 17:37:33 +01002// Copyright © 2018-2023 Arm Ltd and Contributors. All rights reserved.
Éanna Ó Catháind57415d2018-11-28 16:24:38 +00003// SPDX-License-Identifier: MIT
4//
5
6#include "RefElementwiseWorkload.hpp"
Derek Lambertif30f7d32019-04-09 10:25:02 +01007
8#include "Decoders.hpp"
Éanna Ó Catháind57415d2018-11-28 16:24:38 +00009#include "ElementwiseFunction.hpp"
Derek Lambertif30f7d32019-04-09 10:25:02 +010010#include "Encoders.hpp"
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000011#include "Profiling.hpp"
Derek Lambertif30f7d32019-04-09 10:25:02 +010012#include "RefWorkloadUtils.hpp"
Sadik Armaganef38d5d2019-03-25 09:03:35 +000013#include "StringMapping.hpp"
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +010014#include <ResolveType.hpp>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000015#include <vector>
16
17namespace armnn
18{
19
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010020template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
Derek Lambertif30f7d32019-04-09 10:25:02 +010021RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::RefElementwiseWorkload(
22 const ParentDescriptor& desc,
23 const WorkloadInfo& info)
Finn Williams73c547d2022-02-15 20:47:34 +000024 : RefBaseWorkload<ParentDescriptor>(desc, info)
Derek Lambertif30f7d32019-04-09 10:25:02 +010025{
26}
27
28template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
Finn Williamsb8181f72021-04-07 10:23:21 +010029void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::Execute() const
Derek Lambertif30f7d32019-04-09 10:25:02 +010030{
Finn Williamsb8181f72021-04-07 10:23:21 +010031 Execute(m_Data.m_Inputs, m_Data.m_Outputs);
Derek Lambertif30f7d32019-04-09 10:25:02 +010032}
33
34template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
Finn Williamsb8181f72021-04-07 10:23:21 +010035void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::ExecuteAsync(
Matthew Sloyan2d213a72022-06-30 17:13:04 +010036 ExecutionData& executionData)
Finn Williamsb8181f72021-04-07 10:23:21 +010037{
Matthew Sloyan2d213a72022-06-30 17:13:04 +010038 WorkingMemDescriptor* workingMemDescriptor = static_cast<WorkingMemDescriptor*>(executionData.m_Data);
39 Execute(workingMemDescriptor->m_Inputs, workingMemDescriptor->m_Outputs);
Finn Williamsb8181f72021-04-07 10:23:21 +010040}
41
42template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
43void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::Execute(
44 std::vector<ITensorHandle*> inputs, std::vector<ITensorHandle*> outputs) const
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000045{
Mike Kelly7cbe7812023-07-25 17:37:33 +010046 ARMNN_SCOPED_PROFILING_EVENT_REF_NAME_GUID(StringMapping::Instance().Get(DebugString));
Finn Williamsb8181f72021-04-07 10:23:21 +010047 const TensorInfo& inputInfo0 = GetTensorInfo(inputs[0]);
48 const TensorInfo& inputInfo1 = GetTensorInfo(inputs[1]);
49 const TensorInfo& outputInfo = GetTensorInfo(outputs[0]);
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000050
Sadik Armaganef38d5d2019-03-25 09:03:35 +000051 const TensorShape& inShape0 = inputInfo0.GetShape();
52 const TensorShape& inShape1 = inputInfo1.GetShape();
53 const TensorShape& outShape = outputInfo.GetShape();
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000054
Finn Williamsb8181f72021-04-07 10:23:21 +010055 std::unique_ptr<Decoder<InType>> input0 = MakeDecoder<InType>(inputInfo0, inputs[0]->Map());
56 std::unique_ptr<Decoder<InType>> input1 = MakeDecoder<InType>(inputInfo1, inputs[1]->Map());
57 std::unique_ptr<Encoder<OutType>> output= MakeEncoder<OutType>(outputInfo, outputs[0]->Map());
Matthew Benthamc394a6d2019-06-24 12:51:25 +010058
josh minor4a3c6102020-01-06 16:40:46 -060059 ElementwiseBinaryFunction<Functor>(inShape0,
60 inShape1,
61 outShape,
Finn Williamsb8181f72021-04-07 10:23:21 +010062 *input0,
63 *input1,
64 *output);
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000065}
66
Derek Lambertif30f7d32019-04-09 10:25:02 +010067} //namespace armnn
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000068
Sadik Armaganef38d5d2019-03-25 09:03:35 +000069template class armnn::RefElementwiseWorkload<std::plus<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010070 armnn::AdditionQueueDescriptor,
71 armnn::StringMapping::RefAdditionWorkload_Execute>;
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000072
Finn Williamscbd2c232020-06-22 15:58:32 +010073template class armnn::RefElementwiseWorkload<std::plus<int32_t>,
74 armnn::AdditionQueueDescriptor,
75 armnn::StringMapping::RefAdditionWorkload_Execute>;
76
Sadik Armaganef38d5d2019-03-25 09:03:35 +000077template class armnn::RefElementwiseWorkload<std::minus<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010078 armnn::SubtractionQueueDescriptor,
79 armnn::StringMapping::RefSubtractionWorkload_Execute>;
saoste012df12b32018-11-28 16:57:20 +000080
Finn Williamscbd2c232020-06-22 15:58:32 +010081template class armnn::RefElementwiseWorkload<std::minus<int32_t>,
82 armnn::SubtractionQueueDescriptor,
83 armnn::StringMapping::RefSubtractionWorkload_Execute>;
84
Sadik Armaganef38d5d2019-03-25 09:03:35 +000085template class armnn::RefElementwiseWorkload<std::multiplies<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010086 armnn::MultiplicationQueueDescriptor,
87 armnn::StringMapping::RefMultiplicationWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000088
Finn Williamscbd2c232020-06-22 15:58:32 +010089template class armnn::RefElementwiseWorkload<std::multiplies<int32_t>,
90 armnn::MultiplicationQueueDescriptor,
91 armnn::StringMapping::RefMultiplicationWorkload_Execute>;
92
Sadik Armaganef38d5d2019-03-25 09:03:35 +000093template class armnn::RefElementwiseWorkload<std::divides<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010094 armnn::DivisionQueueDescriptor,
95 armnn::StringMapping::RefDivisionWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000096
Finn Williamscbd2c232020-06-22 15:58:32 +010097template class armnn::RefElementwiseWorkload<std::divides<int32_t>,
98 armnn::DivisionQueueDescriptor,
99 armnn::StringMapping::RefDivisionWorkload_Execute>;
100
Sadik Armaganef38d5d2019-03-25 09:03:35 +0000101template class armnn::RefElementwiseWorkload<armnn::maximum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100102 armnn::MaximumQueueDescriptor,
103 armnn::StringMapping::RefMaximumWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +0000104
Finn Williamscbd2c232020-06-22 15:58:32 +0100105template class armnn::RefElementwiseWorkload<armnn::maximum<int32_t>,
106 armnn::MaximumQueueDescriptor,
107 armnn::StringMapping::RefMaximumWorkload_Execute>;
108
Sadik Armaganef38d5d2019-03-25 09:03:35 +0000109template class armnn::RefElementwiseWorkload<armnn::minimum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100110 armnn::MinimumQueueDescriptor,
Derek Lambertif30f7d32019-04-09 10:25:02 +0100111 armnn::StringMapping::RefMinimumWorkload_Execute>;
Finn Williamscbd2c232020-06-22 15:58:32 +0100112
113template class armnn::RefElementwiseWorkload<armnn::minimum<int32_t>,
114 armnn::MinimumQueueDescriptor,
115 armnn::StringMapping::RefMinimumWorkload_Execute>;