blob: d2f538745cbb45576a6045e8e42642bdcc5f2d55 [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
10#include <armnn/utility/PolymorphicDowncast.hpp>
Mike Kelly56858022020-01-27 12:14:47 +000011#include <ResolveType.hpp>
12
13namespace armnn
14{
15
16using namespace armcomputetensorutils;
17
18arm_compute::Status NeonBatchToSpaceNdWorkloadValidate(const TensorInfo& input,
19 const TensorInfo& output,
20 const BatchToSpaceNdDescriptor& desc)
21{
22 const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, desc.m_DataLayout);
23 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, desc.m_DataLayout);
24
25 // ArmNN blockShape is [H, W] Cl asks for W, H
26 int32_t blockHeight = boost::numeric_cast<int32_t>(desc.m_BlockShape[0]);
27 int32_t blockWidth = boost::numeric_cast<int32_t>(desc.m_BlockShape[1]);
28
29 const arm_compute::Status aclStatus = arm_compute::NEBatchToSpaceLayer::validate(&aclInputInfo,
30 blockWidth,
31 blockHeight,
32 &aclOutputInfo);
33 return aclStatus;
34}
35
36NeonBatchToSpaceNdWorkload::NeonBatchToSpaceNdWorkload(const BatchToSpaceNdQueueDescriptor& desc,
37 const WorkloadInfo& info)
38 : BaseWorkload<BatchToSpaceNdQueueDescriptor>(desc, info)
39{
40 m_Data.ValidateInputsOutputs("NeonBatchToSpaceNdWorkload", 1, 1);
41
42 arm_compute::ITensor& input =
Jan Eilers3c9e0452020-04-10 13:00:44 +010043 armnn::PolymorphicPointerDowncast<IAclTensorHandle>(m_Data.m_Inputs[0])->GetTensor();
Mike Kelly56858022020-01-27 12:14:47 +000044 arm_compute::ITensor& output =
Jan Eilers3c9e0452020-04-10 13:00:44 +010045 armnn::PolymorphicPointerDowncast<IAclTensorHandle>(m_Data.m_Outputs[0])->GetTensor();
Mike Kelly56858022020-01-27 12:14:47 +000046
47 arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
48 input.info()->set_data_layout(aclDataLayout);
49 output.info()->set_data_layout(aclDataLayout);
50
51 // ArmNN blockShape is [H, W] Cl asks for W, H
52 int32_t blockHeight = boost::numeric_cast<int32_t>(desc.m_Parameters.m_BlockShape[0]);
53 int32_t blockWidth = boost::numeric_cast<int32_t>(desc.m_Parameters.m_BlockShape[1]);
54
55 m_Layer.reset(new arm_compute::NEBatchToSpaceLayer());
56 m_Layer->configure(&input, blockWidth, blockHeight, &output);
57 m_Layer->prepare();
58}
59
60void NeonBatchToSpaceNdWorkload::Execute() const
61{
62 if (m_Layer)
63 {
64 ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonSpaceToBatchNdWorkload_Execute");
65 m_Layer->run();
66 }
67}
68
69} //namespace armnn