blob: 18bf0a7ad9698f0b8512c60339e79b72fb1ddb0e [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
Sadik Armaganef38d5d2019-03-25 09:03:35 +000070template class armnn::RefElementwiseWorkload<std::minus<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010071 armnn::SubtractionQueueDescriptor,
72 armnn::StringMapping::RefSubtractionWorkload_Execute>;
saoste012df12b32018-11-28 16:57:20 +000073
Sadik Armaganef38d5d2019-03-25 09:03:35 +000074template class armnn::RefElementwiseWorkload<std::multiplies<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010075 armnn::MultiplicationQueueDescriptor,
76 armnn::StringMapping::RefMultiplicationWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000077
78template class armnn::RefElementwiseWorkload<std::divides<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010079 armnn::DivisionQueueDescriptor,
80 armnn::StringMapping::RefDivisionWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000081
82template class armnn::RefElementwiseWorkload<armnn::maximum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010083 armnn::MaximumQueueDescriptor,
84 armnn::StringMapping::RefMaximumWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000085
86template class armnn::RefElementwiseWorkload<armnn::minimum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010087 armnn::MinimumQueueDescriptor,
Derek Lambertif30f7d32019-04-09 10:25:02 +010088 armnn::StringMapping::RefMinimumWorkload_Execute>;