From dd6aceaa884815e68ed69fca71de81babd3204da Mon Sep 17 00:00:00 2001 From: Mohamed Nour Abouelseoud Date: Thu, 18 Oct 2018 12:26:19 +0100 Subject: IVGCVSW-2013 Add a UInt8 Reference Implementation for the PAD Operator Change-Id: I41f3606198db1fda8d72aaf5169594ba9156eb38 --- src/backends/reference/workloads/Pad.cpp | 44 +++++++++++----------- src/backends/reference/workloads/Pad.hpp | 9 +++-- .../reference/workloads/RefPadWorkload.cpp | 17 +++++---- .../reference/workloads/RefPadWorkload.hpp | 25 +++++++++--- .../reference/workloads/RefPermuteWorkload.hpp | 2 +- 5 files changed, 59 insertions(+), 38 deletions(-) (limited to 'src/backends/reference/workloads') diff --git a/src/backends/reference/workloads/Pad.cpp b/src/backends/reference/workloads/Pad.cpp index 5c859317dd..a50fa23c6c 100644 --- a/src/backends/reference/workloads/Pad.cpp +++ b/src/backends/reference/workloads/Pad.cpp @@ -5,24 +5,22 @@ #include "Pad.hpp" #include "backends/WorkloadData.hpp" - #include #include "TensorBufferArrayView.hpp" - #include #include #include #include #include - namespace armnn { +template void Pad(const TensorInfo& inputInfo, const TensorInfo& outputInfo, std::vector> m_PadList, - const float* inputData, - float* outData) + const T* inputData, + T* outData) { unsigned int numOutputElements = outputInfo.GetNumElements(); @@ -30,10 +28,12 @@ void Pad(const TensorInfo& inputInfo, TensorShape inputShape = inputInfo.GetShape(); unsigned int numInputDimensions = inputShape.GetNumDimensions(); + #ifndef NDEBUG - unsigned int numOutputDimensions = outputShape.GetNumDimensions(); + unsigned int numOutputDimensions = outputShape.GetNumDimensions(); assert(numInputDimensions == numOutputDimensions); + #endif unsigned int inputBatches = 0; @@ -51,29 +51,27 @@ void Pad(const TensorInfo& inputInfo, } switch(numInputDimensions) { + case 1: inputWidth = inputShape[0]; for (unsigned int w = 0; w < inputWidth ; w++) { - outData[w+std::get<0>(m_PadList[0])] = inputData[w]; - } break; + case 2 : inputHeight = inputShape[0]; inputWidth = inputShape[1]; - outputHeight = outputShape[0]; outputWidth = outputShape[1]; for (unsigned int h = 0; h < inputHeight; h++) { - for (unsigned int w = 0; w < inputWidth ; w++) { outData[(h+std::get<0>(m_PadList[0]))*outputWidth @@ -82,25 +80,22 @@ void Pad(const TensorInfo& inputInfo, } break; + case 3 : inputChannels = inputShape[0]; inputHeight = inputShape[1]; inputWidth = inputShape[2]; - outputChannels = outputShape[0]; outputHeight = outputShape[1]; outputWidth = outputShape[2]; for (unsigned int c = 0; c < inputChannels; c++) { - for (unsigned int h = 0; h < inputHeight; h++) { - for (unsigned int w = 0; w < inputWidth ; w++) { - outData[(c+std::get<0>(m_PadList[0]))*outputHeight*outputWidth + (h+std::get<0>(m_PadList[1]))*outputWidth + (w+std::get<0>(m_PadList[2]))] = inputData[c * inputHeight * inputWidth @@ -111,13 +106,13 @@ void Pad(const TensorInfo& inputInfo, } break; + case 4 : inputBatches = inputShape[0]; inputChannels = inputShape[1]; inputHeight = inputShape[2]; inputWidth = inputShape[3]; - outputChannels = outputShape[1]; outputHeight = outputShape[2]; outputWidth = outputShape[3]; @@ -126,13 +121,10 @@ void Pad(const TensorInfo& inputInfo, { for (unsigned int c = 0; c < inputChannels; c++) { - for (unsigned int h = 0; h < inputHeight; h++) { - for (unsigned int w = 0; w < inputWidth ; w++) { - outData[(b+std::get<0>(m_PadList[0])) * outputChannels * outputHeight * outputWidth + (c+std::get<0>(m_PadList[1])) * outputHeight * outputWidth + (h+std::get<0>(m_PadList[2])) * outputWidth @@ -141,7 +133,6 @@ void Pad(const TensorInfo& inputInfo, + c * inputHeight * inputWidth + h * inputWidth + w]; - } } } @@ -150,9 +141,20 @@ void Pad(const TensorInfo& inputInfo, break; default : + break; } - } -} //namespace armnn +template void Pad(const TensorInfo& inputInfo, + const TensorInfo& outputInfo, + std::vector> m_PadList, + const float* inputData, + float* outData); +template void Pad(const TensorInfo& inputInfo, + const TensorInfo& outputInfo, + std::vector> m_PadList, + const uint8_t* inputData, + uint8_t* outData); + +} //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/Pad.hpp b/src/backends/reference/workloads/Pad.hpp index ed80ef8eb0..42318d6fcf 100644 --- a/src/backends/reference/workloads/Pad.hpp +++ b/src/backends/reference/workloads/Pad.hpp @@ -12,9 +12,10 @@ namespace armnn { +template void Pad(const TensorInfo& inputInfo, - const TensorInfo& outputInfo, - std::vector> m_PadList, - const float* inputData, - float* outData); + const TensorInfo& outputInfo, + std::vector> m_PadList, + const T* inputData, + T* outData); } //namespace armnn diff --git a/src/backends/reference/workloads/RefPadWorkload.cpp b/src/backends/reference/workloads/RefPadWorkload.cpp index 233fbe4f34..b41c2de9af 100644 --- a/src/backends/reference/workloads/RefPadWorkload.cpp +++ b/src/backends/reference/workloads/RefPadWorkload.cpp @@ -10,28 +10,31 @@ #include "Profiling.hpp" +#include "TypeUtils.hpp" + #include namespace armnn { -RefPadWorkload::RefPadWorkload(const PadQueueDescriptor& descriptor, const WorkloadInfo& info) - :BaseWorkload(descriptor, info) {} - - -void RefPadWorkload::Execute() const +template +void RefPadWorkload::Execute() const { + using T = ResolveType; ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefPadWorkload_Execute"); const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]); const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); - const float* inputData = GetInputTensorDataFloat(0, m_Data); - float* outputData = GetOutputTensorDataFloat(0, m_Data); + const T* inputData = GetInputTensorData(0, m_Data); + T* outputData = GetOutputTensorData(0, m_Data); Pad(inputInfo, outputInfo, m_Data.m_Parameters.m_PadList, inputData, outputData); } +template class RefPadWorkload; +template class RefPadWorkload; + } //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefPadWorkload.hpp b/src/backends/reference/workloads/RefPadWorkload.hpp index 7ff117d6a5..938fcf2004 100644 --- a/src/backends/reference/workloads/RefPadWorkload.hpp +++ b/src/backends/reference/workloads/RefPadWorkload.hpp @@ -5,17 +5,32 @@ #pragma once -#include "backends/Workload.hpp" -#include "backends/WorkloadData.hpp" +#include +#include + +#include namespace armnn { -class RefPadWorkload : public BaseWorkload +template +class RefPadWorkload : public TypedWorkload { public: - explicit RefPadWorkload (const PadQueueDescriptor& descriptor, const WorkloadInfo& info); - virtual void Execute() const override; + + static const std::string& GetName() + { + static const std::string name = std::string("RefPad") + GetDataTypeName(DataType) + "Workload"; + return name; + } + + using TypedWorkload::m_Data; + using TypedWorkload::TypedWorkload; + + void Execute() const override; }; +using RefPadFloat32Workload = RefPadWorkload; +using RefPadUint8Workload = RefPadWorkload; + } //namespace armnn diff --git a/src/backends/reference/workloads/RefPermuteWorkload.hpp b/src/backends/reference/workloads/RefPermuteWorkload.hpp index 841a080dfd..50caa3e9ec 100644 --- a/src/backends/reference/workloads/RefPermuteWorkload.hpp +++ b/src/backends/reference/workloads/RefPermuteWorkload.hpp @@ -31,4 +31,4 @@ using RefPermuteFloat16Workload = RefPermuteWorkload; using RefPermuteFloat32Workload = RefPermuteWorkload; using RefPermuteUint8Workload = RefPermuteWorkload; -} //namespace armnn +} //namespace armnn \ No newline at end of file -- cgit v1.2.1