From 12055747d47657a89d60748a078897f6436e6aa0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=89anna=20=C3=93=20Cath=C3=A1in?= Date: Fri, 25 Jan 2019 10:01:40 +0000 Subject: [PATCH] MLCE-84 Add Neon Pad support and unit tests Change-Id: I0d949a9f23a61af5013efdd18572b29fae585f2a --- src/backends/neon/NeonLayerSupport.cpp | 13 ++++++ src/backends/neon/NeonLayerSupport.hpp | 5 +++ src/backends/neon/NeonWorkloadFactory.cpp | 2 +- src/backends/neon/backend.mk | 1 + src/backends/neon/test/NeonLayerTests.cpp | 5 +++ src/backends/neon/workloads/CMakeLists.txt | 2 + src/backends/neon/workloads/NeonPadWorkload.cpp | 57 +++++++++++++++++++++++++ src/backends/neon/workloads/NeonPadWorkload.hpp | 30 +++++++++++++ src/backends/neon/workloads/NeonWorkloads.hpp | 1 + 9 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/backends/neon/workloads/NeonPadWorkload.cpp create mode 100644 src/backends/neon/workloads/NeonPadWorkload.hpp diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 9db7354..3b09676 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -30,6 +30,7 @@ #include "workloads/NeonMultiplicationFloatWorkload.hpp" #include "workloads/NeonNormalizationFloatWorkload.hpp" #include "workloads/NeonFullyConnectedWorkload.hpp" +#include "workloads/NeonPadWorkload.hpp" #include "workloads/NeonPermuteWorkload.hpp" #include "workloads/NeonPooling2dWorkload.hpp" #include "workloads/NeonResizeBilinearWorkload.hpp" @@ -356,6 +357,18 @@ bool NeonLayerSupport::IsOutputSupported(const TensorInfo& output, &TrueFunc<>); } +bool NeonLayerSupport::IsPadSupported(const TensorInfo& input, + const TensorInfo& output, + const PadDescriptor& descriptor, + Optional reasonIfUnsupported) const +{ + FORWARD_WORKLOAD_VALIDATE_FUNC(NeonPadWorkloadValidate, + reasonIfUnsupported, + input, + output, + descriptor); +} + bool NeonLayerSupport::IsPermuteSupported(const TensorInfo& input, const TensorInfo& output, const PermuteDescriptor& descriptor, diff --git a/src/backends/neon/NeonLayerSupport.hpp b/src/backends/neon/NeonLayerSupport.hpp index 6316324..6de5c78 100644 --- a/src/backends/neon/NeonLayerSupport.hpp +++ b/src/backends/neon/NeonLayerSupport.hpp @@ -112,6 +112,11 @@ public: bool IsOutputSupported(const TensorInfo& output, Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsPadSupported(const TensorInfo& input, + const TensorInfo& output, + const PadDescriptor& descriptor, + Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsPermuteSupported(const TensorInfo& input, const TensorInfo& output, const PermuteDescriptor& descriptor, diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index 76e1dd0..5c7eecc 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -286,7 +286,7 @@ std::unique_ptr NeonWorkloadFactory::CreateMean(const MeanQueueDescri std::unique_ptr NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkloadHelper(descriptor, info); + return std::make_unique(descriptor, info); } std::unique_ptr NeonWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor, diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index 1ebeae5..09dca63 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -31,6 +31,7 @@ BACKEND_SOURCES := \ workloads/NeonMinimumWorkload.cpp \ workloads/NeonMultiplicationFloatWorkload.cpp \ workloads/NeonNormalizationFloatWorkload.cpp \ + workloads/NeonPadWorkload.cpp \ workloads/NeonPermuteWorkload.cpp \ workloads/NeonPooling2dWorkload.cpp \ workloads/NeonReshapeWorkload.cpp \ diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index 6975374..b229cd0 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -386,6 +386,11 @@ ARMNN_AUTO_TEST_CASE(SimpleFloor, SimpleFloorTest) ARMNN_AUTO_TEST_CASE(SimpleReshapeFloat32, SimpleReshapeFloat32Test) ARMNN_AUTO_TEST_CASE(SimpleReshapeUint8, SimpleReshapeUint8Test) +// Pad +ARMNN_AUTO_TEST_CASE(PadFloat322d, PadFloat322dTest) +ARMNN_AUTO_TEST_CASE(PadFloat323d, PadFloat323dTest) +ARMNN_AUTO_TEST_CASE(PadFloat324d, PadFloat324dTest) + // Permute ARMNN_AUTO_TEST_CASE(SimplePermuteFloat32, SimplePermuteFloat32Test) ARMNN_AUTO_TEST_CASE(SimplePermuteUint8, SimplePermuteUint8Test) diff --git a/src/backends/neon/workloads/CMakeLists.txt b/src/backends/neon/workloads/CMakeLists.txt index 713418d..1a1ed74 100644 --- a/src/backends/neon/workloads/CMakeLists.txt +++ b/src/backends/neon/workloads/CMakeLists.txt @@ -40,6 +40,8 @@ list(APPEND armnnNeonBackendWorkloads_sources NeonMultiplicationFloatWorkload.hpp NeonNormalizationFloatWorkload.cpp NeonNormalizationFloatWorkload.hpp + NeonPadWorkload.cpp + NeonPadWorkload.hpp NeonPermuteWorkload.cpp NeonPermuteWorkload.hpp NeonPooling2dWorkload.cpp diff --git a/src/backends/neon/workloads/NeonPadWorkload.cpp b/src/backends/neon/workloads/NeonPadWorkload.cpp new file mode 100644 index 0000000..60d6b8a --- /dev/null +++ b/src/backends/neon/workloads/NeonPadWorkload.cpp @@ -0,0 +1,57 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonPadWorkload.hpp" + +#include +#include +#include +#include + +#include "NeonWorkloadUtils.hpp" + +namespace armnn +{ +using namespace armcomputetensorutils; + +NeonPadWorkload::NeonPadWorkload(const PadQueueDescriptor& descriptor, const WorkloadInfo& info) + : BaseWorkload(descriptor, info) +{ + m_Data.ValidateInputsOutputs("NeonPadWorkload", 1, 1); + + arm_compute::ITensor& input = static_cast(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ITensor& output = static_cast(m_Data.m_Outputs[0])->GetTensor(); + + std::vector> reversed_PadList(descriptor.m_Parameters.m_PadList.size()); + + std::reverse_copy(std::begin(descriptor.m_Parameters.m_PadList), + std::end(descriptor.m_Parameters.m_PadList), + std::begin(reversed_PadList)); + + arm_compute::PaddingList padList = static_cast(reversed_PadList); + + auto layer = std::make_unique(); + layer->configure(&input, &output, padList); + m_Layer.reset(layer.release()); +} + +void NeonPadWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonPadWorkload_Execute"); + m_Layer->run(); +} + +arm_compute::Status NeonPadWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const PadDescriptor& descriptor) +{ + const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input); + const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output); + arm_compute::PaddingList padList = static_cast(descriptor.m_PadList); + + return arm_compute::NEPadLayer::validate(&aclInputInfo, &aclOutputInfo, padList); +} + +} // namespace armnn diff --git a/src/backends/neon/workloads/NeonPadWorkload.hpp b/src/backends/neon/workloads/NeonPadWorkload.hpp new file mode 100644 index 0000000..ab0e821 --- /dev/null +++ b/src/backends/neon/workloads/NeonPadWorkload.hpp @@ -0,0 +1,30 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include +#include +#include +#include + +namespace armnn { + +class NeonPadWorkload : public BaseWorkload +{ +public: + NeonPadWorkload(const PadQueueDescriptor& descriptor, const WorkloadInfo& info); + + void Execute() const override; + +private: + std::unique_ptr m_Layer; +}; + +arm_compute::Status NeonPadWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const PadDescriptor& descriptor); + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonWorkloads.hpp b/src/backends/neon/workloads/NeonWorkloads.hpp index e034cc9..e4f4fcf 100644 --- a/src/backends/neon/workloads/NeonWorkloads.hpp +++ b/src/backends/neon/workloads/NeonWorkloads.hpp @@ -22,6 +22,7 @@ #include "NeonMinimumWorkload.hpp" #include "NeonMultiplicationFloatWorkload.hpp" #include "NeonNormalizationFloatWorkload.hpp" +#include "NeonPadWorkload.hpp" #include "NeonPermuteWorkload.hpp" #include "NeonPooling2dWorkload.hpp" #include "NeonReshapeWorkload.hpp" -- 2.7.4