blob: d7880e0f8d462528a62b25df23d572f645a20898 [file] [log] [blame]
Mike Kelly0be3a882020-01-24 11:27:50 +00001//
2// Copyright © 2020 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "NeonSpaceToBatchNdWorkload.hpp"
7
8#include "NeonWorkloadUtils.hpp"
Jan Eilers3c9e0452020-04-10 13:00:44 +01009
Matthew Sloyan171214c2020-09-09 09:07:37 +010010#include <armnn/utility/NumericCast.hpp>
Jan Eilers3c9e0452020-04-10 13:00:44 +010011#include <armnn/utility/PolymorphicDowncast.hpp>
Matthew Sloyan171214c2020-09-09 09:07:37 +010012
Mike Kelly0be3a882020-01-24 11:27:50 +000013#include <ResolveType.hpp>
14
15namespace armnn
16{
17
18using namespace armcomputetensorutils;
19
20arm_compute::Status NeonSpaceToBatchNdWorkloadValidate(const TensorInfo& input,
21 const TensorInfo& output,
22 const SpaceToBatchNdDescriptor& descriptor)
23{
24 const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
25 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
26
27 // ArmNN blockShape is [H, W] Cl asks for W, H
Matthew Sloyan171214c2020-09-09 09:07:37 +010028 int32_t blockHeight = armnn::numeric_cast<int32_t>(descriptor.m_BlockShape[0]);
29 int32_t blockWidth = armnn::numeric_cast<int32_t>(descriptor.m_BlockShape[1]);
Mike Kelly0be3a882020-01-24 11:27:50 +000030
31 arm_compute::Size2D paddingLeftTop = BuildArmComputeSize2D(
32 descriptor.m_PadList[1].first, descriptor.m_PadList[0].first);
33 arm_compute::Size2D paddingRightBottom = BuildArmComputeSize2D(
34 descriptor.m_PadList[1].second, descriptor.m_PadList[0].second);
35
36 return arm_compute::NESpaceToBatchLayer::validate(&aclInputInfo,
37 blockWidth,
38 blockHeight,
39 paddingLeftTop,
40 paddingRightBottom,
41 &aclOutputInfo);
42}
43
Keith Davis2d0679f2021-08-05 11:35:00 +010044NeonSpaceToBatchNdWorkload::NeonSpaceToBatchNdWorkload(const SpaceToBatchNdQueueDescriptor& descriptor,
Mike Kelly0be3a882020-01-24 11:27:50 +000045 const WorkloadInfo& info)
Keith Davis2d0679f2021-08-05 11:35:00 +010046 : BaseWorkload<SpaceToBatchNdQueueDescriptor>(descriptor, info)
Mike Kelly0be3a882020-01-24 11:27:50 +000047{
Keith Davis2d0679f2021-08-05 11:35:00 +010048 // Report Profiling Details
49 ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonSpaceToBatchNdWorkload_Construct",
50 descriptor.m_Parameters,
51 info,
52 this->GetGuid());
53
Mike Kelly0be3a882020-01-24 11:27:50 +000054 m_Data.ValidateInputsOutputs("NESpaceToBatchNdWorkload", 1, 1);
55
56 arm_compute::ITensor& input =
Jan Eilers3c9e0452020-04-10 13:00:44 +010057 PolymorphicPointerDowncast<IAclTensorHandle>(m_Data.m_Inputs[0])->GetTensor();
Mike Kelly0be3a882020-01-24 11:27:50 +000058 arm_compute::ITensor& output =
Jan Eilers3c9e0452020-04-10 13:00:44 +010059 PolymorphicPointerDowncast<IAclTensorHandle>(m_Data.m_Outputs[0])->GetTensor();
Mike Kelly0be3a882020-01-24 11:27:50 +000060
61 // ArmNN blockShape is [H, W] Cl asks for W, H
Matthew Sloyan171214c2020-09-09 09:07:37 +010062 int32_t blockHeight = armnn::numeric_cast<int32_t>(m_Data.m_Parameters.m_BlockShape[0]);
63 int32_t blockWidth = armnn::numeric_cast<int32_t>(m_Data.m_Parameters.m_BlockShape[1]);
Mike Kelly0be3a882020-01-24 11:27:50 +000064
65 arm_compute::Size2D paddingLeftTop = BuildArmComputeSize2D(
66 m_Data.m_Parameters.m_PadList[1].first, m_Data.m_Parameters.m_PadList[0].first);
67 arm_compute::Size2D paddingRightBottom = BuildArmComputeSize2D(
68 m_Data.m_Parameters.m_PadList[1].second, m_Data.m_Parameters.m_PadList[0].second);
69
70 arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
71 input.info()->set_data_layout(aclDataLayout);
72 output.info()->set_data_layout(aclDataLayout);
73
74 m_Layer.reset(new arm_compute::NESpaceToBatchLayer());
75 m_Layer->configure(&input,
76 blockWidth,
77 blockHeight,
78 paddingLeftTop,
79 paddingRightBottom,
80 &output);
81 m_Layer->prepare();
82}
83
84void NeonSpaceToBatchNdWorkload::Execute() const
85{
86 if (m_Layer)
87 {
Keith Davis2d0679f2021-08-05 11:35:00 +010088 ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID("NeonSpaceToBatchNdWorkload_Execute", this->GetGuid());
Mike Kelly0be3a882020-01-24 11:27:50 +000089 m_Layer->run();
90 }
91}
92
93} //namespace armnn