aboutsummaryrefslogtreecommitdiff
path: root/src/backends/reference/workloads
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/reference/workloads')
-rw-r--r--src/backends/reference/workloads/CMakeLists.txt4
-rw-r--r--src/backends/reference/workloads/RefSpaceToDepthWorkload.cpp28
-rw-r--r--src/backends/reference/workloads/RefSpaceToDepthWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefWorkloads.hpp73
-rw-r--r--src/backends/reference/workloads/SpaceToDepth.cpp107
-rw-r--r--src/backends/reference/workloads/SpaceToDepth.hpp24
6 files changed, 221 insertions, 36 deletions
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 <ResolveType.hpp>
+
+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<float>> decoder = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
+
+ const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
+ std::unique_ptr<Encoder<float>> encoder = MakeEncoder<float>(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 <armnn/TypesUtils.hpp>
+
+namespace armnn
+{
+
+class RefSpaceToDepthWorkload : public BaseWorkload<SpaceToDepthQueueDescriptor>
+{
+public:
+ using BaseWorkload<SpaceToDepthQueueDescriptor>::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 <DataLayoutIndexed.hpp>
+
+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<float>& inputData,
+ Encoder<float>& 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<float>& inputData,
+ Encoder<float>& 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 <armnn/Descriptors.hpp>
+#include <armnn/Tensor.hpp>
+
+namespace armnn
+{
+
+void SpaceToDepth(const TensorInfo& inputInfo,
+ const TensorInfo& outputInfo,
+ const SpaceToDepthDescriptor& params,
+ Decoder<float>& inputData,
+ Encoder<float>& outputData);
+
+} //namespace armnn