From c48ac8c8cea1748ebfef15144f070799d4a129c3 Mon Sep 17 00:00:00 2001 From: Matthew Bentham Date: Wed, 12 Dec 2018 16:15:59 +0000 Subject: MLCE-80 Remove strong typing from NeonBatchNormalization Technical debt work towards adding some new Neon workloads Change-Id: I08ab6dd14d0e89d4ebc8a878fb69caa5681012bf --- src/backends/neon/NeonLayerSupport.cpp | 2 +- src/backends/neon/NeonWorkloadFactory.cpp | 2 +- src/backends/neon/backend.mk | 2 +- src/backends/neon/test/NeonCreateWorkloadTests.cpp | 8 +- src/backends/neon/workloads/CMakeLists.txt | 4 +- .../NeonBatchNormalizationFloatWorkload.cpp | 104 --------------------- .../NeonBatchNormalizationFloatWorkload.hpp | 42 --------- .../workloads/NeonBatchNormalizationWorkload.cpp | 104 +++++++++++++++++++++ .../workloads/NeonBatchNormalizationWorkload.hpp | 40 ++++++++ src/backends/neon/workloads/NeonWorkloads.hpp | 2 +- 10 files changed, 154 insertions(+), 156 deletions(-) delete mode 100644 src/backends/neon/workloads/NeonBatchNormalizationFloatWorkload.cpp delete mode 100644 src/backends/neon/workloads/NeonBatchNormalizationFloatWorkload.hpp create mode 100644 src/backends/neon/workloads/NeonBatchNormalizationWorkload.cpp create mode 100644 src/backends/neon/workloads/NeonBatchNormalizationWorkload.hpp diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 724455de40..7efdf159c9 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -19,7 +19,7 @@ #ifdef ARMCOMPUTENEON_ENABLED #include "workloads/NeonAdditionWorkload.hpp" #include "workloads/NeonActivationWorkload.hpp" -#include "workloads/NeonBatchNormalizationFloatWorkload.hpp" +#include "workloads/NeonBatchNormalizationWorkload.hpp" #include "workloads/NeonConvolution2dWorkload.hpp" #include "workloads/NeonDepthwiseConvolutionWorkload.hpp" #include "workloads/NeonL2NormalizationFloatWorkload.hpp" diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index 848a6f397b..85e5768571 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -185,7 +185,7 @@ std::unique_ptr NeonWorkloadFactory::CreateSubtraction( std::unique_ptr NeonWorkloadFactory::CreateBatchNormalization( const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkloadHelper(descriptor, info); + return std::make_unique(descriptor, info); } std::unique_ptr NeonWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor, diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index a3058ad73e..fdfd696fbe 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -15,7 +15,7 @@ BACKEND_SOURCES := \ NeonWorkloadFactory.cpp \ workloads/NeonActivationWorkload.cpp \ workloads/NeonAdditionWorkload.cpp \ - workloads/NeonBatchNormalizationFloatWorkload.cpp \ + workloads/NeonBatchNormalizationWorkload.cpp \ workloads/NeonConstantWorkload.cpp \ workloads/NeonConvertFp16ToFp32Workload.cpp \ workloads/NeonConvertFp32ToFp16Workload.cpp \ diff --git a/src/backends/neon/test/NeonCreateWorkloadTests.cpp b/src/backends/neon/test/NeonCreateWorkloadTests.cpp index adb64cba9b..86fc457130 100644 --- a/src/backends/neon/test/NeonCreateWorkloadTests.cpp +++ b/src/backends/neon/test/NeonCreateWorkloadTests.cpp @@ -183,23 +183,23 @@ static void NeonCreateBatchNormalizationWorkloadTest(DataLayout dataLayout) #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload) { - NeonCreateBatchNormalizationWorkloadTest(DataLayout::NCHW); + NeonCreateBatchNormalizationWorkloadTest(DataLayout::NCHW); } BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NhwcWorkload) { - NeonCreateBatchNormalizationWorkloadTest(DataLayout::NHWC); + NeonCreateBatchNormalizationWorkloadTest(DataLayout::NHWC); } #endif BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload) { - NeonCreateBatchNormalizationWorkloadTest(DataLayout::NCHW); + NeonCreateBatchNormalizationWorkloadTest(DataLayout::NCHW); } BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload) { - NeonCreateBatchNormalizationWorkloadTest(DataLayout::NHWC); + NeonCreateBatchNormalizationWorkloadTest(DataLayout::NHWC); } template diff --git a/src/backends/neon/workloads/CMakeLists.txt b/src/backends/neon/workloads/CMakeLists.txt index 9961397445..7b0251ce04 100644 --- a/src/backends/neon/workloads/CMakeLists.txt +++ b/src/backends/neon/workloads/CMakeLists.txt @@ -8,8 +8,8 @@ list(APPEND armnnNeonBackendWorkloads_sources NeonActivationWorkload.hpp NeonAdditionWorkload.cpp NeonAdditionWorkload.hpp - NeonBatchNormalizationFloatWorkload.cpp - NeonBatchNormalizationFloatWorkload.hpp + NeonBatchNormalizationWorkload.cpp + NeonBatchNormalizationWorkload.hpp NeonConstantWorkload.cpp NeonConstantWorkload.hpp NeonConvertFp16ToFp32Workload.cpp diff --git a/src/backends/neon/workloads/NeonBatchNormalizationFloatWorkload.cpp b/src/backends/neon/workloads/NeonBatchNormalizationFloatWorkload.cpp deleted file mode 100644 index a8181f66d9..0000000000 --- a/src/backends/neon/workloads/NeonBatchNormalizationFloatWorkload.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "NeonBatchNormalizationFloatWorkload.hpp" -#include -#include -#include - -namespace armnn -{ -using namespace armcomputetensorutils; - - -arm_compute::Status NeonBatchNormalizationValidate(const TensorInfo& input, - const TensorInfo& output, - const TensorInfo& mean, - const TensorInfo& var, - const TensorInfo& beta, - const TensorInfo& gamma, - const BatchNormalizationDescriptor& descriptor) -{ - const arm_compute::TensorInfo aclInputInfo = - armcomputetensorutils::BuildArmComputeTensorInfo(input, descriptor.m_DataLayout); - const arm_compute::TensorInfo aclOutputInfo = - armcomputetensorutils::BuildArmComputeTensorInfo(output, descriptor.m_DataLayout); - const arm_compute::TensorInfo aclMeanInfo = - armcomputetensorutils::BuildArmComputeTensorInfo(mean, descriptor.m_DataLayout); - const arm_compute::TensorInfo aclVarInfo = - armcomputetensorutils::BuildArmComputeTensorInfo(var, descriptor.m_DataLayout); - const arm_compute::TensorInfo aclBetaInfo = - armcomputetensorutils::BuildArmComputeTensorInfo(beta, descriptor.m_DataLayout); - const arm_compute::TensorInfo aclGammaInfo = - armcomputetensorutils::BuildArmComputeTensorInfo(gamma, descriptor.m_DataLayout); - - return arm_compute::NEBatchNormalizationLayer::validate(&aclInputInfo, - &aclOutputInfo, - &aclMeanInfo, - &aclVarInfo, - &aclBetaInfo, - &aclGammaInfo, - descriptor.m_Eps); -} - -NeonBatchNormalizationFloatWorkload::NeonBatchNormalizationFloatWorkload( - const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) - : FloatWorkload(descriptor, info) -{ - m_Data.ValidateInputsOutputs("NeonBatchNormalizationFloatWorkload", 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); - - m_Mean = std::make_unique(); - BuildArmComputeTensor(*m_Mean, m_Data.m_Mean->GetTensorInfo()); - - m_Variance = std::make_unique(); - BuildArmComputeTensor(*m_Variance, m_Data.m_Variance->GetTensorInfo()); - - m_Gamma = std::make_unique(); - BuildArmComputeTensor(*m_Gamma, m_Data.m_Gamma->GetTensorInfo()); - - m_Beta = std::make_unique(); - BuildArmComputeTensor(*m_Beta, m_Data.m_Beta->GetTensorInfo()); - - m_Layer.configure(&input, - &output, - m_Mean.get(), - m_Variance.get(), - m_Beta.get(), - m_Gamma.get(), - m_Data.m_Parameters.m_Eps); - - InitializeArmComputeTensorData(*m_Mean, m_Data.m_Mean); - InitializeArmComputeTensorData(*m_Variance, m_Data.m_Variance); - InitializeArmComputeTensorData(*m_Gamma, m_Data.m_Gamma); - InitializeArmComputeTensorData(*m_Beta, m_Data.m_Beta); - - // Force Compute Library to perform the necessary copying and reshaping, after which - // delete all the input tensors that will no longer be needed - m_Layer.prepare(); - FreeUnusedTensors(); -} - -void NeonBatchNormalizationFloatWorkload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonBatchNormalizationFloatWorkload_Execute"); - m_Layer.run(); -} - -void NeonBatchNormalizationFloatWorkload::FreeUnusedTensors() -{ - FreeTensorIfUnused(m_Mean); - FreeTensorIfUnused(m_Variance); - FreeTensorIfUnused(m_Gamma); - FreeTensorIfUnused(m_Beta); -} - -} //namespace armnn diff --git a/src/backends/neon/workloads/NeonBatchNormalizationFloatWorkload.hpp b/src/backends/neon/workloads/NeonBatchNormalizationFloatWorkload.hpp deleted file mode 100644 index a6289bd900..0000000000 --- a/src/backends/neon/workloads/NeonBatchNormalizationFloatWorkload.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include - -namespace armnn -{ - -arm_compute::Status NeonBatchNormalizationValidate(const TensorInfo& input, - const TensorInfo& output, - const TensorInfo& mean, - const TensorInfo& var, - const TensorInfo& beta, - const TensorInfo& gamma, - const BatchNormalizationDescriptor& descriptor); - -class NeonBatchNormalizationFloatWorkload : public FloatWorkload -{ -public: - NeonBatchNormalizationFloatWorkload(const BatchNormalizationQueueDescriptor& descriptor, - const WorkloadInfo& info); - virtual void Execute() const override; - -private: - mutable arm_compute::NEBatchNormalizationLayer m_Layer; - - std::unique_ptr m_Mean; - std::unique_ptr m_Variance; - std::unique_ptr m_Gamma; - std::unique_ptr m_Beta; - - void FreeUnusedTensors(); -}; - -} //namespace armnn - - - diff --git a/src/backends/neon/workloads/NeonBatchNormalizationWorkload.cpp b/src/backends/neon/workloads/NeonBatchNormalizationWorkload.cpp new file mode 100644 index 0000000000..44d5035431 --- /dev/null +++ b/src/backends/neon/workloads/NeonBatchNormalizationWorkload.cpp @@ -0,0 +1,104 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonBatchNormalizationWorkload.hpp" +#include +#include +#include + +namespace armnn +{ +using namespace armcomputetensorutils; + + +arm_compute::Status NeonBatchNormalizationValidate(const TensorInfo& input, + const TensorInfo& output, + const TensorInfo& mean, + const TensorInfo& var, + const TensorInfo& beta, + const TensorInfo& gamma, + const BatchNormalizationDescriptor& descriptor) +{ + const arm_compute::TensorInfo aclInputInfo = + armcomputetensorutils::BuildArmComputeTensorInfo(input, descriptor.m_DataLayout); + const arm_compute::TensorInfo aclOutputInfo = + armcomputetensorutils::BuildArmComputeTensorInfo(output, descriptor.m_DataLayout); + const arm_compute::TensorInfo aclMeanInfo = + armcomputetensorutils::BuildArmComputeTensorInfo(mean, descriptor.m_DataLayout); + const arm_compute::TensorInfo aclVarInfo = + armcomputetensorutils::BuildArmComputeTensorInfo(var, descriptor.m_DataLayout); + const arm_compute::TensorInfo aclBetaInfo = + armcomputetensorutils::BuildArmComputeTensorInfo(beta, descriptor.m_DataLayout); + const arm_compute::TensorInfo aclGammaInfo = + armcomputetensorutils::BuildArmComputeTensorInfo(gamma, descriptor.m_DataLayout); + + return arm_compute::NEBatchNormalizationLayer::validate(&aclInputInfo, + &aclOutputInfo, + &aclMeanInfo, + &aclVarInfo, + &aclBetaInfo, + &aclGammaInfo, + descriptor.m_Eps); +} + +NeonBatchNormalizationWorkload::NeonBatchNormalizationWorkload( + const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) + : BaseWorkload(descriptor, info) +{ + m_Data.ValidateInputsOutputs("NeonBatchNormalizationWorkload", 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); + + m_Mean = std::make_unique(); + BuildArmComputeTensor(*m_Mean, m_Data.m_Mean->GetTensorInfo()); + + m_Variance = std::make_unique(); + BuildArmComputeTensor(*m_Variance, m_Data.m_Variance->GetTensorInfo()); + + m_Gamma = std::make_unique(); + BuildArmComputeTensor(*m_Gamma, m_Data.m_Gamma->GetTensorInfo()); + + m_Beta = std::make_unique(); + BuildArmComputeTensor(*m_Beta, m_Data.m_Beta->GetTensorInfo()); + + m_Layer.configure(&input, + &output, + m_Mean.get(), + m_Variance.get(), + m_Beta.get(), + m_Gamma.get(), + m_Data.m_Parameters.m_Eps); + + InitializeArmComputeTensorData(*m_Mean, m_Data.m_Mean); + InitializeArmComputeTensorData(*m_Variance, m_Data.m_Variance); + InitializeArmComputeTensorData(*m_Gamma, m_Data.m_Gamma); + InitializeArmComputeTensorData(*m_Beta, m_Data.m_Beta); + + // Force Compute Library to perform the necessary copying and reshaping, after which + // delete all the input tensors that will no longer be needed + m_Layer.prepare(); + FreeUnusedTensors(); +} + +void NeonBatchNormalizationWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonBatchNormalizationWorkload_Execute"); + m_Layer.run(); +} + +void NeonBatchNormalizationWorkload::FreeUnusedTensors() +{ + FreeTensorIfUnused(m_Mean); + FreeTensorIfUnused(m_Variance); + FreeTensorIfUnused(m_Gamma); + FreeTensorIfUnused(m_Beta); +} + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonBatchNormalizationWorkload.hpp b/src/backends/neon/workloads/NeonBatchNormalizationWorkload.hpp new file mode 100644 index 0000000000..52e4db7c90 --- /dev/null +++ b/src/backends/neon/workloads/NeonBatchNormalizationWorkload.hpp @@ -0,0 +1,40 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +namespace armnn +{ + +arm_compute::Status NeonBatchNormalizationValidate(const TensorInfo& input, + const TensorInfo& output, + const TensorInfo& mean, + const TensorInfo& var, + const TensorInfo& beta, + const TensorInfo& gamma, + const BatchNormalizationDescriptor& descriptor); + +class NeonBatchNormalizationWorkload : public BaseWorkload +{ +public: + NeonBatchNormalizationWorkload(const BatchNormalizationQueueDescriptor& descriptor, + const WorkloadInfo& info); + virtual void Execute() const override; + +private: + mutable arm_compute::NEBatchNormalizationLayer m_Layer; + + std::unique_ptr m_Mean; + std::unique_ptr m_Variance; + std::unique_ptr m_Gamma; + std::unique_ptr m_Beta; + + void FreeUnusedTensors(); +}; + +} //namespace armnn + diff --git a/src/backends/neon/workloads/NeonWorkloads.hpp b/src/backends/neon/workloads/NeonWorkloads.hpp index 82142f2aa1..1f08d039ae 100644 --- a/src/backends/neon/workloads/NeonWorkloads.hpp +++ b/src/backends/neon/workloads/NeonWorkloads.hpp @@ -6,7 +6,7 @@ #pragma once #include "NeonActivationWorkload.hpp" #include "NeonAdditionWorkload.hpp" -#include "NeonBatchNormalizationFloatWorkload.hpp" +#include "NeonBatchNormalizationWorkload.hpp" #include "NeonConstantWorkload.hpp" #include "NeonConvertFp16ToFp32Workload.hpp" #include "NeonConvertFp32ToFp16Workload.hpp" -- cgit v1.2.1