blob: 60acbd6252c7400678c1cdd9c60dd1fdf68c1d32 [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>
29void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::PostAllocationConfigure()
30{
31 const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]);
32 const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]);
33 const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
34
Matthew Benthamc394a6d2019-06-24 12:51:25 +010035 m_Input0 = MakeDecoder<InType>(inputInfo0);
36 m_Input1 = MakeDecoder<InType>(inputInfo1);
37 m_Output = MakeEncoder<OutType>(outputInfo);
Derek Lambertif30f7d32019-04-09 10:25:02 +010038}
39
40template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010041void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::Execute() const
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000042{
Sadik Armaganef38d5d2019-03-25 09:03:35 +000043 ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, StringMapping::Instance().Get(DebugString));
Sadik Armaganef38d5d2019-03-25 09:03:35 +000044 const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]);
45 const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]);
46 const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000047
Sadik Armaganef38d5d2019-03-25 09:03:35 +000048 const TensorShape& inShape0 = inputInfo0.GetShape();
49 const TensorShape& inShape1 = inputInfo1.GetShape();
50 const TensorShape& outShape = outputInfo.GetShape();
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000051
Matthew Benthamc394a6d2019-06-24 12:51:25 +010052 m_Input0->Reset(m_Data.m_Inputs[0]->Map());
53 m_Input1->Reset(m_Data.m_Inputs[1]->Map());
54 m_Output->Reset(m_Data.m_Outputs[0]->Map());
55
josh minor4a3c6102020-01-06 16:40:46 -060056 ElementwiseBinaryFunction<Functor>(inShape0,
57 inShape1,
58 outShape,
59 *m_Input0,
60 *m_Input1,
61 *m_Output);
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000062}
63
Derek Lambertif30f7d32019-04-09 10:25:02 +010064} //namespace armnn
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000065
Sadik Armaganef38d5d2019-03-25 09:03:35 +000066template class armnn::RefElementwiseWorkload<std::plus<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010067 armnn::AdditionQueueDescriptor,
68 armnn::StringMapping::RefAdditionWorkload_Execute>;
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000069
Finn Williamscbd2c232020-06-22 15:58:32 +010070template class armnn::RefElementwiseWorkload<std::plus<int32_t>,
71 armnn::AdditionQueueDescriptor,
72 armnn::StringMapping::RefAdditionWorkload_Execute>;
73
Sadik Armaganef38d5d2019-03-25 09:03:35 +000074template class armnn::RefElementwiseWorkload<std::minus<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010075 armnn::SubtractionQueueDescriptor,
76 armnn::StringMapping::RefSubtractionWorkload_Execute>;
saoste012df12b32018-11-28 16:57:20 +000077
Finn Williamscbd2c232020-06-22 15:58:32 +010078template class armnn::RefElementwiseWorkload<std::minus<int32_t>,
79 armnn::SubtractionQueueDescriptor,
80 armnn::StringMapping::RefSubtractionWorkload_Execute>;
81
Sadik Armaganef38d5d2019-03-25 09:03:35 +000082template class armnn::RefElementwiseWorkload<std::multiplies<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010083 armnn::MultiplicationQueueDescriptor,
84 armnn::StringMapping::RefMultiplicationWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000085
Finn Williamscbd2c232020-06-22 15:58:32 +010086template class armnn::RefElementwiseWorkload<std::multiplies<int32_t>,
87 armnn::MultiplicationQueueDescriptor,
88 armnn::StringMapping::RefMultiplicationWorkload_Execute>;
89
Sadik Armaganef38d5d2019-03-25 09:03:35 +000090template class armnn::RefElementwiseWorkload<std::divides<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010091 armnn::DivisionQueueDescriptor,
92 armnn::StringMapping::RefDivisionWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000093
Finn Williamscbd2c232020-06-22 15:58:32 +010094template class armnn::RefElementwiseWorkload<std::divides<int32_t>,
95 armnn::DivisionQueueDescriptor,
96 armnn::StringMapping::RefDivisionWorkload_Execute>;
97
Sadik Armaganef38d5d2019-03-25 09:03:35 +000098template class armnn::RefElementwiseWorkload<armnn::maximum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010099 armnn::MaximumQueueDescriptor,
100 armnn::StringMapping::RefMaximumWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +0000101
Finn Williamscbd2c232020-06-22 15:58:32 +0100102template class armnn::RefElementwiseWorkload<armnn::maximum<int32_t>,
103 armnn::MaximumQueueDescriptor,
104 armnn::StringMapping::RefMaximumWorkload_Execute>;
105
Sadik Armaganef38d5d2019-03-25 09:03:35 +0000106template class armnn::RefElementwiseWorkload<armnn::minimum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100107 armnn::MinimumQueueDescriptor,
Derek Lambertif30f7d32019-04-09 10:25:02 +0100108 armnn::StringMapping::RefMinimumWorkload_Execute>;
Finn Williamscbd2c232020-06-22 15:58:32 +0100109
110template class armnn::RefElementwiseWorkload<armnn::minimum<int32_t>,
111 armnn::MinimumQueueDescriptor,
112 armnn::StringMapping::RefMinimumWorkload_Execute>;