1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "ClSpaceToBatchNdWorkload.hpp"
7
8 #include "ClWorkloadUtils.hpp"
9
10 #include <aclCommon/ArmComputeUtils.hpp>
11 #include <aclCommon/ArmComputeTensorUtils.hpp>
12 #include <armnn/utility/NumericCast.hpp>
13 #include <armnn/utility/PolymorphicDowncast.hpp>
14 #include <armnn/backends/TensorHandle.hpp>
15 #include <cl/ClLayerSupport.hpp>
16 #include <cl/ClTensorHandle.hpp>
17 #include <cl/ClLayerSupport.hpp>
18
19 namespace armnn
20 {
21 using namespace armcomputetensorutils;
22
ClSpaceToBatchNdWorkloadValidate(const TensorInfo & input,const TensorInfo & output,const SpaceToBatchNdDescriptor & descriptor)23 arm_compute::Status ClSpaceToBatchNdWorkloadValidate(const TensorInfo& input,
24 const TensorInfo& output,
25 const SpaceToBatchNdDescriptor& descriptor)
26 {
27 const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
28 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
29
30 // ArmNN blockShape is [H, W] Cl asks for W, H
31 int32_t blockHeight = armnn::numeric_cast<int32_t>(descriptor.m_BlockShape[0]);
32 int32_t blockWidth = armnn::numeric_cast<int32_t>(descriptor.m_BlockShape[1]);
33
34 arm_compute::Size2D paddingLeftTop = BuildArmComputeSize2D(
35 descriptor.m_PadList[1].first, descriptor.m_PadList[0].first);
36 arm_compute::Size2D paddingRightBottom = BuildArmComputeSize2D(
37 descriptor.m_PadList[1].second, descriptor.m_PadList[0].second);
38
39 return arm_compute::CLSpaceToBatchLayer::validate(&aclInputInfo,
40 blockWidth,
41 blockHeight,
42 paddingLeftTop,
43 paddingRightBottom,
44 &aclOutputInfo);
45 }
46
ClSpaceToBatchNdWorkload(const SpaceToBatchNdQueueDescriptor & descriptor,const WorkloadInfo & info,const arm_compute::CLCompileContext & clCompileContext)47 ClSpaceToBatchNdWorkload::ClSpaceToBatchNdWorkload(
48 const SpaceToBatchNdQueueDescriptor& descriptor,
49 const WorkloadInfo& info,
50 const arm_compute::CLCompileContext& clCompileContext)
51 : ClBaseWorkload<SpaceToBatchNdQueueDescriptor>(descriptor, info)
52 {
53 // Report Profiling Details
54 ARMNN_REPORT_PROFILING_WORKLOAD_DESC("ClSpaceToBatchNdWorkload_Construct",
55 descriptor.m_Parameters,
56 info,
57 this->GetGuid());
58
59 m_Data.ValidateInputsOutputs("ClSpaceToBatchNdWorkload", 1, 1);
60
61 arm_compute::ICLTensor& input =
62 armnn::PolymorphicPointerDowncast<IClTensorHandle>(m_Data.m_Inputs[0])->GetTensor();
63 arm_compute::ICLTensor& output =
64 armnn::PolymorphicPointerDowncast<IClTensorHandle>(m_Data.m_Outputs[0])->GetTensor();
65
66 // ArmNN blockShape is [H, W] Cl asks for W, H
67 int32_t blockHeight = armnn::numeric_cast<int32_t>(m_Data.m_Parameters.m_BlockShape[0]);
68 int32_t blockWidth = armnn::numeric_cast<int32_t>(m_Data.m_Parameters.m_BlockShape[1]);
69
70 arm_compute::Size2D paddingLeftTop = BuildArmComputeSize2D(
71 m_Data.m_Parameters.m_PadList[1].first, m_Data.m_Parameters.m_PadList[0].first);
72 arm_compute::Size2D paddingRightBottom = BuildArmComputeSize2D(
73 m_Data.m_Parameters.m_PadList[1].second, m_Data.m_Parameters.m_PadList[0].second);
74
75 arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
76 input.info()->set_data_layout(aclDataLayout);
77 output.info()->set_data_layout(aclDataLayout);
78
79 {
80 ARMNN_SCOPED_PROFILING_EVENT(Compute::Undefined, "ClSpaceToBatchNdWorkload_configure");
81 m_SpaceToBatchLayer.configure(clCompileContext,
82 &input,
83 blockWidth,
84 blockHeight,
85 paddingLeftTop,
86 paddingRightBottom,
87 &output);
88 }
89 }
90
Execute() const91 void ClSpaceToBatchNdWorkload::Execute() const
92 {
93 ARMNN_SCOPED_PROFILING_EVENT_CL_GUID("ClSpaceToBatchNdWorkload_Execute", this->GetGuid());
94 RunClFunction(m_SpaceToBatchLayer, CHECK_LOCATION());
95 }
96
97 } //namespace armnn
98