blob: cbacd9c21e126f9350e46707f36f891be7aff96a [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
35 m_Input0 = MakeDecoder<InType>(inputInfo0, m_Data.m_Inputs[0]->Map());
36 m_Input1 = MakeDecoder<InType>(inputInfo1, m_Data.m_Inputs[1]->Map());
37 m_Output = MakeEncoder<OutType>(outputInfo, m_Data.m_Outputs[0]->Map());
38}
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
Derek Lambertif30f7d32019-04-09 10:25:02 +010052 ElementwiseFunction<Functor>(inShape0,
53 inShape1,
54 outShape,
55 *m_Input0,
56 *m_Input1,
57 *m_Output);
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000058}
59
Derek Lambertif30f7d32019-04-09 10:25:02 +010060} //namespace armnn
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000061
Sadik Armaganef38d5d2019-03-25 09:03:35 +000062template class armnn::RefElementwiseWorkload<std::plus<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010063 armnn::AdditionQueueDescriptor,
64 armnn::StringMapping::RefAdditionWorkload_Execute>;
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000065
Sadik Armaganef38d5d2019-03-25 09:03:35 +000066template class armnn::RefElementwiseWorkload<std::minus<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010067 armnn::SubtractionQueueDescriptor,
68 armnn::StringMapping::RefSubtractionWorkload_Execute>;
saoste012df12b32018-11-28 16:57:20 +000069
Sadik Armaganef38d5d2019-03-25 09:03:35 +000070template class armnn::RefElementwiseWorkload<std::multiplies<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010071 armnn::MultiplicationQueueDescriptor,
72 armnn::StringMapping::RefMultiplicationWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000073
74template class armnn::RefElementwiseWorkload<std::divides<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010075 armnn::DivisionQueueDescriptor,
76 armnn::StringMapping::RefDivisionWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000077
78template class armnn::RefElementwiseWorkload<armnn::maximum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010079 armnn::MaximumQueueDescriptor,
80 armnn::StringMapping::RefMaximumWorkload_Execute>;
Sadik Armaganef38d5d2019-03-25 09:03:35 +000081
82template class armnn::RefElementwiseWorkload<armnn::minimum<float>,
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010083 armnn::MinimumQueueDescriptor,
Derek Lambertif30f7d32019-04-09 10:25:02 +010084 armnn::StringMapping::RefMinimumWorkload_Execute>;
85
86template class armnn::RefElementwiseWorkload<std::equal_to<float>,
87 armnn::EqualQueueDescriptor,
88 armnn::StringMapping::RefEqualWorkload_Execute>;
89
90template class armnn::RefElementwiseWorkload<std::greater<float>,
91 armnn::GreaterQueueDescriptor,
92 armnn::StringMapping::RefGreaterWorkload_Execute>;