blob: 09169ec4b82ac53bf0e244e3e0f2b4bcf02aeb64 [file] [log] [blame]
jimfly01e1fa50c2018-09-21 12:09:51 +01001//
Mike Kelly7cbe7812023-07-25 17:37:33 +01002// Copyright © 2017-2023 Arm Ltd and Contributors. All rights reserved.
jimfly01e1fa50c2018-09-21 12:09:51 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "ClPadWorkload.hpp"
7
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00008#include <cl/ClTensorHandle.hpp>
Teresa Charlin46c657d2021-10-27 22:29:13 +01009#include <aclCommon/ArmComputeUtils.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <aclCommon/ArmComputeTensorUtils.hpp>
jimfly01e1fa50c2018-09-21 12:09:51 +010011#include <arm_compute/core/Types.h>
12
David Beckac42efd2018-09-26 17:41:13 +010013#include "ClWorkloadUtils.hpp"
14
jimfly01e1fa50c2018-09-21 12:09:51 +010015namespace armnn
16{
17using namespace armcomputetensorutils;
18
Sadik Armagane9444752020-12-02 11:28:58 +000019ClPadWorkload::ClPadWorkload(const PadQueueDescriptor& descriptor,
20 const WorkloadInfo& info,
21 const arm_compute::CLCompileContext& clCompileContext)
Teresa Charlin588cbdf2022-01-19 15:55:37 +000022 : ClBaseWorkload<PadQueueDescriptor>(descriptor, info)
jimfly01e1fa50c2018-09-21 12:09:51 +010023{
Keith Davisbcd860a2021-08-05 14:20:33 +010024 // Report Profiling Details
25 ARMNN_REPORT_PROFILING_WORKLOAD_DESC("ClPadWorkload_Construct",
26 descriptor.m_Parameters,
27 info,
28 this->GetGuid());
29
jimfly01e1fa50c2018-09-21 12:09:51 +010030 this->m_Data.ValidateInputsOutputs("ClPadWorkload", 1, 1);
31
32 arm_compute::ICLTensor& input = static_cast<IClTensorHandle*>(this->m_Data.m_Inputs[0])->GetTensor();
33 arm_compute::ICLTensor& output = static_cast<IClTensorHandle*>(this->m_Data.m_Outputs[0])->GetTensor();
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010034
35 std::vector<std::pair<unsigned int, unsigned int>> reversed_PadList(descriptor.m_Parameters.m_PadList.size());
36
37 std::reverse_copy(std::begin(descriptor.m_Parameters.m_PadList),
38 std::end(descriptor.m_Parameters.m_PadList),
39 std::begin(reversed_PadList));
40
41 arm_compute::PaddingList padList = static_cast<arm_compute::PaddingList>(reversed_PadList);
jimfly01e1fa50c2018-09-21 12:09:51 +010042
Matthew Sloyan2e5d0b22021-10-21 14:05:31 +010043 arm_compute::PixelValue pixelValue = GetPixelValue(input.info(), descriptor.m_Parameters.m_PadValue);
FinnWilliamsArmab801622019-07-09 14:46:28 +010044
Kevin May9f6862d2021-10-22 15:42:28 +010045 {
Mike Kelly7cbe7812023-07-25 17:37:33 +010046 ARMNN_SCOPED_PROFILING_EVENT_CL_NAME_GUID("ClPadWorkload_configure");
Teresa Charlin46c657d2021-10-27 22:29:13 +010047 m_Layer.configure(clCompileContext,
48 &input,
49 &output,
50 padList,
51 pixelValue,
52 ConvertPaddingModeToAcl(descriptor.m_Parameters.m_PaddingMode));
Kevin May9f6862d2021-10-22 15:42:28 +010053 }
jimfly01e1fa50c2018-09-21 12:09:51 +010054}
55
Nattapat Chaimanowong4e00a3d2018-10-09 17:05:24 +010056void ClPadWorkload::Execute() const
jimfly01e1fa50c2018-09-21 12:09:51 +010057{
Mike Kelly7cbe7812023-07-25 17:37:33 +010058 ARMNN_SCOPED_PROFILING_EVENT_CL_NAME_GUID("ClPadWorkload_Execute");
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +010059 RunClFunction(m_Layer, CHECK_LOCATION());
jimfly01e1fa50c2018-09-21 12:09:51 +010060}
61
arovir01085f0a42018-10-08 14:48:19 +010062arm_compute::Status ClPadValidate(const TensorInfo& input,
63 const TensorInfo& output,
64 const PadDescriptor& descriptor)
jimfly01e1fa50c2018-09-21 12:09:51 +010065{
66 const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input);
67 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output);
Éanna Ó Catháind0a16082019-01-14 15:50:08 +000068
69 std::vector<std::pair<unsigned int, unsigned int>> reversed_PadList(descriptor.m_PadList.size());
70
71 std::reverse_copy(std::begin(descriptor.m_PadList),
72 std::end(descriptor.m_PadList),
73 std::begin(reversed_PadList));
74
75 arm_compute::PaddingList padList = static_cast<arm_compute::PaddingList>(reversed_PadList);
jimfly01e1fa50c2018-09-21 12:09:51 +010076
Teresa Charlin46c657d2021-10-27 22:29:13 +010077 // PixelValue is currently unused when validating, but it's required to pass in PaddingMode.
78 arm_compute::PixelValue pixelValue = GetPixelValue(&aclInputInfo, descriptor.m_PadValue);
79 const arm_compute::Status aclStatus =
80 arm_compute::CLPadLayer::validate(&aclInputInfo,
81 &aclOutputInfo,
82 padList,
83 pixelValue,
84 ConvertPaddingModeToAcl(descriptor.m_PaddingMode));
jimfly01e1fa50c2018-09-21 12:09:51 +010085
arovir01085f0a42018-10-08 14:48:19 +010086 return aclStatus;
jimfly01e1fa50c2018-09-21 12:09:51 +010087}
88
89} // namespace armnn