From 719d2a94dff9966d70691cff4c97a635e6fe5f5e Mon Sep 17 00:00:00 2001 From: Ellen Norris-Thompson Date: Wed, 12 Jun 2019 10:23:57 +0100 Subject: IVGCVSW-3218 Refactor the Reference Workloads for the ResizeBilinear layer * Refactored ResizeBilinear Reference Workloads to combine Float32 and Uint8 files Signed-off-by: Ellen Norris-Thompson Change-Id: I725a830f4c4755a7d3a37ca68e31e44e7eb267cb --- src/backends/reference/RefWorkloadFactory.cpp | 6 +++- src/backends/reference/backend.mk | 3 +- .../reference/test/RefCreateWorkloadTests.cpp | 6 ++-- src/backends/reference/workloads/CMakeLists.txt | 6 ++-- .../workloads/RefResizeBilinearFloat32Workload.cpp | 30 ------------------- .../workloads/RefResizeBilinearFloat32Workload.hpp | 21 ------------- .../workloads/RefResizeBilinearUint8Workload.cpp | 33 -------------------- .../workloads/RefResizeBilinearUint8Workload.hpp | 21 ------------- .../workloads/RefResizeBilinearWorkload.cpp | 35 ++++++++++++++++++++++ .../workloads/RefResizeBilinearWorkload.hpp | 21 +++++++++++++ src/backends/reference/workloads/RefWorkloads.hpp | 3 +- .../reference/workloads/ResizeBilinear.cpp | 24 ++++++++++----- .../reference/workloads/ResizeBilinear.hpp | 5 ++-- 13 files changed, 88 insertions(+), 126 deletions(-) delete mode 100644 src/backends/reference/workloads/RefResizeBilinearFloat32Workload.cpp delete mode 100644 src/backends/reference/workloads/RefResizeBilinearFloat32Workload.hpp delete mode 100644 src/backends/reference/workloads/RefResizeBilinearUint8Workload.cpp delete mode 100644 src/backends/reference/workloads/RefResizeBilinearUint8Workload.hpp create mode 100644 src/backends/reference/workloads/RefResizeBilinearWorkload.cpp create mode 100644 src/backends/reference/workloads/RefResizeBilinearWorkload.hpp diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index a2d864046d..728e60520a 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -242,7 +242,11 @@ std::unique_ptr RefWorkloadFactory::CreateMemCopy(const MemCop std::unique_ptr RefWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + if (IsFloat16(info)) + { + return MakeWorkload(descriptor, info); + } + return std::make_unique(descriptor, info); } std::unique_ptr RefWorkloadFactory::CreateFakeQuantization( diff --git a/src/backends/reference/backend.mk b/src/backends/reference/backend.mk index 189f692033..c4a0c76bdc 100644 --- a/src/backends/reference/backend.mk +++ b/src/backends/reference/backend.mk @@ -53,8 +53,7 @@ BACKEND_SOURCES := \ workloads/RefPooling2dWorkload.cpp \ workloads/RefQuantizeWorkload.cpp \ workloads/RefReshapeWorkload.cpp \ - workloads/RefResizeBilinearFloat32Workload.cpp \ - workloads/RefResizeBilinearUint8Workload.cpp \ + workloads/RefResizeBilinearWorkload.cpp \ workloads/RefRsqrtWorkload.cpp \ workloads/RefSoftmaxWorkload.cpp \ workloads/RefSpaceToBatchNdWorkload.cpp \ diff --git a/src/backends/reference/test/RefCreateWorkloadTests.cpp b/src/backends/reference/test/RefCreateWorkloadTests.cpp index ef8ff9e6a0..7816d5b17f 100644 --- a/src/backends/reference/test/RefCreateWorkloadTests.cpp +++ b/src/backends/reference/test/RefCreateWorkloadTests.cpp @@ -643,17 +643,17 @@ static void RefCreateResizeBilinearTest(DataLayout dataLayout) BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32) { - RefCreateResizeBilinearTest(DataLayout::NCHW); + RefCreateResizeBilinearTest(DataLayout::NCHW); } BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8) { - RefCreateResizeBilinearTest(DataLayout::NCHW); + RefCreateResizeBilinearTest(DataLayout::NCHW); } BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32Nhwc) { - RefCreateResizeBilinearTest(DataLayout::NHWC); + RefCreateResizeBilinearTest(DataLayout::NHWC); } template diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt index 41a553482d..ebd33901d3 100644 --- a/src/backends/reference/workloads/CMakeLists.txt +++ b/src/backends/reference/workloads/CMakeLists.txt @@ -88,10 +88,8 @@ list(APPEND armnnRefBackendWorkloads_sources RefQuantizeWorkload.hpp RefReshapeWorkload.cpp RefReshapeWorkload.hpp - RefResizeBilinearFloat32Workload.cpp - RefResizeBilinearFloat32Workload.hpp - RefResizeBilinearUint8Workload.cpp - RefResizeBilinearUint8Workload.hpp + RefResizeBilinearWorkload.cpp + RefResizeBilinearWorkload.hpp RefRsqrtWorkload.cpp RefRsqrtWorkload.hpp RefSoftmaxWorkload.cpp diff --git a/src/backends/reference/workloads/RefResizeBilinearFloat32Workload.cpp b/src/backends/reference/workloads/RefResizeBilinearFloat32Workload.cpp deleted file mode 100644 index 8d86bdcf34..0000000000 --- a/src/backends/reference/workloads/RefResizeBilinearFloat32Workload.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "RefResizeBilinearFloat32Workload.hpp" - -#include "RefWorkloadUtils.hpp" -#include "ResizeBilinear.hpp" - -#include "Profiling.hpp" - -namespace armnn -{ - -void RefResizeBilinearFloat32Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefResizeBilinearFloat32Workload_Execute"); - - const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]); - const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); - - ResizeBilinear(GetInputTensorDataFloat(0, m_Data), - inputInfo, - GetOutputTensorDataFloat(0, m_Data), - outputInfo, - m_Data.m_Parameters.m_DataLayout); -} - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefResizeBilinearFloat32Workload.hpp b/src/backends/reference/workloads/RefResizeBilinearFloat32Workload.hpp deleted file mode 100644 index 84d3a5161e..0000000000 --- a/src/backends/reference/workloads/RefResizeBilinearFloat32Workload.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include -#include - -namespace armnn -{ - -class RefResizeBilinearFloat32Workload : public Float32Workload -{ -public: - using Float32Workload::Float32Workload; - virtual void Execute() const override; -}; - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefResizeBilinearUint8Workload.cpp b/src/backends/reference/workloads/RefResizeBilinearUint8Workload.cpp deleted file mode 100644 index 3a6793cd90..0000000000 --- a/src/backends/reference/workloads/RefResizeBilinearUint8Workload.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "RefResizeBilinearUint8Workload.hpp" - -#include "RefWorkloadUtils.hpp" -#include "ResizeBilinear.hpp" - -#include "Profiling.hpp" - -#include - -namespace armnn -{ - -void RefResizeBilinearUint8Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefResizeBilinearUint8Workload_Execute"); - - const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]); - const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); - - auto dequant = Dequantize(GetInputTensorDataU8(0, m_Data), inputInfo); - - std::vector results(outputInfo.GetNumElements()); - ResizeBilinear(dequant.data(), inputInfo, results.data(), outputInfo, m_Data.m_Parameters.m_DataLayout); - - Quantize(GetOutputTensorDataU8(0, m_Data), results.data(), outputInfo); -} - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefResizeBilinearUint8Workload.hpp b/src/backends/reference/workloads/RefResizeBilinearUint8Workload.hpp deleted file mode 100644 index 6380441716..0000000000 --- a/src/backends/reference/workloads/RefResizeBilinearUint8Workload.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include -#include - -namespace armnn -{ - -class RefResizeBilinearUint8Workload : public Uint8Workload -{ -public: - using Uint8Workload::Uint8Workload; - virtual void Execute() const override; -}; - -} //namespace armnn diff --git a/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp b/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp new file mode 100644 index 0000000000..03fcec25fe --- /dev/null +++ b/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp @@ -0,0 +1,35 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "RefResizeBilinearWorkload.hpp" + +#include "RefWorkloadUtils.hpp" +#include "ResizeBilinear.hpp" +#include "BaseIterator.hpp" +#include "Profiling.hpp" + +#include "BaseIterator.hpp" +#include "Decoders.hpp" +#include "Encoders.hpp" + +namespace armnn +{ + +void RefResizeBilinearWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefResizeBilinearWorkload_Execute"); + + const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]); + const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); + + std::unique_ptr> decoderPtr = MakeDecoder(inputInfo, m_Data.m_Inputs[0]->Map()); + Decoder &decoder = *decoderPtr; + std::unique_ptr> encoderPtr = MakeEncoder(outputInfo, m_Data.m_Outputs[0]->Map()); + Encoder &encoder = *encoderPtr; + + ResizeBilinear(decoder, inputInfo, encoder, outputInfo, m_Data.m_Parameters.m_DataLayout); +} + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefResizeBilinearWorkload.hpp b/src/backends/reference/workloads/RefResizeBilinearWorkload.hpp new file mode 100644 index 0000000000..8f86f6fd85 --- /dev/null +++ b/src/backends/reference/workloads/RefResizeBilinearWorkload.hpp @@ -0,0 +1,21 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include +#include + +namespace armnn +{ + +class RefResizeBilinearWorkload : public BaseWorkload +{ +public: + using BaseWorkload::BaseWorkload; + virtual void Execute() const override; +}; + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefWorkloads.hpp b/src/backends/reference/workloads/RefWorkloads.hpp index 1a2dec402e..7cfced484e 100644 --- a/src/backends/reference/workloads/RefWorkloads.hpp +++ b/src/backends/reference/workloads/RefWorkloads.hpp @@ -11,7 +11,7 @@ #include "RefConstantWorkload.hpp" #include "RefConvolution2dWorkload.hpp" #include "RefSplitterWorkload.hpp" -#include "RefResizeBilinearUint8Workload.hpp" +#include "RefResizeBilinearWorkload.hpp" #include "RefL2NormalizationWorkload.hpp" #include "RefActivationWorkload.hpp" #include "RefPooling2dWorkload.hpp" @@ -28,7 +28,6 @@ #include "Gather.hpp" #include "RefFloorWorkload.hpp" #include "RefSoftmaxWorkload.hpp" -#include "RefResizeBilinearFloat32Workload.hpp" #include "ResizeBilinear.hpp" #include "RefNormalizationWorkload.hpp" #include "RefDetectionPostProcessWorkload.hpp" diff --git a/src/backends/reference/workloads/ResizeBilinear.cpp b/src/backends/reference/workloads/ResizeBilinear.cpp index 2d1087c9a0..70a051492a 100644 --- a/src/backends/reference/workloads/ResizeBilinear.cpp +++ b/src/backends/reference/workloads/ResizeBilinear.cpp @@ -27,9 +27,9 @@ inline float Lerp(float a, float b, float w) } -void ResizeBilinear(const float* in, +void ResizeBilinear(Decoder& in, const TensorInfo& inputInfo, - float* out, + Encoder& out, const TensorInfo& outputInfo, DataLayoutIndexed dataLayout) { @@ -50,8 +50,8 @@ void ResizeBilinear(const float* in, const float scaleY = boost::numeric_cast(inputHeight) / boost::numeric_cast(outputHeight); const float scaleX = boost::numeric_cast(inputWidth) / boost::numeric_cast(outputWidth); - TensorBufferArrayView input(inputInfo.GetShape(), in, dataLayout); - TensorBufferArrayView output(outputInfo.GetShape(), out, dataLayout); + TensorShape inputShape = inputInfo.GetShape(); + TensorShape outputShape = outputInfo.GetShape(); for (unsigned int n = 0; n < batchSize; ++n) { @@ -84,11 +84,21 @@ void ResizeBilinear(const float* in, const unsigned int y1 = std::min(y0 + 1, inputHeight - 1u); // Interpolation - const float ly0 = Lerp(input.Get(n, c, y0, x0), input.Get(n, c, y0, x1), xw); // lerp along row y0. - const float ly1 = Lerp(input.Get(n, c, y1, x0), input.Get(n, c, y1, x1), xw); // lerp along row y1. + in[dataLayout.GetIndex(inputShape, n, c, y0, x0)]; + float input1 = in.Get(); + in[dataLayout.GetIndex(inputShape, n, c, y0, x1)]; + float input2 = in.Get(); + in[dataLayout.GetIndex(inputShape, n, c, y1, x0)]; + float input3 = in.Get(); + in[dataLayout.GetIndex(inputShape, n, c, y1, x1)]; + float input4 = in.Get(); + + const float ly0 = Lerp(input1, input2, xw); // lerp along row y0. + const float ly1 = Lerp(input3, input4, xw); // lerp along row y1. const float l = Lerp(ly0, ly1, yw); - output.Get(n, c, y, x) = l; + out[dataLayout.GetIndex(outputShape, n, c, y, x)]; + out.Set(l); } } } diff --git a/src/backends/reference/workloads/ResizeBilinear.hpp b/src/backends/reference/workloads/ResizeBilinear.hpp index 814a0f2257..ad2e487f5a 100644 --- a/src/backends/reference/workloads/ResizeBilinear.hpp +++ b/src/backends/reference/workloads/ResizeBilinear.hpp @@ -5,6 +5,7 @@ #pragma once +#include "BaseIterator.hpp" #include #include @@ -12,9 +13,9 @@ namespace armnn { -void ResizeBilinear(const float* in, +void ResizeBilinear(Decoder& in, const TensorInfo& inputInfo, - float* out, + Encoder& out, const TensorInfo& outputInfo, armnnUtils::DataLayoutIndexed dataLayout = DataLayout::NCHW); -- cgit v1.2.1