From b99480bc522fd98a8e587478b78906e8a57936df Mon Sep 17 00:00:00 2001 From: Conor Kennedy Date: Fri, 8 Mar 2019 08:24:41 +0000 Subject: IVGCVSW-2792 Update Neon Mul/Sub workload for latest CL master * Update Neon Subtraction/Multiplication to use BaseWorkload * Add Uint8 tests for Subtraction/Multiplication Change-Id: Ied2aa048924817a4db0025b9bd9e54151667bd74 Signed-off-by: Conor Kennedy --- src/backends/neon/NeonLayerSupport.cpp | 4 +- src/backends/neon/NeonWorkloadFactory.cpp | 4 +- src/backends/neon/backend.mk | 4 +- src/backends/neon/test/NeonCreateWorkloadTests.cpp | 24 ++++++-- src/backends/neon/test/NeonLayerTests.cpp | 6 ++ src/backends/neon/workloads/CMakeLists.txt | 8 +-- .../workloads/NeonMultiplicationFloatWorkload.cpp | 65 ---------------------- .../workloads/NeonMultiplicationFloatWorkload.hpp | 35 ------------ .../neon/workloads/NeonMultiplicationWorkload.cpp | 63 +++++++++++++++++++++ .../neon/workloads/NeonMultiplicationWorkload.hpp | 31 +++++++++++ .../workloads/NeonSubtractionFloatWorkload.cpp | 52 ----------------- .../workloads/NeonSubtractionFloatWorkload.hpp | 32 ----------- .../neon/workloads/NeonSubtractionWorkload.cpp | 52 +++++++++++++++++ .../neon/workloads/NeonSubtractionWorkload.hpp | 32 +++++++++++ src/backends/neon/workloads/NeonWorkloads.hpp | 4 +- 15 files changed, 216 insertions(+), 200 deletions(-) delete mode 100644 src/backends/neon/workloads/NeonMultiplicationFloatWorkload.cpp delete mode 100644 src/backends/neon/workloads/NeonMultiplicationFloatWorkload.hpp create mode 100644 src/backends/neon/workloads/NeonMultiplicationWorkload.cpp create mode 100644 src/backends/neon/workloads/NeonMultiplicationWorkload.hpp delete mode 100644 src/backends/neon/workloads/NeonSubtractionFloatWorkload.cpp delete mode 100644 src/backends/neon/workloads/NeonSubtractionFloatWorkload.hpp create mode 100644 src/backends/neon/workloads/NeonSubtractionWorkload.cpp create mode 100644 src/backends/neon/workloads/NeonSubtractionWorkload.hpp (limited to 'src/backends/neon') diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 53399a9bf3..46a7e6f79f 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -28,7 +28,7 @@ #include "workloads/NeonMeanWorkload.hpp" #include "workloads/NeonMergerWorkload.hpp" #include "workloads/NeonMinimumWorkload.hpp" -#include "workloads/NeonMultiplicationFloatWorkload.hpp" +#include "workloads/NeonMultiplicationWorkload.hpp" #include "workloads/NeonNormalizationFloatWorkload.hpp" #include "workloads/NeonFullyConnectedWorkload.hpp" #include "workloads/NeonPadWorkload.hpp" @@ -36,7 +36,7 @@ #include "workloads/NeonPooling2dWorkload.hpp" #include "workloads/NeonResizeBilinearWorkload.hpp" #include "workloads/NeonSoftmaxBaseWorkload.hpp" -#include "workloads/NeonSubtractionFloatWorkload.hpp" +#include "workloads/NeonSubtractionWorkload.hpp" #endif using namespace boost; diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index d9bd8b5223..101e59d0c4 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -174,7 +174,7 @@ std::unique_ptr NeonWorkloadFactory::CreateAddition(const Addi std::unique_ptr NeonWorkloadFactory::CreateMultiplication( const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkloadHelper(descriptor, info); + return std::make_unique(descriptor, info); } std::unique_ptr NeonWorkloadFactory::CreateDivision( @@ -186,7 +186,7 @@ std::unique_ptr NeonWorkloadFactory::CreateDivision( std::unique_ptr NeonWorkloadFactory::CreateSubtraction( const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkloadHelper(descriptor, info); + return std::make_unique(descriptor, info); } std::unique_ptr NeonWorkloadFactory::CreateBatchNormalization( diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index d9f2ad2255..c06d05f3cc 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -36,7 +36,7 @@ BACKEND_SOURCES := \ workloads/NeonMeanWorkload.cpp \ workloads/NeonMergerWorkload.cpp \ workloads/NeonMinimumWorkload.cpp \ - workloads/NeonMultiplicationFloatWorkload.cpp \ + workloads/NeonMultiplicationWorkload.cpp \ workloads/NeonNormalizationFloatWorkload.cpp \ workloads/NeonPadWorkload.cpp \ workloads/NeonPermuteWorkload.cpp \ @@ -46,7 +46,7 @@ BACKEND_SOURCES := \ workloads/NeonSoftmaxBaseWorkload.cpp \ workloads/NeonSoftmaxFloatWorkload.cpp \ workloads/NeonSoftmaxUint8Workload.cpp \ - workloads/NeonSubtractionFloatWorkload.cpp + workloads/NeonSubtractionWorkload.cpp else diff --git a/src/backends/neon/test/NeonCreateWorkloadTests.cpp b/src/backends/neon/test/NeonCreateWorkloadTests.cpp index 86fc457130..d4065898a8 100644 --- a/src/backends/neon/test/NeonCreateWorkloadTests.cpp +++ b/src/backends/neon/test/NeonCreateWorkloadTests.cpp @@ -125,7 +125,7 @@ BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload) #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload) { - NeonCreateElementwiseWorkloadTest(); @@ -134,16 +134,24 @@ BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload) BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload) { - NeonCreateElementwiseWorkloadTest(); } +BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload) +{ + NeonCreateElementwiseWorkloadTest(); +} + #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16Workload) { - NeonCreateElementwiseWorkloadTest(); @@ -152,12 +160,20 @@ BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16Workload) BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload) { - NeonCreateElementwiseWorkloadTest(); } +BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload) +{ + NeonCreateElementwiseWorkloadTest(); +} + template static void NeonCreateBatchNormalizationWorkloadTest(DataLayout dataLayout) { diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index 8370da4d14..01773dba03 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -313,11 +313,17 @@ ARMNN_AUTO_TEST_CASE(AddBroadcast1Element, AdditionBroadcast1ElementTest) ARMNN_AUTO_TEST_CASE(SimpleSub, SubtractionTest) ARMNN_AUTO_TEST_CASE(SubBroadcast1Element, SubtractionBroadcast1ElementTest) ARMNN_AUTO_TEST_CASE(SubBroadcast, SubtractionBroadcastTest) +ARMNN_AUTO_TEST_CASE(SubtractionUint8, SubtractionUint8Test) +ARMNN_AUTO_TEST_CASE(SubBroadcastUint8, SubtractionBroadcastUint8Test) +ARMNN_AUTO_TEST_CASE(SubBroadcast1ElementUint8, SubtractionBroadcast1ElementUint8Test) // Mul ARMNN_AUTO_TEST_CASE(SimpleMultiplication, MultiplicationTest) ARMNN_AUTO_TEST_CASE(MultiplicationBroadcast1Element, MultiplicationBroadcast1ElementTest) ARMNN_AUTO_TEST_CASE(MultiplicationBroadcast1DVector, MultiplicationBroadcast1DVectorTest) +ARMNN_AUTO_TEST_CASE(MultiplicationUint8, MultiplicationUint8Test) +ARMNN_AUTO_TEST_CASE(MultiplicationBroadcast1ElementUint8, MultiplicationBroadcast1ElementUint8Test) +ARMNN_AUTO_TEST_CASE(MultiplicationBroadcast1DVectorUint8, MultiplicationBroadcast1DVectorUint8Test) // Batch Norm ARMNN_AUTO_TEST_CASE(BatchNorm, BatchNormTest) diff --git a/src/backends/neon/workloads/CMakeLists.txt b/src/backends/neon/workloads/CMakeLists.txt index 31b0866e23..3bbf64d4fb 100644 --- a/src/backends/neon/workloads/CMakeLists.txt +++ b/src/backends/neon/workloads/CMakeLists.txt @@ -38,8 +38,8 @@ list(APPEND armnnNeonBackendWorkloads_sources NeonMergerWorkload.hpp NeonMinimumWorkload.cpp NeonMinimumWorkload.hpp - NeonMultiplicationFloatWorkload.cpp - NeonMultiplicationFloatWorkload.hpp + NeonMultiplicationWorkload.cpp + NeonMultiplicationWorkload.hpp NeonNormalizationFloatWorkload.cpp NeonNormalizationFloatWorkload.hpp NeonPadWorkload.cpp @@ -59,8 +59,8 @@ list(APPEND armnnNeonBackendWorkloads_sources NeonSoftmaxUint8Workload.cpp NeonSoftmaxUint8Workload.hpp NeonSplitterWorkload.hpp - NeonSubtractionFloatWorkload.cpp - NeonSubtractionFloatWorkload.hpp + NeonSubtractionWorkload.cpp + NeonSubtractionWorkload.hpp NeonWorkloads.hpp NeonWorkloadUtils.hpp ) diff --git a/src/backends/neon/workloads/NeonMultiplicationFloatWorkload.cpp b/src/backends/neon/workloads/NeonMultiplicationFloatWorkload.cpp deleted file mode 100644 index 778e78213c..0000000000 --- a/src/backends/neon/workloads/NeonMultiplicationFloatWorkload.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "NeonMultiplicationFloatWorkload.hpp" - -#include "NeonWorkloadUtils.hpp" - -#include - -namespace armnn -{ - -arm_compute::Status NeonMultiplicationWorkloadValidate(const TensorInfo& input0, - const TensorInfo& input1, - const TensorInfo& output) -{ - const arm_compute::TensorInfo aclInput1 = armcomputetensorutils::BuildArmComputeTensorInfo(input0); - const arm_compute::TensorInfo aclInput2 = armcomputetensorutils::BuildArmComputeTensorInfo(input1); - const arm_compute::TensorInfo aclOutput = armcomputetensorutils::BuildArmComputeTensorInfo(output); - - // At the time of writing, configure() will fail if a rounding policy other than TO_ZERO is supplied to it, - // when providing a scale of 1.0 for F32 tensors, even though the provided rounding policy appears to be - // ignored for F32 tensors. - return arm_compute::NEPixelWiseMultiplication::validate(&aclInput1, - &aclInput2, - &aclOutput, - 1.0f, - arm_compute::ConvertPolicy::SATURATE, - arm_compute::RoundingPolicy::TO_ZERO); -} - -NeonMultiplicationFloatWorkload::NeonMultiplicationFloatWorkload(const MultiplicationQueueDescriptor& descriptor, - const WorkloadInfo& info) - : FloatWorkload(descriptor, info) -{ - m_Data.ValidateInputsOutputs("NeonMultiplicationFloatWorkload", 2, 1); - - arm_compute::ITensor& input1 = boost::polymorphic_downcast(m_Data.m_Inputs[0])->GetTensor(); - arm_compute::ITensor& input2 = boost::polymorphic_downcast(m_Data.m_Inputs[1])->GetTensor(); - arm_compute::ITensor& output = boost::polymorphic_downcast(m_Data.m_Outputs[0])->GetTensor(); - - // At the time of writing, configure() will fail if a rounding policy other than TO_ZERO is supplied to it, - // when providing a scale of 1.0 for F32 tensors, even though the provided rounding policy appears to be - // ignored for F32 tensors. - auto layer = std::make_unique(); - layer->configure(&input1, - &input2, - &output, - 1.0f, - arm_compute::ConvertPolicy::SATURATE, - arm_compute::RoundingPolicy::TO_ZERO); - m_PixelWiseMultiplication.reset(layer.release()); -} - -void NeonMultiplicationFloatWorkload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonMultiplicationFloatWorkload_Execute"); - m_PixelWiseMultiplication->run(); -} - -} //namespace armnn - - diff --git a/src/backends/neon/workloads/NeonMultiplicationFloatWorkload.hpp b/src/backends/neon/workloads/NeonMultiplicationFloatWorkload.hpp deleted file mode 100644 index a65ad4ec4c..0000000000 --- a/src/backends/neon/workloads/NeonMultiplicationFloatWorkload.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include - -#include -#include - -#include - -namespace armnn -{ -arm_compute::Status NeonMultiplicationWorkloadValidate(const TensorInfo& input0, - const TensorInfo& input1, - const TensorInfo& output); - -class NeonMultiplicationFloatWorkload : public FloatWorkload -{ -public: - NeonMultiplicationFloatWorkload(const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info); - virtual void Execute() const override; - -private: - std::unique_ptr m_PixelWiseMultiplication; -}; - -} //namespace armnn - - - - diff --git a/src/backends/neon/workloads/NeonMultiplicationWorkload.cpp b/src/backends/neon/workloads/NeonMultiplicationWorkload.cpp new file mode 100644 index 0000000000..6398b65946 --- /dev/null +++ b/src/backends/neon/workloads/NeonMultiplicationWorkload.cpp @@ -0,0 +1,63 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonMultiplicationWorkload.hpp" + +#include "NeonWorkloadUtils.hpp" + +#include + +namespace armnn +{ + +arm_compute::Status NeonMultiplicationWorkloadValidate(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output) +{ + const arm_compute::TensorInfo aclInput1 = armcomputetensorutils::BuildArmComputeTensorInfo(input0); + const arm_compute::TensorInfo aclInput2 = armcomputetensorutils::BuildArmComputeTensorInfo(input1); + const arm_compute::TensorInfo aclOutput = armcomputetensorutils::BuildArmComputeTensorInfo(output); + + // At the time of writing, configure() will fail if a rounding policy other than TO_ZERO is supplied to it, + // when providing a scale of 1.0 for F32 tensors, even though the provided rounding policy appears to be + // ignored for F32 tensors. + return arm_compute::NEPixelWiseMultiplication::validate(&aclInput1, + &aclInput2, + &aclOutput, + 1.0f, + arm_compute::ConvertPolicy::SATURATE, + arm_compute::RoundingPolicy::TO_ZERO); +} + +NeonMultiplicationWorkload::NeonMultiplicationWorkload(const MultiplicationQueueDescriptor& descriptor, + const WorkloadInfo& info) + : BaseWorkload(descriptor, info) +{ + m_Data.ValidateInputsOutputs("NeonMultiplicationWorkload", 2, 1); + + arm_compute::ITensor& input1 = boost::polymorphic_downcast(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ITensor& input2 = boost::polymorphic_downcast(m_Data.m_Inputs[1])->GetTensor(); + arm_compute::ITensor& output = boost::polymorphic_downcast(m_Data.m_Outputs[0])->GetTensor(); + + // At the time of writing, configure() will fail if a rounding policy other than TO_ZERO is supplied to it, + // when providing a scale of 1.0 for F32 tensors, even though the provided rounding policy appears to be + // ignored for F32 tensors. + auto layer = std::make_unique(); + layer->configure(&input1, + &input2, + &output, + 1.0f, + arm_compute::ConvertPolicy::SATURATE, + arm_compute::RoundingPolicy::TO_ZERO); + m_PixelWiseMultiplication.reset(layer.release()); +} + +void NeonMultiplicationWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonMultiplicationWorkload_Execute"); + m_PixelWiseMultiplication->run(); +} + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonMultiplicationWorkload.hpp b/src/backends/neon/workloads/NeonMultiplicationWorkload.hpp new file mode 100644 index 0000000000..bfbaf776c1 --- /dev/null +++ b/src/backends/neon/workloads/NeonMultiplicationWorkload.hpp @@ -0,0 +1,31 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +#include +#include + +#include + +namespace armnn +{ +arm_compute::Status NeonMultiplicationWorkloadValidate(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output); + +class NeonMultiplicationWorkload : public BaseWorkload +{ +public: + NeonMultiplicationWorkload(const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info); + virtual void Execute() const override; + +private: + std::unique_ptr m_PixelWiseMultiplication; +}; + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonSubtractionFloatWorkload.cpp b/src/backends/neon/workloads/NeonSubtractionFloatWorkload.cpp deleted file mode 100644 index e39f8aa18e..0000000000 --- a/src/backends/neon/workloads/NeonSubtractionFloatWorkload.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "NeonSubtractionFloatWorkload.hpp" - -#include "NeonWorkloadUtils.hpp" -#include -#include - -#include - -namespace armnn -{ - -arm_compute::Status NeonSubtractionWorkloadValidate(const TensorInfo& input0, - const TensorInfo& input1, - const TensorInfo& output) -{ - const arm_compute::TensorInfo aclInput0 = armcomputetensorutils::BuildArmComputeTensorInfo(input0); - const arm_compute::TensorInfo aclInput1 = armcomputetensorutils::BuildArmComputeTensorInfo(input1); - const arm_compute::TensorInfo aclOutput = armcomputetensorutils::BuildArmComputeTensorInfo(output); - - return arm_compute::NEArithmeticSubtraction::validate(&aclInput0, - &aclInput1, - &aclOutput, - arm_compute::ConvertPolicy::SATURATE); -} - -NeonSubtractionFloatWorkload::NeonSubtractionFloatWorkload(const SubtractionQueueDescriptor& descriptor, - const WorkloadInfo& info) - : FloatWorkload(descriptor, info) -{ - m_Data.ValidateInputsOutputs("NeonSubtractionFloatWorkload", 2, 1); - - arm_compute::ITensor& input1 = boost::polymorphic_downcast(m_Data.m_Inputs[0])->GetTensor(); - arm_compute::ITensor& input2 = boost::polymorphic_downcast(m_Data.m_Inputs[1])->GetTensor(); - arm_compute::ITensor& output = boost::polymorphic_downcast(m_Data.m_Outputs[0])->GetTensor(); - - auto layer = std::make_unique(); - layer->configure(&input1, &input2, &output, arm_compute::ConvertPolicy::SATURATE); - m_SubLayer.reset(layer.release()); -} - -void NeonSubtractionFloatWorkload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonSubtractionFloatWorkload_Execute"); - m_SubLayer->run(); -} - -} //namespace armnn diff --git a/src/backends/neon/workloads/NeonSubtractionFloatWorkload.hpp b/src/backends/neon/workloads/NeonSubtractionFloatWorkload.hpp deleted file mode 100644 index 5dce112299..0000000000 --- a/src/backends/neon/workloads/NeonSubtractionFloatWorkload.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include - -#include -#include - -#include - -namespace armnn -{ - -arm_compute::Status NeonSubtractionWorkloadValidate(const TensorInfo& input0, - const TensorInfo& input1, - const TensorInfo& output); - -class NeonSubtractionFloatWorkload : public FloatWorkload -{ -public: - NeonSubtractionFloatWorkload(const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info); - virtual void Execute() const override; - -private: - std::unique_ptr m_SubLayer; -}; - -} //namespace armnn diff --git a/src/backends/neon/workloads/NeonSubtractionWorkload.cpp b/src/backends/neon/workloads/NeonSubtractionWorkload.cpp new file mode 100644 index 0000000000..39176aac61 --- /dev/null +++ b/src/backends/neon/workloads/NeonSubtractionWorkload.cpp @@ -0,0 +1,52 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonSubtractionWorkload.hpp" + +#include "NeonWorkloadUtils.hpp" +#include +#include + +#include + +namespace armnn +{ + +arm_compute::Status NeonSubtractionWorkloadValidate(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output) +{ + const arm_compute::TensorInfo aclInput0 = armcomputetensorutils::BuildArmComputeTensorInfo(input0); + const arm_compute::TensorInfo aclInput1 = armcomputetensorutils::BuildArmComputeTensorInfo(input1); + const arm_compute::TensorInfo aclOutput = armcomputetensorutils::BuildArmComputeTensorInfo(output); + + return arm_compute::NEArithmeticSubtraction::validate(&aclInput0, + &aclInput1, + &aclOutput, + arm_compute::ConvertPolicy::SATURATE); +} + +NeonSubtractionWorkload::NeonSubtractionWorkload(const SubtractionQueueDescriptor& descriptor, + const WorkloadInfo& info) + : BaseWorkload(descriptor, info) +{ + m_Data.ValidateInputsOutputs("NeonSubtractionWorkload", 2, 1); + + arm_compute::ITensor& input1 = boost::polymorphic_downcast(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ITensor& input2 = boost::polymorphic_downcast(m_Data.m_Inputs[1])->GetTensor(); + arm_compute::ITensor& output = boost::polymorphic_downcast(m_Data.m_Outputs[0])->GetTensor(); + + auto layer = std::make_unique(); + layer->configure(&input1, &input2, &output, arm_compute::ConvertPolicy::SATURATE); + m_SubLayer.reset(layer.release()); +} + +void NeonSubtractionWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonSubtractionWorkload_Execute"); + m_SubLayer->run(); +} + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonSubtractionWorkload.hpp b/src/backends/neon/workloads/NeonSubtractionWorkload.hpp new file mode 100644 index 0000000000..3326f8bf4a --- /dev/null +++ b/src/backends/neon/workloads/NeonSubtractionWorkload.hpp @@ -0,0 +1,32 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +#include +#include + +#include + +namespace armnn +{ + +arm_compute::Status NeonSubtractionWorkloadValidate(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output); + +class NeonSubtractionWorkload : public BaseWorkload +{ +public: + NeonSubtractionWorkload(const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info); + virtual void Execute() const override; + +private: + std::unique_ptr m_SubLayer; +}; + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonWorkloads.hpp b/src/backends/neon/workloads/NeonWorkloads.hpp index af85eb2f50..04ea14eff7 100644 --- a/src/backends/neon/workloads/NeonWorkloads.hpp +++ b/src/backends/neon/workloads/NeonWorkloads.hpp @@ -21,7 +21,7 @@ #include "NeonMeanWorkload.hpp" #include "NeonMergerWorkload.hpp" #include "NeonMinimumWorkload.hpp" -#include "NeonMultiplicationFloatWorkload.hpp" +#include "NeonMultiplicationWorkload.hpp" #include "NeonNormalizationFloatWorkload.hpp" #include "NeonPadWorkload.hpp" #include "NeonPermuteWorkload.hpp" @@ -31,4 +31,4 @@ #include "NeonSoftmaxFloatWorkload.hpp" #include "NeonSoftmaxUint8Workload.hpp" #include "NeonSplitterWorkload.hpp" -#include "NeonSubtractionFloatWorkload.hpp" +#include "NeonSubtractionWorkload.hpp" -- cgit v1.2.1