From a57eccbe313557b9eafec40b39bac3115d9b930d Mon Sep 17 00:00:00 2001 From: Keith Davis Date: Fri, 14 Jun 2019 17:33:22 +0100 Subject: IVGCVSW-3231 Add reference workload support for SpaceToDepth * Added reference workload for SpaceToDepth * Added unit tests for float32 & uint8 * Minor sort refactoring to RefWorkloads.hpp to alphabetical order Change-Id: I2e01f8101650e2aae102a8a32bc0064f067141ab Signed-off-by: Keith Davis --- src/backends/reference/workloads/CMakeLists.txt | 4 + .../workloads/RefSpaceToDepthWorkload.cpp | 28 ++++++ .../workloads/RefSpaceToDepthWorkload.hpp | 21 ++++ src/backends/reference/workloads/RefWorkloads.hpp | 73 +++++++------- src/backends/reference/workloads/SpaceToDepth.cpp | 107 +++++++++++++++++++++ src/backends/reference/workloads/SpaceToDepth.hpp | 24 +++++ 6 files changed, 221 insertions(+), 36 deletions(-) create mode 100644 src/backends/reference/workloads/RefSpaceToDepthWorkload.cpp create mode 100644 src/backends/reference/workloads/RefSpaceToDepthWorkload.hpp create mode 100644 src/backends/reference/workloads/SpaceToDepth.cpp create mode 100644 src/backends/reference/workloads/SpaceToDepth.hpp (limited to 'src/backends/reference/workloads') diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt index db0daa0310..ca35e273af 100644 --- a/src/backends/reference/workloads/CMakeLists.txt +++ b/src/backends/reference/workloads/CMakeLists.txt @@ -100,6 +100,8 @@ list(APPEND armnnRefBackendWorkloads_sources RefSoftmaxWorkload.hpp RefSpaceToBatchNdWorkload.cpp RefSpaceToBatchNdWorkload.hpp + RefSpaceToDepthWorkload.cpp + RefSpaceToDepthWorkload.hpp RefSplitterWorkload.cpp RefSplitterWorkload.hpp RefStridedSliceWorkload.cpp @@ -114,6 +116,8 @@ list(APPEND armnnRefBackendWorkloads_sources Softmax.hpp SpaceToBatchNd.hpp SpaceToBatchNd.cpp + SpaceToDepth.hpp + SpaceToDepth.cpp Splitter.hpp Splitter.cpp StridedSlice.hpp diff --git a/src/backends/reference/workloads/RefSpaceToDepthWorkload.cpp b/src/backends/reference/workloads/RefSpaceToDepthWorkload.cpp new file mode 100644 index 0000000000..1b12272506 --- /dev/null +++ b/src/backends/reference/workloads/RefSpaceToDepthWorkload.cpp @@ -0,0 +1,28 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "RefSpaceToDepthWorkload.hpp" +#include "SpaceToDepth.hpp" + +#include "RefWorkloadUtils.hpp" +#include + +namespace armnn +{ + +void RefSpaceToDepthWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSpaceToDepthWorkload_Execute"); + + const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]); + std::unique_ptr> decoder = MakeDecoder(inputInfo, m_Data.m_Inputs[0]->Map()); + + const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]); + std::unique_ptr> encoder = MakeEncoder(outputInfo, m_Data.m_Outputs[0]->Map()); + + SpaceToDepth(inputInfo, outputInfo, m_Data.m_Parameters, *decoder, *encoder); +} + +} //namespace armnn diff --git a/src/backends/reference/workloads/RefSpaceToDepthWorkload.hpp b/src/backends/reference/workloads/RefSpaceToDepthWorkload.hpp new file mode 100644 index 0000000000..82d852814a --- /dev/null +++ b/src/backends/reference/workloads/RefSpaceToDepthWorkload.hpp @@ -0,0 +1,21 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include "backendsCommon/Workload.hpp" + +#include + +namespace armnn +{ + +class RefSpaceToDepthWorkload : 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 41b16fa56f..056127aae6 100644 --- a/src/backends/reference/workloads/RefWorkloads.hpp +++ b/src/backends/reference/workloads/RefWorkloads.hpp @@ -5,50 +5,51 @@ #pragma once -#include "ElementwiseFunction.hpp" -#include "RefElementwiseWorkload.hpp" +#include "Activation.hpp" +#include "BatchNormImpl.hpp" #include "ConvImpl.hpp" -#include "RefConstantWorkload.hpp" -#include "RefConvolution2dWorkload.hpp" -#include "RefSplitterWorkload.hpp" -#include "RefResizeBilinearWorkload.hpp" -#include "RefL2NormalizationWorkload.hpp" +#include "Concatenate.hpp" +#include "ElementwiseFunction.hpp" +#include "FullyConnected.hpp" +#include "Gather.hpp" +#include "Pooling2d.hpp" #include "RefActivationWorkload.hpp" -#include "RefPooling2dWorkload.hpp" -#include "RefWorkloadUtils.hpp" -#include "RefConcatWorkload.hpp" -#include "RefFullyConnectedWorkload.hpp" -#include "RefGatherWorkload.hpp" -#include "Softmax.hpp" -#include "TensorBufferArrayView.hpp" #include "RefBatchNormalizationWorkload.hpp" -#include "Splitter.hpp" +#include "RefBatchToSpaceNdUint8Workload.hpp" +#include "RefBatchToSpaceNdFloat32Workload.hpp" +#include "RefConvolution2dWorkload.hpp" +#include "RefConstantWorkload.hpp" +#include "RefConcatWorkload.hpp" +#include "RefConvertFp16ToFp32Workload.hpp" +#include "RefConvertFp32ToFp16Workload.hpp" #include "RefDepthwiseConvolution2dWorkload.hpp" -#include "FullyConnected.hpp" -#include "Gather.hpp" -#include "RefFloorWorkload.hpp" -#include "RefSoftmaxWorkload.hpp" -#include "ResizeBilinear.hpp" -#include "RefNormalizationWorkload.hpp" #include "RefDetectionPostProcessWorkload.hpp" -#include "BatchNormImpl.hpp" -#include "Activation.hpp" -#include "Concatenate.hpp" -#include "RefSpaceToBatchNdWorkload.hpp" -#include "RefStridedSliceWorkload.hpp" -#include "Pooling2d.hpp" +#include "RefDebugWorkload.hpp" +#include "RefDequantizeWorkload.hpp" +#include "RefElementwiseWorkload.hpp" +#include "RefFullyConnectedWorkload.hpp" +#include "RefFloorWorkload.hpp" #include "RefFakeQuantizationFloat32Workload.hpp" -#include "RefPermuteWorkload.hpp" +#include "RefGatherWorkload.hpp" +#include "RefL2NormalizationWorkload.hpp" #include "RefLstmWorkload.hpp" -#include "RefConvertFp16ToFp32Workload.hpp" -#include "RefConvertFp32ToFp16Workload.hpp" #include "RefMeanWorkload.hpp" +#include "RefNormalizationWorkload.hpp" +#include "RefPooling2dWorkload.hpp" +#include "RefPermuteWorkload.hpp" #include "RefPadWorkload.hpp" -#include "RefBatchToSpaceNdUint8Workload.hpp" -#include "RefBatchToSpaceNdFloat32Workload.hpp" -#include "RefDebugWorkload.hpp" -#include "RefRsqrtWorkload.hpp" -#include "RefDequantizeWorkload.hpp" +#include "RefPreluWorkload.hpp" #include "RefQuantizeWorkload.hpp" +#include "RefResizeBilinearWorkload.hpp" +#include "RefRsqrtWorkload.hpp" #include "RefReshapeWorkload.hpp" -#include "RefPreluWorkload.hpp" +#include "RefSplitterWorkload.hpp" +#include "RefSoftmaxWorkload.hpp" +#include "RefSpaceToBatchNdWorkload.hpp" +#include "RefStridedSliceWorkload.hpp" +#include "RefSpaceToDepthWorkload.hpp" +#include "RefWorkloadUtils.hpp" +#include "ResizeBilinear.hpp" +#include "Softmax.hpp" +#include "Splitter.hpp" +#include "TensorBufferArrayView.hpp" \ No newline at end of file diff --git a/src/backends/reference/workloads/SpaceToDepth.cpp b/src/backends/reference/workloads/SpaceToDepth.cpp new file mode 100644 index 0000000000..4a4f4183d9 --- /dev/null +++ b/src/backends/reference/workloads/SpaceToDepth.cpp @@ -0,0 +1,107 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "SpaceToDepth.hpp" + +#include + +using namespace armnnUtils; + +namespace { + unsigned int GetOffset(const armnn::TensorShape& shape, + unsigned int c, + unsigned int h, + unsigned int w, + unsigned int b, + const DataLayoutIndexed& dataLayout) + { + if (dataLayout.GetDataLayout() == armnn::DataLayout::NHWC) + { + return ((b * shape[dataLayout.GetHeightIndex()] + h) * shape[dataLayout.GetWidthIndex()] + w) * + shape[dataLayout.GetChannelsIndex()] + c; + } + else + { + return ((b * shape[dataLayout.GetChannelsIndex()] + c) * shape[dataLayout.GetHeightIndex()] + h) * + shape[dataLayout.GetWidthIndex()] + w; + } + } +} + +namespace armnn +{ + +void SpaceToDepth(const TensorInfo& inputInfo, + const TensorInfo& outputInfo, + const SpaceToDepthDescriptor& params, + Decoder& inputData, + Encoder& outputData) +{ + DataLayoutIndexed dataLayout = params.m_DataLayout; + + const TensorShape& inputShape = inputInfo.GetShape(); + const TensorShape& outputShape = outputInfo.GetShape(); + + const unsigned int inputBatchSize = inputShape[0]; + const unsigned int inputChannels = inputShape[dataLayout.GetChannelsIndex()]; + + const unsigned int outputHeight = outputShape[dataLayout.GetHeightIndex()]; + const unsigned int outputWidth = outputShape[dataLayout.GetWidthIndex()]; + const unsigned int outputChannels = outputShape[dataLayout.GetChannelsIndex()]; + + const unsigned int blockSize = params.m_BlockSize; + + if (blockSize == 0) + { + throw InvalidArgumentException( + "Input shape must be divisible by block size in all spatial dimensions: Block size is" + " equal to zero"); + } + + for (unsigned int outChannelIndex = 0; outChannelIndex < outputChannels; outChannelIndex++) + { + unsigned int inChannelIndex = outChannelIndex % inputChannels; + + unsigned int shiftW = (outChannelIndex / inputChannels) % blockSize; + unsigned int shiftH = (outChannelIndex / inputChannels) / blockSize; + + for (unsigned int outH = 0; outH < outputHeight; outH++) + { + for (unsigned int outW = 0; outW < outputWidth; outW++) + { + for (unsigned int inBatchIndex = 0; inBatchIndex < inputBatchSize; inBatchIndex++) + { + unsigned int inOffset = GetOffset(inputShape, + inChannelIndex, + (outH * blockSize + shiftH), + (outW * blockSize + shiftW), + inBatchIndex, + dataLayout); + + unsigned int outOffset = GetOffset(outputShape, + outChannelIndex, + outH, + outW, + inBatchIndex, + dataLayout); + + outputData += outOffset; + inputData += inOffset; + outputData.Set(inputData.Get()); + inputData -= inOffset; + outputData -= outOffset; + } + } + } + } +} + +void SpaceToDepth(const TensorInfo& inputInfo, + const TensorInfo& outputInfo, + const SpaceToDepthDescriptor& params, + Decoder& inputData, + Encoder& outData); + +} //namespace armnn diff --git a/src/backends/reference/workloads/SpaceToDepth.hpp b/src/backends/reference/workloads/SpaceToDepth.hpp new file mode 100644 index 0000000000..f855884e94 --- /dev/null +++ b/src/backends/reference/workloads/SpaceToDepth.hpp @@ -0,0 +1,24 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "BaseIterator.hpp" +#include "Decoders.hpp" +#include "Encoders.hpp" + +#include +#include + +namespace armnn +{ + +void SpaceToDepth(const TensorInfo& inputInfo, + const TensorInfo& outputInfo, + const SpaceToDepthDescriptor& params, + Decoder& inputData, + Encoder& outputData); + +} //namespace armnn -- cgit v1.2.1