diff options
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/neon/NeonLayerSupport.cpp | 13 | ||||
-rw-r--r-- | src/backends/neon/NeonLayerSupport.hpp | 5 | ||||
-rw-r--r-- | src/backends/neon/NeonWorkloadFactory.cpp | 2 | ||||
-rw-r--r-- | src/backends/neon/backend.mk | 1 | ||||
-rw-r--r-- | src/backends/neon/test/NeonLayerTests.cpp | 5 | ||||
-rw-r--r-- | src/backends/neon/workloads/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/backends/neon/workloads/NeonMinimumWorkload.cpp | 45 | ||||
-rw-r--r-- | src/backends/neon/workloads/NeonMinimumWorkload.hpp | 38 | ||||
-rw-r--r-- | src/backends/neon/workloads/NeonWorkloads.hpp | 1 |
9 files changed, 111 insertions, 1 deletions
diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 3846801ac1..cc8f973510 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -26,6 +26,7 @@ #include "workloads/NeonMaximumWorkload.hpp" #include "workloads/NeonMeanWorkload.hpp" #include "workloads/NeonMergerWorkload.hpp" +#include "workloads/NeonMinimumWorkload.hpp" #include "workloads/NeonMultiplicationFloatWorkload.hpp" #include "workloads/NeonNormalizationFloatWorkload.hpp" #include "workloads/NeonFullyConnectedWorkload.hpp" @@ -292,6 +293,18 @@ bool NeonLayerSupport::IsMergerSupported(const std::vector<const TensorInfo*> in } } +bool NeonLayerSupport::IsMinimumSupported(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output, + Optional<std::string&> reasonIfUnsupported) const +{ + FORWARD_WORKLOAD_VALIDATE_FUNC(NeonMinimumWorkloadValidate, + reasonIfUnsupported, + input0, + input1, + output); +} + bool NeonLayerSupport::IsMultiplicationSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, diff --git a/src/backends/neon/NeonLayerSupport.hpp b/src/backends/neon/NeonLayerSupport.hpp index 591e51cfc4..73193d34b7 100644 --- a/src/backends/neon/NeonLayerSupport.hpp +++ b/src/backends/neon/NeonLayerSupport.hpp @@ -90,6 +90,11 @@ public: const OriginsDescriptor& descriptor, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsMinimumSupported(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output, + Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsMultiplicationSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp index ff60efb86f..65093fb593 100644 --- a/src/backends/neon/NeonWorkloadFactory.cpp +++ b/src/backends/neon/NeonWorkloadFactory.cpp @@ -303,7 +303,7 @@ std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateStridedSlice(const Strided std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info); + return std::make_unique<NeonMinimumWorkload>(descriptor, info); } std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor, diff --git a/src/backends/neon/backend.mk b/src/backends/neon/backend.mk index d4f414eba1..2e3848c3a3 100644 --- a/src/backends/neon/backend.mk +++ b/src/backends/neon/backend.mk @@ -28,6 +28,7 @@ BACKEND_SOURCES := \ workloads/NeonMaximumWorkload.cpp \ workloads/NeonMeanWorkload.cpp \ workloads/NeonMergerWorkload.cpp \ + workloads/NeonMinimumWorkload.cpp \ workloads/NeonMultiplicationFloatWorkload.cpp \ workloads/NeonNormalizationFloatWorkload.cpp \ workloads/NeonPermuteWorkload.cpp \ diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index 999009bc6d..09b47e5b3e 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -424,6 +424,11 @@ ARMNN_AUTO_TEST_CASE(MaximumUint8, MaximumUint8Test) ARMNN_AUTO_TEST_CASE(MaximumBroadcast1ElementUint8, MaximumBroadcast1ElementUint8Test) ARMNN_AUTO_TEST_CASE(MaximumBroadcast1DVectorUint8, MaximumBroadcast1DVectorUint8Test) +// Min +ARMNN_AUTO_TEST_CASE(SimpleMinimum1, MinimumBroadcast1ElementTest1) +ARMNN_AUTO_TEST_CASE(SimpleMinimum2, MinimumBroadcast1ElementTest2) +ARMNN_AUTO_TEST_CASE(Minimum1DVectorUint8, MinimumBroadcast1DVectorUint8Test) + // Normalization ARMNN_AUTO_TEST_CASE(SimpleNormalizationAcross, SimpleNormalizationAcrossTest) ARMNN_AUTO_TEST_CASE(SimpleNormalizationWithin, SimpleNormalizationWithinTest) diff --git a/src/backends/neon/workloads/CMakeLists.txt b/src/backends/neon/workloads/CMakeLists.txt index b7dfc3fcfd..919c716860 100644 --- a/src/backends/neon/workloads/CMakeLists.txt +++ b/src/backends/neon/workloads/CMakeLists.txt @@ -34,6 +34,8 @@ list(APPEND armnnNeonBackendWorkloads_sources NeonMeanWorkload.hpp NeonMergerWorkload.cpp NeonMergerWorkload.hpp + NeonMinimumWorkload.cpp + NeonMinimumWorkload.hpp NeonMultiplicationFloatWorkload.cpp NeonMultiplicationFloatWorkload.hpp NeonNormalizationFloatWorkload.cpp diff --git a/src/backends/neon/workloads/NeonMinimumWorkload.cpp b/src/backends/neon/workloads/NeonMinimumWorkload.cpp new file mode 100644 index 0000000000..9b97bf5863 --- /dev/null +++ b/src/backends/neon/workloads/NeonMinimumWorkload.cpp @@ -0,0 +1,45 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "NeonMinimumWorkload.hpp" +#include <aclCommon/ArmComputeTensorUtils.hpp> +#include <backendsCommon/CpuTensorHandle.hpp> + +namespace armnn +{ + +arm_compute::Status NeonMinimumWorkloadValidate(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::NEElementwiseMin::validate(&aclInput0, + &aclInput1, + &aclOutput); +} + +NeonMinimumWorkload::NeonMinimumWorkload(const MinimumQueueDescriptor& descriptor, + const WorkloadInfo& info) + : BaseWorkload<MinimumQueueDescriptor>(descriptor, info) +{ + m_Data.ValidateInputsOutputs("NeonMinimumWorkload", 2, 1); + + arm_compute::ITensor& input0 = boost::polymorphic_downcast<INeonTensorHandle*>(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ITensor& input1 = boost::polymorphic_downcast<INeonTensorHandle*>(m_Data.m_Inputs[1])->GetTensor(); + arm_compute::ITensor& output = boost::polymorphic_downcast<INeonTensorHandle*>(m_Data.m_Outputs[0])->GetTensor(); + + m_MinLayer.configure(&input0, &input1, &output); +} + +void NeonMinimumWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonMinimumWorkload_Execute"); + m_MinLayer.run(); +} + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonMinimumWorkload.hpp b/src/backends/neon/workloads/NeonMinimumWorkload.hpp new file mode 100644 index 0000000000..5c76bb387e --- /dev/null +++ b/src/backends/neon/workloads/NeonMinimumWorkload.hpp @@ -0,0 +1,38 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include <neon/workloads/NeonWorkloadUtils.hpp> + +#include <arm_compute/runtime/NEON/functions/NEElementwiseOperations.h> + +namespace armnn +{ + +/// Validate function for validating the inputs and output. +/// @param [in] input0 The input0 value to be validated. +/// @param [in] input1 The input1 value to be validated. +/// @param [in] output The output value to be validated. +arm_compute::Status NeonMinimumWorkloadValidate(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output); + +class NeonMinimumWorkload : public BaseWorkload<MinimumQueueDescriptor> +{ +public: + /// Create a NeonMinimumWorkload. + /// @param [in] descriptor The MinimumQueueDescriptor to configure this operation. + /// @param [in] info The workload where this operation can be found. + NeonMinimumWorkload(const MinimumQueueDescriptor& descriptor, const WorkloadInfo& info); + + /// Execute the Minimum operation. + virtual void Execute() const override; + +private: + mutable arm_compute::NEElementwiseMin m_MinLayer; +}; + +} //namespace armnn diff --git a/src/backends/neon/workloads/NeonWorkloads.hpp b/src/backends/neon/workloads/NeonWorkloads.hpp index a5ef0dcb2d..70f9e376d5 100644 --- a/src/backends/neon/workloads/NeonWorkloads.hpp +++ b/src/backends/neon/workloads/NeonWorkloads.hpp @@ -19,6 +19,7 @@ #include "NeonMaximumWorkload.hpp" #include "NeonMeanWorkload.hpp" #include "NeonMergerWorkload.hpp" +#include "NeonMinimumWorkload.hpp" #include "NeonMultiplicationFloatWorkload.hpp" #include "NeonNormalizationFloatWorkload.hpp" #include "NeonPermuteWorkload.hpp" |