From 6858d3fb714cc20d5fcfd814c35ed3a84dc82145 Mon Sep 17 00:00:00 2001 From: Ellen Norris-Thompson Date: Fri, 21 Jun 2019 15:50:00 +0100 Subject: IVGCVSW-3247: Refactor reference Gather workload * Refactored Gather reference workload to not use templates for different types * Added quantization values in Gather unit tests for Quantized types Signed-off-by: Ellen Norris-Thompson Change-Id: Ibe5d655aa1c287824e45b83818c5862bda7f92b0 --- src/backends/reference/RefWorkloadFactory.cpp | 6 +++++- src/backends/reference/workloads/Gather.cpp | 25 ++++++---------------- src/backends/reference/workloads/Gather.hpp | 9 +++++--- .../reference/workloads/RefGatherWorkload.cpp | 18 +++++++--------- .../reference/workloads/RefGatherWorkload.hpp | 20 +++++------------ 5 files changed, 31 insertions(+), 47 deletions(-) (limited to 'src/backends/reference') diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 5b03555322..035a28b71a 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -429,7 +429,11 @@ std::unique_ptr RefWorkloadFactory::CreateRsqrt(const RsqrtQueueDescr std::unique_ptr RefWorkloadFactory::CreateGather(const armnn::GatherQueueDescriptor& descriptor, const armnn::WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + if (IsFloat16(info)) + { + return MakeWorkload(descriptor, info); + } + return std::make_unique(descriptor, info); } std::unique_ptr RefWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor, diff --git a/src/backends/reference/workloads/Gather.cpp b/src/backends/reference/workloads/Gather.cpp index 45491c7f52..c848a7c138 100644 --- a/src/backends/reference/workloads/Gather.cpp +++ b/src/backends/reference/workloads/Gather.cpp @@ -14,13 +14,12 @@ namespace armnn { -template void Gather(const TensorInfo& paramsInfo, const TensorInfo& indicesInfo, const TensorInfo& outputInfo, - const T* params, + Decoder& params, const int32_t* indices, - T* output) + Encoder& output) { const TensorShape& paramsShape = paramsInfo.GetShape(); @@ -39,9 +38,13 @@ void Gather(const TensorInfo& paramsInfo, unsigned int startOffset = indx * paramsProduct; unsigned int endOffset = startOffset + paramsProduct; + for (unsigned int j = startOffset; j < endOffset; ++j) { - output[outIndex] = params[j]; + params[j]; + float outputValue = params.Get(); + output[outIndex]; + output.Set(outputValue); ++outIndex; } } @@ -49,18 +52,4 @@ void Gather(const TensorInfo& paramsInfo, BOOST_ASSERT(outIndex == outputInfo.GetNumElements()); } -template void Gather(const TensorInfo& paramsInfo, - const TensorInfo& indicesInfo, - const TensorInfo& outputInfo, - const float* params, - const int32_t* indices, - float* output); - -template void Gather(const TensorInfo& paramsInfo, - const TensorInfo& indicesInfo, - const TensorInfo& outputInfo, - const uint8_t* params, - const int32_t* indices, - uint8_t* output); - } //namespace armnn diff --git a/src/backends/reference/workloads/Gather.hpp b/src/backends/reference/workloads/Gather.hpp index 0ad4f8ceb6..16c983eec4 100644 --- a/src/backends/reference/workloads/Gather.hpp +++ b/src/backends/reference/workloads/Gather.hpp @@ -7,15 +7,18 @@ #include "armnn/Tensor.hpp" +#include "BaseIterator.hpp" +#include "Decoders.hpp" +#include "Encoders.hpp" + namespace armnn { -template void Gather(const TensorInfo& paramsInfo, const TensorInfo& indicesInfo, const TensorInfo& outputInfo, - const T* params, + Decoder& params, const int32_t* indices, - T* output); + Encoder& output); } //namespace armnn diff --git a/src/backends/reference/workloads/RefGatherWorkload.cpp b/src/backends/reference/workloads/RefGatherWorkload.cpp index bca3f18796..8edf14c8f8 100644 --- a/src/backends/reference/workloads/RefGatherWorkload.cpp +++ b/src/backends/reference/workloads/RefGatherWorkload.cpp @@ -13,25 +13,23 @@ namespace armnn { -template -void RefGatherWorkload::Execute() const +void RefGatherWorkload::Execute() const { - using T = ResolveType; - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefGatherWorkload_Execute"); const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]); const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]); const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); - const T* paramsData = GetInputTensorData(0, m_Data); + std::unique_ptr> decoderPtr = MakeDecoder(inputInfo0, m_Data.m_Inputs[0]->Map()); + Decoder& decoder = *decoderPtr; + const int32_t* indicesData = GetInputTensorData(1, m_Data); - T* outputData = GetOutputTensorData(0, m_Data); - Gather(inputInfo0, inputInfo1, outputInfo, paramsData, indicesData, outputData); -} + std::unique_ptr> encoderPtr = MakeEncoder(outputInfo, m_Data.m_Outputs[0]->Map()); + Encoder& encoder = *encoderPtr; -template class RefGatherWorkload; -template class RefGatherWorkload; + Gather(inputInfo0, inputInfo1, outputInfo, decoder, indicesData, encoder); +} } //namespace armnn diff --git a/src/backends/reference/workloads/RefGatherWorkload.hpp b/src/backends/reference/workloads/RefGatherWorkload.hpp index 27827490e3..30019a8d4d 100644 --- a/src/backends/reference/workloads/RefGatherWorkload.hpp +++ b/src/backends/reference/workloads/RefGatherWorkload.hpp @@ -9,28 +9,18 @@ #include #include +#include "BaseIterator.hpp" +#include "Decoders.hpp" +#include "Encoders.hpp" namespace armnn { -template -class RefGatherWorkload : public FirstInputTypedWorkload +class RefGatherWorkload : public BaseWorkload { public: - - static const std::string& GetName() - { - static const std::string name = std::string("RefGather") + GetDataTypeName(DataType) + "Workload"; - return name; - } - - using FirstInputTypedWorkload::m_Data; - using FirstInputTypedWorkload::FirstInputTypedWorkload; - + using BaseWorkload::BaseWorkload; void Execute() const override; }; -using RefGatherFloat32Workload = RefGatherWorkload; -using RefGatherUint8Workload = RefGatherWorkload; - } // namespace armnn -- cgit v1.2.1