From 66aecb0bcab0de55afd6a9f217b17fa6107dd308 Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Wed, 24 Jun 2020 11:42:20 +0100 Subject: IVGCVSW-4621 Add CL FILL Workload * Add CL workload for Fill Operator * Enabled Fill operator tests on CL * CLFill function does not have validate() function yet IsLayerSupported() function return true at the moment * Enabled int32 to tests on backends Signed-off-by: Sadik Armagan Change-Id: I9f8cc6d1c86f832ba46a8d170572f4cfcde9ab17 --- .../test/layerTests/FillTestImpl.cpp | 5 ++++ src/backends/cl/ClLayerSupport.cpp | 9 ++++++ 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 | 5 ++++ src/backends/cl/workloads/CMakeLists.txt | 2 ++ src/backends/cl/workloads/ClFillWorkload.cpp | 35 ++++++++++++++++++++++ src/backends/cl/workloads/ClFillWorkload.hpp | 24 +++++++++++++++ src/backends/cl/workloads/ClWorkloads.hpp | 1 + src/backends/neon/test/NeonLayerTests.cpp | 1 + src/backends/reference/RefWorkloadFactory.hpp | 2 +- src/backends/reference/test/RefLayerTests.cpp | 1 + 14 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/backends/cl/workloads/ClFillWorkload.cpp create mode 100644 src/backends/cl/workloads/ClFillWorkload.hpp diff --git a/src/backends/backendsCommon/test/layerTests/FillTestImpl.cpp b/src/backends/backendsCommon/test/layerTests/FillTestImpl.cpp index 00a185ca2d..64970fecdf 100644 --- a/src/backends/backendsCommon/test/layerTests/FillTestImpl.cpp +++ b/src/backends/backendsCommon/test/layerTests/FillTestImpl.cpp @@ -66,5 +66,10 @@ SimpleFillTest( template LayerTestResult, 4> SimpleFillTest( + armnn::IWorkloadFactory& workloadFactory, + const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); + +template LayerTestResult, 4> +SimpleFillTest( armnn::IWorkloadFactory& workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager); \ No newline at end of file diff --git a/src/backends/cl/ClLayerSupport.cpp b/src/backends/cl/ClLayerSupport.cpp index 9c0cf61f9c..44da423f92 100644 --- a/src/backends/cl/ClLayerSupport.cpp +++ b/src/backends/cl/ClLayerSupport.cpp @@ -32,6 +32,7 @@ #include "workloads/ClDequantizeWorkload.hpp" #include "workloads/ClDivisionFloatWorkload.hpp" #include "workloads/ClExpWorkload.hpp" +#include "workloads/ClFillWorkload.hpp" #include "workloads/ClFloorFloatWorkload.hpp" #include "workloads/ClFullyConnectedWorkload.hpp" #include "workloads/ClGatherWorkload.hpp" @@ -428,6 +429,14 @@ bool ClLayerSupport::IsElementwiseUnarySupported(const TensorInfo& input, } } +bool ClLayerSupport::IsFillSupported(const TensorInfo&, + const TensorInfo&, + const FillDescriptor&, + Optional) const +{ + return true; +} + bool ClLayerSupport::IsFloorSupported(const TensorInfo& input, const TensorInfo& output, Optional reasonIfUnsupported) const diff --git a/src/backends/cl/ClLayerSupport.hpp b/src/backends/cl/ClLayerSupport.hpp index 67fd230ea2..d3c3295d2f 100644 --- a/src/backends/cl/ClLayerSupport.hpp +++ b/src/backends/cl/ClLayerSupport.hpp @@ -108,6 +108,11 @@ public: const ElementwiseUnaryDescriptor& descriptor, Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsFillSupported(const TensorInfo& input, + const TensorInfo& output, + const FillDescriptor& descriptor, + Optional reasonIfUnsupported = EmptyOptional()) const override; + bool IsFloorSupported(const TensorInfo& input, const TensorInfo& output, Optional reasonIfUnsupported = EmptyOptional()) const override; diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp index 905930ea55..9bbf661c3c 100644 --- a/src/backends/cl/ClWorkloadFactory.cpp +++ b/src/backends/cl/ClWorkloadFactory.cpp @@ -287,6 +287,12 @@ std::unique_ptr ClWorkloadFactory::CreateEqual(const EqualQueueDescri return CreateComparison(comparisonDescriptor, info); } +std::unique_ptr ClWorkloadFactory::CreateFill(const FillQueueDescriptor& descriptor, + const WorkloadInfo& info) const +{ + return std::make_unique(descriptor, info); +} + std::unique_ptr ClWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor, const WorkloadInfo& info) const { diff --git a/src/backends/cl/ClWorkloadFactory.hpp b/src/backends/cl/ClWorkloadFactory.hpp index 2ea7c6004f..d1e41b0e07 100644 --- a/src/backends/cl/ClWorkloadFactory.hpp +++ b/src/backends/cl/ClWorkloadFactory.hpp @@ -100,6 +100,9 @@ public: std::unique_ptr CreateEqual(const EqualQueueDescriptor& descriptor, const WorkloadInfo& info) const override; + std::unique_ptr CreateFill(const FillQueueDescriptor& descriptor, + const WorkloadInfo& info) const override; + std::unique_ptr CreateFloor(const FloorQueueDescriptor& descriptor, const WorkloadInfo& info) const override; diff --git a/src/backends/cl/backend.mk b/src/backends/cl/backend.mk index 721a9ec26e..87be2caeb2 100644 --- a/src/backends/cl/backend.mk +++ b/src/backends/cl/backend.mk @@ -39,6 +39,7 @@ BACKEND_SOURCES := \ workloads/ClDequantizeWorkload.cpp \ workloads/ClDivisionFloatWorkload.cpp \ workloads/ClExpWorkload.cpp \ + workloads/ClFillWorkload.cpp \ workloads/ClFloorFloatWorkload.cpp \ workloads/ClFullyConnectedWorkload.cpp \ workloads/ClGatherWorkload.cpp \ diff --git a/src/backends/cl/test/ClLayerTests.cpp b/src/backends/cl/test/ClLayerTests.cpp index cbe8dfed61..2f2aa1782e 100644 --- a/src/backends/cl/test/ClLayerTests.cpp +++ b/src/backends/cl/test/ClLayerTests.cpp @@ -462,6 +462,11 @@ ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcInt16_2, DepthToSpaceTest2, DataLayout::NHWC); ARMNN_AUTO_TEST_CASE(DepthToSpaceNhwcInt16_4, DepthToSpaceTest4, DataLayout::NHWC); +// Fill +ARMNN_AUTO_TEST_CASE(SimpleFill, SimpleFillTest) +ARMNN_AUTO_TEST_CASE(SimpleFillF16, SimpleFillTest) +ARMNN_AUTO_TEST_CASE(SimpleFillS32, SimpleFillTest) + // Floor ARMNN_AUTO_TEST_CASE(SimpleFloor, SimpleFloorTest) diff --git a/src/backends/cl/workloads/CMakeLists.txt b/src/backends/cl/workloads/CMakeLists.txt index 6baeae0a80..fe9c9fa5c7 100644 --- a/src/backends/cl/workloads/CMakeLists.txt +++ b/src/backends/cl/workloads/CMakeLists.txt @@ -38,6 +38,8 @@ list(APPEND armnnClBackendWorkloads_sources ClDivisionFloatWorkload.hpp ClExpWorkload.cpp ClExpWorkload.hpp + ClFillWorkload.cpp + ClFillWorkload.hpp ClFloorFloatWorkload.cpp ClFloorFloatWorkload.hpp ClFullyConnectedWorkload.cpp diff --git a/src/backends/cl/workloads/ClFillWorkload.cpp b/src/backends/cl/workloads/ClFillWorkload.cpp new file mode 100644 index 0000000000..47a70bc677 --- /dev/null +++ b/src/backends/cl/workloads/ClFillWorkload.cpp @@ -0,0 +1,35 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "ClFillWorkload.hpp" + +#include "ClWorkloadUtils.hpp" + +#include +#include +#include + +namespace armnn +{ +using namespace armcomputetensorutils; + +ClFillWorkload::ClFillWorkload(const FillQueueDescriptor& descriptor, const WorkloadInfo& info) + : BaseWorkload(descriptor, info) +{ + m_Data.ValidateInputsOutputs("ClFillWorkload", 1, 1); + + arm_compute::ICLTensor& output = static_cast(this->m_Data.m_Outputs[0])->GetTensor(); + arm_compute::PixelValue pixelValue = GetPixelValue(output, descriptor.m_Parameters.m_Value); + + m_Layer.configure(&output, pixelValue); +} + +void ClFillWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_CL("ClFillWorkload_Execute"); + RunClFunction(m_Layer, CHECK_LOCATION()); +} + +} // namespace armnn diff --git a/src/backends/cl/workloads/ClFillWorkload.hpp b/src/backends/cl/workloads/ClFillWorkload.hpp new file mode 100644 index 0000000000..8919445d0c --- /dev/null +++ b/src/backends/cl/workloads/ClFillWorkload.hpp @@ -0,0 +1,24 @@ +// +// Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include +#include +#include + +namespace armnn { + +class ClFillWorkload : public BaseWorkload +{ +public: + ClFillWorkload(const FillQueueDescriptor& descriptor, const WorkloadInfo& info); + void Execute() const override; + +private: + mutable arm_compute::CLFill m_Layer; +}; + +} //namespace armnn diff --git a/src/backends/cl/workloads/ClWorkloads.hpp b/src/backends/cl/workloads/ClWorkloads.hpp index 5c81079ad7..99f3e62de7 100644 --- a/src/backends/cl/workloads/ClWorkloads.hpp +++ b/src/backends/cl/workloads/ClWorkloads.hpp @@ -18,6 +18,7 @@ #include "ClDequantizeWorkload.hpp" #include "ClDivisionFloatWorkload.hpp" #include "ClExpWorkload.hpp" +#include "ClFillWorkload.hpp" #include "ClFloorFloatWorkload.hpp" #include "ClFullyConnectedWorkload.hpp" #include "ClGatherWorkload.hpp" diff --git a/src/backends/neon/test/NeonLayerTests.cpp b/src/backends/neon/test/NeonLayerTests.cpp index c4b5d18f08..acadf6e8a3 100644 --- a/src/backends/neon/test/NeonLayerTests.cpp +++ b/src/backends/neon/test/NeonLayerTests.cpp @@ -1224,6 +1224,7 @@ ARMNN_AUTO_TEST_CASE(ExpNegative, ExpNegativeTest) // Fill ARMNN_AUTO_TEST_CASE(SimpleFill, SimpleFillTest) ARMNN_AUTO_TEST_CASE(SimpleFillF16, SimpleFillTest) +ARMNN_AUTO_TEST_CASE(SimpleFillS32, SimpleFillTest) #if defined(ARMNNREF_ENABLED) diff --git a/src/backends/reference/RefWorkloadFactory.hpp b/src/backends/reference/RefWorkloadFactory.hpp index 0b419303cc..941f1a6636 100644 --- a/src/backends/reference/RefWorkloadFactory.hpp +++ b/src/backends/reference/RefWorkloadFactory.hpp @@ -130,7 +130,7 @@ public: const WorkloadInfo& info) const override; std::unique_ptr CreateFill(const FillQueueDescriptor& descriptor, - const WorkloadInfo& info) const override; + const WorkloadInfo& info) const override; std::unique_ptr CreateFloor(const FloorQueueDescriptor& descriptor, const WorkloadInfo& info) const override; diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index 4d347cab46..d96fa8be59 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -1217,6 +1217,7 @@ ARMNN_AUTO_TEST_CASE(Concat4dDiffShapeDim3Uint8, Concat4dDiffShapeDim3Uint8Test, // Fill ARMNN_AUTO_TEST_CASE(SimpleFill, SimpleFillTest) ARMNN_AUTO_TEST_CASE(SimpleFillF16, SimpleFillTest) +ARMNN_AUTO_TEST_CASE(SimpleFillS32, SimpleFillTest) // Floor ARMNN_AUTO_TEST_CASE(SimpleFloor, SimpleFloorTest) -- cgit v1.2.1