From 47ea3c0e8d8d10906d04a0e7c537ffee68b0f819 Mon Sep 17 00:00:00 2001 From: Francis Murtagh Date: Thu, 20 Jun 2019 12:07:19 +0100 Subject: IVGCVSW-3248 Refactor reference BatchToSpace workload * Add Decoders and Encoders to workload to make it data type agnostic * Merge float32 and Uint8 into single workload Change-Id: I8adfa1898a63f13889eaaf55a31c26fd1e2d7ee8 Signed-off-by: Francis Murtagh --- src/backends/reference/RefWorkloadFactory.cpp | 6 ++++- src/backends/reference/backend.mk | 3 +-- .../reference/workloads/BatchToSpaceNd.cpp | 9 ++++--- .../reference/workloads/BatchToSpaceNd.hpp | 7 ++++-- src/backends/reference/workloads/CMakeLists.txt | 6 ++--- .../workloads/RefBatchToSpaceNdFloat32Workload.cpp | 28 --------------------- .../workloads/RefBatchToSpaceNdFloat32Workload.hpp | 22 ---------------- .../workloads/RefBatchToSpaceNdUint8Workload.cpp | 29 ---------------------- .../workloads/RefBatchToSpaceNdUint8Workload.hpp | 23 ----------------- .../workloads/RefBatchToSpaceNdWorkload.cpp | 29 ++++++++++++++++++++++ .../workloads/RefBatchToSpaceNdWorkload.hpp | 22 ++++++++++++++++ src/backends/reference/workloads/RefWorkloads.hpp | 3 +-- 12 files changed, 71 insertions(+), 116 deletions(-) delete mode 100644 src/backends/reference/workloads/RefBatchToSpaceNdFloat32Workload.cpp delete mode 100644 src/backends/reference/workloads/RefBatchToSpaceNdFloat32Workload.hpp delete mode 100644 src/backends/reference/workloads/RefBatchToSpaceNdUint8Workload.cpp delete mode 100644 src/backends/reference/workloads/RefBatchToSpaceNdUint8Workload.hpp create mode 100644 src/backends/reference/workloads/RefBatchToSpaceNdWorkload.cpp create mode 100644 src/backends/reference/workloads/RefBatchToSpaceNdWorkload.hpp diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index 1f241f060a..5b03555322 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -391,7 +391,11 @@ std::unique_ptr RefWorkloadFactory::CreateEqual(const EqualQueueDescr std::unique_ptr RefWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& 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::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor, diff --git a/src/backends/reference/backend.mk b/src/backends/reference/backend.mk index 6b7e8951e8..849d87c4ca 100644 --- a/src/backends/reference/backend.mk +++ b/src/backends/reference/backend.mk @@ -28,8 +28,7 @@ BACKEND_SOURCES := \ workloads/PreluImpl.cpp \ workloads/RefActivationWorkload.cpp \ workloads/RefBatchNormalizationWorkload.cpp \ - workloads/RefBatchToSpaceNdFloat32Workload.cpp \ - workloads/RefBatchToSpaceNdUint8Workload.cpp \ + workloads/RefBatchToSpaceNdWorkload.cpp \ workloads/RefConcatWorkload.cpp \ workloads/RefConstantWorkload.cpp \ workloads/RefConvertFp16ToFp32Workload.cpp \ diff --git a/src/backends/reference/workloads/BatchToSpaceNd.cpp b/src/backends/reference/workloads/BatchToSpaceNd.cpp index 5f64213b39..7efdb9b75c 100644 --- a/src/backends/reference/workloads/BatchToSpaceNd.cpp +++ b/src/backends/reference/workloads/BatchToSpaceNd.cpp @@ -37,8 +37,8 @@ void BatchToSpaceNd(const DataLayoutIndexed& dataLayout, const TensorInfo& outputTensorInfo, const std::vector& blockShape, const std::vector>& cropsData, - const float* inputData, - float* outputData) + Decoder& inputDecoder, + Encoder& outputEncoder) { TensorShape inputShape = inputTensorInfo.GetShape(); @@ -90,7 +90,10 @@ void BatchToSpaceNd(const DataLayoutIndexed& dataLayout, { unsigned int outOffset = Offset(outputShape, outBatch, outH, outW, c, dataLayout); unsigned int inOffset = Offset(inputShape, inBatch, inH, inW, c, dataLayout); - outputData[outOffset] = inputData[inOffset]; + + outputEncoder[outOffset]; + inputDecoder[inOffset]; + outputEncoder.Set(inputDecoder.Get()); } } } diff --git a/src/backends/reference/workloads/BatchToSpaceNd.hpp b/src/backends/reference/workloads/BatchToSpaceNd.hpp index f08df93584..b757d3709c 100644 --- a/src/backends/reference/workloads/BatchToSpaceNd.hpp +++ b/src/backends/reference/workloads/BatchToSpaceNd.hpp @@ -9,6 +9,9 @@ #include #include +#include "BaseIterator.hpp" +#include "Decoders.hpp" +#include "Encoders.hpp" #include @@ -20,6 +23,6 @@ void BatchToSpaceNd(const armnnUtils::DataLayoutIndexed& dataLayout, const TensorInfo& outputTensorInfo, const std::vector& blockShape, const std::vector>& cropsData, - const float* inputData, - float* outputData); + Decoder& inputDecoder, + Encoder& outputEncoder); } // namespace armnn diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt index ca35e273af..daa004345c 100644 --- a/src/backends/reference/workloads/CMakeLists.txt +++ b/src/backends/reference/workloads/CMakeLists.txt @@ -42,10 +42,8 @@ list(APPEND armnnRefBackendWorkloads_sources RefActivationWorkload.hpp RefBatchNormalizationWorkload.cpp RefBatchNormalizationWorkload.hpp - RefBatchToSpaceNdFloat32Workload.cpp - RefBatchToSpaceNdFloat32Workload.hpp - RefBatchToSpaceNdUint8Workload.cpp - RefBatchToSpaceNdUint8Workload.hpp + RefBatchToSpaceNdWorkload.cpp + RefBatchToSpaceNdWorkload.hpp RefConstantWorkload.cpp RefConstantWorkload.hpp RefConvertFp16ToFp32Workload.cpp diff --git a/src/backends/reference/workloads/RefBatchToSpaceNdFloat32Workload.cpp b/src/backends/reference/workloads/RefBatchToSpaceNdFloat32Workload.cpp deleted file mode 100644 index bf246c272f..0000000000 --- a/src/backends/reference/workloads/RefBatchToSpaceNdFloat32Workload.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "BatchToSpaceNd.hpp" -#include "Profiling.hpp" -#include "RefBatchToSpaceNdFloat32Workload.hpp" -#include "RefWorkloadUtils.hpp" - -namespace armnn -{ - -void RefBatchToSpaceNdFloat32Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefBatchToSpaceNdFloat32Workload_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); - - BatchToSpaceNd(m_Data.m_Parameters.m_DataLayout, inputInfo, outputInfo, m_Data.m_Parameters.m_BlockShape, - m_Data.m_Parameters.m_Crops, inputData, outputData); -} - - -} //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefBatchToSpaceNdFloat32Workload.hpp b/src/backends/reference/workloads/RefBatchToSpaceNdFloat32Workload.hpp deleted file mode 100644 index 4977772c82..0000000000 --- a/src/backends/reference/workloads/RefBatchToSpaceNdFloat32Workload.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include -#include - -namespace armnn { - -class RefBatchToSpaceNdFloat32Workload : public Float32Workload -{ - -public: - using Float32Workload::Float32Workload; - - virtual void Execute() const override; -}; - -} // namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefBatchToSpaceNdUint8Workload.cpp b/src/backends/reference/workloads/RefBatchToSpaceNdUint8Workload.cpp deleted file mode 100644 index e4e108edb1..0000000000 --- a/src/backends/reference/workloads/RefBatchToSpaceNdUint8Workload.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "BatchToSpaceNd.hpp" -#include "Profiling.hpp" -#include "RefBatchToSpaceNdUint8Workload.hpp" -#include "RefWorkloadUtils.hpp" - -namespace armnn -{ - -void RefBatchToSpaceNdUint8Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefBatchToSpaceNdUint8Workload_Execute"); - - const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]); - const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); - auto dequantizedInputData = Dequantize(GetInputTensorDataU8(0, m_Data), inputInfo); - - std::vector results(outputInfo.GetNumElements()); - BatchToSpaceNd(m_Data.m_Parameters.m_DataLayout, inputInfo, outputInfo, m_Data.m_Parameters.m_BlockShape, - m_Data.m_Parameters.m_Crops, dequantizedInputData.data(), results.data()); - - Quantize(GetOutputTensorDataU8(0, m_Data), results.data(), outputInfo); -} - -} //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefBatchToSpaceNdUint8Workload.hpp b/src/backends/reference/workloads/RefBatchToSpaceNdUint8Workload.hpp deleted file mode 100644 index 1f221c2f47..0000000000 --- a/src/backends/reference/workloads/RefBatchToSpaceNdUint8Workload.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include -#include - -namespace armnn -{ - -class RefBatchToSpaceNdUint8Workload : public Uint8Workload -{ - -public: - using Uint8Workload::Uint8Workload; - - virtual void Execute() const override; -}; - -} // namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.cpp b/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.cpp new file mode 100644 index 0000000000..c293066d26 --- /dev/null +++ b/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.cpp @@ -0,0 +1,29 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "BatchToSpaceNd.hpp" +#include "Profiling.hpp" +#include "RefBatchToSpaceNdWorkload.hpp" +#include "RefWorkloadUtils.hpp" + +namespace armnn +{ + +void RefBatchToSpaceNdWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefBatchToSpaceNdWorkload_Execute"); + + const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]); + const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); + + std::unique_ptr> inputDecoder = MakeDecoder(inputInfo, m_Data.m_Inputs[0]->Map()); + std::unique_ptr> outputEncoder = MakeEncoder(outputInfo, m_Data.m_Outputs[0]->Map()); + + BatchToSpaceNd(m_Data.m_Parameters.m_DataLayout, inputInfo, outputInfo, m_Data.m_Parameters.m_BlockShape, + m_Data.m_Parameters.m_Crops, *inputDecoder, *outputEncoder); +} + + +} //namespace armnn \ No newline at end of file diff --git a/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.hpp b/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.hpp new file mode 100644 index 0000000000..60577bab2e --- /dev/null +++ b/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.hpp @@ -0,0 +1,22 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include +#include + +namespace armnn { + +class RefBatchToSpaceNdWorkload : public BaseWorkload +{ + +public: + using BaseWorkload::BaseWorkload; + + virtual void Execute() const override; +}; + +} // 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 056127aae6..90582812e7 100644 --- a/src/backends/reference/workloads/RefWorkloads.hpp +++ b/src/backends/reference/workloads/RefWorkloads.hpp @@ -15,8 +15,7 @@ #include "Pooling2d.hpp" #include "RefActivationWorkload.hpp" #include "RefBatchNormalizationWorkload.hpp" -#include "RefBatchToSpaceNdUint8Workload.hpp" -#include "RefBatchToSpaceNdFloat32Workload.hpp" +#include "RefBatchToSpaceNdWorkload.hpp" #include "RefConvolution2dWorkload.hpp" #include "RefConstantWorkload.hpp" #include "RefConcatWorkload.hpp" -- cgit v1.2.1