From 5d2e700a223dab7432a765c64d0bd483a8acdfae Mon Sep 17 00:00:00 2001 From: Nattapat Chaimanowong Date: Fri, 12 Oct 2018 16:03:56 +0100 Subject: IVGCVSW-1951 Remove type templating from NeonPooling2dWorkload Change-Id: I65129a72d7585776797cfe0947a2a0f1f483b72f --- src/backends/neon/NeonLayerSupport.cpp | 2 +- src/backends/neon/NeonWorkloadFactory.cpp | 2 +- src/backends/neon/backend.mk | 4 +- src/backends/neon/test/NeonCreateWorkloadTests.cpp | 14 +++--- src/backends/neon/workloads/CMakeLists.txt | 8 +--- .../neon/workloads/NeonPooling2dBaseWorkload.cpp | 51 --------------------- .../neon/workloads/NeonPooling2dBaseWorkload.hpp | 37 --------------- .../neon/workloads/NeonPooling2dFloatWorkload.cpp | 27 ----------- .../neon/workloads/NeonPooling2dFloatWorkload.hpp | 25 ----------- .../neon/workloads/NeonPooling2dUint8Workload.cpp | 26 ----------- .../neon/workloads/NeonPooling2dUint8Workload.hpp | 25 ----------- .../neon/workloads/NeonPooling2dWorkload.cpp | 52 ++++++++++++++++++++++ .../neon/workloads/NeonPooling2dWorkload.hpp | 30 +++++++++++++ src/backends/neon/workloads/NeonWorkloads.hpp | 4 +- 14 files changed, 95 insertions(+), 212 deletions(-) delete mode 100644 src/backends/neon/workloads/NeonPooling2dBaseWorkload.cpp delete mode 100644 src/backends/neon/workloads/NeonPooling2dBaseWorkload.hpp delete mode 100644 src/backends/neon/workloads/NeonPooling2dFloatWorkload.cpp delete mode 100644 src/backends/neon/workloads/NeonPooling2dFloatWorkload.hpp delete mode 100644 src/backends/neon/workloads/NeonPooling2dUint8Workload.cpp delete mode 100644 src/backends/neon/workloads/NeonPooling2dUint8Workload.hpp create mode 100644 src/backends/neon/workloads/NeonPooling2dWorkload.cpp create mode 100644 src/backends/neon/workloads/NeonPooling2dWorkload.hpp diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 68118a2a94..a044e04f42 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -25,7 +25,7 @@ #include "workloads/NeonNormalizationFloatWorkload.hpp" #include "workloads/NeonFullyConnectedWorkload.hpp" #include "workloads/NeonPermuteWorkload.hpp" -#include "workloads/NeonPooling2dBaseWorkload.hpp" +#include "workloads/NeonPooling2dWorkload.hpp" #include "workloads/NeonSoftmaxBaseWorkload.hpp" #include "workloads/NeonSubtractionFloatWorkload.hpp" #endif diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index 0f386d129d..f133f2bdc3 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -129,7 +129,7 @@ std::unique_ptr NeonWorkloadFactory::CreatePermute(const Permu std::unique_ptr NeonWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + return std::make_unique(descriptor, info); } std::unique_ptr NeonWorkloadFactory::CreateConvolution2d( diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index 26bf33e2f5..132328ba72 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -31,9 +31,7 @@ BACKEND_SOURCES := \ workloads/NeonMultiplicationFloatWorkload.cpp \ workloads/NeonNormalizationFloatWorkload.cpp \ workloads/NeonPermuteWorkload.cpp \ - workloads/NeonPooling2dBaseWorkload.cpp \ - workloads/NeonPooling2dFloatWorkload.cpp \ - workloads/NeonPooling2dUint8Workload.cpp \ + workloads/NeonPooling2dWorkload.cpp \ workloads/NeonReshapeWorkload.cpp \ workloads/NeonSoftmaxBaseWorkload.cpp \ workloads/NeonSoftmaxFloatWorkload.cpp \ diff --git a/src/backends/neon/test/NeonCreateWorkloadTests.cpp b/src/backends/neon/test/NeonCreateWorkloadTests.cpp index e8790c3ae2..2c4d0ae0f9 100644 --- a/src/backends/neon/test/NeonCreateWorkloadTests.cpp +++ b/src/backends/neon/test/NeonCreateWorkloadTests.cpp @@ -324,12 +324,12 @@ BOOST_AUTO_TEST_CASE(CreateNormalizationFloatNhwcWorkload) } -template +template static void NeonCreatePooling2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW) { Graph graph; NeonWorkloadFactory factory; - auto workload = CreatePooling2dWorkloadTest + auto workload = CreatePooling2dWorkloadTest (factory, graph, dataLayout); TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 2, 5, 5} : TensorShape{3, 5, 5, 2}; @@ -346,28 +346,28 @@ static void NeonCreatePooling2dWorkloadTest(DataLayout dataLayout = DataLayout:: #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16Workload) { - NeonCreatePooling2dWorkloadTest(); + NeonCreatePooling2dWorkloadTest(); } #endif BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload) { - NeonCreatePooling2dWorkloadTest(DataLayout::NCHW); + NeonCreatePooling2dWorkloadTest(DataLayout::NCHW); } BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload) { - NeonCreatePooling2dWorkloadTest(DataLayout::NHWC); + NeonCreatePooling2dWorkloadTest(DataLayout::NHWC); } BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NchwWorkload) { - NeonCreatePooling2dWorkloadTest(DataLayout::NCHW); + NeonCreatePooling2dWorkloadTest(DataLayout::NCHW); } BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NhwcWorkload) { - NeonCreatePooling2dWorkloadTest(DataLayout::NHWC); + NeonCreatePooling2dWorkloadTest(DataLayout::NHWC); } template diff --git a/src/backends/neon/workloads/CMakeLists.txt b/src/backends/neon/workloads/CMakeLists.txt index 7f912610ef..a96c27c75a 100644 --- a/src/backends/neon/workloads/CMakeLists.txt +++ b/src/backends/neon/workloads/CMakeLists.txt @@ -46,12 +46,8 @@ list(APPEND armnnNeonBackendWorkloads_sources NeonNormalizationFloatWorkload.hpp NeonPermuteWorkload.cpp NeonPermuteWorkload.hpp - NeonPooling2dBaseWorkload.cpp - NeonPooling2dBaseWorkload.hpp - NeonPooling2dFloatWorkload.cpp - NeonPooling2dFloatWorkload.hpp - NeonPooling2dUint8Workload.cpp - NeonPooling2dUint8Workload.hpp + NeonPooling2dWorkload.cpp + NeonPooling2dWorkload.hpp NeonReshapeWorkload.cpp NeonReshapeWorkload.hpp NeonSoftmaxBaseWorkload.cpp diff --git a/src/backends/neon/workloads/NeonPooling2dBaseWorkload.cpp b/src/backends/neon/workloads/NeonPooling2dBaseWorkload.cpp deleted file mode 100644 index 054f9c5f75..0000000000 --- a/src/backends/neon/workloads/NeonPooling2dBaseWorkload.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "NeonPooling2dBaseWorkload.hpp" -#include -#include -#include -#include - -namespace armnn -{ -using namespace armcomputetensorutils; - -arm_compute::Status NeonPooling2dWorkloadValidate(const TensorInfo& input, - const TensorInfo& output, - const Pooling2dDescriptor& descriptor) -{ - const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout); - const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout); - - arm_compute::PoolingLayerInfo layerInfo = BuildArmComputePoolingLayerInfo(descriptor); - - return arm_compute::NEPoolingLayer::validate(&aclInputInfo, &aclOutputInfo, layerInfo); -} - -template -NeonPooling2dBaseWorkload::NeonPooling2dBaseWorkload( - const Pooling2dQueueDescriptor& descriptor, const WorkloadInfo& info, const std::string& name) - : TypedWorkload(descriptor, info) -{ - m_Data.ValidateInputsOutputs(name, 1, 1); - - arm_compute::ITensor& input = boost::polymorphic_downcast(m_Data.m_Inputs[0])->GetTensor(); - arm_compute::ITensor& output = boost::polymorphic_downcast(m_Data.m_Outputs[0])->GetTensor(); - - arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout); - input.info()->set_data_layout(aclDataLayout); - output.info()->set_data_layout(aclDataLayout); - - arm_compute::PoolingLayerInfo layerInfo = BuildArmComputePoolingLayerInfo(m_Data.m_Parameters); - - m_PoolingLayer.configure(&input, &output, layerInfo); -} - -template class NeonPooling2dBaseWorkload; -template class NeonPooling2dBaseWorkload; - -} //namespace armnn - diff --git a/src/backends/neon/workloads/NeonPooling2dBaseWorkload.hpp b/src/backends/neon/workloads/NeonPooling2dBaseWorkload.hpp deleted file mode 100644 index 8ea41fe18a..0000000000 --- a/src/backends/neon/workloads/NeonPooling2dBaseWorkload.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include - -namespace armnn -{ - -arm_compute::Status NeonPooling2dWorkloadValidate(const TensorInfo& input, - const TensorInfo& output, - const Pooling2dDescriptor& descriptor); - -// Base class template providing an implementation of the Pooling2d layer common to all data types. -template -class NeonPooling2dBaseWorkload : public TypedWorkload -{ -public: - using TypedWorkload::m_Data; - - NeonPooling2dBaseWorkload(const Pooling2dQueueDescriptor& descriptor, const WorkloadInfo& info, - const std::string& name); - -protected: - mutable arm_compute::NEPoolingLayer m_PoolingLayer; -}; - - -} //namespace armnn - - - - - diff --git a/src/backends/neon/workloads/NeonPooling2dFloatWorkload.cpp b/src/backends/neon/workloads/NeonPooling2dFloatWorkload.cpp deleted file mode 100644 index 46996b088c..0000000000 --- a/src/backends/neon/workloads/NeonPooling2dFloatWorkload.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "NeonPooling2dFloatWorkload.hpp" - - - -namespace armnn -{ - -NeonPooling2dFloatWorkload::NeonPooling2dFloatWorkload(const Pooling2dQueueDescriptor& descriptor, - const WorkloadInfo& info) - : NeonPooling2dBaseWorkload(descriptor, info, - "NeonPooling2dFloatWorkload") -{ -} - -void NeonPooling2dFloatWorkload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonPooling2dFloatWorkload_Execute"); - m_PoolingLayer.run(); -} - -} //namespace armnn - diff --git a/src/backends/neon/workloads/NeonPooling2dFloatWorkload.hpp b/src/backends/neon/workloads/NeonPooling2dFloatWorkload.hpp deleted file mode 100644 index 9b0eebdc2b..0000000000 --- a/src/backends/neon/workloads/NeonPooling2dFloatWorkload.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include -#include "NeonPooling2dBaseWorkload.hpp" - -namespace armnn -{ - -class NeonPooling2dFloatWorkload : public NeonPooling2dBaseWorkload -{ -public: - NeonPooling2dFloatWorkload(const Pooling2dQueueDescriptor& descriptor, const WorkloadInfo& info); - virtual void Execute() const override; -}; - -} //namespace armnn - - - diff --git a/src/backends/neon/workloads/NeonPooling2dUint8Workload.cpp b/src/backends/neon/workloads/NeonPooling2dUint8Workload.cpp deleted file mode 100644 index 8f99a2be86..0000000000 --- a/src/backends/neon/workloads/NeonPooling2dUint8Workload.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "NeonPooling2dUint8Workload.hpp" - - - -namespace armnn -{ - -NeonPooling2dUint8Workload::NeonPooling2dUint8Workload(const Pooling2dQueueDescriptor& descriptor, - const WorkloadInfo& info) - : NeonPooling2dBaseWorkload(descriptor, info, "NeonPooling2dUint8Workload") -{ -} - -void NeonPooling2dUint8Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonPooling2dUint8Workload_Execute"); - m_PoolingLayer.run(); -} - -} //namespace armnn - diff --git a/src/backends/neon/workloads/NeonPooling2dUint8Workload.hpp b/src/backends/neon/workloads/NeonPooling2dUint8Workload.hpp deleted file mode 100644 index d475c5f721..0000000000 --- a/src/backends/neon/workloads/NeonPooling2dUint8Workload.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include -#include "NeonPooling2dBaseWorkload.hpp" - -namespace armnn -{ - -class NeonPooling2dUint8Workload : public NeonPooling2dBaseWorkload -{ -public: - NeonPooling2dUint8Workload(const Pooling2dQueueDescriptor& descriptor, const WorkloadInfo& info); - virtual void Execute() const override; -}; - -} //namespace armnn - - - - diff --git a/src/backends/neon/workloads/NeonPooling2dWorkload.cpp b/src/backends/neon/workloads/NeonPooling2dWorkload.cpp new file mode 100644 index 0000000000..7892b3a315 --- /dev/null +++ b/src/backends/neon/workloads/NeonPooling2dWorkload.cpp @@ -0,0 +1,52 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonPooling2dWorkload.hpp" +#include +#include +#include +#include + +namespace armnn +{ +using namespace armcomputetensorutils; + +arm_compute::Status NeonPooling2dWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const Pooling2dDescriptor& descriptor) +{ + const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout); + const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout); + + arm_compute::PoolingLayerInfo layerInfo = BuildArmComputePoolingLayerInfo(descriptor); + + return arm_compute::NEPoolingLayer::validate(&aclInputInfo, &aclOutputInfo, layerInfo); +} + +NeonPooling2dWorkload::NeonPooling2dWorkload( + const Pooling2dQueueDescriptor& descriptor, const WorkloadInfo& info) + : BaseWorkload(descriptor, info) +{ + m_Data.ValidateInputsOutputs("NeonPooling2dWorkload", 1, 1); + + arm_compute::ITensor& input = boost::polymorphic_downcast(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ITensor& output = boost::polymorphic_downcast(m_Data.m_Outputs[0])->GetTensor(); + + arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout); + input.info()->set_data_layout(aclDataLayout); + output.info()->set_data_layout(aclDataLayout); + + arm_compute::PoolingLayerInfo layerInfo = BuildArmComputePoolingLayerInfo(m_Data.m_Parameters); + + m_PoolingLayer.configure(&input, &output, layerInfo); +} + +void NeonPooling2dWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonPooling2dWorkload_Execute"); + m_PoolingLayer.run(); +} + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonPooling2dWorkload.hpp b/src/backends/neon/workloads/NeonPooling2dWorkload.hpp new file mode 100644 index 0000000000..848221cc6e --- /dev/null +++ b/src/backends/neon/workloads/NeonPooling2dWorkload.hpp @@ -0,0 +1,30 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +namespace armnn +{ + +arm_compute::Status NeonPooling2dWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const Pooling2dDescriptor& descriptor); + +class NeonPooling2dWorkload : public BaseWorkload +{ +public: + using BaseWorkload::m_Data; + + NeonPooling2dWorkload(const Pooling2dQueueDescriptor& descriptor, const WorkloadInfo& info); + + void Execute() const override; + +private: + mutable arm_compute::NEPoolingLayer m_PoolingLayer; +}; + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonWorkloads.hpp b/src/backends/neon/workloads/NeonWorkloads.hpp index 917b1feac3..93711b6fc1 100644 --- a/src/backends/neon/workloads/NeonWorkloads.hpp +++ b/src/backends/neon/workloads/NeonWorkloads.hpp @@ -25,9 +25,7 @@ #include "NeonMultiplicationFloatWorkload.hpp" #include "NeonNormalizationFloatWorkload.hpp" #include "NeonPermuteWorkload.hpp" -#include "NeonPooling2dBaseWorkload.hpp" -#include "NeonPooling2dFloatWorkload.hpp" -#include "NeonPooling2dUint8Workload.hpp" +#include "NeonPooling2dWorkload.hpp" #include "NeonReshapeWorkload.hpp" #include "NeonSoftmaxFloatWorkload.hpp" #include "NeonSoftmaxUint8Workload.hpp" -- cgit v1.2.1