diff options
author | Teresa Charlin <teresa.charlinreyes@arm.com> | 2021-09-01 16:30:34 +0100 |
---|---|---|
committer | TeresaARM <teresa.charlinreyes@arm.com> | 2021-09-29 09:54:21 +0000 |
commit | e89dd69474e237bed1066849ea1f6a4893e4a1a4 (patch) | |
tree | 4569016aa0d12bae938e64b6ed05fe4093229009 /src/backends/neon/workloads/NeonChannelShuffleWorkload.cpp | |
parent | 656f9d9ed51d2226074192071cf6374ff25c154e (diff) | |
download | armnn-e89dd69474e237bed1066849ea1f6a4893e4a1a4.tar.gz |
IVGCVSW-3707 Add Channel Shuffle Workload to CpuAcc backend
Signed-off-by: Teresa Charlin <teresa.charlinreyes@arm.com>
Change-Id: I2e3dee3c73fe58c7cfcb3ce3667884202f46e6aa
Diffstat (limited to 'src/backends/neon/workloads/NeonChannelShuffleWorkload.cpp')
-rw-r--r-- | src/backends/neon/workloads/NeonChannelShuffleWorkload.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/backends/neon/workloads/NeonChannelShuffleWorkload.cpp b/src/backends/neon/workloads/NeonChannelShuffleWorkload.cpp new file mode 100644 index 0000000000..b28ee447b3 --- /dev/null +++ b/src/backends/neon/workloads/NeonChannelShuffleWorkload.cpp @@ -0,0 +1,94 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonChannelShuffleWorkload.hpp" +#include "NeonWorkloadUtils.hpp" + +#include <aclCommon/ArmComputeTensorHandle.hpp> +#include <aclCommon/ArmComputeTensorUtils.hpp> + +#include <armnn/utility/PolymorphicDowncast.hpp> + +namespace armnn +{ + +arm_compute::Status NeonChannelShuffleValidate(const TensorInfo& input, + const TensorInfo& output, + const ChannelShuffleDescriptor& descriptor) +{ + arm_compute::TensorInfo aclInputInfo = armcomputetensorutils::BuildArmComputeTensorInfo(input); + arm_compute::TensorInfo aclOutputInfo = armcomputetensorutils::BuildArmComputeTensorInfo(output); + + // In Arm NN and in NNAPI, channel shuffle implementation is datalayout agnostic and it has axis as a parameter. + // The channel shuffle Implementation for Neon is dependent on datalayout and does not have axis as a parameter, + // it only supports channel shuffle for 4D tensors in dimension C (1 or 3). + arm_compute::DataLayout aclDataLayout; + if (input.GetNumDimensions() == 4) + { + switch (descriptor.m_Axis) + { + case 1: + aclDataLayout = ConvertDataLayout(armnn::DataLayout::NCHW); + break; + case 3: + aclDataLayout = ConvertDataLayout(armnn::DataLayout::NHWC); + break; + default: + return arm_compute::Status{arm_compute::ErrorCode::RUNTIME_ERROR, "Unsupported axis"}; + } + aclInputInfo.set_data_layout(aclDataLayout); + aclOutputInfo.set_data_layout(aclDataLayout); + return arm_compute::NEChannelShuffleLayer::validate(&aclInputInfo, &aclOutputInfo, descriptor.m_NumGroups); + } + else + { + return arm_compute::Status{arm_compute::ErrorCode::RUNTIME_ERROR, "Unsupported number of dimensions"}; + } +} + +NeonChannelShuffleWorkload::NeonChannelShuffleWorkload(const ChannelShuffleQueueDescriptor& descriptor, + const WorkloadInfo& info) + : BaseWorkload<ChannelShuffleQueueDescriptor>(descriptor, info) +{ + // Report Profiling Details + ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonChannelShufflenWorkload_Construct", + descriptor.m_Parameters, + info, + this->GetGuid()); + + m_Data.ValidateInputsOutputs("NeonChannelShuffleWorkload", 1, 1); + + arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor(); + + // In Arm NN and in NNAPI, channel shuffle implementation is datalayout agnostic and it has axis as a parameter. + // The channel shuffle Implementation for Neon is dependent on datalayout and does not have axis as a parameter, + // it only supports channel shuffle for 4D tensors in dimension C (1 or 3). + arm_compute::DataLayout aclDataLayout; + switch (descriptor.m_Parameters.m_Axis) + { + case 1: + aclDataLayout = ConvertDataLayout(armnn::DataLayout::NCHW); + break; + case 3: + aclDataLayout = ConvertDataLayout(armnn::DataLayout::NHWC); + break; + default: + ARMNN_ASSERT_MSG(false, "Unsupported axis"); + break; + } + input.info()->set_data_layout(aclDataLayout); + output.info()->set_data_layout(aclDataLayout); + + m_ChannelShuffleLayer.configure(&input, &output, descriptor.m_Parameters.m_NumGroups); +} + +void NeonChannelShuffleWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID("NeonChannelShuffleWorkload_Execute", this->GetGuid()); + m_ChannelShuffleLayer.run(); +} + +} // namespace armnn |