diff options
Diffstat (limited to 'src/backends/cl')
-rw-r--r-- | src/backends/cl/ClLayerSupport.cpp | 8 | ||||
-rw-r--r-- | src/backends/cl/test/ClLayerSupportTests.cpp | 37 | ||||
-rw-r--r-- | src/backends/cl/workloads/ClConstantWorkload.cpp | 41 | ||||
-rw-r--r-- | src/backends/cl/workloads/ClConstantWorkload.hpp | 3 |
4 files changed, 85 insertions, 4 deletions
diff --git a/src/backends/cl/ClLayerSupport.cpp b/src/backends/cl/ClLayerSupport.cpp index 12c71c0f70..546cbc1e59 100644 --- a/src/backends/cl/ClLayerSupport.cpp +++ b/src/backends/cl/ClLayerSupport.cpp @@ -23,6 +23,7 @@ #include "workloads/ClBatchNormalizationFloatWorkload.hpp" #include "workloads/ClBatchToSpaceNdWorkload.hpp" #include "workloads/ClComparisonWorkload.hpp" +#include "workloads/ClConstantWorkload.hpp" #include "workloads/ClConvertFp16ToFp32Workload.hpp" #include "workloads/ClConvertFp32ToFp16Workload.hpp" #include "workloads/ClConvolution2dWorkload.hpp" @@ -284,10 +285,9 @@ bool ClLayerSupport::IsConcatSupported(const std::vector<const TensorInfo*> inpu bool ClLayerSupport::IsConstantSupported(const TensorInfo& output, Optional<std::string&> reasonIfUnsupported) const { - return IsSupportedForDataTypeCl(reasonIfUnsupported, - output.GetDataType(), - &TrueFunc<>, - &TrueFunc<>); + FORWARD_WORKLOAD_VALIDATE_FUNC(ClConstantWorkloadValidate, + reasonIfUnsupported, + output); } bool ClLayerSupport::IsConvertFp16ToFp32Supported(const TensorInfo& input, diff --git a/src/backends/cl/test/ClLayerSupportTests.cpp b/src/backends/cl/test/ClLayerSupportTests.cpp index 33a2912b79..81d0cc2030 100644 --- a/src/backends/cl/test/ClLayerSupportTests.cpp +++ b/src/backends/cl/test/ClLayerSupportTests.cpp @@ -131,4 +131,41 @@ BOOST_FIXTURE_TEST_CASE(IsMeanSupportedCl, ClContextControlFixture) BOOST_CHECK(result); } +BOOST_AUTO_TEST_CASE(IsConstantSupportedCl) +{ + std::string reasonIfUnsupported; + + bool result = IsConstantLayerSupportedTests<armnn::ClWorkloadFactory, + armnn::DataType::Float16>(reasonIfUnsupported); + BOOST_CHECK(result); + + result = IsConstantLayerSupportedTests<armnn::ClWorkloadFactory, + armnn::DataType::Float32>(reasonIfUnsupported); + BOOST_CHECK(result); + + result = IsConstantLayerSupportedTests<armnn::ClWorkloadFactory, + armnn::DataType::QAsymmU8>(reasonIfUnsupported); + BOOST_CHECK(result); + + result = IsConstantLayerSupportedTests<armnn::ClWorkloadFactory, + armnn::DataType::Boolean>(reasonIfUnsupported); + BOOST_CHECK(!result); + + result = IsConstantLayerSupportedTests<armnn::ClWorkloadFactory, + armnn::DataType::QSymmS16>(reasonIfUnsupported); + BOOST_CHECK(result); + + result = IsConstantLayerSupportedTests<armnn::ClWorkloadFactory, + armnn::DataType::QSymmS8>(reasonIfUnsupported); + BOOST_CHECK(result); + + result = IsConstantLayerSupportedTests<armnn::ClWorkloadFactory, + armnn::DataType::QAsymmS8>(reasonIfUnsupported); + BOOST_CHECK(result); + + result = IsConstantLayerSupportedTests<armnn::ClWorkloadFactory, + armnn::DataType::BFloat16>(reasonIfUnsupported); + BOOST_CHECK(!result); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/backends/cl/workloads/ClConstantWorkload.cpp b/src/backends/cl/workloads/ClConstantWorkload.cpp index e928870324..bae7446753 100644 --- a/src/backends/cl/workloads/ClConstantWorkload.cpp +++ b/src/backends/cl/workloads/ClConstantWorkload.cpp @@ -15,6 +15,31 @@ namespace armnn { +arm_compute::Status ClConstantWorkloadValidate(const TensorInfo& output) +{ + const arm_compute::TensorInfo neonOutputInfo = armcomputetensorutils::BuildArmComputeTensorInfo(output); + + std::array<arm_compute::DataType,7> supportedTypes = { + arm_compute::DataType::F16, + arm_compute::DataType::F32, + arm_compute::DataType::QASYMM8, + arm_compute::DataType::QASYMM8_SIGNED, + arm_compute::DataType::QSYMM16, + arm_compute::DataType::QSYMM8, + arm_compute::DataType::QSYMM8_PER_CHANNEL + }; + auto it = std::find(begin(supportedTypes), end(supportedTypes), neonOutputInfo.data_type()); + + if (it != end(supportedTypes)) + { + return arm_compute::Status{}; + } + else + { + return arm_compute::Status{arm_compute::ErrorCode::RUNTIME_ERROR, "Unsupported DataType"}; + } +} + ClConstantWorkload::ClConstantWorkload(const ConstantQueueDescriptor& descriptor, const WorkloadInfo& info) : BaseWorkload<ConstantQueueDescriptor>(descriptor, info) , m_RanOnce(false) @@ -54,6 +79,22 @@ void ClConstantWorkload::Execute() const CopyArmComputeClTensorData(output, data.m_LayerOutput->GetConstTensor<uint8_t>()); break; } + case arm_compute::DataType::QASYMM8_SIGNED: + { + CopyArmComputeClTensorData(output, data.m_LayerOutput->GetConstTensor<int8_t>()); + break; + } + case arm_compute::DataType::QSYMM16: + { + CopyArmComputeClTensorData(output, data.m_LayerOutput->GetConstTensor<int16_t>()); + break; + } + case arm_compute::DataType::QSYMM8: + case arm_compute::DataType::QSYMM8_PER_CHANNEL: + { + CopyArmComputeClTensorData(output, data.m_LayerOutput->GetConstTensor<int8_t>()); + break; + } default: { ARMNN_ASSERT_MSG(false, "Unknown data type"); diff --git a/src/backends/cl/workloads/ClConstantWorkload.hpp b/src/backends/cl/workloads/ClConstantWorkload.hpp index 75325dc409..e5a1d4410d 100644 --- a/src/backends/cl/workloads/ClConstantWorkload.hpp +++ b/src/backends/cl/workloads/ClConstantWorkload.hpp @@ -5,10 +5,13 @@ #pragma once +#include <arm_compute/core/Error.h> #include <backendsCommon/Workload.hpp> namespace armnn { +arm_compute::Status ClConstantWorkloadValidate(const TensorInfo& output); + class ClConstantWorkload : public BaseWorkload<ConstantQueueDescriptor> { public: |