blob: 433e3e8ad826b33bfaeb27898487b4cc91e3930a [file] [log] [blame]
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "RefComparisonWorkload.hpp"
7
8#include "Decoders.hpp"
9#include "ElementwiseFunction.hpp"
10#include "Encoders.hpp"
11#include "RefWorkloadUtils.hpp"
12
13#include <Profiling.hpp>
14
15#include <armnn/TypesUtils.hpp>
16
17#include <functional>
18
19namespace armnn
20{
21
22RefComparisonWorkload::RefComparisonWorkload(const ComparisonQueueDescriptor& desc,
23 const WorkloadInfo& info)
Finn Williams73c547d2022-02-15 20:47:34 +000024 : RefBaseWorkload<ComparisonQueueDescriptor>(desc, info)
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010025{}
26
27void RefComparisonWorkload::PostAllocationConfigure()
28{
Finn Williamsb8181f72021-04-07 10:23:21 +010029 PostAllocationConfigure(m_Data.m_Inputs, m_Data.m_Outputs);
30}
31
32void RefComparisonWorkload::PostAllocationConfigure(std::vector<ITensorHandle*> inputs,
33 std::vector<ITensorHandle*> outputs)
34{
35 const TensorInfo& inputInfo0 = GetTensorInfo(inputs[0]);
36 const TensorInfo& inputInfo1 = GetTensorInfo(inputs[1]);
37 const TensorInfo& outputInfo = GetTensorInfo(outputs[0]);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010038
39 m_Input0 = MakeDecoder<InType>(inputInfo0);
40 m_Input1 = MakeDecoder<InType>(inputInfo1);
41
42 m_Output = MakeEncoder<OutType>(outputInfo);
43}
44
45void RefComparisonWorkload::Execute() const
46{
Finn Williamsb8181f72021-04-07 10:23:21 +010047 Execute(m_Data.m_Inputs, m_Data.m_Outputs);
48}
49
50void RefComparisonWorkload::ExecuteAsync(WorkingMemDescriptor &workingMemDescriptor)
51{
52 PostAllocationConfigure(workingMemDescriptor.m_Inputs, workingMemDescriptor.m_Outputs);
53
54 Execute(workingMemDescriptor.m_Inputs, workingMemDescriptor.m_Outputs);
55}
56
57void RefComparisonWorkload::Execute(std::vector<ITensorHandle*> inputs, std::vector<ITensorHandle*> outputs) const
58{
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010059 ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefComparisonWorkload_Execute");
60
Finn Williamsb8181f72021-04-07 10:23:21 +010061 const TensorInfo& inputInfo0 = GetTensorInfo(inputs[0]);
62 const TensorInfo& inputInfo1 = GetTensorInfo(inputs[1]);
63 const TensorInfo& outputInfo = GetTensorInfo(outputs[0]);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010064
65 const TensorShape& inShape0 = inputInfo0.GetShape();
66 const TensorShape& inShape1 = inputInfo1.GetShape();
67 const TensorShape& outShape = outputInfo.GetShape();
68
Finn Williamsb8181f72021-04-07 10:23:21 +010069 m_Input0->Reset(inputs[0]->Map());
70 m_Input1->Reset(inputs[1]->Map());
71 m_Output->Reset(outputs[0]->Map());
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010072
josh minor4a3c6102020-01-06 16:40:46 -060073 using EqualFunction = ElementwiseBinaryFunction<std::equal_to<InType>>;
74 using GreaterFunction = ElementwiseBinaryFunction<std::greater<InType>>;
75 using GreaterOrEqualFunction = ElementwiseBinaryFunction<std::greater_equal<InType>>;
76 using LessFunction = ElementwiseBinaryFunction<std::less<InType>>;
77 using LessOrEqualFunction = ElementwiseBinaryFunction<std::less_equal<InType>>;
78 using NotEqualFunction = ElementwiseBinaryFunction<std::not_equal_to<InType>>;
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010079
80 switch (m_Data.m_Parameters.m_Operation)
81 {
82 case ComparisonOperation::Equal:
83 {
84 EqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
85 break;
86 }
87 case ComparisonOperation::Greater:
88 {
89 GreaterFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
90 break;
91 }
92 case ComparisonOperation::GreaterOrEqual:
93 {
94 GreaterOrEqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
95 break;
96 }
97 case ComparisonOperation::Less:
98 {
99 LessFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
100 break;
101 }
102 case ComparisonOperation::LessOrEqual:
103 {
104 LessOrEqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
105 break;
106 }
107 case ComparisonOperation::NotEqual:
108 {
109 NotEqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
110 break;
111 }
112 default:
113 {
114 throw InvalidArgumentException(std::string("Unsupported comparison operation ") +
115 GetComparisonOperationAsCString(m_Data.m_Parameters.m_Operation), CHECK_LOCATION());
116 }
117 }
118}
119
120} // namespace armnn