blob: 220d2d19080910b5ad1dd69448d30152b1af41d8 [file] [log] [blame]
Sadik Armaganf4464322018-12-20 16:19:12 +00001//
Teresa Charlin588cbdf2022-01-19 15:55:37 +00002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Sadik Armaganf4464322018-12-20 16:19:12 +00003// 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>
Matthew Sloyan171214c2020-09-09 09:07:37 +010012#include <armnn/utility/NumericCast.hpp>
Jan Eilers3c9e0452020-04-10 13:00:44 +010013#include <armnn/utility/PolymorphicDowncast.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000014#include <armnn/backends/TensorHandle.hpp>
Sadik Armaganf4464322018-12-20 16:19:12 +000015#include <cl/ClLayerSupport.hpp>
16#include <cl/ClTensorHandle.hpp>
17#include <cl/ClLayerSupport.hpp>
18
Sadik Armaganf4464322018-12-20 16:19:12 +000019namespace armnn
20{
21using namespace armcomputetensorutils;
22
23arm_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
Matthew Sloyan171214c2020-09-09 09:07:37 +010031 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]);
Sadik Armaganf4464322018-12-20 16:19:12 +000033
Nattapat Chaimanowong17fa2b42019-02-26 12:26:08 +000034 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);
Sadik Armaganf4464322018-12-20 16:19:12 +000038
39 return arm_compute::CLSpaceToBatchLayer::validate(&aclInputInfo,
40 blockWidth,
41 blockHeight,
Nattapat Chaimanowong17fa2b42019-02-26 12:26:08 +000042 paddingLeftTop,
43 paddingRightBottom,
Sadik Armaganf4464322018-12-20 16:19:12 +000044 &aclOutputInfo);
45}
46
47ClSpaceToBatchNdWorkload::ClSpaceToBatchNdWorkload(
Sadik Armagane9444752020-12-02 11:28:58 +000048 const SpaceToBatchNdQueueDescriptor& descriptor,
49 const WorkloadInfo& info,
50 const arm_compute::CLCompileContext& clCompileContext)
Teresa Charlin588cbdf2022-01-19 15:55:37 +000051 : ClBaseWorkload<SpaceToBatchNdQueueDescriptor>(descriptor, info)
Sadik Armaganf4464322018-12-20 16:19:12 +000052{
Keith Davisbcd860a2021-08-05 14:20:33 +010053 // Report Profiling Details
54 ARMNN_REPORT_PROFILING_WORKLOAD_DESC("ClSpaceToBatchNdWorkload_Construct",
55 descriptor.m_Parameters,
56 info,
57 this->GetGuid());
58
Sadik Armaganf4464322018-12-20 16:19:12 +000059 m_Data.ValidateInputsOutputs("ClSpaceToBatchNdWorkload", 1, 1);
60
61 arm_compute::ICLTensor& input =
Jan Eilers3c9e0452020-04-10 13:00:44 +010062 armnn::PolymorphicPointerDowncast<IClTensorHandle>(m_Data.m_Inputs[0])->GetTensor();
Sadik Armaganf4464322018-12-20 16:19:12 +000063 arm_compute::ICLTensor& output =
Jan Eilers3c9e0452020-04-10 13:00:44 +010064 armnn::PolymorphicPointerDowncast<IClTensorHandle>(m_Data.m_Outputs[0])->GetTensor();
Sadik Armaganf4464322018-12-20 16:19:12 +000065
66 // ArmNN blockShape is [H, W] Cl asks for W, H
Matthew Sloyan171214c2020-09-09 09:07:37 +010067 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]);
Sadik Armaganf4464322018-12-20 16:19:12 +000069
Nattapat Chaimanowong17fa2b42019-02-26 12:26:08 +000070 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);
Sadik Armaganf4464322018-12-20 16:19:12 +000074
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
Kevin May9f6862d2021-10-22 15:42:28 +010079 {
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 }
Sadik Armaganf4464322018-12-20 16:19:12 +000089}
90
91void ClSpaceToBatchNdWorkload::Execute() const
92{
Keith Davisbcd860a2021-08-05 14:20:33 +010093 ARMNN_SCOPED_PROFILING_EVENT_CL_GUID("ClSpaceToBatchNdWorkload_Execute", this->GetGuid());
Sadik Armaganf4464322018-12-20 16:19:12 +000094 RunClFunction(m_SpaceToBatchLayer, CHECK_LOCATION());
95}
96
97} //namespace armnn