From d2aa85ee2a0f574bcba50a376721f15c7e99308d Mon Sep 17 00:00:00 2001 From: James Conroy Date: Mon, 1 Jul 2019 17:12:40 +0100 Subject: IVGCVSW-3353 Add CL support and tests for SpaceToDepth * Added CL backend support for SpaceToDepth. * Enabled unit tests for SpaceToDepth on CL. * Renamed unit tests to make them type-agnostic. * Added QSymm16/S16 support to ClTensorHandle. Signed-off-by: James Conroy Change-Id: I417d82946142ed619c447428bf0b0c4a2116c004 --- src/backends/backendsCommon/WorkloadData.cpp | 3 +- src/backends/backendsCommon/test/LayerTests.cpp | 50 +++++++++++++++--- src/backends/backendsCommon/test/LayerTests.hpp | 20 ++++++- .../backendsCommon/test/SpaceToDepthTestImpl.hpp | 4 +- src/backends/cl/ClLayerSupport.cpp | 13 +++++ src/backends/cl/ClLayerSupport.hpp | 5 ++ src/backends/cl/ClTensorHandle.hpp | 20 +++++++ src/backends/cl/ClWorkloadFactory.cpp | 6 +++ src/backends/cl/ClWorkloadFactory.hpp | 3 ++ src/backends/cl/backend.mk | 1 + src/backends/cl/test/ClLayerTests.cpp | 13 +++++ src/backends/cl/workloads/CMakeLists.txt | 2 + .../cl/workloads/ClSpaceToDepthWorkload.cpp | 61 ++++++++++++++++++++++ .../cl/workloads/ClSpaceToDepthWorkload.hpp | 29 ++++++++++ src/backends/cl/workloads/ClWorkloads.hpp | 1 + src/backends/reference/RefLayerSupport.cpp | 3 +- src/backends/reference/test/RefLayerTests.cpp | 10 +++- 17 files changed, 230 insertions(+), 14 deletions(-) create mode 100644 src/backends/cl/workloads/ClSpaceToDepthWorkload.cpp create mode 100644 src/backends/cl/workloads/ClSpaceToDepthWorkload.hpp (limited to 'src/backends') diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 3766f5f7ca..324c1debc0 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -1206,7 +1206,8 @@ void SpaceToDepthQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) con { DataType::Float32, DataType::Float16, - DataType::QuantisedAsymm8 + DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 }; ValidateDataTypes(workloadInfo.m_InputTensorInfos[0], diff --git a/src/backends/backendsCommon/test/LayerTests.cpp b/src/backends/backendsCommon/test/LayerTests.cpp index 56c0ab6b12..5c41d3aac3 100644 --- a/src/backends/backendsCommon/test/LayerTests.cpp +++ b/src/backends/backendsCommon/test/LayerTests.cpp @@ -9421,7 +9421,7 @@ LayerTestResult SpaceToDepthNHWCAsymmQ8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { - return SpaceToDepthSimpleTest( + return SpaceToDepthSimpleTest1( workloadFactory, memoryManager); } @@ -9430,26 +9430,64 @@ LayerTestResult SpaceToDepthNCHWAsymmQ8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { - return SpaceToDepthSimpleTest( + return SpaceToDepthSimpleTest1( workloadFactory, memoryManager, armnn::DataLayout::NCHW); } -LayerTestResult SpaceToDepthNHWCFloat32Test( +LayerTestResult SpaceToDepthNHWCFloat32Test1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { - return SpaceToDepthFloatTest( + return SpaceToDepthSimpleTest1( workloadFactory, memoryManager); } -LayerTestResult SpaceToDepthNCHWFloat32Test( +LayerTestResult SpaceToDepthNCHWFloat32Test1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) { - return SpaceToDepthFloatTest( + return SpaceToDepthSimpleTest1( + workloadFactory, + memoryManager, + armnn::DataLayout::NCHW); +} + +LayerTestResult SpaceToDepthNHWCFloat32Test2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return SpaceToDepthSimpleTest2( + workloadFactory, + memoryManager); +} + +LayerTestResult SpaceToDepthNCHWFloat32Test2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return SpaceToDepthSimpleTest2( + workloadFactory, + memoryManager, + armnn::DataLayout::NCHW); +} + +LayerTestResult SpaceToDepthNHWCQSymm16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return SpaceToDepthSimpleTest2( + workloadFactory, + memoryManager); +} + +LayerTestResult SpaceToDepthNCHWQSymm16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager) +{ + return SpaceToDepthSimpleTest2( workloadFactory, memoryManager, armnn::DataLayout::NCHW); diff --git a/src/backends/backendsCommon/test/LayerTests.hpp b/src/backends/backendsCommon/test/LayerTests.hpp index 259ad01c62..c3ea619eaa 100644 --- a/src/backends/backendsCommon/test/LayerTests.hpp +++ b/src/backends/backendsCommon/test/LayerTests.hpp @@ -2004,11 +2004,27 @@ LayerTestResult SpaceToDepthNHWCAsymmQ8Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); -LayerTestResult SpaceToDepthNHWCFloat32Test( +LayerTestResult SpaceToDepthNHWCFloat32Test1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); -LayerTestResult SpaceToDepthNCHWFloat32Test( +LayerTestResult SpaceToDepthNCHWFloat32Test1( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult SpaceToDepthNHWCFloat32Test2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult SpaceToDepthNCHWFloat32Test2( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult SpaceToDepthNHWCQSymm16Test( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +LayerTestResult SpaceToDepthNCHWQSymm16Test( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); diff --git a/src/backends/backendsCommon/test/SpaceToDepthTestImpl.hpp b/src/backends/backendsCommon/test/SpaceToDepthTestImpl.hpp index 99926cd026..af3f5d2618 100644 --- a/src/backends/backendsCommon/test/SpaceToDepthTestImpl.hpp +++ b/src/backends/backendsCommon/test/SpaceToDepthTestImpl.hpp @@ -81,7 +81,7 @@ LayerTestResult SpaceToDepthTestImpl( } template> -LayerTestResult SpaceToDepthSimpleTest( +LayerTestResult SpaceToDepthSimpleTest1( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout = armnn::DataLayout::NHWC) @@ -114,7 +114,7 @@ LayerTestResult SpaceToDepthSimpleTest( } template> -LayerTestResult SpaceToDepthFloatTest( +LayerTestResult SpaceToDepthSimpleTest2( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, armnn::DataLayout dataLayout = armnn::DataLayout::NHWC) diff --git a/src/backends/cl/ClLayerSupport.cpp b/src/backends/cl/ClLayerSupport.cpp index a6baa3c38f..497a6435df 100644 --- a/src/backends/cl/ClLayerSupport.cpp +++ b/src/backends/cl/ClLayerSupport.cpp @@ -43,6 +43,7 @@ #include "workloads/ClQuantizeWorkload.hpp" #include "workloads/ClSoftmaxBaseWorkload.hpp" #include "workloads/ClSpaceToBatchNdWorkload.hpp" +#include "workloads/ClSpaceToDepthWorkload.hpp" #include "workloads/ClSplitterWorkload.hpp" #include "workloads/ClStridedSliceWorkload.hpp" #include "workloads/ClSubtractionWorkload.hpp" @@ -650,6 +651,18 @@ bool ClLayerSupport::IsSpaceToBatchNdSupported(const TensorInfo& input, descriptor); } +bool ClLayerSupport::IsSpaceToDepthSupported(const TensorInfo& input, + const TensorInfo& output, + const SpaceToDepthDescriptor& descriptor, + Optional reasonIfUnsupported) const +{ + FORWARD_WORKLOAD_VALIDATE_FUNC(ClSpaceToDepthWorkloadValidate, + reasonIfUnsupported, + input, + output, + descriptor); +} + bool ClLayerSupport::IsSplitterSupported(const TensorInfo& input, const ViewsDescriptor& descriptor, Optional reasonIfUnsupported) const diff --git a/src/backends/cl/ClLayerSupport.hpp b/src/backends/cl/ClLayerSupport.hpp index f77889bef6..4a55997004 100644 --- a/src/backends/cl/ClLayerSupport.hpp +++ b/src/backends/cl/ClLayerSupport.hpp @@ -223,6 +223,11 @@ public: const SpaceToBatchNdDescriptor& descriptor, Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsSpaceToDepthSupported(const TensorInfo& input, + const TensorInfo& output, + const SpaceToDepthDescriptor& descriptor, + Optional reasonIfUnsupported = EmptyOptional()) const override; + ARMNN_DEPRECATED_MSG("Use IsSplitterSupported with outputs instead") bool IsSplitterSupported(const TensorInfo& input, const ViewsDescriptor& descriptor, diff --git a/src/backends/cl/ClTensorHandle.hpp b/src/backends/cl/ClTensorHandle.hpp index f09fb024e0..d08b79f9a6 100644 --- a/src/backends/cl/ClTensorHandle.hpp +++ b/src/backends/cl/ClTensorHandle.hpp @@ -105,6 +105,11 @@ private: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), static_cast(memory)); break; + case arm_compute::DataType::S16: + case arm_compute::DataType::QSYMM16: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; default: { throw armnn::UnimplementedException(); @@ -132,6 +137,11 @@ private: armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), this->GetTensor()); break; + case arm_compute::DataType::S16: + case arm_compute::DataType::QSYMM16: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; default: { throw armnn::UnimplementedException(); @@ -207,6 +217,11 @@ private: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), static_cast(memory)); break; + case arm_compute::DataType::S16: + case arm_compute::DataType::QSYMM16: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; default: { throw armnn::UnimplementedException(); @@ -234,6 +249,11 @@ private: armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), this->GetTensor()); break; + case arm_compute::DataType::S16: + case arm_compute::DataType::QSYMM16: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; default: { throw armnn::UnimplementedException(); diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp index 307f954bae..506acb4534 100644 --- a/src/backends/cl/ClWorkloadFactory.cpp +++ b/src/backends/cl/ClWorkloadFactory.cpp @@ -431,4 +431,10 @@ std::unique_ptr ClWorkloadFactory::CreateTransposeConvolution2 return MakeWorkload(descriptor, info, m_MemoryManager->GetIntraLayerManager()); } +std::unique_ptr ClWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& 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 5448504737..3b0ac826d7 100644 --- a/src/backends/cl/ClWorkloadFactory.hpp +++ b/src/backends/cl/ClWorkloadFactory.hpp @@ -179,6 +179,9 @@ public: std::unique_ptr CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + std::unique_ptr CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + private: template static std::unique_ptr MakeWorkload(const QueueDescriptorType& descriptor, diff --git a/src/backends/cl/backend.mk b/src/backends/cl/backend.mk index 87964cdc7a..1bc1fb3d71 100644 --- a/src/backends/cl/backend.mk +++ b/src/backends/cl/backend.mk @@ -53,6 +53,7 @@ BACKEND_SOURCES := \ workloads/ClSoftmaxFloatWorkload.cpp \ workloads/ClSoftmaxUint8Workload.cpp \ workloads/ClSpaceToBatchNdWorkload.cpp \ + workloads/ClSpaceToDepthWorkload.cpp \ workloads/ClSplitterWorkload.cpp \ workloads/ClStridedSliceWorkload.cpp \ workloads/ClSubtractionWorkload.cpp \ diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index 9ac244e505..20eb413762 100644 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -432,6 +432,19 @@ ARMNN_AUTO_TEST_CASE(SpaceToBatchNdMultiChannelsNHWCUint8, SpaceToBatchNdMultiCh ARMNN_AUTO_TEST_CASE(SpaceToBatchNdMultiBlockNHWCUint8, SpaceToBatchNdMultiBlockNHWCUint8Test) ARMNN_AUTO_TEST_CASE(SpaceToBatchNdPaddingNHWCUint8, SpaceToBatchNdPaddingNHWCUint8Test) +// Space To Depth +ARMNN_AUTO_TEST_CASE(SpaceToDepthNCHWAsymmQ8, SpaceToDepthNCHWAsymmQ8Test) +ARMNN_AUTO_TEST_CASE(SpaceToDepthNHWCAsymmQ8, SpaceToDepthNHWCAsymmQ8Test) + +ARMNN_AUTO_TEST_CASE(SpaceToDepthNHWC1Float32, SpaceToDepthNHWCFloat32Test1) +ARMNN_AUTO_TEST_CASE(SpaceToDepthNCHW1Float32, SpaceToDepthNCHWFloat32Test1) + +ARMNN_AUTO_TEST_CASE(SpaceToDepthNHWC2Float32, SpaceToDepthNHWCFloat32Test2) +ARMNN_AUTO_TEST_CASE(SpaceToDepthNCHW2Float32, SpaceToDepthNCHWFloat32Test2) + +ARMNN_AUTO_TEST_CASE(SpaceToDepthNHWCQSymm16, SpaceToDepthNHWCQSymm16Test) +ARMNN_AUTO_TEST_CASE(SpaceToDepthNCHWQSymm16, SpaceToDepthNCHWQSymm16Test) + // Strided Slice ARMNN_AUTO_TEST_CASE(StridedSlice4DFloat32, StridedSlice4DFloat32Test) ARMNN_AUTO_TEST_CASE(StridedSlice4DReverseFloat32, StridedSlice4DReverseFloat32Test) diff --git a/src/backends/cl/workloads/CMakeLists.txt b/src/backends/cl/workloads/CMakeLists.txt index 40c5f766e4..d98956fb06 100644 --- a/src/backends/cl/workloads/CMakeLists.txt +++ b/src/backends/cl/workloads/CMakeLists.txt @@ -70,6 +70,8 @@ list(APPEND armnnClBackendWorkloads_sources ClSoftmaxUint8Workload.hpp ClSpaceToBatchNdWorkload.hpp ClSpaceToBatchNdWorkload.cpp + ClSpaceToDepthWorkload.cpp + ClSpaceToDepthWorkload.hpp ClSplitterWorkload.cpp ClSplitterWorkload.hpp ClStridedSliceWorkload.cpp diff --git a/src/backends/cl/workloads/ClSpaceToDepthWorkload.cpp b/src/backends/cl/workloads/ClSpaceToDepthWorkload.cpp new file mode 100644 index 0000000000..d541e4ec52 --- /dev/null +++ b/src/backends/cl/workloads/ClSpaceToDepthWorkload.cpp @@ -0,0 +1,61 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "ClSpaceToDepthWorkload.hpp" +#include "ClWorkloadUtils.hpp" + +#include +#include +#include +#include +#include + +namespace armnn +{ +using namespace armcomputetensorutils; + +ClSpaceToDepthWorkload::ClSpaceToDepthWorkload(const SpaceToDepthQueueDescriptor& desc, + const WorkloadInfo& info) + : BaseWorkload(desc, info) +{ + m_Data.ValidateInputsOutputs("ClSpaceToDepthWorkload", 1, 1); + + arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout); + + arm_compute::ICLTensor& input = static_cast(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 = static_cast(m_Data.m_Outputs[0])->GetTensor(); + output.info()->set_data_layout(aclDataLayout); + + m_Layer.configure(&input, &output, blockSize); +} + +void ClSpaceToDepthWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_CL("ClSpaceToDepthWorkload_Execute"); + RunClFunction(m_Layer, CHECK_LOCATION()); +} + +arm_compute::Status ClSpaceToDepthWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const SpaceToDepthDescriptor& 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::CLSpaceToDepthLayer::validate(&aclInputInfo, + &aclOutputInfo, + blockSize); + return aclStatus; +} + +} //namespace armnn diff --git a/src/backends/cl/workloads/ClSpaceToDepthWorkload.hpp b/src/backends/cl/workloads/ClSpaceToDepthWorkload.hpp new file mode 100644 index 0000000000..57ce5d4d05 --- /dev/null +++ b/src/backends/cl/workloads/ClSpaceToDepthWorkload.hpp @@ -0,0 +1,29 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +#include +#include + +namespace armnn +{ +arm_compute::Status ClSpaceToDepthWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const SpaceToDepthDescriptor& desc); + +class ClSpaceToDepthWorkload : public BaseWorkload +{ +public: + ClSpaceToDepthWorkload(const SpaceToDepthQueueDescriptor& descriptor, const WorkloadInfo& info); + void Execute() const override; + +private: + mutable arm_compute::CLSpaceToDepthLayer m_Layer; +}; + +} //namespace armnn diff --git a/src/backends/cl/workloads/ClWorkloads.hpp b/src/backends/cl/workloads/ClWorkloads.hpp index 6ba8138780..256b68c96a 100644 --- a/src/backends/cl/workloads/ClWorkloads.hpp +++ b/src/backends/cl/workloads/ClWorkloads.hpp @@ -34,6 +34,7 @@ #include "ClSoftmaxFloatWorkload.hpp" #include "ClSoftmaxUint8Workload.hpp" #include "ClSpaceToBatchNdWorkload.hpp" +#include "ClSpaceToDepthWorkload.hpp" #include "ClSplitterWorkload.hpp" #include "ClStridedSliceWorkload.hpp" #include "ClSubtractionWorkload.hpp" diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 26070a5328..ae668f31f3 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -1457,10 +1457,11 @@ bool RefLayerSupport::IsSpaceToDepthSupported(const TensorInfo& input, ignore_unused(descriptor); bool supported = true; - std::array supportedTypes = + std::array supportedTypes = { DataType::Float32, DataType::QuantisedAsymm8, + DataType::QuantisedSymm16 }; supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported, diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 9f89c8c2e2..e978f4254d 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -974,8 +974,14 @@ ARMNN_AUTO_TEST_CASE(BatchToSpaceNdNchwQsymm16_7, BatchToSpaceNdNchwTest7