From 5f400d6d23b463ca810180b45dd84c3f99b24690 Mon Sep 17 00:00:00 2001 From: Derek Lamberti Date: Mon, 25 Mar 2019 15:41:58 +0000 Subject: IVGCVSW-2871 Ref QuantizeLayer workload Change-Id: If048b2a053c542b31ae344fe0af04d9b4f40eb6d Signed-off-by: Derek Lamberti --- src/backends/reference/workloads/CMakeLists.txt | 2 + .../reference/workloads/RefQuantizeWorkload.cpp | 66 ++++++++++++++++++++++ .../reference/workloads/RefQuantizeWorkload.hpp | 26 +++++++++ src/backends/reference/workloads/RefWorkloads.hpp | 2 + 4 files changed, 96 insertions(+) create mode 100644 src/backends/reference/workloads/RefQuantizeWorkload.cpp create mode 100644 src/backends/reference/workloads/RefQuantizeWorkload.hpp (limited to 'src/backends/reference/workloads') diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt index c4fc202250..4f5fbb554e 100644 --- a/src/backends/reference/workloads/CMakeLists.txt +++ b/src/backends/reference/workloads/CMakeLists.txt @@ -97,6 +97,8 @@ list(APPEND armnnRefBackendWorkloads_sources RefPooling2dFloat32Workload.hpp RefPooling2dUint8Workload.cpp RefPooling2dUint8Workload.hpp + RefQuantizeWorkload.cpp + RefQuantizeWorkload.hpp RefReshapeFloat32Workload.cpp RefReshapeFloat32Workload.hpp RefReshapeUint8Workload.cpp diff --git a/src/backends/reference/workloads/RefQuantizeWorkload.cpp b/src/backends/reference/workloads/RefQuantizeWorkload.cpp new file mode 100644 index 0000000000..b7ace32e14 --- /dev/null +++ b/src/backends/reference/workloads/RefQuantizeWorkload.cpp @@ -0,0 +1,66 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "RefQuantizeWorkload.hpp" + +#include + + +namespace armnn +{ + +namespace +{ + +template +void QuantizeImpl(const void *input, void *output, size_t numValues, float scale, int offset) +{ + auto in = static_cast(input); + auto out = static_cast(output); + for (size_t i = 0; i < numValues; i++, in++, out++) + { + *out = armnn::Quantize(*in, scale, offset); + } +} + +} //namespace + +RefQuantizeWorkload::RefQuantizeWorkload(const QuantizeQueueDescriptor& descriptor, const WorkloadInfo &info) + : BaseWorkload(descriptor, info) + , m_NumElements(info.m_InputTensorInfos[0].GetNumElements()) + , m_TargetType(info.m_OutputTensorInfos[0].GetDataType()) + , m_Scale(info.m_OutputTensorInfos[0].GetQuantizationScale()) + , m_Offset(info.m_OutputTensorInfos[0].GetQuantizationOffset()) +{ +} + +void RefQuantizeWorkload::Execute() const +{ + const void* input = m_Data.m_Inputs[0]->Map(true); + void* output = m_Data.m_Outputs[0]->Map(true); + + switch(m_TargetType) + { + case DataType::QuantisedAsymm8: + { + QuantizeImpl(input, output, m_NumElements, m_Scale, m_Offset); + break; + } + case DataType::QuantisedSymm16: + { + QuantizeImpl(input, output, m_NumElements, m_Scale, 0); + break; + } + default: + { + BOOST_ASSERT_MSG(false, "RefQuantizeWorkload: Non quantized output type encountered"); + } + } + + m_Data.m_Inputs[0]->Unmap(); + m_Data.m_Outputs[0]->Unmap(); +} + +} //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefQuantizeWorkload.hpp b/src/backends/reference/workloads/RefQuantizeWorkload.hpp new file mode 100644 index 0000000000..6a43b8471d --- /dev/null +++ b/src/backends/reference/workloads/RefQuantizeWorkload.hpp @@ -0,0 +1,26 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include +#include + +namespace armnn { + +class RefQuantizeWorkload : public BaseWorkload +{ +public: + RefQuantizeWorkload(const QuantizeQueueDescriptor& descriptor, const WorkloadInfo &info); + void Execute() const override; + +private: + size_t m_NumElements; + armnn::DataType m_TargetType; + float m_Scale; + int m_Offset; +}; + +} //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefWorkloads.hpp b/src/backends/reference/workloads/RefWorkloads.hpp index 7d2e813f6b..77aa56fcc6 100644 --- a/src/backends/reference/workloads/RefWorkloads.hpp +++ b/src/backends/reference/workloads/RefWorkloads.hpp @@ -64,3 +64,5 @@ #include "RefRsqrtFloat32Workload.hpp" #include "RefComparisonWorkload.hpp" #include "RefDequantizeWorkload.hpp" + +#include "RefQuantizeWorkload.hpp" \ No newline at end of file -- cgit v1.2.1