1 //
2 // Copyright © 2022 Arm Ltd and Contributors. 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
19 namespace armnn
20 {
21
RefComparisonWorkload(const ComparisonQueueDescriptor & desc,const WorkloadInfo & info)22 RefComparisonWorkload::RefComparisonWorkload(const ComparisonQueueDescriptor& desc,
23 const WorkloadInfo& info)
24 : RefBaseWorkload<ComparisonQueueDescriptor>(desc, info)
25 {}
26
PostAllocationConfigure()27 void RefComparisonWorkload::PostAllocationConfigure()
28 {
29 PostAllocationConfigure(m_Data.m_Inputs, m_Data.m_Outputs);
30 }
31
PostAllocationConfigure(std::vector<ITensorHandle * > inputs,std::vector<ITensorHandle * > outputs)32 void 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]);
38
39 m_Input0 = MakeDecoder<InType>(inputInfo0);
40 m_Input1 = MakeDecoder<InType>(inputInfo1);
41
42 m_Output = MakeEncoder<OutType>(outputInfo);
43 }
44
Execute() const45 void RefComparisonWorkload::Execute() const
46 {
47 Execute(m_Data.m_Inputs, m_Data.m_Outputs);
48 }
49
ExecuteAsync(ExecutionData & executionData)50 void RefComparisonWorkload::ExecuteAsync(ExecutionData& executionData)
51 {
52 WorkingMemDescriptor* workingMemDescriptor = static_cast<WorkingMemDescriptor*>(executionData.m_Data);
53
54 PostAllocationConfigure(workingMemDescriptor->m_Inputs, workingMemDescriptor->m_Outputs);
55 Execute(workingMemDescriptor->m_Inputs, workingMemDescriptor->m_Outputs);
56 }
57
Execute(std::vector<ITensorHandle * > inputs,std::vector<ITensorHandle * > outputs) const58 void RefComparisonWorkload::Execute(std::vector<ITensorHandle*> inputs, std::vector<ITensorHandle*> outputs) const
59 {
60 ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefComparisonWorkload_Execute");
61
62 const TensorInfo& inputInfo0 = GetTensorInfo(inputs[0]);
63 const TensorInfo& inputInfo1 = GetTensorInfo(inputs[1]);
64 const TensorInfo& outputInfo = GetTensorInfo(outputs[0]);
65
66 const TensorShape& inShape0 = inputInfo0.GetShape();
67 const TensorShape& inShape1 = inputInfo1.GetShape();
68 const TensorShape& outShape = outputInfo.GetShape();
69
70 m_Input0->Reset(inputs[0]->Map());
71 m_Input1->Reset(inputs[1]->Map());
72 m_Output->Reset(outputs[0]->Map());
73
74 using EqualFunction = ElementwiseBinaryFunction<std::equal_to<InType>>;
75 using GreaterFunction = ElementwiseBinaryFunction<std::greater<InType>>;
76 using GreaterOrEqualFunction = ElementwiseBinaryFunction<std::greater_equal<InType>>;
77 using LessFunction = ElementwiseBinaryFunction<std::less<InType>>;
78 using LessOrEqualFunction = ElementwiseBinaryFunction<std::less_equal<InType>>;
79 using NotEqualFunction = ElementwiseBinaryFunction<std::not_equal_to<InType>>;
80
81 switch (m_Data.m_Parameters.m_Operation)
82 {
83 case ComparisonOperation::Equal:
84 {
85 EqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
86 break;
87 }
88 case ComparisonOperation::Greater:
89 {
90 GreaterFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
91 break;
92 }
93 case ComparisonOperation::GreaterOrEqual:
94 {
95 GreaterOrEqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
96 break;
97 }
98 case ComparisonOperation::Less:
99 {
100 LessFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
101 break;
102 }
103 case ComparisonOperation::LessOrEqual:
104 {
105 LessOrEqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
106 break;
107 }
108 case ComparisonOperation::NotEqual:
109 {
110 NotEqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
111 break;
112 }
113 default:
114 {
115 throw InvalidArgumentException(std::string("Unsupported comparison operation ") +
116 GetComparisonOperationAsCString(m_Data.m_Parameters.m_Operation), CHECK_LOCATION());
117 }
118 }
119 }
120
121 } // namespace armnn
122