From c6a41ffa25d468a69465e1a7b22b280b029f65a2 Mon Sep 17 00:00:00 2001 From: Nattapat Chaimanowong Date: Tue, 29 Jan 2019 09:56:02 +0000 Subject: IVGCVSW-2443 Add Cl support for Greater operator Change-Id: I7eb3b2e712dbaa5c13f6cf3a1da63df4d2bd4de5 --- src/backends/backendsCommon/WorkloadFactory.cpp | 5 +- src/backends/cl/ClLayerSupport.cpp | 13 +++++ src/backends/cl/ClLayerSupport.hpp | 5 ++ src/backends/cl/ClWorkloadFactory.cpp | 2 +- src/backends/cl/backend.mk | 1 + src/backends/cl/test/ClEndToEndTests.cpp | 42 ++++++++++++++++ src/backends/cl/test/ClLayerTests.cpp | 8 +++ src/backends/cl/workloads/CMakeLists.txt | 2 + src/backends/cl/workloads/ClGreaterWorkload.cpp | 65 +++++++++++++++++++++++++ src/backends/cl/workloads/ClGreaterWorkload.hpp | 34 +++++++++++++ src/backends/cl/workloads/ClWorkloads.hpp | 1 + 11 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 src/backends/cl/workloads/ClGreaterWorkload.cpp create mode 100644 src/backends/cl/workloads/ClGreaterWorkload.hpp (limited to 'src') diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp index 6cca174141..72d0b19d04 100644 --- a/src/backends/backendsCommon/WorkloadFactory.cpp +++ b/src/backends/backendsCommon/WorkloadFactory.cpp @@ -729,7 +729,10 @@ bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId, const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo(); const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo(); const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo(); - result = layerSupportObject->IsGreaterSupported(input0, input1, output, reason); + result = layerSupportObject->IsGreaterSupported(OverrideDataType(input0, dataType), + OverrideDataType(input1, dataType), + OverrideDataType(output, DataType::Boolean), + reason); break; } default: diff --git a/src/backends/cl/ClLayerSupport.cpp b/src/backends/cl/ClLayerSupport.cpp index 410cb04288..a7c1358ae7 100644 --- a/src/backends/cl/ClLayerSupport.cpp +++ b/src/backends/cl/ClLayerSupport.cpp @@ -25,6 +25,7 @@ #include "workloads/ClDepthwiseConvolutionWorkload.hpp" #include "workloads/ClDivisionFloatWorkload.hpp" #include "workloads/ClFullyConnectedWorkload.hpp" +#include "workloads/ClGreaterWorkload.hpp" #include "workloads/ClL2NormalizationFloatWorkload.hpp" #include "workloads/ClLstmFloatWorkload.hpp" #include "workloads/ClMaximumWorkload.hpp" @@ -288,6 +289,18 @@ bool ClLayerSupport::IsFullyConnectedSupported(const TensorInfo& input, descriptor); } +bool ClLayerSupport::IsGreaterSupported(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output, + Optional reasonIfUnsupported) const +{ + FORWARD_WORKLOAD_VALIDATE_FUNC(ClGreaterWorkloadValidate, + reasonIfUnsupported, + input0, + input1, + output); +} + bool ClLayerSupport::IsInputSupported(const TensorInfo& input, Optional reasonIfUnsupported) const { diff --git a/src/backends/cl/ClLayerSupport.hpp b/src/backends/cl/ClLayerSupport.hpp index 07e24335dc..6393a11e84 100644 --- a/src/backends/cl/ClLayerSupport.hpp +++ b/src/backends/cl/ClLayerSupport.hpp @@ -77,6 +77,11 @@ public: const FullyConnectedDescriptor& descriptor, Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsGreaterSupported(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& ouput, + Optional reasonIfUnsupported) const override; + bool IsInputSupported(const TensorInfo& input, Optional reasonIfUnsupported = EmptyOptional()) const override; diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp index 6cd9c6dfa5..d41a7e5997 100644 --- a/src/backends/cl/ClWorkloadFactory.cpp +++ b/src/backends/cl/ClWorkloadFactory.cpp @@ -348,7 +348,7 @@ std::unique_ptr ClWorkloadFactory::CreateMinimum(const MinimumQueueDe std::unique_ptr ClWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + return MakeWorkload(descriptor, info); } std::unique_ptr ClWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor, diff --git a/src/backends/cl/backend.mk b/src/backends/cl/backend.mk index cb3163a561..a6d6e002c4 100644 --- a/src/backends/cl/backend.mk +++ b/src/backends/cl/backend.mk @@ -26,6 +26,7 @@ BACKEND_SOURCES := \ workloads/ClDivisionFloatWorkload.cpp \ workloads/ClFloorFloatWorkload.cpp \ workloads/ClFullyConnectedWorkload.cpp \ + workloads/ClGreaterWorkload.cpp \ workloads/ClL2NormalizationFloatWorkload.cpp \ workloads/ClLstmFloatWorkload.cpp \ workloads/ClMaximumWorkload.cpp \ diff --git a/src/backends/cl/test/ClEndToEndTests.cpp b/src/backends/cl/test/ClEndToEndTests.cpp index ba94353049..bc0bad2fa6 100644 --- a/src/backends/cl/test/ClEndToEndTests.cpp +++ b/src/backends/cl/test/ClEndToEndTests.cpp @@ -5,6 +5,7 @@ #include #include +#include #include @@ -47,4 +48,45 @@ BOOST_AUTO_TEST_CASE(ClMergerEndToEndDim3Uint8Test) MergerDim3EndToEnd(defaultBackends); } +BOOST_AUTO_TEST_CASE(ClGreaterSimpleEndToEndTest) +{ + const std::vector expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0 }); + + ArithmeticSimpleEndToEnd(defaultBackends, + LayerType::Greater, + expectedOutput); +} + +BOOST_AUTO_TEST_CASE(ClGreaterSimpleEndToEndUint8Test) +{ + const std::vector expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0 }); + + ArithmeticSimpleEndToEnd(defaultBackends, + LayerType::Greater, + expectedOutput); +} + +BOOST_AUTO_TEST_CASE(ClGreaterBroadcastEndToEndTest) +{ + const std::vector expectedOutput({ 0, 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1 }); + + ArithmeticBroadcastEndToEnd(defaultBackends, + LayerType::Greater, + expectedOutput); +} + +BOOST_AUTO_TEST_CASE(ClGreaterBroadcastEndToEndUint8Test) +{ + const std::vector expectedOutput({ 0, 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1 }); + + ArithmeticBroadcastEndToEnd(defaultBackends, + LayerType::Greater, + expectedOutput); +} + + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index 2fe03abb3c..641e964470 100644 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -366,6 +366,14 @@ ARMNN_AUTO_TEST_CASE(MinimumBroadcast1Element1, MinimumBroadcast1ElementTest1) ARMNN_AUTO_TEST_CASE(MinimumBroadcast1Element2, MinimumBroadcast1ElementTest2) ARMNN_AUTO_TEST_CASE(MinimumBroadcast1DVectorUint8, MinimumBroadcast1DVectorUint8Test) +// Greater +ARMNN_AUTO_TEST_CASE(SimpleGreater, GreaterSimpleTest) +ARMNN_AUTO_TEST_CASE(GreaterBroadcast1Element, GreaterBroadcast1ElementTest) +ARMNN_AUTO_TEST_CASE(GreaterBroadcast1DVector, GreaterBroadcast1DVectorTest) +ARMNN_AUTO_TEST_CASE(GreaterUint8, GreaterUint8Test) +ARMNN_AUTO_TEST_CASE(GreaterBroadcast1ElementUint8, GreaterBroadcast1ElementUint8Test) +ARMNN_AUTO_TEST_CASE(GreaterBroadcast1DVectorUint8, GreaterBroadcast1DVectorUint8Test) + // Space To Batch Nd ARMNN_AUTO_TEST_CASE(SpaceToBatchNdSimpleFloat32, SpaceToBatchNdSimpleFloat32Test) ARMNN_AUTO_TEST_CASE(SpaceToBatchNdMultiChannelsFloat32, SpaceToBatchNdMultiChannelsFloat32Test) diff --git a/src/backends/cl/workloads/CMakeLists.txt b/src/backends/cl/workloads/CMakeLists.txt index 4dfce43679..d5dccb607c 100644 --- a/src/backends/cl/workloads/CMakeLists.txt +++ b/src/backends/cl/workloads/CMakeLists.txt @@ -28,6 +28,8 @@ list(APPEND armnnClBackendWorkloads_sources ClFloorFloatWorkload.hpp ClFullyConnectedWorkload.cpp ClFullyConnectedWorkload.hpp + ClGreaterWorkload.cpp + ClGreaterWorkload.hpp ClL2NormalizationFloatWorkload.cpp ClL2NormalizationFloatWorkload.hpp ClLstmFloatWorkload.cpp diff --git a/src/backends/cl/workloads/ClGreaterWorkload.cpp b/src/backends/cl/workloads/ClGreaterWorkload.cpp new file mode 100644 index 0000000000..435ead853f --- /dev/null +++ b/src/backends/cl/workloads/ClGreaterWorkload.cpp @@ -0,0 +1,65 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "ClGreaterWorkload.hpp" + +#include "ClWorkloadUtils.hpp" + +#include +#include + +#include + +#include +#include +#include + +namespace armnn +{ + +using namespace armcomputetensorutils; + +arm_compute::Status ClGreaterWorkloadValidate(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output) +{ + const arm_compute::TensorInfo aclInput0Info = BuildArmComputeTensorInfo(input0); + const arm_compute::TensorInfo aclInput1Info = BuildArmComputeTensorInfo(input1); + const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output); + + const arm_compute::Status aclStatus = arm_compute::CLComparison::validate( + &aclInput0Info, + &aclInput1Info, + &aclOutputInfo, + arm_compute::ComparisonOperation::Greater); + + return aclStatus; +} + +template +ClGreaterWorkload::ClGreaterWorkload(const GreaterQueueDescriptor& descriptor, + const WorkloadInfo& info) + : MultiTypedWorkload(descriptor, info) +{ + m_Data.ValidateInputsOutputs("ClGreaterWorkload", 2, 1); + + arm_compute::ICLTensor& input0 = static_cast(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ICLTensor& input1 = static_cast(m_Data.m_Inputs[1])->GetTensor(); + arm_compute::ICLTensor& output = static_cast(m_Data.m_Outputs[0])->GetTensor(); + + m_GreaterLayer.configure(&input0, &input1, &output, arm_compute::ComparisonOperation::Greater); +} + +template +void ClGreaterWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_CL("ClGreaterWorkload_Execute"); + RunClFunction(m_GreaterLayer, CHECK_LOCATION()); +} + +template class ClGreaterWorkload; +template class ClGreaterWorkload; + +} //namespace armnn diff --git a/src/backends/cl/workloads/ClGreaterWorkload.hpp b/src/backends/cl/workloads/ClGreaterWorkload.hpp new file mode 100644 index 0000000000..69d017e6c6 --- /dev/null +++ b/src/backends/cl/workloads/ClGreaterWorkload.hpp @@ -0,0 +1,34 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +#include + +namespace armnn +{ + +arm_compute::Status ClGreaterWorkloadValidate(const TensorInfo& input0, + const TensorInfo& input1, + const TensorInfo& output); + +template +class ClGreaterWorkload : public MultiTypedWorkload +{ +public: + ClGreaterWorkload(const GreaterQueueDescriptor& descriptor, const WorkloadInfo& info); + void Execute() const override; + +private: + using MultiTypedWorkload::m_Data; + mutable arm_compute::CLComparison m_GreaterLayer; +}; + +using ClGreaterFloat32Workload = ClGreaterWorkload; +using ClGreaterUint8Workload = ClGreaterWorkload; + +} //namespace armnn diff --git a/src/backends/cl/workloads/ClWorkloads.hpp b/src/backends/cl/workloads/ClWorkloads.hpp index be223921d0..36f2b90609 100644 --- a/src/backends/cl/workloads/ClWorkloads.hpp +++ b/src/backends/cl/workloads/ClWorkloads.hpp @@ -14,6 +14,7 @@ #include "ClDivisionFloatWorkload.hpp" #include "ClFloorFloatWorkload.hpp" #include "ClFullyConnectedWorkload.hpp" +#include "ClGreaterWorkload.hpp" #include "ClL2NormalizationFloatWorkload.hpp" #include "ClLstmFloatWorkload.hpp" #include "ClMergerWorkload.hpp" -- cgit v1.2.1