From d4b70599c1d5f9f4b6b4c757eb46943157874910 Mon Sep 17 00:00:00 2001 From: Nattapat Chaimanowong Date: Fri, 12 Oct 2018 11:21:49 +0100 Subject: IVGCVSW-1951 Remove type templating from NeonActivationWorkload Change-Id: I564a743b4d90ae5364c5958eed3fbfba97782b80 --- src/backends/neon/NeonLayerSupport.cpp | 2 +- src/backends/neon/NeonWorkloadFactory.cpp | 2 +- src/backends/neon/backend.mk | 3 +- src/backends/neon/test/NeonCreateWorkloadTests.cpp | 21 ++++---- src/backends/neon/workloads/CMakeLists.txt | 6 +-- .../neon/workloads/NeonActivationFloatWorkload.cpp | 57 ---------------------- .../neon/workloads/NeonActivationFloatWorkload.hpp | 29 ----------- .../neon/workloads/NeonActivationUint8Workload.cpp | 35 ------------- .../neon/workloads/NeonActivationUint8Workload.hpp | 28 ----------- .../neon/workloads/NeonActivationWorkload.cpp | 55 +++++++++++++++++++++ .../neon/workloads/NeonActivationWorkload.hpp | 27 ++++++++++ src/backends/neon/workloads/NeonWorkloads.hpp | 3 +- 12 files changed, 98 insertions(+), 170 deletions(-) delete mode 100644 src/backends/neon/workloads/NeonActivationFloatWorkload.cpp delete mode 100644 src/backends/neon/workloads/NeonActivationFloatWorkload.hpp delete mode 100644 src/backends/neon/workloads/NeonActivationUint8Workload.cpp delete mode 100644 src/backends/neon/workloads/NeonActivationUint8Workload.hpp create mode 100644 src/backends/neon/workloads/NeonActivationWorkload.cpp create mode 100644 src/backends/neon/workloads/NeonActivationWorkload.hpp diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 8581cfe5d7..68118a2a94 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -16,7 +16,7 @@ #ifdef ARMCOMPUTENEON_ENABLED #include "workloads/NeonAdditionFloatWorkload.hpp" -#include "workloads/NeonActivationFloatWorkload.hpp" +#include "workloads/NeonActivationWorkload.hpp" #include "workloads/NeonBatchNormalizationFloatWorkload.hpp" #include "workloads/NeonConvolution2dBaseWorkload.hpp" #include "workloads/NeonDepthwiseConvolutionBaseWorkload.hpp" diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index dd91b152f2..f17c80edbb 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -91,7 +91,7 @@ std::unique_ptr NeonWorkloadFactory::CreateOutput(const OutputQueueDe std::unique_ptr NeonWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + return std::make_unique(descriptor, info); } std::unique_ptr NeonWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor, diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index b041bca6d7..f3c1843a9c 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -11,8 +11,7 @@ BACKEND_SOURCES := \ NeonBackend.cpp \ NeonLayerSupport.cpp \ NeonWorkloadFactory.cpp \ - workloads/NeonActivationFloatWorkload.cpp \ - workloads/NeonActivationUint8Workload.cpp \ + workloads/NeonActivationWorkload.cpp \ workloads/NeonAdditionFloatWorkload.cpp \ workloads/NeonBatchNormalizationFloatWorkload.cpp \ workloads/NeonConstantFloatWorkload.cpp \ diff --git a/src/backends/neon/test/NeonCreateWorkloadTests.cpp b/src/backends/neon/test/NeonCreateWorkloadTests.cpp index 05281cded2..8a85e7dd94 100644 --- a/src/backends/neon/test/NeonCreateWorkloadTests.cpp +++ b/src/backends/neon/test/NeonCreateWorkloadTests.cpp @@ -51,13 +51,12 @@ bool TestNeonTensorHandleInfo(armnn::INeonTensorHandle* handle, const armnn::Ten } // namespace -template +template static void NeonCreateActivationWorkloadTest() { Graph graph; NeonWorkloadFactory factory; - auto workload = CreateActivationWorkloadTest - (factory, graph); + auto workload = CreateActivationWorkloadTest(factory, graph); // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest). ActivationQueueDescriptor queueDescriptor = workload->GetData(); @@ -70,13 +69,13 @@ static void NeonCreateActivationWorkloadTest() #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload) { - NeonCreateActivationWorkloadTest(); + NeonCreateActivationWorkloadTest(); } #endif BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload) { - NeonCreateActivationWorkloadTest(); + NeonCreateActivationWorkloadTest(); } template wlSplitter; - std::unique_ptr wlActiv0_0; - std::unique_ptr wlActiv0_1; - std::unique_ptr wlActiv1_0; - std::unique_ptr wlActiv1_1; + std::unique_ptr wlActiv0_0; + std::unique_ptr wlActiv0_1; + std::unique_ptr wlActiv1_0; + std::unique_ptr wlActiv1_1; CreateSplitterMultipleInputsOneOutputWorkloadTest(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, - wlActiv1_0, wlActiv1_1); + NeonActivationWorkload, DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, + wlActiv1_0, wlActiv1_1); armnn::INeonTensorHandle* sOut0 = dynamic_cast(wlSplitter->GetData().m_Outputs[0]); armnn::INeonTensorHandle* sOut1 = dynamic_cast(wlSplitter->GetData().m_Outputs[1]); diff --git a/src/backends/neon/workloads/CMakeLists.txt b/src/backends/neon/workloads/CMakeLists.txt index 850c65cb4e..460b870273 100644 --- a/src/backends/neon/workloads/CMakeLists.txt +++ b/src/backends/neon/workloads/CMakeLists.txt @@ -4,10 +4,8 @@ # list(APPEND armnnNeonBackendWorkloads_sources - NeonActivationFloatWorkload.cpp - NeonActivationFloatWorkload.hpp - NeonActivationUint8Workload.cpp - NeonActivationUint8Workload.hpp + NeonActivationWorkload.cpp + NeonActivationWorkload.hpp NeonAdditionFloatWorkload.cpp NeonAdditionFloatWorkload.hpp NeonBaseConstantWorkload.hpp diff --git a/src/backends/neon/workloads/NeonActivationFloatWorkload.cpp b/src/backends/neon/workloads/NeonActivationFloatWorkload.cpp deleted file mode 100644 index 1d6bf70431..0000000000 --- a/src/backends/neon/workloads/NeonActivationFloatWorkload.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "NeonActivationFloatWorkload.hpp" -#include - - -namespace armnn -{ - -arm_compute::Status NeonActivationWorkloadValidate(const TensorInfo& input, - const TensorInfo& output, - const ActivationDescriptor& descriptor) -{ - const arm_compute::TensorInfo aclInput = armcomputetensorutils::BuildArmComputeTensorInfo(input); - const arm_compute::TensorInfo aclOutput = armcomputetensorutils::BuildArmComputeTensorInfo(output); - - const arm_compute::ActivationLayerInfo activationLayerInfo = - ConvertActivationDescriptorToAclActivationLayerInfo(descriptor); - - if (input.GetDataType() == DataType::QuantisedAsymm8 && - activationLayerInfo.activation() == arm_compute::ActivationLayerInfo::ActivationFunction::LOGISTIC) - { - return arm_compute::Status{arm_compute::ErrorCode::RUNTIME_ERROR, - "Neon: Logistic Activations unsupported with QAsymm8 data type."}; - } - - return arm_compute::NEActivationLayer::validate(&aclInput, - &aclOutput, - activationLayerInfo); -} - -NeonActivationFloatWorkload::NeonActivationFloatWorkload(const ActivationQueueDescriptor& descriptor, - const WorkloadInfo& info) - : FloatWorkload(descriptor, info) -{ - m_Data.ValidateInputsOutputs("NeonActivationFloatWorkload", 1, 1); - - const arm_compute::ActivationLayerInfo activationLayerInfo = - ConvertActivationDescriptorToAclActivationLayerInfo(m_Data.m_Parameters); - - 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(); - - m_ActivationLayer.configure(&input, &output, activationLayerInfo); -} - -void NeonActivationFloatWorkload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonActivationFloatWorkload_Execute"); - m_ActivationLayer.run(); -} - -} //namespace armnn - diff --git a/src/backends/neon/workloads/NeonActivationFloatWorkload.hpp b/src/backends/neon/workloads/NeonActivationFloatWorkload.hpp deleted file mode 100644 index 4d2f51fb4f..0000000000 --- a/src/backends/neon/workloads/NeonActivationFloatWorkload.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include - -namespace armnn -{ - -arm_compute::Status NeonActivationWorkloadValidate(const TensorInfo& input, - const TensorInfo& output, - const ActivationDescriptor& descriptor); - -class NeonActivationFloatWorkload : public FloatWorkload -{ -public: - NeonActivationFloatWorkload(const ActivationQueueDescriptor& descriptor, const WorkloadInfo& info); - void Execute() const override; - -private: - mutable arm_compute::NEActivationLayer m_ActivationLayer; -}; -} //namespace armnn - - - diff --git a/src/backends/neon/workloads/NeonActivationUint8Workload.cpp b/src/backends/neon/workloads/NeonActivationUint8Workload.cpp deleted file mode 100644 index 4aed6b510f..0000000000 --- a/src/backends/neon/workloads/NeonActivationUint8Workload.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "NeonActivationUint8Workload.hpp" -#include -#include - -namespace armnn -{ -NeonActivationUint8Workload::NeonActivationUint8Workload(const ActivationQueueDescriptor& descriptor, - const WorkloadInfo& info) - : Uint8Workload(descriptor, info) -{ - auto activation = ConvertActivationFunctionToAclActivationFunction(m_Data.m_Parameters.m_Function); - arm_compute::ActivationLayerInfo layerInfo(activation, - m_Data.m_Parameters.m_A, - m_Data.m_Parameters.m_B); - - m_Data.ValidateInputsOutputs("NeonActivationUint8Workload", 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(); - - m_ActivationLayer.configure(&input, &output, layerInfo); -} - -void NeonActivationUint8Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonActivationUint8Workload_Execute"); - - m_ActivationLayer.run(); -} -} //namespace armnn diff --git a/src/backends/neon/workloads/NeonActivationUint8Workload.hpp b/src/backends/neon/workloads/NeonActivationUint8Workload.hpp deleted file mode 100644 index 56e3544379..0000000000 --- a/src/backends/neon/workloads/NeonActivationUint8Workload.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include - -namespace armnn -{ - -class NeonActivationUint8Workload : public Uint8Workload -{ -public: - NeonActivationUint8Workload(const ActivationQueueDescriptor& descriptor, const WorkloadInfo& info); - virtual void Execute() const override; - -private: - mutable arm_compute::NEActivationLayer m_ActivationLayer; -}; - -} //namespace armnn - - - - - diff --git a/src/backends/neon/workloads/NeonActivationWorkload.cpp b/src/backends/neon/workloads/NeonActivationWorkload.cpp new file mode 100644 index 0000000000..c1c240f65f --- /dev/null +++ b/src/backends/neon/workloads/NeonActivationWorkload.cpp @@ -0,0 +1,55 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonActivationWorkload.hpp" +#include + +namespace armnn +{ + +arm_compute::Status NeonActivationWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const ActivationDescriptor& descriptor) +{ + const arm_compute::TensorInfo aclInput = armcomputetensorutils::BuildArmComputeTensorInfo(input); + const arm_compute::TensorInfo aclOutput = armcomputetensorutils::BuildArmComputeTensorInfo(output); + + const arm_compute::ActivationLayerInfo activationLayerInfo = + ConvertActivationDescriptorToAclActivationLayerInfo(descriptor); + + if (input.GetDataType() == DataType::QuantisedAsymm8 && + activationLayerInfo.activation() == arm_compute::ActivationLayerInfo::ActivationFunction::LOGISTIC) + { + return arm_compute::Status{arm_compute::ErrorCode::RUNTIME_ERROR, + "Neon: Logistic Activations unsupported with QAsymm8 data type."}; + } + + return arm_compute::NEActivationLayer::validate(&aclInput, + &aclOutput, + activationLayerInfo); +} + +NeonActivationWorkload::NeonActivationWorkload(const ActivationQueueDescriptor& descriptor, + const WorkloadInfo& info) + : BaseWorkload(descriptor, info) +{ + m_Data.ValidateInputsOutputs("NeonActivationWorkload", 1, 1); + + const arm_compute::ActivationLayerInfo activationLayerInfo = + ConvertActivationDescriptorToAclActivationLayerInfo(m_Data.m_Parameters); + + 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(); + + m_ActivationLayer.configure(&input, &output, activationLayerInfo); +} + +void NeonActivationWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonActivationWorkload_Execute"); + m_ActivationLayer.run(); +} + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonActivationWorkload.hpp b/src/backends/neon/workloads/NeonActivationWorkload.hpp new file mode 100644 index 0000000000..b120f94bdc --- /dev/null +++ b/src/backends/neon/workloads/NeonActivationWorkload.hpp @@ -0,0 +1,27 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +namespace armnn +{ + +arm_compute::Status NeonActivationWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const ActivationDescriptor& descriptor); + +class NeonActivationWorkload : public BaseWorkload +{ +public: + NeonActivationWorkload(const ActivationQueueDescriptor& descriptor, const WorkloadInfo& info); + void Execute() const override; + +private: + mutable arm_compute::NEActivationLayer m_ActivationLayer; +}; + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonWorkloads.hpp b/src/backends/neon/workloads/NeonWorkloads.hpp index a4ab6b2cac..db2df18371 100644 --- a/src/backends/neon/workloads/NeonWorkloads.hpp +++ b/src/backends/neon/workloads/NeonWorkloads.hpp @@ -4,8 +4,7 @@ // #pragma once -#include "NeonActivationFloatWorkload.hpp" -#include "NeonActivationUint8Workload.hpp" +#include "NeonActivationWorkload.hpp" #include "NeonAdditionFloatWorkload.hpp" #include "NeonBaseConstantWorkload.hpp" #include "NeonBaseMergerWorkload.hpp" -- cgit v1.2.1