From a856501ac5c2d0cca70068993e5c7cc714872890 Mon Sep 17 00:00:00 2001 From: Keith Davis Date: Fri, 14 Feb 2020 12:22:40 +0000 Subject: IVGCVSW-4420 Failing Unit Test Cl: Quantize layer * Fix bug with missing ValidateInputsOutputs in Cl Workload * Renamed data type tests to be more specific * Future proofing Signed-off-by: Keith Davis Change-Id: I157acc318e40d727fcfb3f36f7f577fc87472f3d --- src/backends/backendsCommon/MakeWorkloadHelper.hpp | 1 + src/backends/backendsCommon/WorkloadFactory.cpp | 1 + src/backends/backendsCommon/WorkloadUtils.cpp | 1 + src/backends/cl/ClTensorHandle.hpp | 20 ++++++++++++++++++++ src/backends/cl/ClWorkloadFactory.cpp | 2 +- src/backends/cl/test/ClLayerSupportTests.cpp | 11 +++++++++-- src/backends/cl/workloads/ClDequantizeWorkload.cpp | 2 ++ src/backends/cl/workloads/ClQuantizeWorkload.cpp | 2 ++ src/backends/cl/workloads/ClWorkloadUtils.hpp | 1 + src/backends/neon/workloads/NeonQuantizeWorkload.cpp | 2 ++ 10 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/backends/backendsCommon/MakeWorkloadHelper.hpp b/src/backends/backendsCommon/MakeWorkloadHelper.hpp index f876c6b781..250a10a61c 100644 --- a/src/backends/backendsCommon/MakeWorkloadHelper.hpp +++ b/src/backends/backendsCommon/MakeWorkloadHelper.hpp @@ -59,6 +59,7 @@ std::unique_ptr MakeWorkloadHelper(const QueueDescriptorType& descrip case DataType::QAsymmU8: return MakeWorkloadForType::Func(descriptor, info, std::forward(args)...); case DataType::QSymmS8: + case DataType::QAsymmS8: return MakeWorkloadForType::Func(descriptor, info, std::forward(args)...); case DataType::Signed32: return MakeWorkloadForType::Func(descriptor, info, std::forward(args)...); diff --git a/src/backends/backendsCommon/WorkloadFactory.cpp b/src/backends/backendsCommon/WorkloadFactory.cpp index 283e748038..23ff70a52e 100644 --- a/src/backends/backendsCommon/WorkloadFactory.cpp +++ b/src/backends/backendsCommon/WorkloadFactory.cpp @@ -352,6 +352,7 @@ bool IWorkloadFactory::IsLayerSupported(const BackendId& backendId, break; } case DataType::QAsymmU8: + case DataType::QAsymmS8: case DataType::QSymmS8: case DataType::QSymmS16: { diff --git a/src/backends/backendsCommon/WorkloadUtils.cpp b/src/backends/backendsCommon/WorkloadUtils.cpp index 69a62914e5..3b3959ba9f 100644 --- a/src/backends/backendsCommon/WorkloadUtils.cpp +++ b/src/backends/backendsCommon/WorkloadUtils.cpp @@ -166,6 +166,7 @@ armnn::ConstTensor ConvertWeightTensorFromArmnnToAcl(const ConstCpuTensorHandle* weightPermuted = ReorderWeightChannelsForAcl(weightPermuted, dataLayout, permuteBuffer); break; + case DataType::QAsymmS8: case DataType::QAsymmU8: weightPermuted = ReorderWeightChannelsForAcl(weightPermuted, dataLayout, permuteBuffer); break; diff --git a/src/backends/cl/ClTensorHandle.hpp b/src/backends/cl/ClTensorHandle.hpp index cf2b44ac55..1830d186b6 100644 --- a/src/backends/cl/ClTensorHandle.hpp +++ b/src/backends/cl/ClTensorHandle.hpp @@ -100,6 +100,11 @@ private: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), static_cast(memory)); break; + case arm_compute::DataType::QSYMM8_PER_CHANNEL: + case arm_compute::DataType::QASYMM8_SIGNED: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; case arm_compute::DataType::F16: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), static_cast(memory)); @@ -141,6 +146,11 @@ private: this->GetTensor()); break; case arm_compute::DataType::S16: + case arm_compute::DataType::QSYMM8_PER_CHANNEL: + case arm_compute::DataType::QASYMM8_SIGNED: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; case arm_compute::DataType::QSYMM16: armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), this->GetTensor()); @@ -224,6 +234,11 @@ private: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), static_cast(memory)); break; + case arm_compute::DataType::QSYMM8_PER_CHANNEL: + case arm_compute::DataType::QASYMM8_SIGNED: + armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), + static_cast(memory)); + break; case arm_compute::DataType::S16: case arm_compute::DataType::QSYMM16: armcomputetensorutils::CopyArmComputeITensorData(this->GetTensor(), @@ -260,6 +275,11 @@ private: armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), this->GetTensor()); break; + case arm_compute::DataType::QSYMM8_PER_CHANNEL: + case arm_compute::DataType::QASYMM8_SIGNED: + armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), + this->GetTensor()); + break; case arm_compute::DataType::S16: case arm_compute::DataType::QSYMM16: armcomputetensorutils::CopyArmComputeITensorData(static_cast(memory), diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp index 0440aac022..4bb2e2a8ce 100644 --- a/src/backends/cl/ClWorkloadFactory.cpp +++ b/src/backends/cl/ClWorkloadFactory.cpp @@ -438,7 +438,7 @@ std::unique_ptr ClWorkloadFactory::CreatePrelu(const PreluQueueDescri std::unique_ptr ClWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + return MakeWorkload(descriptor, info); } std::unique_ptr ClWorkloadFactory::CreateQuantizedLstm(const QuantizedLstmQueueDescriptor& descriptor, diff --git a/src/backends/cl/test/ClLayerSupportTests.cpp b/src/backends/cl/test/ClLayerSupportTests.cpp index 8d10375778..33a2912b79 100644 --- a/src/backends/cl/test/ClLayerSupportTests.cpp +++ b/src/backends/cl/test/ClLayerSupportTests.cpp @@ -36,14 +36,21 @@ BOOST_FIXTURE_TEST_CASE(IsLayerSupportedFloat32Cl, ClContextControlFixture) IsLayerSupportedTests(&factory); } -BOOST_FIXTURE_TEST_CASE(IsLayerSupportedUint8Cl, ClContextControlFixture) +BOOST_FIXTURE_TEST_CASE(IsLayerSupportedQAsymmU8Cl, ClContextControlFixture) { armnn::ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager()); IsLayerSupportedTests(&factory); } -BOOST_FIXTURE_TEST_CASE(IsLayerSupportedInt8Cl, ClContextControlFixture) +BOOST_FIXTURE_TEST_CASE(IsLayerSupportedQAsymmS8Cl, ClContextControlFixture) +{ + armnn::ClWorkloadFactory factory = + ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager()); + IsLayerSupportedTests(&factory); +} + +BOOST_FIXTURE_TEST_CASE(IsLayerSupportedQSymmS8Cl, ClContextControlFixture) { armnn::ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager()); diff --git a/src/backends/cl/workloads/ClDequantizeWorkload.cpp b/src/backends/cl/workloads/ClDequantizeWorkload.cpp index 67a555a020..eca795de7e 100644 --- a/src/backends/cl/workloads/ClDequantizeWorkload.cpp +++ b/src/backends/cl/workloads/ClDequantizeWorkload.cpp @@ -32,6 +32,8 @@ ClDequantizeWorkload::ClDequantizeWorkload(const DequantizeQueueDescriptor& desc const WorkloadInfo& workloadInfo) : BaseWorkload(descriptor, workloadInfo) { + m_Data.ValidateInputsOutputs("ClDequantizeWorkload", 1, 1); + arm_compute::ICLTensor& input = boost::polymorphic_pointer_downcast( m_Data.m_Inputs[0])->GetTensor(); diff --git a/src/backends/cl/workloads/ClQuantizeWorkload.cpp b/src/backends/cl/workloads/ClQuantizeWorkload.cpp index 230e346a00..263065a5a4 100644 --- a/src/backends/cl/workloads/ClQuantizeWorkload.cpp +++ b/src/backends/cl/workloads/ClQuantizeWorkload.cpp @@ -32,6 +32,8 @@ arm_compute::Status ClQuantizeWorkloadValidate(const TensorInfo& input, ClQuantizeWorkload::ClQuantizeWorkload(const QuantizeQueueDescriptor& descriptor, const WorkloadInfo& info) : BaseWorkload(descriptor, info) { + m_Data.ValidateInputsOutputs("ClQuantizeWorkload", 1, 1); + arm_compute::ICLTensor& input = static_cast(m_Data.m_Inputs[0])->GetTensor(); arm_compute::ICLTensor& output = static_cast(m_Data.m_Outputs[0])->GetTensor(); diff --git a/src/backends/cl/workloads/ClWorkloadUtils.hpp b/src/backends/cl/workloads/ClWorkloadUtils.hpp index d3c6df50ed..b4bcc1c017 100644 --- a/src/backends/cl/workloads/ClWorkloadUtils.hpp +++ b/src/backends/cl/workloads/ClWorkloadUtils.hpp @@ -101,6 +101,7 @@ inline void InitializeArmComputeClTensorData(arm_compute::CLTensor& clTensor, case DataType::Float32: CopyArmComputeClTensorData(clTensor, handle->GetConstTensor()); break; + case DataType::QAsymmS8: case DataType::QAsymmU8: CopyArmComputeClTensorData(clTensor, handle->GetConstTensor()); break; diff --git a/src/backends/neon/workloads/NeonQuantizeWorkload.cpp b/src/backends/neon/workloads/NeonQuantizeWorkload.cpp index cb8393b819..4f3ea2c3c1 100644 --- a/src/backends/neon/workloads/NeonQuantizeWorkload.cpp +++ b/src/backends/neon/workloads/NeonQuantizeWorkload.cpp @@ -28,6 +28,8 @@ NeonQuantizeWorkload::NeonQuantizeWorkload(const QuantizeQueueDescriptor& descri const WorkloadInfo& workloadInfo) : BaseWorkload(descriptor, workloadInfo) { + m_Data.ValidateInputsOutputs("NeonQuantizeWorkload", 1, 1); + arm_compute::ITensor& input = boost::polymorphic_pointer_downcast( m_Data.m_Inputs[0])->GetTensor(); arm_compute::ITensor& output = boost::polymorphic_pointer_downcast( -- cgit v1.2.1