From b280196ef4e04725a46155732ff0a1faf6b76722 Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Mon, 30 Sep 2019 11:24:53 +0100 Subject: [PATCH] IVGCVSW-3732 Add CL workload for DepthToSpace Signed-off-by: Aron Virginas-Tar Change-Id: I577c45099eda1d04214e7a1f75fa10d1352efc80 --- src/backends/cl/ClLayerSupport.cpp | 15 ++++- src/backends/cl/ClLayerSupport.hpp | 5 ++ src/backends/cl/ClWorkloadFactory.cpp | 6 ++ src/backends/cl/ClWorkloadFactory.hpp | 3 + src/backends/cl/backend.mk | 1 + src/backends/cl/test/ClLayerTests.cpp | 41 ++++++++++++++ src/backends/cl/workloads/CMakeLists.txt | 2 + .../cl/workloads/ClDepthToSpaceWorkload.cpp | 66 ++++++++++++++++++++++ .../cl/workloads/ClDepthToSpaceWorkload.hpp | 31 ++++++++++ src/backends/cl/workloads/ClWorkloads.hpp | 1 + 10 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 src/backends/cl/workloads/ClDepthToSpaceWorkload.cpp create mode 100644 src/backends/cl/workloads/ClDepthToSpaceWorkload.hpp diff --git a/src/backends/cl/ClLayerSupport.cpp b/src/backends/cl/ClLayerSupport.cpp index 5905cd9..4503915 100644 --- a/src/backends/cl/ClLayerSupport.cpp +++ b/src/backends/cl/ClLayerSupport.cpp @@ -24,8 +24,9 @@ #include "workloads/ClConvertFp16ToFp32Workload.hpp" #include "workloads/ClConvertFp32ToFp16Workload.hpp" #include "workloads/ClConvolution2dWorkload.hpp" -#include "workloads/ClDequantizeWorkload.hpp" +#include "workloads/ClDepthToSpaceWorkload.hpp" #include "workloads/ClDepthwiseConvolutionWorkload.hpp" +#include "workloads/ClDequantizeWorkload.hpp" #include "workloads/ClDivisionFloatWorkload.hpp" #include "workloads/ClFullyConnectedWorkload.hpp" #include "workloads/ClGreaterWorkload.hpp" @@ -303,6 +304,18 @@ bool ClLayerSupport::IsDequantizeSupported(const TensorInfo& input, output); } +bool ClLayerSupport::IsDepthToSpaceSupported(const TensorInfo& input, + const TensorInfo& output, + const DepthToSpaceDescriptor& descriptor, + Optional reasonIfUnsupported) const +{ + FORWARD_WORKLOAD_VALIDATE_FUNC(ClDepthToSpaceWorkloadValidate, + reasonIfUnsupported, + input, + output, + descriptor); +} + bool ClLayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input, const TensorInfo& output, const DepthwiseConvolution2dDescriptor& descriptor, diff --git a/src/backends/cl/ClLayerSupport.hpp b/src/backends/cl/ClLayerSupport.hpp index ddc428d..1a37315 100644 --- a/src/backends/cl/ClLayerSupport.hpp +++ b/src/backends/cl/ClLayerSupport.hpp @@ -67,6 +67,11 @@ public: const TensorInfo& output, Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsDepthToSpaceSupported(const TensorInfo& input, + const TensorInfo& output, + const DepthToSpaceDescriptor& descriptor, + Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsDepthwiseConvolutionSupported(const TensorInfo& input, const TensorInfo& output, const DepthwiseConvolution2dDescriptor& descriptor, diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp index 536d4dd..ea3c27e 100644 --- a/src/backends/cl/ClWorkloadFactory.cpp +++ b/src/backends/cl/ClWorkloadFactory.cpp @@ -463,4 +463,10 @@ std::unique_ptr ClWorkloadFactory::CreateStack(const StackQueueDescri return MakeWorkload(descriptor, info); } +std::unique_ptr ClWorkloadFactory::CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor, + const WorkloadInfo& info) const +{ + return MakeWorkload(descriptor, info); +} + } // namespace armnn diff --git a/src/backends/cl/ClWorkloadFactory.hpp b/src/backends/cl/ClWorkloadFactory.hpp index c8d58db..7ea7f26 100644 --- a/src/backends/cl/ClWorkloadFactory.hpp +++ b/src/backends/cl/ClWorkloadFactory.hpp @@ -75,6 +75,9 @@ public: std::unique_ptr CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + std::unique_ptr CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + std::unique_ptr CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const override; diff --git a/src/backends/cl/backend.mk b/src/backends/cl/backend.mk index c417c4f..20ece76 100644 --- a/src/backends/cl/backend.mk +++ b/src/backends/cl/backend.mk @@ -32,6 +32,7 @@ BACKEND_SOURCES := \ workloads/ClConvertFp16ToFp32Workload.cpp \ workloads/ClConvertFp32ToFp16Workload.cpp \ workloads/ClConvolution2dWorkload.cpp \ + workloads/ClDepthToSpaceWorkload.cpp \ workloads/ClDepthwiseConvolutionWorkload.cpp \ workloads/ClDequantizeWorkload.cpp \ workloads/ClDivisionFloatWorkload.cpp \ diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index 6a26a3d..76e5061 100644 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -356,6 +356,47 @@ ARMNN_AUTO_TEST_CASE(Concat4dDiffShapeDim0Uint8, Concat4dDiffShapeDim0Uint8Test) ARMNN_AUTO_TEST_CASE(Concat4dDiffShapeDim1Uint8, Concat4dDiffShapeDim1Uint8Test) ARMNN_AUTO_TEST_CASE(Concat4dDiffShapeDim3Uint8, Concat4dDiffShapeDim3Uint8Test, false) +// DepthToSpace +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwFloat32_1, DepthToSpaceTest1, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwFloat32_2, DepthToSpaceTest2, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwFloat32_3, DepthToSpaceTest3, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwFloat32_4, DepthToSpaceTest4, DataLayout::NCHW); + +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwFloat16_1, DepthToSpaceTest1, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwFloat16_2, DepthToSpaceTest2, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwFloat16_3, DepthToSpaceTest3, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwFloat16_4, DepthToSpaceTest4, DataLayout::NCHW); + +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwUint8_1, DepthToSpaceTest1, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwUint8_2, DepthToSpaceTest2, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwUint8_3, DepthToSpaceTest3, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwUint8_4, DepthToSpaceTest4, DataLayout::NCHW); + +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwInt16_1, DepthToSpaceTest1, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwInt16_2, DepthToSpaceTest2, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwInt16_3, DepthToSpaceTest3, DataLayout::NCHW); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNchwInt16_4, DepthToSpaceTest4, DataLayout::NCHW); + +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcFloat32_1, DepthToSpaceTest1, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcFloat32_2, DepthToSpaceTest2, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcFloat32_3, DepthToSpaceTest3, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcFloat32_4, DepthToSpaceTest4, DataLayout::NHWC); + +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcFloat16_1, DepthToSpaceTest1, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcFloat16_2, DepthToSpaceTest2, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcFloat16_3, DepthToSpaceTest3, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcFloat16_4, DepthToSpaceTest4, DataLayout::NHWC); + +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcUint8_1, DepthToSpaceTest1, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcUint8_2, DepthToSpaceTest2, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcUint8_3, DepthToSpaceTest3, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcUint8_4, DepthToSpaceTest4, DataLayout::NHWC); + +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcInt16_1, DepthToSpaceTest1, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcInt16_2, DepthToSpaceTest2, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcInt16_3, DepthToSpaceTest3, DataLayout::NHWC); +ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcInt16_4, DepthToSpaceTest4, DataLayout::NHWC); + // Floor ARMNN_AUTO_TEST_CASE(SimpleFloor, SimpleFloorTest) diff --git a/src/backends/cl/workloads/CMakeLists.txt b/src/backends/cl/workloads/CMakeLists.txt index 7578a40..affe869 100644 --- a/src/backends/cl/workloads/CMakeLists.txt +++ b/src/backends/cl/workloads/CMakeLists.txt @@ -24,6 +24,8 @@ list(APPEND armnnClBackendWorkloads_sources ClConvertFp32ToFp16Workload.hpp ClConvolution2dWorkload.cpp ClConvolution2dWorkload.hpp + ClDepthToSpaceWorkload.cpp + ClDepthToSpaceWorkload.hpp ClDepthwiseConvolutionWorkload.cpp ClDepthwiseConvolutionWorkload.hpp ClDequantizeWorkload.cpp diff --git a/src/backends/cl/workloads/ClDepthToSpaceWorkload.cpp b/src/backends/cl/workloads/ClDepthToSpaceWorkload.cpp new file mode 100644 index 0000000..800a984 --- /dev/null +++ b/src/backends/cl/workloads/ClDepthToSpaceWorkload.cpp @@ -0,0 +1,66 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "ClDepthToSpaceWorkload.hpp" + +#include "ClWorkloadUtils.hpp" + +#include + +#include + +#include +#include + +namespace armnn +{ + +using namespace armcomputetensorutils; + +arm_compute::Status ClDepthToSpaceWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const DepthToSpaceDescriptor& desc) +{ + DataLayout dataLayout = desc.m_DataLayout; + const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, dataLayout); + + int32_t blockSize = boost::numeric_cast(desc.m_BlockSize); + + const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, dataLayout); + + const arm_compute::Status aclStatus = arm_compute::CLDepthToSpaceLayer::validate(&aclInputInfo, + &aclOutputInfo, + blockSize); + return aclStatus; +} + +ClDepthToSpaceWorkload::ClDepthToSpaceWorkload(const DepthToSpaceQueueDescriptor& desc, + const WorkloadInfo& info) + : BaseWorkload(desc, info) +{ + m_Data.ValidateInputsOutputs("ClDepthToSpaceWorkload", 1, 1); + + arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout); + + arm_compute::ICLTensor& input = + boost::polymorphic_pointer_downcast(m_Data.m_Inputs[0])->GetTensor(); + input.info()->set_data_layout(aclDataLayout); + + int32_t blockSize = boost::numeric_cast(desc.m_Parameters.m_BlockSize); + + arm_compute::ICLTensor& output = + boost::polymorphic_pointer_downcast(m_Data.m_Outputs[0])->GetTensor(); + output.info()->set_data_layout(aclDataLayout); + + m_Layer.configure(&input, &output, blockSize); +} + +void ClDepthToSpaceWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_CL("ClDepthToSpaceWorkload_Execute"); + RunClFunction(m_Layer, CHECK_LOCATION()); +} + +} // namespace armnn diff --git a/src/backends/cl/workloads/ClDepthToSpaceWorkload.hpp b/src/backends/cl/workloads/ClDepthToSpaceWorkload.hpp new file mode 100644 index 0000000..de8b496 --- /dev/null +++ b/src/backends/cl/workloads/ClDepthToSpaceWorkload.hpp @@ -0,0 +1,31 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +#include + +#include + +namespace armnn +{ + +arm_compute::Status ClDepthToSpaceWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const DepthToSpaceDescriptor& desc); + +class ClDepthToSpaceWorkload : public BaseWorkload +{ +public: + ClDepthToSpaceWorkload(const DepthToSpaceQueueDescriptor& descriptor, const WorkloadInfo& info); + void Execute() const override; + +private: + mutable arm_compute::CLDepthToSpaceLayer m_Layer; +}; + +} // namespace armnn diff --git a/src/backends/cl/workloads/ClWorkloads.hpp b/src/backends/cl/workloads/ClWorkloads.hpp index 7525f84..5c42e76 100644 --- a/src/backends/cl/workloads/ClWorkloads.hpp +++ b/src/backends/cl/workloads/ClWorkloads.hpp @@ -11,6 +11,7 @@ #include "ClBatchNormalizationFloatWorkload.hpp" #include "ClBatchToSpaceNdWorkload.hpp" #include "ClConvolution2dWorkload.hpp" +#include "ClDepthToSpaceWorkload.hpp" #include "ClDepthwiseConvolutionWorkload.hpp" #include "ClDequantizeWorkload.hpp" #include "ClDivisionFloatWorkload.hpp" -- 2.7.4