blob: b378d5f843164db79004f595facd07f98b220d64 [file] [log] [blame]
Éanna Ó Catháin12055742019-01-25 10:01:40 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "NeonPadWorkload.hpp"
7
8#include <neon/NeonTensorHandle.hpp>
9#include <aclCommon/ArmComputeTensorUtils.hpp>
10#include <arm_compute/core/Types.h>
11#include <arm_compute/runtime/NEON/functions/NEPadLayer.h>
12
13#include "NeonWorkloadUtils.hpp"
14
15namespace armnn
16{
17using namespace armcomputetensorutils;
18
19NeonPadWorkload::NeonPadWorkload(const PadQueueDescriptor& descriptor, const WorkloadInfo& info)
20 : BaseWorkload<PadQueueDescriptor>(descriptor, info)
21{
Keith Davis2d0679f2021-08-05 11:35:00 +010022 // Report Profiling Details
23 ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonPadWorkload_Construct",
24 descriptor.m_Parameters,
25 info,
26 this->GetGuid());
27
Éanna Ó Catháin12055742019-01-25 10:01:40 +000028 m_Data.ValidateInputsOutputs("NeonPadWorkload", 1, 1);
29
Derek Lambertic81855f2019-06-13 17:34:19 +010030 arm_compute::ITensor& input = static_cast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
31 arm_compute::ITensor& output = static_cast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
Éanna Ó Catháin12055742019-01-25 10:01:40 +000032
33 std::vector<std::pair<unsigned int, unsigned int>> reversed_PadList(descriptor.m_Parameters.m_PadList.size());
34
35 std::reverse_copy(std::begin(descriptor.m_Parameters.m_PadList),
36 std::end(descriptor.m_Parameters.m_PadList),
37 std::begin(reversed_PadList));
38
39 arm_compute::PaddingList padList = static_cast<arm_compute::PaddingList>(reversed_PadList);
40
Mike Kelly0a08ec62019-07-25 08:39:31 +010041 arm_compute::PixelValue pixelValue = GetPixelValue(input, descriptor.m_Parameters.m_PadValue);
FinnWilliamsArma5b5bbf2019-07-08 14:11:33 +010042
Éanna Ó Catháin12055742019-01-25 10:01:40 +000043 auto layer = std::make_unique<arm_compute::NEPadLayer>();
FinnWilliamsArma5b5bbf2019-07-08 14:11:33 +010044 layer->configure(&input, &output, padList, pixelValue);
Éanna Ó Catháin12055742019-01-25 10:01:40 +000045 m_Layer.reset(layer.release());
46}
47
48void NeonPadWorkload::Execute() const
49{
Keith Davis2d0679f2021-08-05 11:35:00 +010050 ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID("NeonPadWorkload_Execute", this->GetGuid());
Éanna Ó Catháin12055742019-01-25 10:01:40 +000051 m_Layer->run();
52}
53
54arm_compute::Status NeonPadWorkloadValidate(const TensorInfo& input,
55 const TensorInfo& output,
56 const PadDescriptor& descriptor)
57{
58 const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input);
59 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output);
Éanna Ó Catháin4a552012019-01-31 10:28:20 +000060
61 std::vector<std::pair<unsigned int, unsigned int>> reversed_PadList(descriptor.m_PadList.size());
62
63 std::reverse_copy(std::begin(descriptor.m_PadList),
64 std::end(descriptor.m_PadList),
65 std::begin(reversed_PadList));
66
67 arm_compute::PaddingList padList = static_cast<arm_compute::PaddingList>(reversed_PadList);
Éanna Ó Catháin12055742019-01-25 10:01:40 +000068
69 return arm_compute::NEPadLayer::validate(&aclInputInfo, &aclOutputInfo, padList);
70}
71
72} // namespace armnn