blob: dd7d325ca5ad9ef0af6de680bff5e1845f3bed64 [file] [log] [blame]
Éanna Ó Catháind57415d2018-11-28 16:24:38 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// 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)
24 : BaseWorkload<ParentDescriptor>(desc, info)
25{
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(
36 WorkingMemDescriptor &workingMemDescriptor)
37{
38 Execute(workingMemDescriptor.m_Inputs, workingMemDescriptor.m_Outputs);
39}
40
41template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
42void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::Execute(
43 std::vector<ITensorHandle*> inputs, std::vector<ITensorHandle*> outputs) const
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000044{
Sadik Armaganef38d5d2019-03-25 09:03:35 +000045 ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, StringMapping::Instance().Get(DebugString));
Finn Williamsb8181f72021-04-07 10:23:21 +010046 const TensorInfo& inputInfo0 = GetTensorInfo(inputs[0]);
47 const TensorInfo& inputInfo1 = GetTensorInfo(inputs[1]);
48 const TensorInfo& outputInfo = GetTensorInfo(outputs[0]);
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000049
Sadik Armaganef38d5d2019-03-25 09:03:35 +000050 const TensorShape& inShape0 = inputInfo0.GetShape();
51 const TensorShape& inShape1 = inputInfo1.GetShape();
52 const TensorShape& outShape = outputInfo.GetShape();
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000053
Finn Williamsb8181f72021-04-07 10:23:21 +010054 std::unique_ptr<Decoder<InType>> input0 = MakeDecoder<InType>(inputInfo0, inputs[0]->Map());
55 std::unique_ptr<Decoder<InType>> input1 = MakeDecoder<InType>(inputInfo1, inputs[1]->Map());
56 std::unique_ptr<Encoder<OutType>> output= MakeEncoder<OutType>(outputInfo, outputs[0]->Map());
Matthew Benthamc394a6d2019-06-24 12:51:25 +010057
josh minor4a3c6102020-01-06 16:40:46 -060058 ElementwiseBinaryFunction<Functor>(inShape0,
59 inShape1,
60 outShape,
Finn Williamsb8181f72021-04-07 10:23:21 +010061 *input0,
62 *input1,
63 *output);
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000064}
65
Derek Lambertif30f7d32019-04-09 10:25:02 +010066} //namespace armnn
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000067
Sadik Armaganef38d5d2019-03-25 09:03:35 +000068template class armnn::RefElementwiseWorkload<std::plus<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010069 armnn::AdditionQueueDescriptor,
70 armnn::StringMapping::RefAdditionWorkload_Execute>;
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000071
Finn Williamscbd2c232020-06-22 15:58:32 +010072template class armnn::RefElementwiseWorkload<std::plus<int32_t>,
73 armnn::AdditionQueueDescriptor,
74 armnn::StringMapping::RefAdditionWorkload_Execute>;
75
Sadik Armaganef38d5d2019-03-25 09:03:35 +000076template class armnn::RefElementwiseWorkload<std::minus<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010077 armnn::SubtractionQueueDescriptor,
78 armnn::StringMapping::RefSubtractionWorkload_Execute>;
saoste012df12b32018-11-28 16:57:20 +000079
Finn Williamscbd2c232020-06-22 15:58:32 +010080template class armnn::RefElementwiseWorkload<std::minus<int32_t>,
81 armnn::SubtractionQueueDescriptor,
82 armnn::StringMapping::RefSubtractionWorkload_Execute>;
83
Sadik Armaganef38d5d2019-03-25 09:03:35 +000084template class armnn::RefElementwiseWorkload<std::multiplies<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010085 armnn::MultiplicationQueueDescriptor,
86 armnn::StringMapping::RefMultiplicationWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000087
Finn Williamscbd2c232020-06-22 15:58:32 +010088template class armnn::RefElementwiseWorkload<std::multiplies<int32_t>,
89 armnn::MultiplicationQueueDescriptor,
90 armnn::StringMapping::RefMultiplicationWorkload_Execute>;
91
Sadik Armaganef38d5d2019-03-25 09:03:35 +000092template class armnn::RefElementwiseWorkload<std::divides<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010093 armnn::DivisionQueueDescriptor,
94 armnn::StringMapping::RefDivisionWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000095
Finn Williamscbd2c232020-06-22 15:58:32 +010096template class armnn::RefElementwiseWorkload<std::divides<int32_t>,
97 armnn::DivisionQueueDescriptor,
98 armnn::StringMapping::RefDivisionWorkload_Execute>;
99
Sadik Armaganef38d5d2019-03-25 09:03:35 +0000100template class armnn::RefElementwiseWorkload<armnn::maximum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100101 armnn::MaximumQueueDescriptor,
102 armnn::StringMapping::RefMaximumWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +0000103
Finn Williamscbd2c232020-06-22 15:58:32 +0100104template class armnn::RefElementwiseWorkload<armnn::maximum<int32_t>,
105 armnn::MaximumQueueDescriptor,
106 armnn::StringMapping::RefMaximumWorkload_Execute>;
107
Sadik Armaganef38d5d2019-03-25 09:03:35 +0000108template class armnn::RefElementwiseWorkload<armnn::minimum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100109 armnn::MinimumQueueDescriptor,
Derek Lambertif30f7d32019-04-09 10:25:02 +0100110 armnn::StringMapping::RefMinimumWorkload_Execute>;
Finn Williamscbd2c232020-06-22 15:58:32 +0100111
112template class armnn::RefElementwiseWorkload<armnn::minimum<int32_t>,
113 armnn::MinimumQueueDescriptor,
114 armnn::StringMapping::RefMinimumWorkload_Execute>;