blob: 0dcbf76d57287819370a0a67d8902119194c486e [file] [log] [blame]
Sadik Armagana2747482021-02-09 10:28:54 +00001//
Mike Kelly7cbe7812023-07-25 17:37:33 +01002// Copyright © 2021-2023 Arm Ltd and Contributors. All rights reserved.
Sadik Armagana2747482021-02-09 10:28:54 +00003// SPDX-License-Identifier: MIT
4//
5
6#include "NeonReduceWorkload.hpp"
7
8#include <aclCommon/ArmComputeUtils.hpp>
9#include <aclCommon/ArmComputeTensorUtils.hpp>
10
11#include <neon/NeonTensorHandle.hpp>
12
13#include "NeonWorkloadUtils.hpp"
14
15namespace armnn
16{
17using namespace armcomputetensorutils;
18
19arm_compute::Status NeonReduceWorkloadValidate(const TensorInfo& input,
20 const TensorInfo& output,
Keith Davis2d0679f2021-08-05 11:35:00 +010021 const ReduceDescriptor& descriptor)
Sadik Armagana2747482021-02-09 10:28:54 +000022{
Keith Davis2d0679f2021-08-05 11:35:00 +010023 if ( descriptor.m_vAxis.size()==1 || descriptor.m_vAxis.empty())
Matthew Sloyanae123062021-05-07 14:18:01 +000024 {
Matthew Sloyan5fc0fd62021-05-03 12:22:03 +010025 const arm_compute::TensorInfo aclInputInfo = armcomputetensorutils::BuildArmComputeTensorInfo(input);
26 const arm_compute::TensorInfo aclOutputInfo = armcomputetensorutils::BuildArmComputeTensorInfo(output);
27
28 arm_compute::Coordinates coords = BuildArmComputeReductionCoordinates(aclInputInfo.num_dimensions(),
29 input.GetNumDimensions(),
Keith Davis2d0679f2021-08-05 11:35:00 +010030 descriptor.m_vAxis);
Matthew Sloyan5fc0fd62021-05-03 12:22:03 +010031
32 return arm_compute::NEReductionOperation::validate(&aclInputInfo,
33 &aclOutputInfo,
34 static_cast<unsigned int>(coords[0]),
Keith Davis2d0679f2021-08-05 11:35:00 +010035 ConvertReductionOperationToAcl(descriptor),
36 descriptor.m_KeepDims);
Matthew Sloyanae123062021-05-07 14:18:01 +000037 }
Matthew Sloyan5fc0fd62021-05-03 12:22:03 +010038 else
39 {
40 // Validate layer if there are multiple axes.
41 arm_compute::Status status;
Keith Davis2d0679f2021-08-05 11:35:00 +010042 IS_MULTI_AXES_REDUCE_SUPPORTED(NeonReduceWorkloadValidate, input, descriptor, status);
Matthew Sloyan5fc0fd62021-05-03 12:22:03 +010043 return status;
44 }
Sadik Armagana2747482021-02-09 10:28:54 +000045}
46
47NeonReduceWorkload::NeonReduceWorkload(const ReduceQueueDescriptor& descriptor, const WorkloadInfo& info)
Teresa Charlin588cbdf2022-01-19 15:55:37 +000048 : NeonBaseWorkload<ReduceQueueDescriptor>(descriptor, info)
Sadik Armagana2747482021-02-09 10:28:54 +000049{
Keith Davis2d0679f2021-08-05 11:35:00 +010050 // Report Profiling Details
51 ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonReduceWorkload_Construct",
52 descriptor.m_Parameters,
53 info,
54 this->GetGuid());
55
Sadik Armagana2747482021-02-09 10:28:54 +000056 m_Data.ValidateInputsOutputs("NeonReduceWorkload", 1, 1);
57
58 arm_compute::ITensor& input = static_cast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
59 arm_compute::ITensor& output = static_cast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
60
61 arm_compute::Coordinates coords = BuildArmComputeReductionCoordinates(input.info()->num_dimensions(),
62 info.m_InputTensorInfos[0].GetNumDimensions(),
63 m_Data.m_Parameters.m_vAxis);
Matthew Sloyan5fc0fd62021-05-03 12:22:03 +010064
Sadik Armagana2747482021-02-09 10:28:54 +000065 m_Layer.configure(&input,
66 &output,
67 static_cast<unsigned int>(coords[0]),
68 ConvertReductionOperationToAcl(m_Data.m_Parameters),
69 m_Data.m_Parameters.m_KeepDims);
70}
71
72void NeonReduceWorkload::Execute() const
73{
Mike Kelly7cbe7812023-07-25 17:37:33 +010074 ARMNN_SCOPED_PROFILING_EVENT_NEON_NAME_GUID("NeonReduceWorkload_Execute");
Sadik Armagana2747482021-02-09 10:28:54 +000075 m_Layer.run();
76}
77
78} //namespace armnn