blob: 2a354755418d3c328b902eb4fadbfc991deeaef6 [file] [log] [blame]
Mike Kelly56858022020-01-27 12:14:47 +00001//
2// Copyright © 2020 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "NeonBatchToSpaceNdWorkload.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 Kelly56858022020-01-27 12:14:47 +000013#include <ResolveType.hpp>
14
15namespace armnn
16{
17
18using namespace armcomputetensorutils;
19
20arm_compute::Status NeonBatchToSpaceNdWorkloadValidate(const TensorInfo& input,
21 const TensorInfo& output,
Keith Davis2d0679f2021-08-05 11:35:00 +010022 const BatchToSpaceNdDescriptor& descriptor)
Mike Kelly56858022020-01-27 12:14:47 +000023{
Keith Davis2d0679f2021-08-05 11:35:00 +010024 const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
25 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
Mike Kelly56858022020-01-27 12:14:47 +000026
27 // ArmNN blockShape is [H, W] Cl asks for W, H
Keith Davis2d0679f2021-08-05 11:35:00 +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 Kelly56858022020-01-27 12:14:47 +000030
31 const arm_compute::Status aclStatus = arm_compute::NEBatchToSpaceLayer::validate(&aclInputInfo,
32 blockWidth,
33 blockHeight,
34 &aclOutputInfo);
35 return aclStatus;
36}
37
Keith Davis2d0679f2021-08-05 11:35:00 +010038NeonBatchToSpaceNdWorkload::NeonBatchToSpaceNdWorkload(const BatchToSpaceNdQueueDescriptor& descriptor,
Mike Kelly56858022020-01-27 12:14:47 +000039 const WorkloadInfo& info)
Keith Davis2d0679f2021-08-05 11:35:00 +010040 : BaseWorkload<BatchToSpaceNdQueueDescriptor>(descriptor, info)
Mike Kelly56858022020-01-27 12:14:47 +000041{
Keith Davis2d0679f2021-08-05 11:35:00 +010042 // Report Profiling Details
43 ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonBatchToSpaceWorkload_Construct",
44 descriptor.m_Parameters,
45 info,
46 this->GetGuid());
47
Mike Kelly56858022020-01-27 12:14:47 +000048 m_Data.ValidateInputsOutputs("NeonBatchToSpaceNdWorkload", 1, 1);
49
50 arm_compute::ITensor& input =
Jan Eilers3c9e0452020-04-10 13:00:44 +010051 armnn::PolymorphicPointerDowncast<IAclTensorHandle>(m_Data.m_Inputs[0])->GetTensor();
Mike Kelly56858022020-01-27 12:14:47 +000052 arm_compute::ITensor& output =
Jan Eilers3c9e0452020-04-10 13:00:44 +010053 armnn::PolymorphicPointerDowncast<IAclTensorHandle>(m_Data.m_Outputs[0])->GetTensor();
Mike Kelly56858022020-01-27 12:14:47 +000054
55 arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
56 input.info()->set_data_layout(aclDataLayout);
57 output.info()->set_data_layout(aclDataLayout);
58
59 // ArmNN blockShape is [H, W] Cl asks for W, H
Keith Davis2d0679f2021-08-05 11:35:00 +010060 int32_t blockHeight = armnn::numeric_cast<int32_t>(descriptor.m_Parameters.m_BlockShape[0]);
61 int32_t blockWidth = armnn::numeric_cast<int32_t>(descriptor.m_Parameters.m_BlockShape[1]);
Mike Kelly56858022020-01-27 12:14:47 +000062
63 m_Layer.reset(new arm_compute::NEBatchToSpaceLayer());
64 m_Layer->configure(&input, blockWidth, blockHeight, &output);
65 m_Layer->prepare();
66}
67
68void NeonBatchToSpaceNdWorkload::Execute() const
69{
70 if (m_Layer)
71 {
Keith Davis2d0679f2021-08-05 11:35:00 +010072 ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID("NeonSpaceToBatchNdWorkload_Execute", this->GetGuid());
Mike Kelly56858022020-01-27 12:14:47 +000073 m_Layer->run();
74 }
75}
76
77} //namespace armnn