blob: 0ce83a99f3430b817f97a21eecc7654278f967ce [file] [log] [blame]
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +01001//
Matthew Sloyan2d213a72022-06-30 17:13:04 +01002// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +01003// 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
Matthew Sloyan2d213a72022-06-30 17:13:04 +010050void RefComparisonWorkload::ExecuteAsync(ExecutionData& executionData)
Finn Williamsb8181f72021-04-07 10:23:21 +010051{
Matthew Sloyan2d213a72022-06-30 17:13:04 +010052 WorkingMemDescriptor* workingMemDescriptor = static_cast<WorkingMemDescriptor*>(executionData.m_Data);
Finn Williamsb8181f72021-04-07 10:23:21 +010053
Matthew Sloyan2d213a72022-06-30 17:13:04 +010054 PostAllocationConfigure(workingMemDescriptor->m_Inputs, workingMemDescriptor->m_Outputs);
55 Execute(workingMemDescriptor->m_Inputs, workingMemDescriptor->m_Outputs);
Finn Williamsb8181f72021-04-07 10:23:21 +010056}
57
58void RefComparisonWorkload::Execute(std::vector<ITensorHandle*> inputs, std::vector<ITensorHandle*> outputs) const
59{
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010060 ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefComparisonWorkload_Execute");
61
Finn Williamsb8181f72021-04-07 10:23:21 +010062 const TensorInfo& inputInfo0 = GetTensorInfo(inputs[0]);
63 const TensorInfo& inputInfo1 = GetTensorInfo(inputs[1]);
64 const TensorInfo& outputInfo = GetTensorInfo(outputs[0]);
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010065
66 const TensorShape& inShape0 = inputInfo0.GetShape();
67 const TensorShape& inShape1 = inputInfo1.GetShape();
68 const TensorShape& outShape = outputInfo.GetShape();
69
Finn Williamsb8181f72021-04-07 10:23:21 +010070 m_Input0->Reset(inputs[0]->Map());
71 m_Input1->Reset(inputs[1]->Map());
72 m_Output->Reset(outputs[0]->Map());
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010073
josh minor4a3c6102020-01-06 16:40:46 -060074 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>>;
Aron Virginas-Tar77bfb5e2019-10-16 17:45:38 +010080
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