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/Abs.hpp22
-rw-r--r--src/backends/reference/workloads/Activation.cpp101
-rw-r--r--src/backends/reference/workloads/Activation.hpp25
-rw-r--r--src/backends/reference/workloads/ArgMinMax.cpp47
-rw-r--r--src/backends/reference/workloads/ArgMinMax.hpp20
-rw-r--r--src/backends/reference/workloads/BaseIterator.hpp573
-rw-r--r--src/backends/reference/workloads/BatchNormImpl.cpp66
-rw-r--r--src/backends/reference/workloads/BatchNormImpl.hpp24
-rw-r--r--src/backends/reference/workloads/BatchToSpaceNd.cpp103
-rw-r--r--src/backends/reference/workloads/BatchToSpaceNd.hpp29
-rw-r--r--src/backends/reference/workloads/Broadcast.cpp52
-rw-r--r--src/backends/reference/workloads/Broadcast.hpp105
-rw-r--r--src/backends/reference/workloads/CMakeLists.txt175
-rw-r--r--src/backends/reference/workloads/Concatenate.cpp83
-rw-r--r--src/backends/reference/workloads/Concatenate.hpp14
-rw-r--r--src/backends/reference/workloads/ConvImpl.cpp228
-rw-r--r--src/backends/reference/workloads/ConvImpl.hpp67
-rw-r--r--src/backends/reference/workloads/Debug.cpp127
-rw-r--r--src/backends/reference/workloads/Debug.hpp19
-rw-r--r--src/backends/reference/workloads/Decoders.hpp144
-rw-r--r--src/backends/reference/workloads/DepthToSpace.cpp79
-rw-r--r--src/backends/reference/workloads/DepthToSpace.hpp20
-rw-r--r--src/backends/reference/workloads/Dequantize.cpp31
-rw-r--r--src/backends/reference/workloads/Dequantize.hpp20
-rw-r--r--src/backends/reference/workloads/DetectionPostProcess.cpp323
-rw-r--r--src/backends/reference/workloads/DetectionPostProcess.hpp47
-rw-r--r--src/backends/reference/workloads/ElementwiseFunction.cpp62
-rw-r--r--src/backends/reference/workloads/ElementwiseFunction.hpp40
-rw-r--r--src/backends/reference/workloads/Encoders.hpp113
-rw-r--r--src/backends/reference/workloads/Exp.hpp22
-rw-r--r--src/backends/reference/workloads/FullyConnected.cpp64
-rw-r--r--src/backends/reference/workloads/FullyConnected.hpp28
-rw-r--r--src/backends/reference/workloads/Gather.cpp57
-rw-r--r--src/backends/reference/workloads/Gather.hpp24
-rw-r--r--src/backends/reference/workloads/InstanceNorm.cpp86
-rw-r--r--src/backends/reference/workloads/InstanceNorm.hpp20
-rw-r--r--src/backends/reference/workloads/LogSoftmax.cpp91
-rw-r--r--src/backends/reference/workloads/LogSoftmax.hpp21
-rw-r--r--src/backends/reference/workloads/LstmUtils.cpp307
-rw-r--r--src/backends/reference/workloads/LstmUtils.hpp88
-rw-r--r--src/backends/reference/workloads/Maximum.hpp22
-rw-r--r--src/backends/reference/workloads/Mean.cpp143
-rw-r--r--src/backends/reference/workloads/Mean.hpp22
-rw-r--r--src/backends/reference/workloads/Minimum.hpp22
-rw-r--r--src/backends/reference/workloads/Pad.cpp180
-rw-r--r--src/backends/reference/workloads/Pad.hpp22
-rw-r--r--src/backends/reference/workloads/Pooling2d.cpp275
-rw-r--r--src/backends/reference/workloads/Pooling2d.hpp21
-rw-r--r--src/backends/reference/workloads/PreluImpl.cpp35
-rw-r--r--src/backends/reference/workloads/PreluImpl.hpp21
-rw-r--r--src/backends/reference/workloads/RefActivationWorkload.cpp33
-rw-r--r--src/backends/reference/workloads/RefActivationWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefArgMinMaxWorkload.cpp38
-rw-r--r--src/backends/reference/workloads/RefArgMinMaxWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefBatchNormalizationWorkload.cpp45
-rw-r--r--src/backends/reference/workloads/RefBatchNormalizationWorkload.hpp28
-rw-r--r--src/backends/reference/workloads/RefBatchToSpaceNdWorkload.cpp29
-rw-r--r--src/backends/reference/workloads/RefBatchToSpaceNdWorkload.hpp22
-rw-r--r--src/backends/reference/workloads/RefComparisonWorkload.cpp102
-rw-r--r--src/backends/reference/workloads/RefComparisonWorkload.hpp34
-rw-r--r--src/backends/reference/workloads/RefConcatWorkload.cpp21
-rw-r--r--src/backends/reference/workloads/RefConcatWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefConstantWorkload.cpp41
-rw-r--r--src/backends/reference/workloads/RefConstantWorkload.hpp26
-rw-r--r--src/backends/reference/workloads/RefConvertFp16ToFp32Workload.cpp27
-rw-r--r--src/backends/reference/workloads/RefConvertFp16ToFp32Workload.hpp21
-rw-r--r--src/backends/reference/workloads/RefConvertFp32ToFp16Workload.cpp29
-rw-r--r--src/backends/reference/workloads/RefConvertFp32ToFp16Workload.hpp21
-rw-r--r--src/backends/reference/workloads/RefConvolution2dWorkload.cpp57
-rw-r--r--src/backends/reference/workloads/RefConvolution2dWorkload.hpp41
-rw-r--r--src/backends/reference/workloads/RefDebugWorkload.cpp55
-rw-r--r--src/backends/reference/workloads/RefDebugWorkload.hpp48
-rw-r--r--src/backends/reference/workloads/RefDepthToSpaceWorkload.cpp27
-rw-r--r--src/backends/reference/workloads/RefDepthToSpaceWorkload.hpp20
-rw-r--r--src/backends/reference/workloads/RefDepthwiseConvolution2dWorkload.cpp62
-rw-r--r--src/backends/reference/workloads/RefDepthwiseConvolution2dWorkload.hpp39
-rw-r--r--src/backends/reference/workloads/RefDequantizeWorkload.cpp28
-rw-r--r--src/backends/reference/workloads/RefDequantizeWorkload.hpp22
-rw-r--r--src/backends/reference/workloads/RefDetectionPostProcessWorkload.cpp50
-rw-r--r--src/backends/reference/workloads/RefDetectionPostProcessWorkload.hpp25
-rw-r--r--src/backends/reference/workloads/RefElementwiseUnaryWorkload.cpp95
-rw-r--r--src/backends/reference/workloads/RefElementwiseUnaryWorkload.hpp33
-rw-r--r--src/backends/reference/workloads/RefElementwiseWorkload.cpp88
-rw-r--r--src/backends/reference/workloads/RefElementwiseWorkload.hpp68
-rw-r--r--src/backends/reference/workloads/RefFakeQuantizationFloat32Workload.cpp42
-rw-r--r--src/backends/reference/workloads/RefFakeQuantizationFloat32Workload.hpp21
-rw-r--r--src/backends/reference/workloads/RefFloorWorkload.cpp38
-rw-r--r--src/backends/reference/workloads/RefFloorWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefFullyConnectedWorkload.cpp68
-rw-r--r--src/backends/reference/workloads/RefFullyConnectedWorkload.hpp43
-rw-r--r--src/backends/reference/workloads/RefGatherWorkload.cpp35
-rw-r--r--src/backends/reference/workloads/RefGatherWorkload.hpp26
-rw-r--r--src/backends/reference/workloads/RefInstanceNormalizationWorkload.cpp33
-rw-r--r--src/backends/reference/workloads/RefInstanceNormalizationWorkload.hpp22
-rw-r--r--src/backends/reference/workloads/RefL2NormalizationWorkload.cpp100
-rw-r--r--src/backends/reference/workloads/RefL2NormalizationWorkload.hpp23
-rw-r--r--src/backends/reference/workloads/RefLogSoftmaxWorkload.cpp36
-rw-r--r--src/backends/reference/workloads/RefLogSoftmaxWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefLstmWorkload.cpp383
-rw-r--r--src/backends/reference/workloads/RefLstmWorkload.hpp49
-rw-r--r--src/backends/reference/workloads/RefMeanWorkload.cpp34
-rw-r--r--src/backends/reference/workloads/RefMeanWorkload.hpp24
-rw-r--r--src/backends/reference/workloads/RefNormalizationWorkload.cpp210
-rw-r--r--src/backends/reference/workloads/RefNormalizationWorkload.hpp23
-rw-r--r--src/backends/reference/workloads/RefPadWorkload.cpp41
-rw-r--r--src/backends/reference/workloads/RefPadWorkload.hpp38
-rw-r--r--src/backends/reference/workloads/RefPermuteWorkload.cpp36
-rw-r--r--src/backends/reference/workloads/RefPermuteWorkload.hpp35
-rw-r--r--src/backends/reference/workloads/RefPooling2dWorkload.cpp32
-rw-r--r--src/backends/reference/workloads/RefPooling2dWorkload.hpp23
-rw-r--r--src/backends/reference/workloads/RefPreluWorkload.cpp35
-rw-r--r--src/backends/reference/workloads/RefPreluWorkload.hpp22
-rw-r--r--src/backends/reference/workloads/RefQuantizeWorkload.cpp54
-rw-r--r--src/backends/reference/workloads/RefQuantizeWorkload.hpp30
-rw-r--r--src/backends/reference/workloads/RefReshapeWorkload.cpp25
-rw-r--r--src/backends/reference/workloads/RefReshapeWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefResizeBilinearWorkload.cpp35
-rw-r--r--src/backends/reference/workloads/RefResizeBilinearWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefResizeWorkload.cpp41
-rw-r--r--src/backends/reference/workloads/RefResizeWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefSliceWorkload.cpp29
-rw-r--r--src/backends/reference/workloads/RefSliceWorkload.hpp22
-rw-r--r--src/backends/reference/workloads/RefSoftmaxWorkload.cpp40
-rw-r--r--src/backends/reference/workloads/RefSoftmaxWorkload.hpp21
-rw-r--r--src/backends/reference/workloads/RefSpaceToBatchNdWorkload.cpp28
-rw-r--r--src/backends/reference/workloads/RefSpaceToBatchNdWorkload.hpp21
-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/RefSplitterWorkload.cpp20
-rw-r--r--src/backends/reference/workloads/RefSplitterWorkload.hpp23
-rw-r--r--src/backends/reference/workloads/RefStackWorkload.cpp57
-rw-r--r--src/backends/reference/workloads/RefStackWorkload.hpp22
-rw-r--r--src/backends/reference/workloads/RefStridedSliceWorkload.cpp40
-rw-r--r--src/backends/reference/workloads/RefStridedSliceWorkload.hpp20
-rw-r--r--src/backends/reference/workloads/RefTransposeConvolution2dWorkload.cpp70
-rw-r--r--src/backends/reference/workloads/RefTransposeConvolution2dWorkload.hpp43
-rw-r--r--src/backends/reference/workloads/RefWorkloadUtils.hpp103
-rw-r--r--src/backends/reference/workloads/RefWorkloads.hpp65
-rw-r--r--src/backends/reference/workloads/Resize.cpp170
-rw-r--r--src/backends/reference/workloads/Resize.hpp25
-rw-r--r--src/backends/reference/workloads/Rsqrt.hpp22
-rw-r--r--src/backends/reference/workloads/Slice.cpp95
-rw-r--r--src/backends/reference/workloads/Slice.hpp22
-rw-r--r--src/backends/reference/workloads/Softmax.cpp72
-rw-r--r--src/backends/reference/workloads/Softmax.hpp17
-rw-r--r--src/backends/reference/workloads/SpaceToBatchNd.cpp126
-rw-r--r--src/backends/reference/workloads/SpaceToBatchNd.hpp24
-rw-r--r--src/backends/reference/workloads/SpaceToDepth.cpp107
-rw-r--r--src/backends/reference/workloads/SpaceToDepth.hpp24
-rw-r--r--src/backends/reference/workloads/Splitter.cpp94
-rw-r--r--src/backends/reference/workloads/Splitter.hpp82
-rw-r--r--src/backends/reference/workloads/Sqrt.hpp22
-rw-r--r--src/backends/reference/workloads/Stack.cpp115
-rw-r--r--src/backends/reference/workloads/Stack.hpp20
-rw-r--r--src/backends/reference/workloads/StridedSlice.cpp149
-rw-r--r--src/backends/reference/workloads/StridedSlice.hpp20
-rw-r--r--src/backends/reference/workloads/StringMapping.cpp17
-rw-r--r--src/backends/reference/workloads/StringMapping.hpp53
-rw-r--r--src/backends/reference/workloads/TensorBufferArrayView.hpp42
-rw-r--r--src/backends/reference/workloads/TransposeConvolution2d.cpp131
-rw-r--r--src/backends/reference/workloads/TransposeConvolution2d.hpp26
161 files changed, 0 insertions, 9578 deletions
diff --git a/src/backends/reference/workloads/Abs.hpp b/src/backends/reference/workloads/Abs.hpp
deleted file mode 100644
index b05f2e3367..0000000000
--- a/src/backends/reference/workloads/Abs.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <iostream>
-
-namespace armnn
-{
- template<typename T>
-struct abs : public std::unary_function<T, T>
- {
- T
- operator () (const T& inputData) const
- {
- return std::abs(inputData);
- }
- };
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Activation.cpp b/src/backends/reference/workloads/Activation.cpp
deleted file mode 100644
index 814a0ddd13..0000000000
--- a/src/backends/reference/workloads/Activation.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Activation.hpp"
-
-#include <cmath>
-
-namespace armnn
-{
-float Activation(float in,
- ActivationFunction function,
- float a,
- float b)
-{
- float output;
-
- // Compute the result of the activation function.
- switch (function)
- {
- case ActivationFunction::Linear:
- {
- output = a * in + b;
- break;
- }
- case ActivationFunction::Sigmoid:
- {
- output = 1.f / (1.f + expf(-in));
- break;
- }
- case ActivationFunction::ReLu:
- {
- output = std::max(0.f, in);
- break;
- }
- case ActivationFunction::BoundedReLu:
- {
- output = std::min(a, std::max(b, in));
- break;
- }
- case ActivationFunction::SoftReLu:
- {
- output = logf(1.0f + expf(in));
- break;
- }
- case ActivationFunction::LeakyReLu:
- {
- output = in > 0.0f ? in : (in * a);
- break;
- }
- case ActivationFunction::Abs:
- {
- output = in < 0 ? -in : in;
- break;
- }
- case ActivationFunction::Sqrt:
- {
- output = sqrtf(in);
- break;
- }
- case ActivationFunction::Square:
- {
- output = in * in;
- break;
- }
- case ActivationFunction::TanH:
- {
- output = a * tanhf(b * in);
- break;
- }
- default:
- {
- throw InvalidArgumentException("Unsupported activation function");
- }
- }
-
- return output;
-}
-
-
-void Activation(Decoder<float>& in,
- Encoder<float>& out,
- const TensorInfo& tensorInfo,
- ActivationFunction function,
- float a,
- float b)
-{
- unsigned int numElements = tensorInfo.GetNumElements();
-
- for (unsigned int i = 0; i < numElements; i++)
- {
- out.Set(Activation(in.Get(), function, a, b));
- ++in;
- ++out;
- }
- in -= numElements;
- out -= numElements;
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Activation.hpp b/src/backends/reference/workloads/Activation.hpp
deleted file mode 100644
index b7fd50c54c..0000000000
--- a/src/backends/reference/workloads/Activation.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "BaseIterator.hpp"
-
-#include <armnn/Tensor.hpp>
-#include <armnn/Types.hpp>
-
-namespace armnn
-{
-float Activation(float in,
- ActivationFunction function,
- float a,
- float b);
-
-void Activation(Decoder<float>& in,
- Encoder<float>& out,
- const TensorInfo& tensorInfo,
- ActivationFunction function,
- float a,
- float b);
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/ArgMinMax.cpp b/src/backends/reference/workloads/ArgMinMax.cpp
deleted file mode 100644
index db85b958e9..0000000000
--- a/src/backends/reference/workloads/ArgMinMax.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "ArgMinMax.hpp"
-
-#include <armnnUtils/TensorUtils.hpp>
-
-#include <boost/numeric/conversion/cast.hpp>
-
-namespace armnn
-{
-
-void ArgMinMax(Decoder<float>& in, int32_t* out, const TensorInfo& inputTensorInfo,
- const TensorInfo& outputTensorInfo, ArgMinMaxFunction function, int axis)
-{
- boost::ignore_unused(outputTensorInfo);
-
- unsigned int uAxis = armnnUtils::GetUnsignedAxis(inputTensorInfo.GetNumDimensions(), axis);
-
- const unsigned int outerElements = armnnUtils::GetNumElementsBetween(inputTensorInfo.GetShape(), 0, uAxis);
- const unsigned int axisSize = inputTensorInfo.GetShape()[uAxis];
- const unsigned int innerElements = armnnUtils::GetNumElementsBetween(inputTensorInfo.GetShape(),
- uAxis + 1,
- inputTensorInfo.GetNumDimensions());
-
- for (unsigned int outer = 0; outer < outerElements; ++outer) {
- for (unsigned int inner = 0; inner < innerElements; ++inner) {
- in[outer * axisSize * innerElements + inner];
- auto tmpValue = in.Get();
- unsigned int tmpIndex = 0;
- for (unsigned int i = 1; i < axisSize; ++i) {
- in[(outer * axisSize * innerElements) + (i * innerElements) + inner];
- const auto& value = in.Get();
- if ((function == armnn::ArgMinMaxFunction::Min && value < tmpValue) ||
- (function == armnn::ArgMinMaxFunction::Max && value > tmpValue)) {
- tmpValue = value;
- tmpIndex = i;
- }
- }
- out[outer * innerElements + inner] = boost::numeric_cast<int32_t>(tmpIndex);
- }
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/ArgMinMax.hpp b/src/backends/reference/workloads/ArgMinMax.hpp
deleted file mode 100644
index 5a9c6a8a2a..0000000000
--- a/src/backends/reference/workloads/ArgMinMax.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "armnn/Tensor.hpp"
-#include "armnn/Descriptors.hpp"
-
-#include "Decoders.hpp"
-
-namespace armnn
-{
-
-void ArgMinMax(Decoder<float>& in, int32_t* out, const TensorInfo& inputTensorInfo,
- const TensorInfo& outputTensorInfo, ArgMinMaxFunction function, int axis);
-
-} //namespace armnn
-
diff --git a/src/backends/reference/workloads/BaseIterator.hpp b/src/backends/reference/workloads/BaseIterator.hpp
deleted file mode 100644
index c48201837b..0000000000
--- a/src/backends/reference/workloads/BaseIterator.hpp
+++ /dev/null
@@ -1,573 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-
-#include <armnn/TypesUtils.hpp>
-#include <armnnUtils/FloatingPointConverter.hpp>
-
-#include <ResolveType.hpp>
-
-#include <boost/assert.hpp>
-#include <boost/core/ignore_unused.hpp>
-
-namespace armnn
-{
-
-class BaseIterator
-{
-public:
- BaseIterator() {}
-
- virtual ~BaseIterator() {}
-
- virtual BaseIterator& SetIndex(unsigned int index, unsigned int axisIndex = 0) = 0;
-
- virtual BaseIterator& operator++() = 0;
-
- virtual BaseIterator& operator+=(const unsigned int increment) = 0;
-
- virtual BaseIterator& operator-=(const unsigned int increment) = 0;
-
- virtual BaseIterator& operator[](const unsigned int index) = 0;
-};
-
-template<typename IType>
-class Decoder : public BaseIterator
-{
-public:
- Decoder() {}
-
- virtual ~Decoder() {}
-
- virtual void Reset(void*) = 0;
-
- virtual IType Get() const = 0;
-};
-
-template<typename IType>
-class Encoder : public BaseIterator
-{
-public:
- Encoder() {}
-
- virtual ~Encoder() {}
-
- virtual void Reset(void*) = 0;
-
- virtual void Set(IType right) = 0;
-
- virtual IType Get() const = 0;
-};
-
-template<typename T, typename Base>
-class TypedIterator : public Base
-{
-public:
- TypedIterator(T* data = nullptr)
- : m_Iterator(data), m_Start(data)
- {}
-
- void Reset(void* data) override
- {
- m_Iterator = reinterpret_cast<T*>(data);
- m_Start = m_Iterator;
- }
-
- TypedIterator& operator++() override
- {
- BOOST_ASSERT(m_Iterator);
- ++m_Iterator;
- return *this;
- }
-
- TypedIterator& operator+=(const unsigned int increment) override
- {
- BOOST_ASSERT(m_Iterator);
- m_Iterator += increment;
- return *this;
- }
-
- TypedIterator& operator-=(const unsigned int increment) override
- {
- BOOST_ASSERT(m_Iterator);
- m_Iterator -= increment;
- return *this;
- }
-
- TypedIterator& operator[](const unsigned int index) override
- {
- BOOST_ASSERT(m_Iterator);
- m_Iterator = m_Start + index;
- return *this;
- }
-
- TypedIterator& SetIndex(unsigned int index, unsigned int axisIndex = 0) override
- {
- boost::ignore_unused(axisIndex);
- BOOST_ASSERT(m_Iterator);
- m_Iterator = m_Start + index;
- return *this;
- }
-
-protected:
- T* m_Iterator;
- T* m_Start;
-};
-
-class QASymm8Decoder : public TypedIterator<const uint8_t, Decoder<float>>
-{
-public:
- QASymm8Decoder(const uint8_t* data, const float scale, const int32_t offset)
- : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
-
- QASymm8Decoder(const float scale, const int32_t offset)
- : QASymm8Decoder(nullptr, scale, offset) {}
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
- }
-
-private:
- const float m_Scale;
- const int32_t m_Offset;
-};
-
-class QASymmS8Decoder : public TypedIterator<const int8_t, Decoder<float>>
-{
-public:
- QASymmS8Decoder(const int8_t* data, const float scale, const int32_t offset)
- : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
-
- QASymmS8Decoder(const float scale, const int32_t offset)
- : QASymmS8Decoder(nullptr, scale, offset) {}
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
- }
-
-private:
- const float m_Scale;
- const int32_t m_Offset;
-};
-
-class QSymmS8Decoder : public TypedIterator<const int8_t, Decoder<float>>
-{
-public:
- QSymmS8Decoder(const int8_t* data, const float scale, const int32_t offset)
- : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
-
- QSymmS8Decoder(const float scale, const int32_t offset)
- : QSymmS8Decoder(nullptr, scale, offset) {}
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
- }
-
-private:
- const float m_Scale;
- const int32_t m_Offset;
-};
-
-class QSymm16Decoder : public TypedIterator<const int16_t, Decoder<float>>
-{
-public:
- QSymm16Decoder(const int16_t* data, const float scale, const int32_t offset)
- : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
-
- QSymm16Decoder(const float scale, const int32_t offset)
- : QSymm16Decoder(nullptr, scale, offset) {}
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
- }
-
-private:
- const float m_Scale;
- const int32_t m_Offset;
-};
-
-class Float16Decoder : public TypedIterator<const Half, Decoder<float>>
-{
-public:
- Float16Decoder(const Half* data)
- : TypedIterator(data) {}
-
- Float16Decoder()
- : Float16Decoder(nullptr) {}
-
- float Get() const override
- {
- float val = 0.f;
- armnnUtils::FloatingPointConverter::ConvertFloat16To32(m_Iterator, 1, &val);
- return val;
- }
-};
-
-class Float32Decoder : public TypedIterator<const float, Decoder<float>>
-{
-public:
- Float32Decoder(const float* data)
- : TypedIterator(data) {}
-
- Float32Decoder()
- : Float32Decoder(nullptr) {}
-
- float Get() const override
- {
- return *m_Iterator;
- }
-};
-
-class ScaledInt32Decoder : public TypedIterator<const int32_t, Decoder<float>>
-{
-public:
- ScaledInt32Decoder(const int32_t* data, const float scale)
- : TypedIterator(data), m_Scale(scale) {}
-
- ScaledInt32Decoder(const float scale)
- : ScaledInt32Decoder(nullptr, scale) {}
-
- float Get() const override
- {
- return static_cast<float>(*m_Iterator) * m_Scale;
- }
-
-private:
- const float m_Scale;
-};
-
-class Int32Decoder : public TypedIterator<const int32_t, Decoder<float>>
-{
-public:
- Int32Decoder(const int32_t* data)
- : TypedIterator(data) {}
-
- Int32Decoder()
- : Int32Decoder(nullptr) {}
-
- float Get() const override
- {
- return static_cast<float>(*m_Iterator);
- }
-};
-
-class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>>
-{
-public:
- QASymm8Encoder(uint8_t* data, const float scale, const int32_t offset)
- : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
-
- QASymm8Encoder(const float scale, const int32_t offset)
- : QASymm8Encoder(nullptr, scale, offset) {}
-
- void Set(float right) override
- {
- *m_Iterator = armnn::Quantize<uint8_t>(right, m_Scale, m_Offset);
- }
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
- }
-
-private:
- const float m_Scale;
- const int32_t m_Offset;
-};
-
-class QASymmS8Encoder : public TypedIterator<int8_t, Encoder<float>>
-{
-public:
- QASymmS8Encoder(int8_t* data, const float scale, const int32_t offset)
- : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
-
- QASymmS8Encoder(const float scale, const int32_t offset)
- : QASymmS8Encoder(nullptr, scale, offset) {}
-
- void Set(float right) override
- {
- *m_Iterator = armnn::Quantize<int8_t>(right, m_Scale, m_Offset);
- }
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
- }
-
-private:
- const float m_Scale;
- const int32_t m_Offset;
-};
-
-class QSymmS8Encoder : public TypedIterator<int8_t, Encoder<float>>
-{
-public:
- QSymmS8Encoder(int8_t* data, const float scale, const int32_t offset)
- : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
-
- QSymmS8Encoder(const float scale, const int32_t offset)
- : QSymmS8Encoder(nullptr, scale, offset) {}
-
- void Set(float right) override
- {
- *m_Iterator = armnn::Quantize<int8_t>(right, m_Scale, m_Offset);
- }
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
- }
-
-private:
- const float m_Scale;
- const int32_t m_Offset;
-};
-
-class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>>
-{
-public:
- QSymm16Encoder(int16_t* data, const float scale, const int32_t offset)
- : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
-
- QSymm16Encoder(const float scale, const int32_t offset)
- : QSymm16Encoder(nullptr, scale, offset) {}
-
- void Set(float right) override
- {
- *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset);
- }
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
- }
-
-private:
- const float m_Scale;
- const int32_t m_Offset;
-};
-
-class Float16Encoder : public TypedIterator<Half, Encoder<float>>
-{
-public:
- Float16Encoder(Half* data)
- : TypedIterator(data) {}
-
- Float16Encoder()
- : Float16Encoder(nullptr) {}
-
- void Set(float right) override
- {
- armnnUtils::FloatingPointConverter::ConvertFloat32To16(&right, 1, m_Iterator);
- }
-
- float Get() const override
- {
- float val = 0.f;
- armnnUtils::FloatingPointConverter::ConvertFloat16To32(m_Iterator, 1, &val);
- return val;
- }
-};
-
-class Float32Encoder : public TypedIterator<float, Encoder<float>>
-{
-public:
- Float32Encoder(float* data)
- : TypedIterator(data) {}
-
- Float32Encoder()
- : Float32Encoder(nullptr) {}
-
- void Set(float right) override
- {
- *m_Iterator = right;
- }
-
- float Get() const override
- {
- return *m_Iterator;
- }
-};
-
-class Int32Encoder : public TypedIterator<int32_t, Encoder<float>>
-{
-public:
- Int32Encoder(int32_t* data)
- : TypedIterator(data) {}
-
- Int32Encoder()
- : Int32Encoder(nullptr) {}
-
- void Set(float right) override
- {
- *m_Iterator = static_cast<int32_t>(right);
- }
-
- float Get() const override
- {
- return static_cast<float>(*m_Iterator);
- }
-};
-
-class BooleanEncoder : public TypedIterator<uint8_t, Encoder<bool>>
-{
-public:
- BooleanEncoder(uint8_t* data)
- : TypedIterator(data) {}
-
- BooleanEncoder()
- : BooleanEncoder(nullptr) {}
-
- void Set(bool right) override
- {
- *m_Iterator = right;
- }
-
- bool Get() const override
- {
- return *m_Iterator;
- }
-};
-
-// PerAxisIterator for per-axis quantization
-template<typename T, typename Base>
-class PerAxisIterator : public Base
-{
-public:
- // axisFactor is used to calculate axisIndex
- PerAxisIterator(T* data = nullptr, unsigned int axisFactor = 0)
- : m_Iterator(data), m_Start(data), m_AxisIndex(0), m_AxisFactor(axisFactor)
- {}
-
- // This should be called to set index for per-axis Encoder/Decoder
- PerAxisIterator& SetIndex(unsigned int index, unsigned int axisIndex) override
- {
- BOOST_ASSERT(m_Iterator);
- m_Iterator = m_Start + index;
- m_AxisIndex = axisIndex;
- return *this;
- }
-
- void Reset(void* data) override
- {
- m_Iterator = reinterpret_cast<T*>(data);
- m_Start = m_Iterator;
- m_AxisIndex = 0;
- }
-
- PerAxisIterator& operator++() override
- {
- BOOST_ASSERT(m_Iterator);
- ++m_Iterator;
- m_AxisIndex = static_cast<unsigned int>(*m_Iterator) % m_AxisFactor;
- return *this;
- }
-
- PerAxisIterator& operator+=(const unsigned int increment) override
- {
- BOOST_ASSERT(m_Iterator);
- m_Iterator += increment;
- m_AxisIndex = static_cast<unsigned int>(*m_Iterator) % m_AxisFactor;
- return *this;
- }
-
- PerAxisIterator& operator-=(const unsigned int decrement) override
- {
- BOOST_ASSERT(m_Iterator);
- m_Iterator -= decrement;
- m_AxisIndex = static_cast<unsigned int>(*m_Iterator) % m_AxisFactor;
- return *this;
- }
-
- PerAxisIterator& operator[](const unsigned int index) override
- {
- BOOST_ASSERT(m_Iterator);
- m_Iterator = m_Start + index;
- m_AxisIndex = static_cast<unsigned int>(*m_Iterator) % m_AxisFactor;
- return *this;
- }
-
- protected:
- T* m_Iterator;
- T* m_Start;
- unsigned int m_AxisIndex;
- unsigned int m_AxisFactor;
-};
-
-class QSymm8PerAxisDecoder : public PerAxisIterator<const int8_t, Decoder<float>>
-{
-public:
- QSymm8PerAxisDecoder(const int8_t* data, const std::vector<float>& scale, unsigned int axisFactor)
- : PerAxisIterator(data, axisFactor), m_Scale(scale) {}
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scale[m_AxisIndex], 0);
- }
-
- // Get scale of the current value
- float GetScale() const
- {
- return m_Scale[m_AxisIndex];
- }
-
-private:
- std::vector<float> m_Scale;
-};
-
-class QSymm8PerAxisEncoder : public PerAxisIterator<int8_t, Encoder<float>>
-{
-public:
- QSymm8PerAxisEncoder(int8_t* data, const std::vector<float>& scale, unsigned int axisFactor)
- : PerAxisIterator(data, axisFactor), m_Scale(scale) {}
-
- void Set(float right)
- {
- *m_Iterator = armnn::Quantize<int8_t>(right, m_Scale[m_AxisIndex], 0);
- }
-
- float Get() const
- {
- return armnn::Dequantize(*m_Iterator, m_Scale[m_AxisIndex], 0);
- }
-
- // Get scale of the current value
- float GetScale() const
- {
- return m_Scale[m_AxisIndex];
- }
-
-private:
- std::vector<float> m_Scale;
-};
-
-class ScaledInt32PerAxisDecoder : public PerAxisIterator<const int32_t, Decoder<float>>
-{
-public:
- ScaledInt32PerAxisDecoder(const int32_t* data, const std::vector<float>& scales, unsigned int axisFactor)
- : PerAxisIterator(data, axisFactor), m_Scales(scales) {}
-
- float Get() const override
- {
- return armnn::Dequantize(*m_Iterator, m_Scales[m_AxisIndex], 0);
- }
-
- // Get scale of the current value
- float GetScale() const
- {
- return m_Scales[m_AxisIndex];
- }
-
-private:
- std::vector<float> m_Scales;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/BatchNormImpl.cpp b/src/backends/reference/workloads/BatchNormImpl.cpp
deleted file mode 100644
index e742c7280f..0000000000
--- a/src/backends/reference/workloads/BatchNormImpl.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "BatchNormImpl.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include <armnn/Tensor.hpp>
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-#include <cmath>
-
-namespace armnn
-{
-
-void BatchNormImpl(const BatchNormalizationQueueDescriptor& data,
- Decoder<float>& meanDecoder,
- Decoder<float>& varianceDecoder,
- Decoder<float>& betaDecoder,
- Decoder<float>& gammaDecoder,
- Decoder<float>& inputDecoder,
- Encoder<float>& outputEncoder)
-{
- const TensorInfo& inputInfo = GetTensorInfo(data.m_Inputs[0]);
- const TensorShape inputShape = inputInfo.GetShape();
-
- armnnUtils::DataLayoutIndexed dataLayout(data.m_Parameters.m_DataLayout);
-
- unsigned int inputBatches = inputShape[0];
- unsigned int inputHeight = inputShape[dataLayout.GetHeightIndex()];
- unsigned int inputWidth = inputShape[dataLayout.GetWidthIndex()];
- unsigned int inputChannels = inputShape[dataLayout.GetChannelsIndex()];
-
- for (unsigned int c = 0; c < inputChannels; c++)
- {
- meanDecoder[c];
- varianceDecoder[c];
- betaDecoder[c];
- gammaDecoder[c];
- float mean = meanDecoder.Get();
- float var = varianceDecoder.Get();
- float beta = betaDecoder.Get();
- float gamma = gammaDecoder.Get();
-
- float mult = gamma / sqrtf(var + data.m_Parameters.m_Eps);
- float add = beta - mult * mean;
-
- for (unsigned int n = 0; n < inputBatches; n++)
- {
- for (unsigned int h = 0; h < inputHeight; h++)
- {
- for (unsigned int w = 0; w < inputWidth; w++)
- {
- unsigned int index = dataLayout.GetIndex(inputShape, n, c, h, w);
- inputDecoder[index];
- outputEncoder[index];
- outputEncoder.Set(mult * inputDecoder.Get() + add);
- }
- }
- }
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/BatchNormImpl.hpp b/src/backends/reference/workloads/BatchNormImpl.hpp
deleted file mode 100644
index c0250b9e0f..0000000000
--- a/src/backends/reference/workloads/BatchNormImpl.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "Encoders.hpp"
-#include "Decoders.hpp"
-
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-void BatchNormImpl(const BatchNormalizationQueueDescriptor& data,
- Decoder<float>& meanIn,
- Decoder<float>& varIn,
- Decoder<float>& betaIn,
- Decoder<float>& gammaIn,
- Decoder<float>& inputData,
- Encoder<float>& outputData);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/BatchToSpaceNd.cpp b/src/backends/reference/workloads/BatchToSpaceNd.cpp
deleted file mode 100644
index 7efdb9b75c..0000000000
--- a/src/backends/reference/workloads/BatchToSpaceNd.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "BatchToSpaceNd.hpp"
-
-#include "RefWorkloadUtils.hpp"
-
-#include <armnn/Types.hpp>
-
-#include <boost/assert.hpp>
-
-using namespace armnnUtils;
-
-namespace armnn
-{
-
-inline unsigned int Offset(const TensorShape& shape, unsigned int batch, unsigned int height, unsigned int width,
- unsigned int channels, const DataLayoutIndexed& dataLayout)
-{
- if (dataLayout.GetDataLayout() == DataLayout::NHWC)
- {
- return ((batch * shape[dataLayout.GetHeightIndex()] + height) * shape[dataLayout.GetWidthIndex()] + width) *
- shape[dataLayout.GetChannelsIndex()] + channels;
- }
- else
- {
- return ((batch * shape[dataLayout.GetChannelsIndex()] + channels) *
- shape[dataLayout.GetHeightIndex()] + height) *
- shape[dataLayout.GetWidthIndex()] + width;
- }
-}
-
-void BatchToSpaceNd(const DataLayoutIndexed& dataLayout,
- const TensorInfo& inputTensorInfo,
- const TensorInfo& outputTensorInfo,
- const std::vector<unsigned int>& blockShape,
- const std::vector<std::pair<unsigned int, unsigned int>>& cropsData,
- Decoder<float>& inputDecoder,
- Encoder<float>& outputEncoder)
-{
- TensorShape inputShape = inputTensorInfo.GetShape();
-
- BOOST_ASSERT_MSG(inputShape.GetNumDimensions() == 4, "Expected Input with 4 Dimensions");
-
- TensorShape outputShape = outputTensorInfo.GetShape();
-
- BOOST_ASSERT_MSG(outputShape.GetNumDimensions() == 4, "Expected Output with 4 Dimensions");
-
- const unsigned int inputBatchSize = inputShape[0];
- const unsigned int channels = inputShape[dataLayout.GetChannelsIndex()];
-
- const unsigned int outputBatchSize = outputShape[0];
- const unsigned int outputHeight = outputShape[dataLayout.GetHeightIndex()];
- const unsigned int outputWidth = outputShape[dataLayout.GetWidthIndex()];
-
- BOOST_ASSERT_MSG(blockShape.size() > 0, "BlockShape must contain 1 or more entries");
-
- const unsigned int blockShapeHeight = blockShape[0];
- const unsigned int blockShapeWidth = blockShape[1];
-
- BOOST_ASSERT_MSG(cropsData.size() > 0, "Crops must contain 1 or more entries");
-
- const unsigned int cropsTop = cropsData[0].first;
- const unsigned int cropsLeft = cropsData[1].first;
-
- for (unsigned int inBatch = 0; inBatch < inputBatchSize; ++inBatch)
- {
- const unsigned int outBatch = inBatch % outputBatchSize;
- const unsigned int spatialOffset = inBatch / outputBatchSize;
-
- for (unsigned int inH = 0; inH < inputTensorInfo.GetShape()[dataLayout.GetHeightIndex()]; ++inH) {
- const unsigned int outH = inH * blockShapeHeight + spatialOffset / blockShapeWidth - cropsTop;
-
- if (outH >= outputHeight)
- {
- continue;
- }
-
- for (unsigned int inW = 0; inW < inputTensorInfo.GetShape()[dataLayout.GetWidthIndex()]; ++inW) {
- const unsigned int outW = inW * blockShapeWidth + spatialOffset % blockShapeWidth - cropsLeft;
-
- if (outW >= outputWidth)
- {
- continue;
- }
-
- for (unsigned int c = 0; c < channels; c++)
- {
- unsigned int outOffset = Offset(outputShape, outBatch, outH, outW, c, dataLayout);
- unsigned int inOffset = Offset(inputShape, inBatch, inH, inW, c, dataLayout);
-
- outputEncoder[outOffset];
- inputDecoder[inOffset];
- outputEncoder.Set(inputDecoder.Get());
- }
- }
- }
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/BatchToSpaceNd.hpp b/src/backends/reference/workloads/BatchToSpaceNd.hpp
deleted file mode 100644
index a375aaae52..0000000000
--- a/src/backends/reference/workloads/BatchToSpaceNd.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-#include <armnn/Types.hpp>
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-void BatchToSpaceNd(const armnnUtils::DataLayoutIndexed& dataLayout,
- const TensorInfo& inputTensorInfo,
- const TensorInfo& outputTensorInfo,
- const std::vector<unsigned int>& blockShape,
- const std::vector<std::pair<unsigned int, unsigned int>>& cropsData,
- Decoder<float>& inputDecoder,
- Encoder<float>& outputEncoder);
-} // namespace armnn
diff --git a/src/backends/reference/workloads/Broadcast.cpp b/src/backends/reference/workloads/Broadcast.cpp
deleted file mode 100644
index 24af0fc4b1..0000000000
--- a/src/backends/reference/workloads/Broadcast.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Broadcast.hpp"
-
-namespace armnn
-{
-
-BroadcastLoop::BroadcastLoop(const TensorShape& inShape0, const TensorShape& inShape1, const TensorShape& outShape)
-: m_DimData(outShape.GetNumDimensions())
-{
- const unsigned int numDims = GetNumDimensions();
-
- unsigned int sIn0 = 1;
- unsigned int sIn1 = 1;
- unsigned int sOut = 1;
-
- for (unsigned int j = numDims - 1, k = 0; k < numDims ; k++, j--)
- {
- m_DimData[j].m_DimSize = outShape[j];
- m_DimData[j].m_Stride1 = (inShape0[j] > 1) ? sIn0 : 0;
- m_DimData[j].m_Stride2 = (inShape1[j] > 1) ? sIn1 : 0;
- m_DimData[j].m_StrideOut = sOut;
-
- sIn0 *= inShape0[j];
- sIn1 *= inShape1[j];
- sOut *= outShape[j];
- }
-}
-
-BroadcastLoop::BroadcastLoop(const TensorShape& inShape, const TensorShape& outShape)
-: m_DimData(outShape.GetNumDimensions())
-{
- const unsigned int numDims = GetNumDimensions();
-
- unsigned int sIn = 1;
- unsigned int sOut = 1;
-
- for (unsigned int j = numDims - 1, k = 0; k < numDims ; k++, j--)
- {
- m_DimData[j].m_DimSize = outShape[j];
- m_DimData[j].m_Stride1 = (inShape[j] > 1) ? sIn : 0;
- m_DimData[j].m_StrideOut = sOut;
-
- sIn *= inShape[j];
- sOut *= outShape[j];
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/Broadcast.hpp b/src/backends/reference/workloads/Broadcast.hpp
deleted file mode 100644
index a3d944ae75..0000000000
--- a/src/backends/reference/workloads/Broadcast.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "BaseIterator.hpp"
-#include <armnn/Tensor.hpp>
-
-#include <functional>
-
-namespace armnn
-{
-
-struct BroadcastLoop
-{
- BroadcastLoop(const TensorShape& inShape0, const TensorShape& inShape1, const TensorShape& outShape);
-
- BroadcastLoop(const TensorShape& inShape, const TensorShape& outShape);
-
- unsigned int GetNumDimensions()
- {
- return static_cast<unsigned int>(m_DimData.size());
- }
-
- template <typename Func, typename DecoderOp, typename EncoderOp>
- void Unroll(Func operationFunc,
- unsigned int dimension,
- DecoderOp& inData0,
- DecoderOp& inData1,
- EncoderOp& outData)
- {
- if (dimension >= GetNumDimensions())
- {
- outData.Set(operationFunc(inData0.Get(), inData1.Get()));
- return;
- }
-
- unsigned int inData0Movement = 0;
- unsigned int inData1Movement = 0;
- unsigned int outDataMovement = 0;
-
- for (unsigned int i = 0; i < m_DimData[dimension].m_DimSize; i++)
- {
- Unroll(operationFunc, dimension + 1, inData0, inData1, outData);
-
- inData0 += m_DimData[dimension].m_Stride1;
- inData1 += m_DimData[dimension].m_Stride2;
- outData += m_DimData[dimension].m_StrideOut;
-
- inData0Movement += m_DimData[dimension].m_Stride1;
- inData1Movement += m_DimData[dimension].m_Stride2;
- outDataMovement += m_DimData[dimension].m_StrideOut;
- }
-
- // move iterator back to the start
- inData0 -= inData0Movement;
- inData1 -= inData1Movement;
- outData -= outDataMovement;
- }
-
- template <typename Func, typename DecoderOp, typename EncoderOp>
- void Unroll(Func operationFunc,
- unsigned int dimension,
- DecoderOp& inData,
- EncoderOp& outData)
- {
- if (dimension >= GetNumDimensions())
- {
- outData.Set(operationFunc(inData.Get()));
- return;
- }
-
- unsigned int inDataMovement = 0;
- unsigned int outDataMovement = 0;
-
- for (unsigned int i = 0; i < m_DimData[dimension].m_DimSize; i++)
- {
- Unroll(operationFunc, dimension + 1, inData, outData);
-
- inData += m_DimData[dimension].m_Stride1;
- outData += m_DimData[dimension].m_StrideOut;
-
- inDataMovement += m_DimData[dimension].m_Stride1;
- outDataMovement += m_DimData[dimension].m_StrideOut;
- }
-
- // move iterator back to the start
- inData -= inDataMovement;
- outData -= outDataMovement;
- }
-
-private:
- // Struct to hold the dimension data.
- struct BroadcastDimensionData
- {
- unsigned int m_DimSize;
- unsigned int m_StrideOut;
- unsigned int m_Stride1;
- unsigned int m_Stride2;
- };
-
- std::vector<BroadcastDimensionData> m_DimData;
-};
-
-} //namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/CMakeLists.txt b/src/backends/reference/workloads/CMakeLists.txt
deleted file mode 100644
index 6795204d59..0000000000
--- a/src/backends/reference/workloads/CMakeLists.txt
+++ /dev/null
@@ -1,175 +0,0 @@
-#
-# Copyright © 2017 Arm Ltd. All rights reserved.
-# SPDX-License-Identifier: MIT
-#
-
-list(APPEND armnnRefBackendWorkloads_sources
- Abs.hpp
- ArgMinMax.cpp
- ArgMinMax.hpp
- Activation.cpp
- Activation.hpp
- ArgMinMax.cpp
- ArgMinMax.hpp
- BaseIterator.hpp
- BatchNormImpl.cpp
- BatchNormImpl.hpp
- BatchToSpaceNd.cpp
- BatchToSpaceNd.hpp
- Broadcast.cpp
- Broadcast.hpp
- ConvImpl.cpp
- ConvImpl.hpp
- Debug.cpp
- Debug.hpp
- Decoders.hpp
- DepthToSpace.cpp
- DepthToSpace.hpp
- DetectionPostProcess.cpp
- DetectionPostProcess.hpp
- Dequantize.cpp
- Dequantize.hpp
- ElementwiseFunction.cpp
- ElementwiseFunction.hpp
- Encoders.hpp
- Exp.hpp
- FullyConnected.cpp
- FullyConnected.hpp
- Gather.cpp
- Gather.hpp
- InstanceNorm.cpp
- InstanceNorm.hpp
- LogSoftmax.cpp
- LogSoftmax.hpp
- LstmUtils.hpp
- LstmUtils.cpp
- Maximum.hpp
- Mean.cpp
- Mean.hpp
- Concatenate.hpp
- Concatenate.cpp
- Minimum.hpp
- Pad.cpp
- Pad.hpp
- Pooling2d.cpp
- Pooling2d.hpp
- PreluImpl.cpp
- PreluImpl.hpp
- RefActivationWorkload.cpp
- RefActivationWorkload.hpp
- RefArgMinMaxWorkload.cpp
- RefArgMinMaxWorkload.hpp
- RefBatchNormalizationWorkload.cpp
- RefBatchNormalizationWorkload.hpp
- RefBatchToSpaceNdWorkload.cpp
- RefBatchToSpaceNdWorkload.hpp
- RefComparisonWorkload.cpp
- RefComparisonWorkload.hpp
- RefConcatWorkload.cpp
- RefConcatWorkload.hpp
- RefConstantWorkload.cpp
- RefConstantWorkload.hpp
- RefConvertFp16ToFp32Workload.cpp
- RefConvertFp16ToFp32Workload.hpp
- RefConvertFp32ToFp16Workload.cpp
- RefConvertFp32ToFp16Workload.hpp
- RefConvolution2dWorkload.cpp
- RefConvolution2dWorkload.hpp
- RefElementwiseWorkload.cpp
- RefElementwiseWorkload.hpp
- RefDebugWorkload.cpp
- RefDebugWorkload.hpp
- RefDepthToSpaceWorkload.cpp
- RefDepthToSpaceWorkload.hpp
- RefDepthwiseConvolution2dWorkload.cpp
- RefDepthwiseConvolution2dWorkload.hpp
- RefDequantizeWorkload.cpp
- RefDequantizeWorkload.hpp
- RefDetectionPostProcessWorkload.cpp
- RefDetectionPostProcessWorkload.hpp
- RefElementwiseUnaryWorkload.cpp
- RefElementwiseUnaryWorkload.hpp
- RefFakeQuantizationFloat32Workload.cpp
- RefFakeQuantizationFloat32Workload.hpp
- RefFloorWorkload.cpp
- RefFloorWorkload.hpp
- RefFullyConnectedWorkload.cpp
- RefFullyConnectedWorkload.hpp
- RefGatherWorkload.cpp
- RefGatherWorkload.hpp
- RefInstanceNormalizationWorkload.cpp
- RefInstanceNormalizationWorkload.hpp
- RefL2NormalizationWorkload.cpp
- RefL2NormalizationWorkload.hpp
- RefLogSoftmaxWorkload.cpp
- RefLogSoftmaxWorkload.hpp
- RefLstmWorkload.cpp
- RefLstmWorkload.hpp
- RefMeanWorkload.cpp
- RefMeanWorkload.hpp
- RefNormalizationWorkload.cpp
- RefNormalizationWorkload.hpp
- RefPadWorkload.cpp
- RefPadWorkload.hpp
- RefPermuteWorkload.cpp
- RefPermuteWorkload.hpp
- RefPooling2dWorkload.cpp
- RefPooling2dWorkload.hpp
- RefPreluWorkload.cpp
- RefPreluWorkload.hpp
- RefQuantizeWorkload.cpp
- RefQuantizeWorkload.hpp
- RefReshapeWorkload.cpp
- RefReshapeWorkload.hpp
- RefResizeBilinearWorkload.cpp
- RefResizeBilinearWorkload.hpp
- RefResizeWorkload.cpp
- RefResizeWorkload.hpp
- RefSliceWorkload.cpp
- RefSliceWorkload.hpp
- RefSoftmaxWorkload.cpp
- RefSoftmaxWorkload.hpp
- RefSpaceToBatchNdWorkload.cpp
- RefSpaceToBatchNdWorkload.hpp
- RefSpaceToDepthWorkload.cpp
- RefSpaceToDepthWorkload.hpp
- RefSplitterWorkload.cpp
- RefSplitterWorkload.hpp
- RefStackWorkload.cpp
- RefStackWorkload.hpp
- RefStridedSliceWorkload.cpp
- RefStridedSliceWorkload.hpp
- RefTransposeConvolution2dWorkload.cpp
- RefTransposeConvolution2dWorkload.hpp
- RefWorkloads.hpp
- RefWorkloadUtils.hpp
- Resize.cpp
- Resize.hpp
- Rsqrt.hpp
- Slice.cpp
- Slice.hpp
- Softmax.cpp
- Softmax.hpp
- SpaceToBatchNd.hpp
- SpaceToBatchNd.cpp
- SpaceToDepth.hpp
- SpaceToDepth.cpp
- Splitter.hpp
- Splitter.cpp
- Sqrt.hpp
- Stack.cpp
- Stack.hpp
- StridedSlice.hpp
- StridedSlice.cpp
- StringMapping.cpp
- StringMapping.hpp
- TensorBufferArrayView.hpp
- TransposeConvolution2d.cpp
- TransposeConvolution2d.hpp
-)
-
-add_library(armnnRefBackendWorkloads OBJECT ${armnnRefBackendWorkloads_sources})
-target_include_directories(armnnRefBackendWorkloads PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnRefBackendWorkloads PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
-target_include_directories(armnnRefBackendWorkloads PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
-target_include_directories(armnnRefBackendWorkloads PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling)
diff --git a/src/backends/reference/workloads/Concatenate.cpp b/src/backends/reference/workloads/Concatenate.cpp
deleted file mode 100644
index bb55424c0c..0000000000
--- a/src/backends/reference/workloads/Concatenate.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Concatenate.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn
-{
-
-void Concatenate(const ConcatQueueDescriptor &data)
-{
- const TensorInfo& outputInfo0 = GetTensorInfo(data.m_Outputs[0]);
-
- std::unique_ptr<Encoder<float>> encoderPtr = MakeEncoder<float>(outputInfo0, data.m_Outputs[0]->Map());
- Encoder<float>& encoder = *encoderPtr;
-
- for (unsigned int index = 0 ; index < outputInfo0.GetNumElements(); ++index)
- {
- unsigned int indices[MaxNumOfTensorDimensions] = { 0 };
-
- unsigned int indexRemainder = index;
- unsigned int dimensionStride = outputInfo0.GetNumElements();
-
- for (unsigned int i = 0; i < outputInfo0.GetNumDimensions(); i++)
- {
- dimensionStride /= outputInfo0.GetShape()[i];
- indices[i] = indexRemainder / dimensionStride; // Use integer division to round down.
- indexRemainder -= indices[i] * dimensionStride;
- }
-
- for (unsigned int viewIdx = 0; viewIdx < data.m_ViewOrigins.size(); ++viewIdx)
- {
- ConcatQueueDescriptor::ViewOrigin const& view = data.m_ViewOrigins[viewIdx];
-
- //Split view extents are defined by the size of (the corresponding) input tensor.
- const TensorInfo& inputInfo = GetTensorInfo(data.m_Inputs[viewIdx]);
- BOOST_ASSERT(inputInfo.GetNumDimensions() == outputInfo0.GetNumDimensions());
-
- // Check all dimensions to see if this element is inside the given input view.
- bool insideView = true;
- for (unsigned int i = 0; i < inputInfo.GetNumDimensions(); i++)
- {
- if (indices[i] < view.m_Origin[i])
- {
- insideView = false;
- }
- if (indices[i] >= view.m_Origin[i] + inputInfo.GetShape()[i])
- {
- insideView = false;
- }
- }
-
- if (insideView)
- {
- std::unique_ptr<Decoder<float>> decoderPtr =
- MakeDecoder<float>(inputInfo, data.m_Inputs[viewIdx]->Map());
- Decoder<float>& decoder = *decoderPtr;
- unsigned int inIndex = 0;
- unsigned int dimensionStride = 1;
-
- for (unsigned int i = inputInfo.GetNumDimensions(); i-- > 0;)
- {
- inIndex += dimensionStride * (indices[i] - view.m_Origin[i]);
- dimensionStride *= inputInfo.GetShape()[i];
- }
- decoder += inIndex;
- encoder.Set(decoder.Get());
-
- //What should we do if input views overlap on the output tensor?
- //We could error, take the average, or shm else...
- //For now just stop after finding first view (input) that matches.
- break;
- }
- }
- ++encoder;
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Concatenate.hpp b/src/backends/reference/workloads/Concatenate.hpp
deleted file mode 100644
index ac82a87af3..0000000000
--- a/src/backends/reference/workloads/Concatenate.hpp
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/WorkloadData.hpp>
-#include <armnn/Tensor.hpp>
-
-namespace armnn
-{
-void Concatenate(const ConcatQueueDescriptor &data);
-} //namespace armnn
diff --git a/src/backends/reference/workloads/ConvImpl.cpp b/src/backends/reference/workloads/ConvImpl.cpp
deleted file mode 100644
index 0c13e3ba0d..0000000000
--- a/src/backends/reference/workloads/ConvImpl.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "ConvImpl.hpp"
-
-#include <boost/assert.hpp>
-
-#include <cmath>
-#include <limits>
-
-namespace armnn
-{
-
-QuantizedMultiplierSmallerThanOne::QuantizedMultiplierSmallerThanOne(float multiplier)
-{
- BOOST_ASSERT(multiplier >= 0.0f && multiplier < 1.0f);
- if (multiplier == 0.0f)
- {
- m_Multiplier = 0;
- m_RightShift = 0;
- }
- else
- {
- const double q = std::frexp(multiplier, &m_RightShift);
- m_RightShift = -m_RightShift;
- int64_t qFixed = static_cast<int64_t>(std::round(q * (1ll << 31)));
- BOOST_ASSERT(qFixed <= (1ll << 31));
- if (qFixed == (1ll << 31))
- {
- qFixed /= 2;
- --m_RightShift;
- }
- BOOST_ASSERT(m_RightShift >= 0);
- BOOST_ASSERT(qFixed <= std::numeric_limits<int32_t>::max());
- m_Multiplier = static_cast<int32_t>(qFixed);
- }
-}
-
-int32_t QuantizedMultiplierSmallerThanOne::operator*(int32_t rhs) const
-{
- int32_t x = SaturatingRoundingDoublingHighMul(rhs, m_Multiplier);
- return RoundingDivideByPOT(x, m_RightShift);
-}
-
-int32_t QuantizedMultiplierSmallerThanOne::SaturatingRoundingDoublingHighMul(int32_t a, int32_t b)
-{
- // Check for overflow.
- if (a == b && a == std::numeric_limits<int32_t>::min())
- {
- return std::numeric_limits<int32_t>::max();
- }
- int64_t a_64(a);
- int64_t b_64(b);
- int64_t ab_64 = a_64 * b_64;
- int32_t nudge = ab_64 >= 0 ? (1 << 30) : (1 - (1 << 30));
- int32_t ab_x2_high32 = static_cast<std::int32_t>((ab_64 + nudge) / (1ll << 31));
- return ab_x2_high32;
-}
-
-int32_t QuantizedMultiplierSmallerThanOne::RoundingDivideByPOT(int32_t x, int exponent)
-{
- BOOST_ASSERT(exponent >= 0 && exponent <= 31);
- int32_t mask = (1 << exponent) - 1;
- int32_t remainder = x & mask;
- int32_t threshold = (mask >> 1) + (x < 0 ? 1 : 0);
- return (x >> exponent) + (remainder > threshold ? 1 : 0);
-}
-
-void Convolve(const TensorShape& rInputShape,
- Decoder<float>& rInputDecoder,
- const TensorShape& rOutputShape,
- Encoder<float>& rOutputEncoder,
- const TensorShape& rFilterShape,
- Decoder<float>& rFilterDecoder,
- bool biasEnabled,
- Decoder<float>* pBiasDecoder,
- DataLayout dataLayout,
- unsigned int paddingTop,
- unsigned int paddingLeft,
- unsigned int xStride,
- unsigned int yStride,
- unsigned int xDilation,
- unsigned int yDilation,
- bool depthwise)
-{
- if (biasEnabled && !pBiasDecoder)
- {
- throw InvalidArgumentException("Bias is enabled but the bias data is invalid");
- }
- const armnnUtils::DataLayoutIndexed dataLayoutIndexed(dataLayout);
-
- const unsigned int channelsIndex = dataLayoutIndexed.GetChannelsIndex();
- const unsigned int heightIndex = dataLayoutIndexed.GetHeightIndex();
- const unsigned int widthIndex = dataLayoutIndexed.GetWidthIndex();
-
- unsigned int depthMultiplier = depthwise ? rFilterShape[0] : 1;
- unsigned int inputChannels = depthwise ? rFilterShape[1] : rFilterShape[channelsIndex];
- unsigned int outputChannels = depthwise ? inputChannels * depthMultiplier : rFilterShape[0];
-
- unsigned int batchSize = rOutputShape[0];
- unsigned int outputHeight = rOutputShape[heightIndex];
- unsigned int outputWidth = rOutputShape[widthIndex];
- unsigned int inputHeight = rInputShape[heightIndex];
- unsigned int inputWidth = rInputShape[widthIndex];
-
- unsigned int filterHeight = depthwise ? rFilterShape[2] : rFilterShape[heightIndex];
- unsigned int filterWidth = depthwise ? rFilterShape[3] : rFilterShape[widthIndex];
-
- for (unsigned int batchIdx = 0; batchIdx < batchSize; batchIdx++)
- {
- for (unsigned int cOutput = 0; cOutput < outputChannels; cOutput++)
- {
- for (unsigned int yOutput = 0; yOutput < outputHeight; yOutput++)
- {
- for (unsigned int xOutput = 0; xOutput < outputWidth; xOutput++)
- {
- // This loop goes over each output element.
- float sum = 0.0f;
-
- // For depthwise, each output channel corresponds to exactly one input channel.
- // For normal, must loop over each input channel.
- for (unsigned int cInput = 0; cInput < (depthwise ? 1 : inputChannels); cInput++)
- {
- unsigned int depthwiseMultiplierIdx = 0;
- if (depthwise)
- {
- cInput = cOutput / depthMultiplier;
- depthwiseMultiplierIdx = cOutput % depthMultiplier;
- }
-
- for (unsigned int yFilter = 0; yFilter < filterHeight; yFilter++)
- {
- for (unsigned int xFilter = 0; xFilter < filterWidth; xFilter++)
- {
- // This loop goes over each input element for each output element.
- unsigned int filterIndex = 0;
-
- // Since dimensionality of kernel depends on depthwiseness, so does index.
- if (depthwise)
- {
- filterIndex = depthwiseMultiplierIdx * filterWidth * filterHeight * inputChannels +
- cInput * filterWidth * filterHeight +
- yFilter * filterWidth +
- xFilter;
- }
- else
- {
- // Keep this implementation, as using DataLayoutIndexed::GetIndex causes great
- // performance regression.
- if (dataLayout == DataLayout::NHWC)
- {
- filterIndex = cOutput * filterHeight * filterWidth * inputChannels +
- yFilter * filterWidth * inputChannels +
- xFilter * inputChannels +
- cInput;
- }
- else
- {
- filterIndex = cOutput * filterWidth * filterHeight * inputChannels +
- cInput * filterWidth * filterHeight +
- yFilter * filterWidth +
- xFilter;
- }
- }
-
- rFilterDecoder.SetIndex(filterIndex, cOutput);
- float filterValue = rFilterDecoder.Get();
-
- unsigned int yInput = yOutput * yStride + yFilter * yDilation;
- unsigned int xInput = xOutput * xStride + xFilter * xDilation;
-
- float inputValue;
-
- // Check if we're in the padding.
- if (yInput < paddingTop || yInput >= inputHeight + paddingTop ||
- xInput < paddingLeft || xInput >= inputWidth + paddingLeft )
- {
- inputValue = 0.0f;
- }
- else
- {
- unsigned int inputIndex = 0;
-
- // Keep this implementation, as using DataLayoutIndexed::GetIndex causes great
- // performance regression.
- if (dataLayout == DataLayout::NHWC)
- {
- inputIndex = batchIdx * inputHeight * inputWidth * inputChannels +
- (yInput - paddingTop) * inputWidth * inputChannels +
- (xInput - paddingLeft) * inputChannels +
- cInput;
- }
- else
- {
- inputIndex = batchIdx * inputWidth * inputHeight * inputChannels +
- inputWidth * inputHeight * cInput +
- inputWidth * (yInput - paddingTop) +
- xInput - paddingLeft;
- }
-
- rInputDecoder[inputIndex];
- inputValue = rInputDecoder.Get();
- }
-
- sum += filterValue * inputValue;
- }
- }
- }
-
- if (biasEnabled)
- {
- (*pBiasDecoder).SetIndex(cOutput, cOutput);
- sum += pBiasDecoder->Get();
- }
-
- unsigned int outIdx = dataLayoutIndexed.GetIndex(rOutputShape, batchIdx, cOutput, yOutput, xOutput);
-
- rOutputEncoder[outIdx];
- rOutputEncoder.Set(sum);
- }
- }
- }
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/ConvImpl.hpp b/src/backends/reference/workloads/ConvImpl.hpp
deleted file mode 100644
index 562fd3e296..0000000000
--- a/src/backends/reference/workloads/ConvImpl.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "RefWorkloadUtils.hpp"
-#include "TensorBufferArrayView.hpp"
-#include "BaseIterator.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-#include <armnn/Tensor.hpp>
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-#include <boost/assert.hpp>
-#include <boost/numeric/conversion/cast.hpp>
-
-#include <cmath>
-#include <limits>
-
-namespace armnn
-{
-
-/// Performs multiplication of an integer with a multiplier which is less than one,
-/// using quantized integer arithmetic which is consistent with AndroidNN's CPU executor.
-struct QuantizedMultiplierSmallerThanOne
-{
-public:
- /// Constructs a QuantizedMultiplierSmallerThanOne which will multiply by the given multiplier.
- /// This stores the appropriate integer quantities (derived from the given multiplier) for later use.
- /// The implementation of this function is adapted from Android NN's QuantizeMultiplierSmallerThanOne().
- QuantizedMultiplierSmallerThanOne(float multiplier);
-
- /// The implementation of this function is adapted from Android NN's MultiplyByQuantizedMultiplierSmallerThanOne().
- int32_t operator*(int32_t rhs) const;
-
-private:
- /// The implementation of this function is adapted from gemmlowp's SaturatingRoundingDoublingHighMul().
- static int32_t SaturatingRoundingDoublingHighMul(int32_t a, int32_t b);
-
- /// The implementation of this function is adapted from gemmlowp's RoundingDivideByPOT().
- static int32_t RoundingDivideByPOT(int32_t x, int exponent);
-
- int32_t m_Multiplier;
- int32_t m_RightShift;
-};
-
-void Convolve(const TensorShape& rInputShape,
- Decoder<float>& rInputDecoder,
- const TensorShape& rOutputShape,
- Encoder<float>& rOutputEncoder,
- const TensorShape& rFilterShape,
- Decoder<float>& rFilterDecoder,
- bool biasEnabled,
- Decoder<float>* pBiasDecoder,
- DataLayout dataLayout,
- unsigned int paddingTop,
- unsigned int paddingLeft,
- unsigned int xStride,
- unsigned int yStride,
- unsigned int xDilation,
- unsigned int yDilation,
- bool depthwise = false);
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Debug.cpp b/src/backends/reference/workloads/Debug.cpp
deleted file mode 100644
index 49e9e02ffb..0000000000
--- a/src/backends/reference/workloads/Debug.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Debug.hpp"
-
-#include <Half.hpp>
-
-#include <boost/numeric/conversion/cast.hpp>
-
-#include <algorithm>
-#include <iostream>
-
-namespace armnn
-{
-
-template <typename T>
-void Debug(const TensorInfo& inputInfo,
- const T* inputData,
- LayerGuid guid,
- const std::string& layerName,
- unsigned int slotIndex)
-{
- const unsigned int numDims = inputInfo.GetNumDimensions();
- const unsigned int numElements = inputInfo.GetNumElements();
- const TensorShape& inputShape = inputInfo.GetShape();
-
- std::vector<unsigned int> strides(numDims, 0);
- strides[numDims - 1] = inputShape[numDims - 1];
-
- for (unsigned int i = 2; i <= numDims; i++)
- {
- strides[numDims - i] = strides[numDims - i + 1] * inputShape[numDims - i];
- }
-
- std::cout << "{ ";
- std::cout << "\"layerGuid\": " << guid << ", ";
- std::cout << "\"layerName\": \"" << layerName << "\", ";
- std::cout << "\"outputSlot\": " << slotIndex << ", ";
- std::cout << "\"shape\": ";
-
- std::cout << "[";
- for (unsigned int i = 0; i < numDims; i++)
- {
- std::cout << inputShape[i];
- if (i != numDims - 1)
- {
- std::cout << ", ";
- }
- }
- std::cout << "], ";
-
- std::cout << "\"min\": "
- << boost::numeric_cast<float>(*std::min_element(inputData, inputData + numElements)) << ", ";
-
- std::cout << "\"max\": "
- << boost::numeric_cast<float>(*std::max_element(inputData, inputData + numElements)) << ", ";
-
- std::cout << "\"data\": ";
-
- for (unsigned int i = 0; i < numElements; i++)
- {
- for (unsigned int j = 0; j < numDims; j++)
- {
- if (i % strides[j] == 0)
- {
- std::cout << "[" ;
- }
- }
-
- std::cout << boost::numeric_cast<float>(inputData[i]);
-
- for (unsigned int j = 0; j < numDims; j++)
- {
- if ((i+1) % strides[j] == 0)
- {
- std::cout << "]" ;
- }
- }
-
- if (i != numElements - 1)
- {
- std::cout << ", ";
- }
- }
-
- std::cout << " }" << std::endl;
-}
-
-template void Debug<Half>(const TensorInfo& inputInfo,
- const Half* inputData,
- LayerGuid guid,
- const std::string& layerName,
- unsigned int slotIndex);
-
-template void Debug<float>(const TensorInfo& inputInfo,
- const float* inputData,
- LayerGuid guid,
- const std::string& layerName,
- unsigned int slotIndex);
-
-template void Debug<uint8_t>(const TensorInfo& inputInfo,
- const uint8_t* inputData,
- LayerGuid guid,
- const std::string& layerName,
- unsigned int slotIndex);
-
-template void Debug<int8_t>(const TensorInfo& inputInfo,
- const int8_t* inputData,
- LayerGuid guid,
- const std::string& layerName,
- unsigned int slotIndex);
-
-template void Debug<int16_t>(const TensorInfo& inputInfo,
- const int16_t* inputData,
- LayerGuid guid,
- const std::string& layerName,
- unsigned int slotIndex);
-
-template void Debug<int32_t>(const TensorInfo& inputInfo,
- const int32_t* inputData,
- LayerGuid guid,
- const std::string& layerName,
- unsigned int slotIndex);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/Debug.hpp b/src/backends/reference/workloads/Debug.hpp
deleted file mode 100644
index 3f9920c543..0000000000
--- a/src/backends/reference/workloads/Debug.hpp
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <armnn/Tensor.hpp>
-
-namespace armnn
-{
-
-template <typename T>
-void Debug(const TensorInfo& inputInfo,
- const T* inputData,
- LayerGuid guid,
- const std::string& layerName,
- unsigned int slotIndex);
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Decoders.hpp b/src/backends/reference/workloads/Decoders.hpp
deleted file mode 100644
index 6a8c756048..0000000000
--- a/src/backends/reference/workloads/Decoders.hpp
+++ /dev/null
@@ -1,144 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-
-#include <armnnUtils/FloatingPointConverter.hpp>
-#include <armnnUtils/TensorUtils.hpp>
-
-#include <boost/assert.hpp>
-
-namespace armnn
-{
-
-namespace
-{
-
-inline std::unique_ptr<Decoder<float>> MakeSigned32PerAxisDecoder(const TensorInfo& info, const void* data)
-{
- auto params = armnnUtils::GetPerAxisParams(info);
- return std::make_unique<ScaledInt32PerAxisDecoder>(
- static_cast<const int32_t*>(data),
- params.second,
- params.first);
-}
-
-inline std::unique_ptr<Decoder<float>> MakeSigned32Decoder(const TensorInfo& info, const void* data)
-{
- if(info.HasMultipleQuantizationScales())
- {
- // NOTE: If we have multiple quantization scales, we create a ScaledInt32PerAxisDecoder.
- // This will be used to decode per-axis quantized convolution biases.
- return MakeSigned32PerAxisDecoder(info, data);
- }
- else
- {
- if (info.GetQuantizationDim().has_value())
- {
- // NOTE: Even though we only have a single quantization scale, if the quantization
- // dimension is set, the tensor has per-axis quantization and we need to create a
- // ScaledInt32PerAxisDecoder
- return MakeSigned32PerAxisDecoder(info, data);
- }
-
- const float scale = info.GetQuantizationScale();
- if (scale == 0.f)
- {
- // NOTE:: If no quantization scale is set, we create an Int32Decoder, which simply
- // casts the int value to float. This will be used for any INT32 data other than
- // convolution biases.
- return std::make_unique<Int32Decoder>(static_cast<const int32_t*>(data));
- }
-
- // NOTE: If we only have a single (non-zero) quantization scale and no quantization
- // dimension is specified, we need to create a ScaledInt32Decoder. This will be used
- // to decode per-tensor quantized convolution biases.
- return std::make_unique<ScaledInt32Decoder>(static_cast<const int32_t*>(data), scale);
- }
-}
-
-} // anonymous namespace
-
-template<typename T>
-inline std::unique_ptr<Decoder<T>> MakeDecoder(const TensorInfo& info, const void* data = nullptr);
-
-template<>
-inline std::unique_ptr<Decoder<float>> MakeDecoder(const TensorInfo& info, const void* data)
-{
- switch(info.GetDataType())
- {
- ARMNN_NO_DEPRECATE_WARN_BEGIN
- case armnn::DataType::QuantizedSymm8PerAxis:
- {
- std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
- return std::make_unique<QSymm8PerAxisDecoder>(
- static_cast<const int8_t*>(data),
- params.second,
- params.first);
- }
- ARMNN_NO_DEPRECATE_WARN_END
- case DataType::QAsymmS8:
- {
- return std::make_unique<QASymmS8Decoder>(
- static_cast<const int8_t*>(data),
- info.GetQuantizationScale(),
- info.GetQuantizationOffset());
- }
- case DataType::QAsymmU8:
- {
- return std::make_unique<QASymm8Decoder>(
- static_cast<const uint8_t*>(data),
- info.GetQuantizationScale(),
- info.GetQuantizationOffset());
- }
- case DataType::QSymmS16:
- {
- return std::make_unique<QSymm16Decoder>(
- static_cast<const int16_t*>(data),
- info.GetQuantizationScale(),
- info.GetQuantizationOffset());
- }
- case DataType::Float16:
- {
- return std::make_unique<Float16Decoder>(static_cast<const Half*>(data));
- }
- case DataType::Float32:
- {
- return std::make_unique<Float32Decoder>(static_cast<const float*>(data));
- }
- case DataType::Signed32:
- {
- return MakeSigned32Decoder(info, data);
- }
- case DataType::QSymmS8:
- {
- if (info.HasPerAxisQuantization())
- {
- std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
- return std::make_unique<QSymm8PerAxisDecoder>(
- static_cast<const int8_t*>(data),
- params.second,
- params.first);
- }
- else
- {
- return std::make_unique<QSymmS8Decoder>(
- static_cast<const int8_t*>(data),
- info.GetQuantizationScale(),
- info.GetQuantizationOffset());
- }
- }
- default:
- {
- BOOST_ASSERT_MSG(false, "Unsupported Data Type!");
- break;
- }
- }
- return nullptr;
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/DepthToSpace.cpp b/src/backends/reference/workloads/DepthToSpace.cpp
deleted file mode 100644
index 91ca160ae2..0000000000
--- a/src/backends/reference/workloads/DepthToSpace.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "DepthToSpace.hpp"
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-#include <armnnUtils/Permute.hpp>
-
-#include <boost/assert.hpp>
-
-using namespace armnnUtils;
-
-namespace armnn
-{
-
-void DepthToSpace(const TensorInfo& inputInfo,
- const DepthToSpaceDescriptor& descriptor,
- const void* inputData,
- void* outputData,
- unsigned int dataTypeSize)
-{
- const unsigned int blockSize = descriptor.m_BlockSize;
- BOOST_ASSERT(blockSize != 0u);
-
- const TensorShape& inputShape = inputInfo.GetShape();
- const unsigned int batches = inputShape[0];
-
- armnnUtils::DataLayoutIndexed dataLayoutIndexed(descriptor.m_DataLayout);
- const unsigned int inDepth = inputShape[dataLayoutIndexed.GetChannelsIndex()];
- const unsigned int inHeight = inputShape[dataLayoutIndexed.GetHeightIndex()];
- const unsigned int inWidth = inputShape[dataLayoutIndexed.GetWidthIndex()];
-
- const unsigned int outDepth = inDepth / (blockSize * blockSize);
-
- // The 4D input data can be interpreted as 6D (implicitly reshaped) as follows:
- //
- // [batch, block size, block size, inDepth, inHeight, inWidth] for NCHW and
- // [batch, inHeight, inWidth, blockSize, blockSize, outDepth] for NHWC.
- //
- // DepthToSpace can then be implemented as a permutation in 6D resulting in
- // the following shapes:
- //
- // [batch, outDepth, inHeight, blockSize, inWidth, blockSize] for NCHW and
- // [batch, inHeight, blockSize, inWidth, blockSize, outDepth] for NHWC.
- //
- // NOTE:
- // Since 6D tensors are not currently supported, in practice we need to handle each
- // batch separately and execute 5D permutations
-
- TensorShape permDestShape;
- PermutationVector permVector{};
- if (descriptor.m_DataLayout == DataLayout::NCHW)
- {
- permDestShape = TensorShape({ outDepth, inHeight, blockSize, inWidth, blockSize });
- permVector = { 2, 4, 0, 1, 3 };
- }
- else
- {
- permDestShape = TensorShape({ inHeight, blockSize, inWidth, blockSize, outDepth });
- permVector = { 0, 2, 1, 3, 4 };
- }
-
- const unsigned int numElementsPerBatch = inputShape.GetNumElements() / batches;
-
- for (unsigned int batchIndex = 0u; batchIndex < batches; ++batchIndex)
- {
- const uintptr_t batchDataOffset = batchIndex * (numElementsPerBatch * dataTypeSize);
-
- armnnUtils::Permute(permDestShape,
- permVector,
- static_cast<const void*>(reinterpret_cast<const uint8_t*>(inputData) + batchDataOffset),
- static_cast<void*>(reinterpret_cast<uint8_t*>(outputData) + batchDataOffset),
- dataTypeSize);
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/DepthToSpace.hpp b/src/backends/reference/workloads/DepthToSpace.hpp
deleted file mode 100644
index a1805c02be..0000000000
--- a/src/backends/reference/workloads/DepthToSpace.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/Descriptors.hpp>
-#include <armnn/Tensor.hpp>
-
-namespace armnn
-{
-
-void DepthToSpace(const TensorInfo& inputInfo,
- const DepthToSpaceDescriptor& descriptor,
- const void* inputData,
- void* outputData,
- unsigned int dataTypeSize);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/Dequantize.cpp b/src/backends/reference/workloads/Dequantize.cpp
deleted file mode 100644
index 4025e8d7fa..0000000000
--- a/src/backends/reference/workloads/Dequantize.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Dequantize.hpp"
-
-#include <boost/core/ignore_unused.hpp>
-namespace armnn
-{
-
-void Dequantize(Decoder<float>& inputDecoder,
- Encoder<float>& outputEncoder,
- const TensorInfo& inputInfo,
- const TensorInfo& outputInfo)
-{
- boost::ignore_unused(outputInfo);
- BOOST_ASSERT(inputInfo.GetNumElements() == outputInfo.GetNumElements());
- for (unsigned int i = 0; i < inputInfo.GetNumElements(); i++)
- {
- // inputDecoder.Get() dequantizes the data element from whatever
- // type is given by inputInfo to fp32 (If MakeDecoder supports that dequantization)
- // outputEncoder.Set() transforms the data element to whatever type is
- // given by outputInfo (if MakeEncoder supports that transformation)
- outputEncoder.Set(inputDecoder.Get());
- ++outputEncoder;
- ++inputDecoder;
- }
-}
-
-} // armnn namespace \ No newline at end of file
diff --git a/src/backends/reference/workloads/Dequantize.hpp b/src/backends/reference/workloads/Dequantize.hpp
deleted file mode 100644
index c01b454833..0000000000
--- a/src/backends/reference/workloads/Dequantize.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/Tensor.hpp>
-#include "Encoders.hpp"
-#include "Decoders.hpp"
-
-namespace armnn
-{
-
-void Dequantize(Decoder<float>& inputDecoder,
- Encoder<float>& outputEncoder,
- const TensorInfo& inputInfo,
- const TensorInfo& outputInfo);
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/DetectionPostProcess.cpp b/src/backends/reference/workloads/DetectionPostProcess.cpp
deleted file mode 100644
index 96e57803a1..0000000000
--- a/src/backends/reference/workloads/DetectionPostProcess.cpp
+++ /dev/null
@@ -1,323 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "DetectionPostProcess.hpp"
-
-
-#include <boost/assert.hpp>
-#include <boost/numeric/conversion/cast.hpp>
-
-#include <algorithm>
-#include <numeric>
-
-namespace armnn
-{
-
-std::vector<unsigned int> GenerateRangeK(unsigned int k)
-{
- std::vector<unsigned int> range(k);
- std::iota(range.begin(), range.end(), 0);
- return range;
-}
-
-void TopKSort(unsigned int k, unsigned int* indices, const float* values, unsigned int numElement)
-{
- std::partial_sort(indices, indices + k, indices + numElement,
- [&values](unsigned int i, unsigned int j) { return values[i] > values[j]; });
-}
-
-float IntersectionOverUnion(const float* boxI, const float* boxJ)
-{
- // Box-corner format: ymin, xmin, ymax, xmax.
- const int yMin = 0;
- const int xMin = 1;
- const int yMax = 2;
- const int xMax = 3;
- float areaI = (boxI[yMax] - boxI[yMin]) * (boxI[xMax] - boxI[xMin]);
- float areaJ = (boxJ[yMax] - boxJ[yMin]) * (boxJ[xMax] - boxJ[xMin]);
- float yMinIntersection = std::max(boxI[yMin], boxJ[yMin]);
- float xMinIntersection = std::max(boxI[xMin], boxJ[xMin]);
- float yMaxIntersection = std::min(boxI[yMax], boxJ[yMax]);
- float xMaxIntersection = std::min(boxI[xMax], boxJ[xMax]);
- float areaIntersection = std::max(yMaxIntersection - yMinIntersection, 0.0f) *
- std::max(xMaxIntersection - xMinIntersection, 0.0f);
- float areaUnion = areaI + areaJ - areaIntersection;
- return areaIntersection / areaUnion;
-}
-
-std::vector<unsigned int> NonMaxSuppression(unsigned int numBoxes,
- const std::vector<float>& boxCorners,
- const std::vector<float>& scores,
- float nmsScoreThreshold,
- unsigned int maxDetection,
- float nmsIouThreshold)
-{
- // Select boxes that have scores above a given threshold.
- std::vector<float> scoresAboveThreshold;
- std::vector<unsigned int> indicesAboveThreshold;
- for (unsigned int i = 0; i < numBoxes; ++i)
- {
- if (scores[i] >= nmsScoreThreshold)
- {
- scoresAboveThreshold.push_back(scores[i]);
- indicesAboveThreshold.push_back(i);
- }
- }
-
- // Sort the indices based on scores.
- unsigned int numAboveThreshold = boost::numeric_cast<unsigned int>(scoresAboveThreshold.size());
- std::vector<unsigned int> sortedIndices = GenerateRangeK(numAboveThreshold);
- TopKSort(numAboveThreshold, sortedIndices.data(), scoresAboveThreshold.data(), numAboveThreshold);
-
- // Number of output cannot be more than max detections specified in the option.
- unsigned int numOutput = std::min(maxDetection, numAboveThreshold);
- std::vector<unsigned int> outputIndices;
- std::vector<bool> visited(numAboveThreshold, false);
-
- // Prune out the boxes with high intersection over union by keeping the box with higher score.
- for (unsigned int i = 0; i < numAboveThreshold; ++i)
- {
- if (outputIndices.size() >= numOutput)
- {
- break;
- }
- if (!visited[sortedIndices[i]])
- {
- outputIndices.push_back(indicesAboveThreshold[sortedIndices[i]]);
- }
- for (unsigned int j = i + 1; j < numAboveThreshold; ++j)
- {
- unsigned int iIndex = indicesAboveThreshold[sortedIndices[i]] * 4;
- unsigned int jIndex = indicesAboveThreshold[sortedIndices[j]] * 4;
- if (IntersectionOverUnion(&boxCorners[iIndex], &boxCorners[jIndex]) > nmsIouThreshold)
- {
- visited[sortedIndices[j]] = true;
- }
- }
- }
- return outputIndices;
-}
-
-void AllocateOutputData(unsigned int numOutput,
- unsigned int numSelected,
- const std::vector<float>& boxCorners,
- const std::vector<unsigned int>& outputIndices,
- const std::vector<unsigned int>& selectedBoxes,
- const std::vector<unsigned int>& selectedClasses,
- const std::vector<float>& selectedScores,
- float* detectionBoxes,
- float* detectionScores,
- float* detectionClasses,
- float* numDetections)
-{
- for (unsigned int i = 0; i < numOutput; ++i)
- {
- unsigned int boxIndex = i * 4;
- if (i < numSelected)
- {
- unsigned int boxCornorIndex = selectedBoxes[outputIndices[i]] * 4;
- detectionScores[i] = selectedScores[outputIndices[i]];
- detectionClasses[i] = boost::numeric_cast<float>(selectedClasses[outputIndices[i]]);
- detectionBoxes[boxIndex] = boxCorners[boxCornorIndex];
- detectionBoxes[boxIndex + 1] = boxCorners[boxCornorIndex + 1];
- detectionBoxes[boxIndex + 2] = boxCorners[boxCornorIndex + 2];
- detectionBoxes[boxIndex + 3] = boxCorners[boxCornorIndex + 3];
- }
- else
- {
- detectionScores[i] = 0.0f;
- detectionClasses[i] = 0.0f;
- detectionBoxes[boxIndex] = 0.0f;
- detectionBoxes[boxIndex + 1] = 0.0f;
- detectionBoxes[boxIndex + 2] = 0.0f;
- detectionBoxes[boxIndex + 3] = 0.0f;
- }
- }
- numDetections[0] = boost::numeric_cast<float>(numSelected);
-}
-
-void DetectionPostProcess(const TensorInfo& boxEncodingsInfo,
- const TensorInfo& scoresInfo,
- const TensorInfo& anchorsInfo,
- const TensorInfo& detectionBoxesInfo,
- const TensorInfo& detectionClassesInfo,
- const TensorInfo& detectionScoresInfo,
- const TensorInfo& numDetectionsInfo,
- const DetectionPostProcessDescriptor& desc,
- Decoder<float>& boxEncodings,
- Decoder<float>& scores,
- Decoder<float>& anchors,
- float* detectionBoxes,
- float* detectionClasses,
- float* detectionScores,
- float* numDetections)
-{
- boost::ignore_unused(anchorsInfo, detectionClassesInfo, detectionScoresInfo, numDetectionsInfo);
-
- // Transform center-size format which is (ycenter, xcenter, height, width) to box-corner format,
- // which represents the lower left corner and the upper right corner (ymin, xmin, ymax, xmax)
- std::vector<float> boxCorners(boxEncodingsInfo.GetNumElements());
-
- const unsigned int numBoxes = boxEncodingsInfo.GetShape()[1];
- const unsigned int numScores = scoresInfo.GetNumElements();
-
- for (unsigned int i = 0; i < numBoxes; ++i)
- {
- // Y
- float boxEncodingY = boxEncodings.Get();
- float anchorY = anchors.Get();
-
- ++boxEncodings;
- ++anchors;
-
- // X
- float boxEncodingX = boxEncodings.Get();
- float anchorX = anchors.Get();
-
- ++boxEncodings;
- ++anchors;
-
- // H
- float boxEncodingH = boxEncodings.Get();
- float anchorH = anchors.Get();
-
- ++boxEncodings;
- ++anchors;
-
- // W
- float boxEncodingW = boxEncodings.Get();
- float anchorW = anchors.Get();
-
- ++boxEncodings;
- ++anchors;
-
- float yCentre = boxEncodingY / desc.m_ScaleY * anchorH + anchorY;
- float xCentre = boxEncodingX / desc.m_ScaleX * anchorW + anchorX;
-
- float halfH = 0.5f * expf(boxEncodingH / desc.m_ScaleH) * anchorH;
- float halfW = 0.5f * expf(boxEncodingW / desc.m_ScaleW) * anchorW;
-
- unsigned int indexY = i * 4;
- unsigned int indexX = indexY + 1;
- unsigned int indexH = indexX + 1;
- unsigned int indexW = indexH + 1;
-
- // ymin
- boxCorners[indexY] = yCentre - halfH;
- // xmin
- boxCorners[indexX] = xCentre - halfW;
- // ymax
- boxCorners[indexH] = yCentre + halfH;
- // xmax
- boxCorners[indexW] = xCentre + halfW;
-
- BOOST_ASSERT(boxCorners[indexY] < boxCorners[indexH]);
- BOOST_ASSERT(boxCorners[indexX] < boxCorners[indexW]);
- }
-
- unsigned int numClassesWithBg = desc.m_NumClasses + 1;
-
- // Decode scores
- std::vector<float> decodedScores;
- decodedScores.reserve(numScores);
-
- for (unsigned int i = 0u; i < numScores; ++i)
- {
- decodedScores.emplace_back(scores.Get());
- ++scores;
- }
-
- // Perform Non Max Suppression.
- if (desc.m_UseRegularNms)
- {
- // Perform Regular NMS.
- // For each class, perform NMS and select max detection numbers of the highest score across all classes.
- std::vector<float> classScores(numBoxes);
-
- std::vector<unsigned int> selectedBoxesAfterNms;
- selectedBoxesAfterNms.reserve(numBoxes);
-
- std::vector<float> selectedScoresAfterNms;
- selectedBoxesAfterNms.reserve(numScores);
-
- std::vector<unsigned int> selectedClasses;
-
- for (unsigned int c = 0; c < desc.m_NumClasses; ++c)
- {
- // For each boxes, get scores of the boxes for the class c.
- for (unsigned int i = 0; i < numBoxes; ++i)
- {
- classScores[i] = decodedScores[i * numClassesWithBg + c + 1];
- }
- std::vector<unsigned int> selectedIndices = NonMaxSuppression(numBoxes,
- boxCorners,
- classScores,
- desc.m_NmsScoreThreshold,
- desc.m_DetectionsPerClass,
- desc.m_NmsIouThreshold);
-
- for (unsigned int i = 0; i < selectedIndices.size(); ++i)
- {
- selectedBoxesAfterNms.push_back(selectedIndices[i]);
- selectedScoresAfterNms.push_back(classScores[selectedIndices[i]]);
- selectedClasses.push_back(c);
- }
- }
-
- // Select max detection numbers of the highest score across all classes
- unsigned int numSelected = boost::numeric_cast<unsigned int>(selectedBoxesAfterNms.size());
- unsigned int numOutput = std::min(desc.m_MaxDetections, numSelected);
-
- // Sort the max scores among the selected indices.
- std::vector<unsigned int> outputIndices = GenerateRangeK(numSelected);
- TopKSort(numOutput, outputIndices.data(), selectedScoresAfterNms.data(), numSelected);
-
- AllocateOutputData(detectionBoxesInfo.GetShape()[1], numOutput, boxCorners, outputIndices,
- selectedBoxesAfterNms, selectedClasses, selectedScoresAfterNms,
- detectionBoxes, detectionScores, detectionClasses, numDetections);
- }
- else
- {
- // Perform Fast NMS.
- // Select max scores of boxes and perform NMS on max scores,
- // select max detection numbers of the highest score
- unsigned int numClassesPerBox = std::min(desc.m_MaxClassesPerDetection, desc.m_NumClasses);
- std::vector<float> maxScores;
- std::vector<unsigned int>boxIndices;
- std::vector<unsigned int>maxScoreClasses;
-
- for (unsigned int box = 0; box < numBoxes; ++box)
- {
- unsigned int scoreIndex = box * numClassesWithBg + 1;
-
- // Get the max scores of the box.
- std::vector<unsigned int> maxScoreIndices = GenerateRangeK(desc.m_NumClasses);
- TopKSort(numClassesPerBox, maxScoreIndices.data(),
- decodedScores.data() + scoreIndex, desc.m_NumClasses);
-
- for (unsigned int i = 0; i < numClassesPerBox; ++i)
- {
- maxScores.push_back(decodedScores[scoreIndex + maxScoreIndices[i]]);
- maxScoreClasses.push_back(maxScoreIndices[i]);
- boxIndices.push_back(box);
- }
- }
-
- // Perform NMS on max scores
- std::vector<unsigned int> selectedIndices = NonMaxSuppression(numBoxes, boxCorners, maxScores,
- desc.m_NmsScoreThreshold,
- desc.m_MaxDetections,
- desc.m_NmsIouThreshold);
-
- unsigned int numSelected = boost::numeric_cast<unsigned int>(selectedIndices.size());
- unsigned int numOutput = std::min(desc.m_MaxDetections, numSelected);
-
- AllocateOutputData(detectionBoxesInfo.GetShape()[1], numOutput, boxCorners, selectedIndices,
- boxIndices, maxScoreClasses, maxScores,
- detectionBoxes, detectionScores, detectionClasses, numDetections);
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/DetectionPostProcess.hpp b/src/backends/reference/workloads/DetectionPostProcess.hpp
deleted file mode 100644
index 8700a53317..0000000000
--- a/src/backends/reference/workloads/DetectionPostProcess.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include "armnn/Tensor.hpp"
-#include "armnn/Descriptors.hpp"
-
-#include "Decoders.hpp"
-
-#include <vector>
-
-namespace armnn
-{
-
-void DetectionPostProcess(const TensorInfo& boxEncodingsInfo,
- const TensorInfo& scoresInfo,
- const TensorInfo& anchorsInfo,
- const TensorInfo& detectionBoxesInfo,
- const TensorInfo& detectionClassesInfo,
- const TensorInfo& detectionScoresInfo,
- const TensorInfo& numDetectionsInfo,
- const DetectionPostProcessDescriptor& desc,
- Decoder<float>& boxEncodings,
- Decoder<float>& scores,
- Decoder<float>& anchors,
- float* detectionBoxes,
- float* detectionClasses,
- float* detectionScores,
- float* numDetections);
-
-void TopKSort(unsigned int k,
- unsigned int* indices,
- const float* values,
- unsigned int numElement);
-
-float IntersectionOverUnion(const float* boxI, const float* boxJ);
-
-std::vector<unsigned int> NonMaxSuppression(unsigned int numBoxes,
- const std::vector<float>& boxCorners,
- const std::vector<float>& scores,
- float nmsScoreThreshold,
- unsigned int maxDetection,
- float nmsIouThreshold);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/ElementwiseFunction.cpp b/src/backends/reference/workloads/ElementwiseFunction.cpp
deleted file mode 100644
index 5687cf5861..0000000000
--- a/src/backends/reference/workloads/ElementwiseFunction.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "ElementwiseFunction.hpp"
-#include "Broadcast.hpp"
-#include <functional>
-#include "Minimum.hpp"
-#include "Maximum.hpp"
-#include "Abs.hpp"
-#include "Exp.hpp"
-#include "Rsqrt.hpp"
-#include "Sqrt.hpp"
-
-
-namespace armnn
-{
-
-template <typename Functor>
-ElementwiseBinaryFunction<Functor>::ElementwiseBinaryFunction(const TensorShape& inShape0,
- const TensorShape& inShape1,
- const TensorShape& outShape,
- Decoder<InType>& inData0,
- Decoder<InType>& inData1,
- Encoder<OutType>& outData)
-{
- BroadcastLoop(inShape0, inShape1, outShape).Unroll(Functor(), 0, inData0, inData1, outData);
-}
-
-template <typename Functor>
-ElementwiseUnaryFunction<Functor>::ElementwiseUnaryFunction(const TensorShape& inShape,
- const TensorShape& outShape,
- Decoder<InType>& inData,
- Encoder<OutType>& outData)
-{
- BroadcastLoop(inShape, outShape).Unroll(Functor(), 0, inData, outData);
-}
-
-} //namespace armnn
-
-template struct armnn::ElementwiseBinaryFunction<std::plus<float>>;
-template struct armnn::ElementwiseBinaryFunction<std::minus<float>>;
-template struct armnn::ElementwiseBinaryFunction<std::multiplies<float>>;
-template struct armnn::ElementwiseBinaryFunction<std::divides<float>>;
-template struct armnn::ElementwiseBinaryFunction<armnn::maximum<float>>;
-template struct armnn::ElementwiseBinaryFunction<armnn::minimum<float>>;
-
-// Comparison
-template struct armnn::ElementwiseBinaryFunction<std::equal_to<float>>;
-template struct armnn::ElementwiseBinaryFunction<std::greater<float>>;
-template struct armnn::ElementwiseBinaryFunction<std::greater_equal<float>>;
-template struct armnn::ElementwiseBinaryFunction<std::less<float>>;
-template struct armnn::ElementwiseBinaryFunction<std::less_equal<float>>;
-template struct armnn::ElementwiseBinaryFunction<std::not_equal_to<float>>;
-
-// Unary
-template struct armnn::ElementwiseUnaryFunction<armnn::abs<float>>;
-template struct armnn::ElementwiseUnaryFunction<armnn::exp<float>>;
-template struct armnn::ElementwiseUnaryFunction<std::negate<float>>;
-template struct armnn::ElementwiseUnaryFunction<armnn::rsqrt<float>>;
-template struct armnn::ElementwiseUnaryFunction<armnn::sqrt<float>>;
diff --git a/src/backends/reference/workloads/ElementwiseFunction.hpp b/src/backends/reference/workloads/ElementwiseFunction.hpp
deleted file mode 100644
index 8259ba5ac7..0000000000
--- a/src/backends/reference/workloads/ElementwiseFunction.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-#include <armnn/Tensor.hpp>
-
-namespace armnn
-{
-
-template <typename Functor>
-struct ElementwiseBinaryFunction
-{
- using OutType = typename Functor::result_type;
- using InType = typename Functor::first_argument_type;
-
- ElementwiseBinaryFunction(const TensorShape& inShape0,
- const TensorShape& inShape1,
- const TensorShape& outShape,
- Decoder<InType>& inData0,
- Decoder<InType>& inData1,
- Encoder<OutType>& outData);
-};
-
-template <typename Functor>
-struct ElementwiseUnaryFunction
-{
- using OutType = typename Functor::result_type;
- using InType = typename Functor::argument_type;
-
- ElementwiseUnaryFunction(const TensorShape& inShape,
- const TensorShape& outShape,
- Decoder<InType>& inData,
- Encoder<OutType>& outData);
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Encoders.hpp b/src/backends/reference/workloads/Encoders.hpp
deleted file mode 100644
index f52297602f..0000000000
--- a/src/backends/reference/workloads/Encoders.hpp
+++ /dev/null
@@ -1,113 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-
-#include <armnnUtils/TensorUtils.hpp>
-
-#include <boost/assert.hpp>
-
-namespace armnn
-{
-
-template<typename T>
-inline std::unique_ptr<Encoder<T>> MakeEncoder(const TensorInfo& info, void* data = nullptr);
-
-template<>
-inline std::unique_ptr<Encoder<float>> MakeEncoder(const TensorInfo& info, void* data)
-{
- switch(info.GetDataType())
- {
- ARMNN_NO_DEPRECATE_WARN_BEGIN
- case armnn::DataType::QuantizedSymm8PerAxis:
- {
- std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
- return std::make_unique<QSymm8PerAxisEncoder>(
- static_cast<int8_t*>(data),
- params.second,
- params.first);
- }
- ARMNN_NO_DEPRECATE_WARN_END
- case armnn::DataType::QAsymmS8:
- {
- return std::make_unique<QASymmS8Encoder>(
- static_cast<int8_t*>(data),
- info.GetQuantizationScale(),
- info.GetQuantizationOffset());
- }
- case armnn::DataType::QAsymmU8:
- {
- return std::make_unique<QASymm8Encoder>(
- static_cast<uint8_t*>(data),
- info.GetQuantizationScale(),
- info.GetQuantizationOffset());
- }
- case DataType::QSymmS8:
- {
- if (info.HasPerAxisQuantization())
- {
- std::pair<unsigned int, std::vector<float>> params = armnnUtils::GetPerAxisParams(info);
- return std::make_unique<QSymm8PerAxisEncoder>(
- static_cast<int8_t*>(data),
- params.second,
- params.first);
- }
- else
- {
- return std::make_unique<QSymmS8Encoder>(
- static_cast<int8_t*>(data),
- info.GetQuantizationScale(),
- info.GetQuantizationOffset());
- }
- }
- case armnn::DataType::QSymmS16:
- {
- return std::make_unique<QSymm16Encoder>(
- static_cast<int16_t*>(data),
- info.GetQuantizationScale(),
- info.GetQuantizationOffset());
- }
- case armnn::DataType::Signed32:
- {
- return std::make_unique<Int32Encoder>(static_cast<int32_t*>(data));
- }
- case armnn::DataType::Float16:
- {
- return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
- }
- case armnn::DataType::Float32:
- {
- return std::make_unique<Float32Encoder>(static_cast<float*>(data));
- }
- default:
- {
- BOOST_ASSERT_MSG(false, "Unsupported target Data Type!");
- break;
- }
- }
- return nullptr;
-}
-
-template<>
-inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
-{
- switch(info.GetDataType())
- {
- case armnn::DataType::Boolean:
- {
- return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
- }
- default:
- {
- BOOST_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
- break;
- }
- }
- return nullptr;
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Exp.hpp b/src/backends/reference/workloads/Exp.hpp
deleted file mode 100644
index 1a046728ba..0000000000
--- a/src/backends/reference/workloads/Exp.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <iostream>
-
-namespace armnn
-{
- template<typename T>
-struct exp : public std::unary_function<T, T>
- {
- T
- operator () (const T& inputData) const
- {
- return std::exp(inputData);
- }
- };
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/FullyConnected.cpp b/src/backends/reference/workloads/FullyConnected.cpp
deleted file mode 100644
index 02d9b060ef..0000000000
--- a/src/backends/reference/workloads/FullyConnected.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "FullyConnected.hpp"
-
-#include "RefWorkloadUtils.hpp"
-
-#include <boost/assert.hpp>
-
-namespace armnn
-{
-
-void FullyConnected(const TensorShape& rInputShape,
- Decoder<float>& rInputDecoder,
- const TensorShape& rOutputShape,
- Encoder<float>& rOutputEncoder,
- Decoder<float>& rWeightDecoder,
- Decoder<float>& rBiasDecoder,
- const bool biasEnabled,
- const unsigned int K,
- const bool transposeWeights)
-{
- // Perform FullyConnected implementation
- unsigned int outputSize = rOutputShape[1];
-
- for (unsigned int n = 0; n < rInputShape[0]; n++)
- {
- for (unsigned int channelOutput = 0; channelOutput < outputSize; channelOutput++)
- {
- float outval = 0.f;
-
- for (unsigned int channelInput = 0; channelInput < K; channelInput++)
- {
- float weight;
- if (transposeWeights)
- {
- rWeightDecoder[channelOutput * K + channelInput];
- weight = rWeightDecoder.Get();
- }
- else
- {
- rWeightDecoder[channelInput * outputSize + channelOutput];
- weight = rWeightDecoder.Get();
- }
-
- rInputDecoder[n * K + channelInput];
- outval += weight * rInputDecoder.Get();
- }
-
- if (biasEnabled)
- {
- rBiasDecoder[channelOutput];
- outval += rBiasDecoder.Get();
- }
-
- rOutputEncoder[n * outputSize + channelOutput];
- rOutputEncoder.Set(outval);
- }
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/FullyConnected.hpp b/src/backends/reference/workloads/FullyConnected.hpp
deleted file mode 100644
index 78fa055086..0000000000
--- a/src/backends/reference/workloads/FullyConnected.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-#include <armnn/Tensor.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-/// Performs a matrix multiplication and optionally adds a bias.
-void FullyConnected(const TensorShape& rInputShape,
- Decoder<float>& rInputDecoder,
- const TensorShape& rOutputShape,
- Encoder<float>& rOutputEncoder,
- Decoder<float>& rWeightDecoder,
- Decoder<float>& rBiasDecoder,
- bool biasEnabled,
- unsigned int K,
- bool transposeWeights);
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Gather.cpp b/src/backends/reference/workloads/Gather.cpp
deleted file mode 100644
index 5416855f48..0000000000
--- a/src/backends/reference/workloads/Gather.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Gather.hpp"
-
-#include "RefWorkloadUtils.hpp"
-
-#include <backendsCommon/WorkloadData.hpp>
-
-#include <boost/core/ignore_unused.hpp>
-#include <boost/numeric/conversion/cast.hpp>
-
-namespace armnn
-{
-
-void Gather(const TensorInfo& paramsInfo,
- const TensorInfo& indicesInfo,
- const TensorInfo& outputInfo,
- Decoder<float>& params,
- const int32_t* indices,
- Encoder<float>& output)
-{
- boost::ignore_unused(outputInfo);
- const TensorShape& paramsShape = paramsInfo.GetShape();
-
- unsigned int paramsProduct = 1;
- for (unsigned int i = 1; i < paramsInfo.GetNumDimensions(); ++i)
- {
- paramsProduct = paramsProduct * paramsShape[i];
- }
-
- unsigned int outIndex = 0;
- for (unsigned int i = 0; i < indicesInfo.GetNumElements(); ++i)
- {
- unsigned int indx = boost::numeric_cast<unsigned int>(indices[i]);
-
- BOOST_ASSERT(indices[i] >= 0 && indx < paramsShape[0]);
-
- unsigned int startOffset = indx * paramsProduct;
- unsigned int endOffset = startOffset + paramsProduct;
-
- for (unsigned int j = startOffset; j < endOffset; ++j)
- {
- params[j];
- float outputValue = params.Get();
- output[outIndex];
- output.Set(outputValue);
- ++outIndex;
- }
- }
-
- BOOST_ASSERT(outIndex == outputInfo.GetNumElements());
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Gather.hpp b/src/backends/reference/workloads/Gather.hpp
deleted file mode 100644
index 16c983eec4..0000000000
--- a/src/backends/reference/workloads/Gather.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "armnn/Tensor.hpp"
-
-#include "BaseIterator.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn
-{
-
-void Gather(const TensorInfo& paramsInfo,
- const TensorInfo& indicesInfo,
- const TensorInfo& outputInfo,
- Decoder<float>& params,
- const int32_t* indices,
- Encoder<float>& output);
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/InstanceNorm.cpp b/src/backends/reference/workloads/InstanceNorm.cpp
deleted file mode 100644
index 08c555f0e8..0000000000
--- a/src/backends/reference/workloads/InstanceNorm.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "InstanceNorm.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include <armnn/Tensor.hpp>
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-#include <cmath>
-
-namespace armnn
-{
-
-void InstanceNorm(const InstanceNormalizationQueueDescriptor& data,
- Decoder<float>& inputDecoder,
- Encoder<float>& outputEncoder)
-{
- const TensorInfo& inputInfo = GetTensorInfo(data.m_Inputs[0]);
- const TensorShape inputShape = inputInfo.GetShape();
-
- armnnUtils::DataLayoutIndexed dataLayout(data.m_Parameters.m_DataLayout);
-
- unsigned int inputBatches = inputShape[0];
- unsigned int inputHeight = inputShape[dataLayout.GetHeightIndex()];
- unsigned int inputWidth = inputShape[dataLayout.GetWidthIndex()];
- unsigned int inputChannels = inputShape[dataLayout.GetChannelsIndex()];
-
- float beta = data.m_Parameters.m_Beta;
- float eps = data.m_Parameters.m_Eps;
- float gamma = data.m_Parameters.m_Gamma;
-
- for (unsigned int n = 0; n < inputBatches; ++n)
- {
- for (unsigned int c = 0; c < inputChannels; ++c)
- {
- float mean = 0, var = 0;
-
- //Calculate Mean
- for (unsigned int h = 0; h < inputHeight; h++)
- {
- for (unsigned int w = 0; w < inputWidth; w++)
- {
- unsigned int index = dataLayout.GetIndex(inputShape, n, c, h, w);
-
- inputDecoder[index];
- float value = inputDecoder.Get();
- mean += value;
- }
- }
- mean /= static_cast<float>(inputHeight * inputWidth);
-
- //Calculate Variance
- for (unsigned int h = 0; h < inputHeight; h++)
- {
- for (unsigned int w = 0; w < inputWidth; w++)
- {
- unsigned int index = dataLayout.GetIndex(inputShape, n, c, h, w);
-
- inputDecoder[index];
- float value = inputDecoder.Get();
- var += (value - mean) * (value - mean);
- }
- }
- var /= static_cast<float>(inputHeight * inputWidth);
-
- // Apply Instance Normalisation
- for (unsigned int h = 0; h < inputHeight; ++h)
- {
- for (unsigned int w = 0; w < inputWidth; ++w)
- {
- unsigned int index = dataLayout.GetIndex(inputShape, n, c, h, w);
- inputDecoder[index];
- outputEncoder[index];
- outputEncoder.Set((inputDecoder.Get() - mean) * gamma / std::sqrt ( var + eps) + beta);
- }
-
- }
- }
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/InstanceNorm.hpp b/src/backends/reference/workloads/InstanceNorm.hpp
deleted file mode 100644
index d73b4cd115..0000000000
--- a/src/backends/reference/workloads/InstanceNorm.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "Encoders.hpp"
-#include "Decoders.hpp"
-
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-void InstanceNorm(const InstanceNormalizationQueueDescriptor& data,
- Decoder<float>& inputData,
- Encoder<float>& outputData);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/LogSoftmax.cpp b/src/backends/reference/workloads/LogSoftmax.cpp
deleted file mode 100644
index ddf5674fb8..0000000000
--- a/src/backends/reference/workloads/LogSoftmax.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "LogSoftmax.hpp"
-
-#include <armnnUtils/TensorUtils.hpp>
-
-#include <cmath>
-
-#include <boost/assert.hpp>
-#include <boost/core/ignore_unused.hpp>
-#include <boost/numeric/conversion/cast.hpp>
-
-namespace
-{
-
-inline bool ValidateAxis(int axis, unsigned int numDimensions)
-{
- const int sNumDimensions = boost::numeric_cast<int>(numDimensions);
- return axis < sNumDimensions && axis >= -sNumDimensions;
-}
-
-} // anonymous namespace
-
-namespace armnn
-{
-
-void LogSoftmax(Decoder<float>& input,
- Encoder<float>& output,
- const TensorInfo& inputInfo,
- const LogSoftmaxDescriptor& descriptor)
-{
- const unsigned int numDimensions = inputInfo.GetNumDimensions();
-
- bool axisIsValid = ValidateAxis(descriptor.m_Axis, numDimensions);
- BOOST_ASSERT_MSG(axisIsValid,
- "Axis index is not in range [-numDimensions, numDimensions).");
- boost::ignore_unused(axisIsValid);
-
- unsigned int uAxis = descriptor.m_Axis < 0 ?
- numDimensions - boost::numeric_cast<unsigned int>(std::abs(descriptor.m_Axis)) :
- boost::numeric_cast<unsigned int>(descriptor.m_Axis);
-
- const TensorShape& inputShape = inputInfo.GetShape();
- const unsigned int outerSize = armnnUtils::GetNumElementsBetween(inputShape, 0, uAxis);
- const unsigned int axisSize = inputShape[uAxis];
- const unsigned int innerSize = armnnUtils::GetNumElementsBetween(inputShape,
- uAxis + 1,
- inputShape.GetNumDimensions());
-
- for (unsigned int outer = 0; outer < outerSize; ++outer)
- {
- for (unsigned int inner = 0; inner < innerSize; ++inner)
- {
- // Find max
- input[outer * axisSize * innerSize + inner];
- float maxValue = input.Get();
- for (unsigned int i = 1u; i < axisSize; ++i)
- {
- input[(outer * axisSize + i) * innerSize + inner];
- maxValue = std::max(maxValue, input.Get());
- }
-
- // Compute sum
- float sum = 0.0f;
- for (unsigned int i = 0u; i < axisSize; ++i)
- {
- input[(outer * axisSize + i) * innerSize + inner];
- sum += std::exp((input.Get() - maxValue) * descriptor.m_Beta);
- }
-
- // Compute log sum
- const float logSum = std::log(sum);
-
- // Compute result
- for (unsigned int i = 0u; i < axisSize; ++i)
- {
- const unsigned int index = (outer * axisSize + i) * innerSize + inner;
-
- input [index];
- output[index];
-
- output.Set((input.Get() - maxValue) * descriptor.m_Beta - logSum);
- }
- }
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/LogSoftmax.hpp b/src/backends/reference/workloads/LogSoftmax.hpp
deleted file mode 100644
index 6d46cb9a24..0000000000
--- a/src/backends/reference/workloads/LogSoftmax.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/Descriptors.hpp>
-#include <armnn/Tensor.hpp>
-
-#include "BaseIterator.hpp"
-
-namespace armnn
-{
-
-void LogSoftmax(Decoder<float>& input,
- Encoder<float>& output,
- const TensorInfo& inputInfo,
- const LogSoftmaxDescriptor& descriptor);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/LstmUtils.cpp b/src/backends/reference/workloads/LstmUtils.cpp
deleted file mode 100644
index f197aae291..0000000000
--- a/src/backends/reference/workloads/LstmUtils.cpp
+++ /dev/null
@@ -1,307 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-//#pragma once
-
-#include "LstmUtils.hpp"
-#include "BaseIterator.hpp"
-#include <backendsCommon/CpuTensorHandle.hpp>
-
-
-// Helper functions ported from the Android code base
-// Refer to: android/external/tensorflow/tensorflow/contrib/lite/kernels/internal/reference/portable_tensor_utils.cc
-
-void VectorBatchVectorAdd(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Decoder<float>& batchVector,
- uint32_t nBatch,
- armnn::Encoder<float>& outResult )
-{
- for (uint32_t b = 0; b < nBatch; b++)
- {
- for (uint32_t v = 0; v < vSize; v++)
- {
- outResult.Set(batchVector.Get() + vector.Get());
- ++outResult;
- ++vector;
- ++batchVector;
- }
- vector -= vSize;
- }
- batchVector -= vSize * nBatch;
- outResult -= vSize * nBatch;
-}
-
-
-// Layer norm for each batch.
-// normalization_epsilon is added to avoid divergence.
-void MeanStddevNormalization(armnn::Decoder<float>& input_vector,
- armnn::Encoder<float>& output_vector,
- uint32_t v_size,
- uint32_t n_batch,
- float normalization_epsilon)
-{
- for (uint32_t batch = 0; batch < n_batch; ++batch) {
- float sum = 0.0f;
- float sum_sq = 0.0f;
- for (uint32_t i = 0; i < v_size; ++i) {
- sum += input_vector.Get();
- sum_sq += input_vector.Get() * input_vector.Get();
- ++input_vector;
- }
- input_vector -= v_size;
-
- const float mean = sum / static_cast<float>(v_size);
- float stddev_inv = 0.0f;
- const float variance = sum_sq / static_cast<float>(v_size) - mean * mean;
- if (variance == 0) {
- stddev_inv = 1.0f / std::sqrt(normalization_epsilon);
- } else {
- stddev_inv = 1.0f / std::sqrt(variance);
- }
-
- for (uint32_t i = 0; i < v_size; ++i) {
- output_vector.Set((input_vector.Get() - mean) * stddev_inv);
- ++output_vector;
- ++input_vector;
- }
- // Don't reset iterator to handle next batch
- }
- output_vector -= v_size * n_batch;
- input_vector -= v_size * n_batch;
-}
-
-void ZeroVector(armnn::Encoder<float>& vector,
- uint32_t vSize)
-{
- for (uint32_t v = 0; v < vSize; v++)
- {
- vector.Set(0.0f);
- ++vector;
- }
- vector -= vSize;
-}
-
-void MatrixBatchVectorMultiplyAccumulate(armnn::Decoder<float>& matrix,
- uint32_t mRows,
- uint32_t mCols,
- armnn::Decoder<float>& vector,
- uint32_t nBatch,
- armnn::Encoder<float>& outResult)
-{
- for (uint32_t b = 0; b < nBatch; b++)
- {
- for (uint32_t r = 0; r < mRows; r++)
- {
- vector += b * mCols;
- for (uint32_t c = 0; c < mCols; c++)
- {
- outResult.Set(outResult.Get() + matrix.Get() * vector.Get());
- ++matrix;
- ++vector;
- }
- outResult += 1;
- vector -= (b+1) * mCols;
- }
- matrix -= (mRows * mCols);
- }
- outResult -= (mRows * nBatch);
-}
-
-void VectorBatchVectorAssign(armnn::Decoder<float>& vector,
- uint32_t vSize,
- uint32_t nBatch,
- armnn::Encoder<float>& outBatchVector)
-{
- for (uint32_t b = 0; b < nBatch; b++)
- {
- for (uint32_t v = 0; v < vSize; v++)
- {
- outBatchVector.Set(vector.Get());
- ++outBatchVector;
- ++vector;
- }
- vector -= vSize;
- }
- outBatchVector -= (nBatch * vSize);
-}
-
-void VectorBatchVectorCwiseProductAccumulate(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Decoder<float>& batchVector,
- uint32_t nBatch,
- armnn::Encoder<float>& outResult)
-{
- for (uint32_t b = 0; b < nBatch; b++)
- {
- for (uint32_t v = 0; v < vSize; v++)
- {
- outResult.Set(outResult.Get() + vector.Get() * batchVector.Get());
- ++outResult;
- ++vector;
- ++batchVector;
- }
- vector -= vSize;
- }
- batchVector -= vSize * nBatch;
- outResult -= vSize * nBatch;
-}
-
-void VectorBatchVectorCwiseProduct(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Decoder<float>& batchVector,
- uint32_t nBatch,
- armnn::Encoder<float>& outResult)
-{
- for (uint32_t b = 0; b < nBatch; b++)
- {
- for (uint32_t v = 0; v < vSize; v++)
- {
- outResult.Set(vector.Get() * batchVector.Get());
- ++outResult;
- ++vector;
- ++batchVector;
- }
- vector -= vSize;
- }
- batchVector -= vSize * nBatch;
- outResult -= vSize * nBatch;
-}
-
-void Sub1Vector(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Encoder<float>& result)
-{
- for (uint32_t v = 0; v < vSize; v++)
- {
- result.Set(1.0f - vector.Get());
- ++vector;
- ++result;
- }
- vector -= vSize;
- result -= vSize;
-}
-
-void VectorVectorCwiseProduct(armnn::Decoder<float>& vector1,
- armnn::Decoder<float>& vector2,
- uint32_t vSize,
- armnn::Encoder<float>& outResult)
-{
- for (uint32_t v = 0; v < vSize; v++)
- {
- outResult.Set(vector1.Get() * vector2.Get());
- ++outResult;
- ++vector1;
- ++vector2;
- }
- outResult -= vSize;
- vector1 -= vSize;
- vector2 -= vSize;
-}
-
-void VectorVectorCwiseProductAccumulate(armnn::Decoder<float>& vector1,
- armnn::Decoder<float>& vector2,
- uint32_t vSize,
- armnn::Encoder<float>& outResult)
-{
- for (uint32_t v = 0; v < vSize; v++)
- {
- outResult.Set(outResult.Get() + vector1.Get() * vector2.Get());
- ++outResult;
- ++vector1;
- ++vector2;
- }
- outResult -= vSize;
- vector1 -= vSize;
- vector2 -= vSize;
-}
-
-float Clip(float f,
- float absLimit)
-{
- float result = (absLimit < f) ? absLimit : f;
- result = (-absLimit > result) ? -absLimit : result;
- return result;
-}
-
-void ClipVector(armnn::Decoder<float>& vector,
- uint32_t vSize,
- float absLimit,
- armnn::Encoder<float>& outResult)
-{
- for (uint32_t v = 0; v < vSize; v++)
- {
- outResult.Set(Clip(vector.Get(), absLimit));
- ++vector;
- ++outResult;
- }
- vector -= vSize;
- outResult -= vSize;
-}
-
-void CopyVector(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Encoder<float>& outResult)
-{
- for (uint32_t v = 0; v < vSize; v++)
- {
- outResult.Set(vector.Get());
- ++outResult;
- ++vector;
- }
- outResult -= vSize;
- vector -= vSize;
-}
-
-void SetActivationParameters(uint32_t activation,
- armnn::ActivationFunction& outArmnnActivation,
- float& outA,
- float& outB)
-{
- switch (activation)
- {
- case 0: // None
- outA = 0;
- outB = 0;
- return;
-
- case 1: // Relu
- outArmnnActivation = armnn::ActivationFunction::ReLu;
- outA = 0;
- outB = 0;
- return;
-
- case 3: // Relu6
- outArmnnActivation = armnn::ActivationFunction::BoundedReLu;
- outA = 6;
- outB = 0;
- return;
-
- case 4: // Tanh
- outArmnnActivation = armnn::ActivationFunction::TanH;
- outA = 1;
- outB = 1;
- return;
-
- case 6: // Sigmoid
- outArmnnActivation = armnn::ActivationFunction::Sigmoid;
- outA = 0;
- outB = 0;
- return;
-
- default:
- throw armnn::Exception("Unsupported activation function: " + std::to_string(activation));
- }
-}
-
-std::unique_ptr<armnn::ScopedCpuTensorHandle> AssignScopedCpuTensorHandle(const armnn::ConstCpuTensorHandle* ptr)
-{
- if (!ptr)
- {
- return nullptr;
- }
-
- return std::make_unique<armnn::ScopedCpuTensorHandle>(*ptr);
-}
diff --git a/src/backends/reference/workloads/LstmUtils.hpp b/src/backends/reference/workloads/LstmUtils.hpp
deleted file mode 100644
index f6aff8b69f..0000000000
--- a/src/backends/reference/workloads/LstmUtils.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-#include <backendsCommon/CpuTensorHandle.hpp>
-
-// Helper functions ported from the Android code base
-// Refer to: android/external/tensorflow/tensorflow/contrib/lite/kernels/internal/reference/portable_tensor_utils.cc
-
-
-void VectorBatchVectorAdd(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Decoder<float>& batchVector,
- uint32_t nBatch,
- armnn::Encoder<float>& outResult );
-
-// Layer norm for each batch.
-// normalization_epsilon is added to avoid divergence.
-void MeanStddevNormalization(armnn::Decoder<float>& input_vector,
- armnn::Encoder<float>& output_vector,
- uint32_t v_size,
- uint32_t n_batch,
- float normalization_epsilon);
-
-void ZeroVector(armnn::Encoder<float>& vector,
- uint32_t vSize);
-
-void MatrixBatchVectorMultiplyAccumulate(armnn::Decoder<float>& matrix,
- uint32_t mRows,
- uint32_t mCols,
- armnn::Decoder<float>& vector,
- uint32_t nBatch,
- armnn::Encoder<float>& outResult);
-
-void VectorBatchVectorAssign(armnn::Decoder<float>& vector,
- uint32_t vSize,
- uint32_t nBatch,
- armnn::Encoder<float>& outBatchVector);
-
-void VectorBatchVectorCwiseProductAccumulate(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Decoder<float>& batchVector,
- uint32_t nBatch,
- armnn::Encoder<float>& outResult);
-
-void VectorBatchVectorCwiseProduct(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Decoder<float>& batchVector,
- uint32_t nBatch,
- armnn::Encoder<float>& outResult);
-
-void Sub1Vector(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Encoder<float>& result);
-
-
-void VectorVectorCwiseProduct(armnn::Decoder<float>& vector1,
- armnn::Decoder<float>& vector2,
- uint32_t vSize,
- armnn::Encoder<float>& outResult);
-
-void VectorVectorCwiseProductAccumulate(armnn::Decoder<float>& vector1,
- armnn::Decoder<float>& vector2,
- uint32_t vSize,
- armnn::Encoder<float>& outResult);
-
-float Clip(float f,
- float absLimit);
-
-void ClipVector(armnn::Decoder<float>& vector,
- uint32_t vSize,
- float absLimit,
- armnn::Encoder<float>& outResult);
-
-void CopyVector(armnn::Decoder<float>& vector,
- uint32_t vSize,
- armnn::Encoder<float>& outResult);
-
-void SetActivationParameters(uint32_t activation,
- armnn::ActivationFunction& outArmnnActivation,
- float& outA,
- float& outB);
-
-std::unique_ptr<armnn::ScopedCpuTensorHandle> AssignScopedCpuTensorHandle(const armnn::ConstCpuTensorHandle* ptr);
diff --git a/src/backends/reference/workloads/Maximum.hpp b/src/backends/reference/workloads/Maximum.hpp
deleted file mode 100644
index 97df19d3c6..0000000000
--- a/src/backends/reference/workloads/Maximum.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <iostream>
-
-namespace armnn
-{
- template<typename T>
-struct maximum : public std::binary_function<T, T, T>
- {
- T
- operator () (const T& inputData0, const T& inputData1) const
- {
- return std::max(inputData0, inputData1);
- }
- };
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Mean.cpp b/src/backends/reference/workloads/Mean.cpp
deleted file mode 100644
index f2c0a4fc3f..0000000000
--- a/src/backends/reference/workloads/Mean.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Mean.hpp"
-#include <backendsCommon/WorkloadData.hpp>
-
-#include <boost/numeric/conversion/cast.hpp>
-
-#include <cmath>
-#include <cstddef>
-#include <functional>
-#include <limits>
-
-namespace armnn
-{
-bool NextIndex(const unsigned int numDims, const armnn::TensorShape& dims, std::vector<unsigned int>& current)
-{
- unsigned int carry = 1;
-
- for (unsigned int idx = numDims; idx-- > 0; )
- {
- unsigned int current_val = current[idx] + carry;
- if (dims[idx] == current_val)
- {
- current[idx] = 0;
- }
- else
- {
- current[idx] = current_val;
- carry = 0;
- break;
- }
- }
- return (carry == 0);
-}
-
-unsigned int ReducedOutputOffset(const unsigned int numDims,
- const armnn::TensorShape& dims,
- std::vector<unsigned int>& index,
- const unsigned int numAxis,
- const std::vector<unsigned int>& axis)
-{
- unsigned int offset = 0;
- for (unsigned int idx = 0; idx < numDims; ++idx)
- {
- bool isAxis = false;
- if (!axis.empty())
- {
- for (unsigned int axisIdx = 0; axisIdx < numAxis; ++axisIdx)
- {
- if (idx == axis[axisIdx])
- {
- isAxis = true;
- break;
- }
- }
- }
- if (!isAxis)
- {
- offset = offset * dims[idx] + index[idx];
- }
- }
- return offset;
-}
-} // namespace
-
-namespace armnn
-{
-void Mean(const armnn::TensorInfo& inputInfo,
- const armnn::TensorInfo& outputInfo,
- const std::vector<unsigned int>& axis,
- Decoder<float>& input,
- Encoder<float>& output)
-{
-
- unsigned int inputNumDims = inputInfo.GetNumDimensions();
- unsigned int outputNumDims = outputInfo.GetNumDimensions();
-
- armnn::TensorShape outputDims = outputInfo.GetShape();
- armnn::TensorShape inputDims = inputInfo.GetShape();
-
- // Initialise output data.
- unsigned int numOutputs = 1;
- for (unsigned int idx = 0; idx < outputNumDims; ++idx)
- {
- numOutputs *= outputDims[idx];
- }
-
- std::vector<float> tempSum(numOutputs);
- for (unsigned int idx = 0; idx < numOutputs; ++idx)
- {
- output[idx];
- output.Set(0.0f);
- tempSum[idx] = 0.0f;
- }
-
- // Initialise temp index.
- std::vector<unsigned int> tempIndex(inputNumDims);
- for (unsigned int idx = 0; idx < inputNumDims; ++idx)
- {
- tempIndex[idx] = 0;
- }
-
- std::vector<unsigned int> resolvedAxis = axis;
- if (resolvedAxis.empty())
- {
- for (unsigned int idx = 0; idx < inputNumDims; ++idx)
- {
- resolvedAxis.push_back(idx);
- }
- }
- auto numResolvedAxis = boost::numeric_cast<unsigned int>(resolvedAxis.size());
-
- // Iterates through input_data and sum up the reduced axis.
- for (bool hasNext = true; hasNext; hasNext = NextIndex(inputNumDims, inputDims, tempIndex))
- {
- unsigned int inputOffset = ReducedOutputOffset(inputNumDims, inputDims, tempIndex, 0, {});
- unsigned int outputOffset = ReducedOutputOffset(inputNumDims, inputDims, tempIndex,
- numResolvedAxis, resolvedAxis);
- input[inputOffset];
- tempSum[outputOffset] += input.Get();
- }
-
- // Takes average by num of elements added to get mean.
- size_t numElementsInAxis = 1;
- for (unsigned int idx = 0; idx < numResolvedAxis; ++idx)
- {
- unsigned int current = inputDims[resolvedAxis[idx]];
- BOOST_ASSERT(boost::numeric_cast<float>(current) <
- (std::numeric_limits<float>::max() / boost::numeric_cast<float>(numElementsInAxis)));
- numElementsInAxis *= current;
- }
- if (numElementsInAxis > 0) {
- for (unsigned int idx = 0; idx < numOutputs; ++idx)
- {
- output[idx];
- output.Set(tempSum[idx] / boost::numeric_cast<float>(numElementsInAxis));
- }
- }
-}
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Mean.hpp b/src/backends/reference/workloads/Mean.hpp
deleted file mode 100644
index dfb0302bf9..0000000000
--- a/src/backends/reference/workloads/Mean.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "armnn/DescriptorsFwd.hpp"
-#include "armnn/Tensor.hpp"
-#include "BaseIterator.hpp"
-
-#include <vector>
-
-namespace armnn
-{
-void Mean(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- const std::vector<unsigned int>& axis,
- Decoder<float>& input,
- Encoder<float>& output);
-} //namespace armnn
-
diff --git a/src/backends/reference/workloads/Minimum.hpp b/src/backends/reference/workloads/Minimum.hpp
deleted file mode 100644
index 0c053981a0..0000000000
--- a/src/backends/reference/workloads/Minimum.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-namespace armnn
-{
-
-template<typename T>
-struct minimum : public std::binary_function<T, T, T>
-{
- T
- operator()(const T& input1, const T& input2) const
- {
- return std::min(input1, input2);
- }
-};
-
-} //namespace armnn
-
diff --git a/src/backends/reference/workloads/Pad.cpp b/src/backends/reference/workloads/Pad.cpp
deleted file mode 100644
index 9fedb44f96..0000000000
--- a/src/backends/reference/workloads/Pad.cpp
+++ /dev/null
@@ -1,180 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Pad.hpp"
-#include <backendsCommon/WorkloadData.hpp>
-#include "TensorBufferArrayView.hpp"
-#include "Encoders.hpp"
-
-#include <boost/numeric/conversion/cast.hpp>
-#include <cmath>
-#include <cstddef>
-#include <functional>
-#include <limits>
-#include <cassert>
-
-namespace armnn
-{
-
-template <typename T>
-void Pad(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- std::vector<std::pair<unsigned int, unsigned int>> m_padList,
- const T* inputData,
- T* outData,
- const float padValue)
-{
- unsigned int numOutputElements = outputInfo.GetNumElements();
-
- TensorShape outputShape = outputInfo.GetShape();
- TensorShape inputShape = inputInfo.GetShape();
-
- unsigned int numInputDimensions = inputShape.GetNumDimensions();
-
- #ifndef NDEBUG
-
- unsigned int numOutputDimensions = outputShape.GetNumDimensions();
- assert(numInputDimensions == numOutputDimensions);
-
- #endif
-
- unsigned int inputBatches = 0;
- unsigned int inputChannels = 0;
- unsigned int inputHeight = 0;
- unsigned int inputWidth = 0;
-
- unsigned int outputChannels = 0;
- unsigned int outputHeight = 0;
- unsigned int outputWidth = 0;
-
- T convertedPadValue = static_cast<T>(padValue);
-
- for (unsigned int i = 0; i < numOutputElements; ++i)
- {
- outData[i] = convertedPadValue;
- }
-
- 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
- + (w+std::get<0>(m_padList[1]))] = inputData[h * inputWidth + w];
- }
- }
-
- 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
- + h * inputWidth
- + w];
- }
- }
- }
-
- break;
-
- case 4 :
-
- inputBatches = inputShape[0];
- inputChannels = inputShape[1];
- inputHeight = inputShape[2];
- inputWidth = inputShape[3];
- outputChannels = outputShape[1];
- outputHeight = outputShape[2];
- outputWidth = outputShape[3];
-
- for (unsigned int b = 0; b < inputBatches; b++)
- {
- 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
- + (w+std::get<0>(m_padList[3]))] = inputData[b * inputChannels * inputHeight
- * inputWidth
- + c * inputHeight * inputWidth
- + h * inputWidth
- + w];
- }
- }
- }
- }
-
- break;
-
- default :
-
- break;
- }
-}
-
-template void Pad<float>(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
- const float* inputData,
- float* outData,
- const float padValue);
-template void Pad<Half>(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
- const Half* inputData,
- Half* outData,
- const float padValue);
-template void Pad<uint8_t>(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
- const uint8_t* inputData,
- uint8_t* outData,
- const float padValue);
-template void Pad<int16_t>(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
- const int16_t* inputData,
- int16_t* outData,
- const float padValue);
-
-} //namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/Pad.hpp b/src/backends/reference/workloads/Pad.hpp
deleted file mode 100644
index 429718596e..0000000000
--- a/src/backends/reference/workloads/Pad.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "armnn/DescriptorsFwd.hpp"
-#include "armnn/Tensor.hpp"
-
-#include <vector>
-
-namespace armnn
-{
-template <typename T>
-void Pad(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- std::vector<std::pair<unsigned int, unsigned int>> m_padList,
- const T* inputData,
- T* outData,
- const float padValue);
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Pooling2d.cpp b/src/backends/reference/workloads/Pooling2d.cpp
deleted file mode 100644
index 8ff2eb457a..0000000000
--- a/src/backends/reference/workloads/Pooling2d.cpp
+++ /dev/null
@@ -1,275 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Pooling2d.hpp"
-
-#include <armnn/Exceptions.hpp>
-#include <armnn/Types.hpp>
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-#include <boost/numeric/conversion/cast.hpp>
-
-#include <limits>
-#include <algorithm>
-#include <functional>
-
-namespace
-{
- using PoolingAlgorithm = armnn::PoolingAlgorithm;
-
- float DefaultInitializer(PoolingAlgorithm algorithm)
- {
- switch (algorithm)
- {
- case PoolingAlgorithm::Max:
- {
- return std::numeric_limits<float>::lowest();
- }
- case PoolingAlgorithm::Average:
- case PoolingAlgorithm::L2:
- {
- return 0.0f;
- }
- default:
- {
- throw armnn::InvalidArgumentException("Unsupported pooling algorithm");
- }
- }
- }
-
- using Accumulator = std::function<void(float & accu, float value)>;
-
- Accumulator GetAccumulator(PoolingAlgorithm algorithm)
- {
- switch (algorithm)
- {
- case PoolingAlgorithm::Max:
- {
- return [](float & accu, float value) {
- if (value > accu) {
- accu = value;
- }
- };
- }
-
- case PoolingAlgorithm::Average:
- {
- return [](float & accu, float value) {
- accu += value;
- };
- }
-
- case PoolingAlgorithm::L2:
- {
- return [](float & accu, float value) {
- accu += (value*value);
- };
- }
-
- default:
- {
- throw armnn::InvalidArgumentException("Unsupported pooling algorithm");
- }
- }
- }
-
- using Executor = std::function<void(float & accumulated, float kernelSize)>;
-
- Executor GetExecutor(PoolingAlgorithm algorithm)
- {
- switch (algorithm)
- {
- case PoolingAlgorithm::Max:
- {
- return [](float & /*accumulated*/, float /*kernelSize*/) {};
- }
-
- case PoolingAlgorithm::Average:
- {
- return [](float & accumulated, float kernelSize) {
- accumulated /= kernelSize;
- };
- }
-
- case PoolingAlgorithm::L2:
- {
- return [](float & accumulated, float kernelSize) {
- accumulated = sqrtf(accumulated / kernelSize);
- };
- }
-
- default:
- {
- throw armnn::InvalidArgumentException("Unsupported pooling algorithm");
- }
- }
- }
-
- bool OnPaddingOnly(int start, int end, int maxRange)
- {
- if (end <= 0 || start > maxRange)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
-
-
- bool ClampRange(int & start, int & end, int maxRange)
- {
- if (start < 0 || end > maxRange)
- {
- start = std::min(std::max(start, 0), maxRange);
- end = std::min(std::max(end, 0), maxRange);
- return true;
- }
- else
- {
- return false;
- }
- }
-}
-
-using namespace armnnUtils;
-
-namespace armnn
-{
-void Pooling2d(Decoder<float>& rInputDecoder,
- Encoder<float>& rOutputEncoder,
- const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- const Pooling2dDescriptor& params)
-{
- const DataLayoutIndexed dataLayout(params.m_DataLayout);
- auto channelsIndex = dataLayout.GetChannelsIndex();
- auto heightIndex = dataLayout.GetHeightIndex();
- auto widthIndex = dataLayout.GetWidthIndex();
-
- const int batchSize = boost::numeric_cast<int>(outputInfo.GetShape()[0]);
- const int channels = boost::numeric_cast<int>(outputInfo.GetShape()[channelsIndex]);
- const int heightOutput = boost::numeric_cast<int>(outputInfo.GetShape()[heightIndex]);
- const int widthOutput = boost::numeric_cast<int>(outputInfo.GetShape()[widthIndex]);
- const int heightInput = boost::numeric_cast<int>(inputInfo.GetShape()[heightIndex]);
- const int widthInput = boost::numeric_cast<int>(inputInfo.GetShape()[widthIndex]);
- const int padLeft = boost::numeric_cast<int>(params.m_PadLeft);
- const int padRight = boost::numeric_cast<int>(params.m_PadRight);
- const int padTop = boost::numeric_cast<int>(params.m_PadTop);
- const int padBottom = boost::numeric_cast<int>(params.m_PadBottom);
- const int strideX = boost::numeric_cast<int>(params.m_StrideX);
- const int strideY = boost::numeric_cast<int>(params.m_StrideY);
- const int poolHeight = boost::numeric_cast<int>(params.m_PoolHeight);
- const int poolWidth = boost::numeric_cast<int>(params.m_PoolWidth);
-
- float defaultInitializer = DefaultInitializer(params.m_PoolType);
-
- Accumulator accumulate = GetAccumulator(params.m_PoolType);
- Executor execute = GetExecutor(params.m_PoolType);
-
- TensorShape outputShape = outputInfo.GetShape();
- TensorShape inputShape = inputInfo.GetShape();
-
- // Check supported padding methods outside the loop to simplify
- // the inner loop.
- if (params.m_PaddingMethod != PaddingMethod::Exclude &&
- params.m_PaddingMethod != PaddingMethod::IgnoreValue)
- {
- throw armnn::InvalidArgumentException("Unsupported padding type");
- }
-
- for (int n = 0; n < batchSize; n++)
- {
- for (int c = 0; c < channels; c++)
- {
- for (int yOutput = 0; yOutput < heightOutput; yOutput++)
- {
- // Calculate values independent of the x axis
- int hstart = (yOutput * strideY) - padTop;
- int hend = hstart + poolHeight;
- // Clamp the pooling region inside the valid input area (which includes the padding).
- // This is necessary because the final pooling in a row may overlap beyond the padding.
- hend = std::min(hend, heightInput + padBottom);
-
- int height = hend - hstart;
- bool hclamped = ClampRange(hstart, hend, heightInput);
-
- for (int xOutput = 0; xOutput < widthOutput; xOutput++)
- {
- int wstart = (xOutput * strideX) - padLeft;
- int wend = wstart + poolWidth;
-
- // Clamp the pooling region inside the valid input area (which includes the padding).
- // This is necessary because the final pooling in a row may overlap beyond the padding.
- wend = std::min(wend, widthInput + padRight);
-
- float result = defaultInitializer;
- float poolAreaSize = boost::numeric_cast<float>(height * (wend - wstart));
-
- // Special case: when the pooling kernel is over a padding region and the padding
- // size is larger or equal to the kernel and the kernel only covers
- // padding and no real values, then we initialize the result as zero
- // by convention. This is because we need to choose a value here and
- // all values we have are padding, which we ignore.
- if (OnPaddingOnly(hstart, hend, heightInput) ||
- OnPaddingOnly(wstart, wend, widthInput))
- {
- result = 0.0f;
-
- unsigned int outputIndex = dataLayout.GetIndex(outputShape,
- boost::numeric_cast<unsigned int>(n),
- boost::numeric_cast<unsigned int>(c),
- boost::numeric_cast<unsigned int>(yOutput),
- boost::numeric_cast<unsigned int>(xOutput));
- rOutputEncoder[outputIndex];
- rOutputEncoder.Set(result);
- continue;
- }
-
- bool clamped = hclamped |= ClampRange(wstart, wend, widthInput);
-
- if (clamped && params.m_PaddingMethod == PaddingMethod::Exclude)
- {
- // When we exclude the padding, it means we calculate with a smaller
- // kernel size, so I changed the divisor here.
- poolAreaSize = boost::numeric_cast<float>((hend - hstart) * (wend - wstart));
- }
-
- for (auto yInput = hstart; yInput < hend; yInput++)
- {
- for (auto xInput = wstart; xInput < wend; xInput++)
- {
- unsigned int inputIndex = dataLayout.GetIndex(inputShape,
- boost::numeric_cast<unsigned int>(n),
- boost::numeric_cast<unsigned int>(c),
- boost::numeric_cast<unsigned int>(yInput),
- boost::numeric_cast<unsigned int>(xInput));
-
- rInputDecoder[inputIndex];
- float inval = rInputDecoder.Get();
-
- accumulate(result, inval);
- }
- }
-
- execute(result, poolAreaSize);
-
- unsigned int outputIndex = dataLayout.GetIndex(outputShape,
- boost::numeric_cast<unsigned int>(n),
- boost::numeric_cast<unsigned int>(c),
- boost::numeric_cast<unsigned int>(yOutput),
- boost::numeric_cast<unsigned int>(xOutput));
-
- rOutputEncoder[outputIndex];
- rOutputEncoder.Set(result);
- }
- }
- }
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Pooling2d.hpp b/src/backends/reference/workloads/Pooling2d.hpp
deleted file mode 100644
index 182f9bd262..0000000000
--- a/src/backends/reference/workloads/Pooling2d.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/Descriptors.hpp>
-#include <armnn/Tensor.hpp>
-
-#include "BaseIterator.hpp"
-
-namespace armnn
-{
-/// Computes the Pooling2d operation.
-void Pooling2d(Decoder<float>& rInputDecoder,
- Encoder<float>& rOutputEncoder,
- const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- const Pooling2dDescriptor& params);
-} //namespace armnn
diff --git a/src/backends/reference/workloads/PreluImpl.cpp b/src/backends/reference/workloads/PreluImpl.cpp
deleted file mode 100644
index 458025bb0a..0000000000
--- a/src/backends/reference/workloads/PreluImpl.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "PreluImpl.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Broadcast.hpp"
-
-namespace armnn
-{
-
-void PreluImpl(const PreluQueueDescriptor& data,
- Decoder<float>& inputData,
- Decoder<float>& alphaData,
- Encoder<float>& outputData)
-{
- const TensorInfo& inputInfo = GetTensorInfo(data.m_Inputs[0]);
- const TensorInfo& alphaInfo = GetTensorInfo(data.m_Inputs[1]);
- const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[0]);
-
- const TensorShape& inputShape = inputInfo.GetShape();
- const TensorShape& alphaShape = alphaInfo.GetShape();
- const TensorShape& outputShape = outputInfo.GetShape();
-
- // PReLU activation: f(x) = alpha * x for x < 0, f(x) = x for x >= 0
- auto prelu = [](float x, float alpha)
- {
- return x < 0 ? alpha * x : x;
- };
-
- BroadcastLoop(inputShape, alphaShape, outputShape).Unroll(prelu, 0, inputData, alphaData, outputData);
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/PreluImpl.hpp b/src/backends/reference/workloads/PreluImpl.hpp
deleted file mode 100644
index 9299b1c7f7..0000000000
--- a/src/backends/reference/workloads/PreluImpl.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "Encoders.hpp"
-#include "Decoders.hpp"
-
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-void PreluImpl(const PreluQueueDescriptor& data,
- Decoder<float>& inputData,
- Decoder<float>& alphaData,
- Encoder<float>& outputData);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefActivationWorkload.cpp b/src/backends/reference/workloads/RefActivationWorkload.cpp
deleted file mode 100644
index 78c971e183..0000000000
--- a/src/backends/reference/workloads/RefActivationWorkload.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefActivationWorkload.hpp"
-
-#include "Activation.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include "Profiling.hpp"
-
-namespace armnn
-{
-
-void RefActivationWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefActivationWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- Activation(*MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map()),
- *MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map()),
- inputInfo,
- m_Data.m_Parameters.m_Function,
- m_Data.m_Parameters.m_A,
- m_Data.m_Parameters.m_B);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefActivationWorkload.hpp b/src/backends/reference/workloads/RefActivationWorkload.hpp
deleted file mode 100644
index a3b001e61f..0000000000
--- a/src/backends/reference/workloads/RefActivationWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefActivationWorkload : public BaseWorkload<ActivationQueueDescriptor>
-{
-public:
- using BaseWorkload<ActivationQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefArgMinMaxWorkload.cpp b/src/backends/reference/workloads/RefArgMinMaxWorkload.cpp
deleted file mode 100644
index 5f1eb73b61..0000000000
--- a/src/backends/reference/workloads/RefArgMinMaxWorkload.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefArgMinMaxWorkload.hpp"
-
-#include "ArgMinMax.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-#include "Profiling.hpp"
-
-namespace armnn
-{
-RefArgMinMaxWorkload::RefArgMinMaxWorkload(
- const ArgMinMaxQueueDescriptor& descriptor,
- const WorkloadInfo& info)
- : BaseWorkload<ArgMinMaxQueueDescriptor>(descriptor, info) {}
-
-void RefArgMinMaxWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefArgMinMaxWorkload_Execute");
-
- const TensorInfo &inputTensorInfo = GetTensorInfo(m_Data.m_Inputs[0]);
-
- std::unique_ptr<Decoder<float>> decoderPtr = MakeDecoder<float>(inputTensorInfo, m_Data.m_Inputs[0]->Map());
- Decoder<float> &decoder = *decoderPtr;
-
- const TensorInfo &outputTensorInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- int32_t* output = GetOutputTensorData<int32_t>(0, m_Data);
-
- ArgMinMax(decoder, output, inputTensorInfo, outputTensorInfo, m_Data.m_Parameters.m_Function,
- m_Data.m_Parameters.m_Axis);
-}
-
-} //namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/RefArgMinMaxWorkload.hpp b/src/backends/reference/workloads/RefArgMinMaxWorkload.hpp
deleted file mode 100644
index 97b70772d1..0000000000
--- a/src/backends/reference/workloads/RefArgMinMaxWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-class RefArgMinMaxWorkload : public BaseWorkload<ArgMinMaxQueueDescriptor>
-{
-public:
- explicit RefArgMinMaxWorkload(const ArgMinMaxQueueDescriptor& descriptor,
- const WorkloadInfo& info);
-
- virtual void Execute() const override;
-};
-} //namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/RefBatchNormalizationWorkload.cpp b/src/backends/reference/workloads/RefBatchNormalizationWorkload.cpp
deleted file mode 100644
index 54e7d0d38b..0000000000
--- a/src/backends/reference/workloads/RefBatchNormalizationWorkload.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefBatchNormalizationWorkload.hpp"
-
-#include "BatchNormImpl.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include "Profiling.hpp"
-
-namespace armnn
-{
-
-RefBatchNormalizationWorkload::RefBatchNormalizationWorkload(const BatchNormalizationQueueDescriptor& descriptor,
- const WorkloadInfo& info)
- : BaseWorkload(descriptor, info)
- , m_Mean (std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Mean)))
- , m_Variance(std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Variance)))
- , m_Beta (std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Beta)))
- , m_Gamma (std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Gamma)))
-{}
-
-void RefBatchNormalizationWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefBatchNormalizationWorkload_Execute");
-
- std::unique_ptr<Decoder<float>> meanDecoder = MakeDecoder<float>(m_Mean->GetTensorInfo(),
- m_Mean->Map(true));
- std::unique_ptr<Decoder<float>> varianceDecoder = MakeDecoder<float>(m_Variance->GetTensorInfo(),
- m_Variance->Map(true));
- std::unique_ptr<Decoder<float>> gammaDecoder = MakeDecoder<float>(m_Gamma->GetTensorInfo(),
- m_Gamma->Map(true));
- std::unique_ptr<Decoder<float>> betaDecoder = MakeDecoder<float>(m_Beta->GetTensorInfo(),
- m_Beta->Map(true));
- std::unique_ptr<Decoder<float>> inputDecoder = MakeDecoder<float>(GetTensorInfo(m_Data.m_Inputs[0]),
- m_Data.m_Inputs[0]->Map());
- std::unique_ptr<Encoder<float>> outputEncoder = MakeEncoder<float>(GetTensorInfo(m_Data.m_Outputs[0]),
- m_Data.m_Outputs[0]->Map());
-
- BatchNormImpl(m_Data, *meanDecoder, *varianceDecoder, *betaDecoder, *gammaDecoder, *inputDecoder, *outputEncoder);
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefBatchNormalizationWorkload.hpp b/src/backends/reference/workloads/RefBatchNormalizationWorkload.hpp
deleted file mode 100644
index 9e71e7b4c5..0000000000
--- a/src/backends/reference/workloads/RefBatchNormalizationWorkload.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefBatchNormalizationWorkload : public BaseWorkload<BatchNormalizationQueueDescriptor>
-{
-public:
- explicit RefBatchNormalizationWorkload(const BatchNormalizationQueueDescriptor& descriptor,
- const WorkloadInfo& info);
- virtual void Execute() const override;
-
-private:
- std::unique_ptr<ScopedCpuTensorHandle> m_Mean;
- std::unique_ptr<ScopedCpuTensorHandle> m_Variance;
- std::unique_ptr<ScopedCpuTensorHandle> m_Beta;
- std::unique_ptr<ScopedCpuTensorHandle> m_Gamma;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.cpp b/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.cpp
deleted file mode 100644
index c21ef7640a..0000000000
--- a/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.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 "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<Decoder<float>> inputDecoder = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
- std::unique_ptr<Encoder<float>> outputEncoder = MakeEncoder<float>(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
diff --git a/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.hpp b/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.hpp
deleted file mode 100644
index 60577bab2e..0000000000
--- a/src/backends/reference/workloads/RefBatchToSpaceNdWorkload.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn {
-
-class RefBatchToSpaceNdWorkload : public BaseWorkload<BatchToSpaceNdQueueDescriptor>
-{
-
-public:
- using BaseWorkload<BatchToSpaceNdQueueDescriptor>::BaseWorkload;
-
- virtual void Execute() const override;
-};
-
-} // namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/RefComparisonWorkload.cpp b/src/backends/reference/workloads/RefComparisonWorkload.cpp
deleted file mode 100644
index 52ad9a2879..0000000000
--- a/src/backends/reference/workloads/RefComparisonWorkload.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefComparisonWorkload.hpp"
-
-#include "Decoders.hpp"
-#include "ElementwiseFunction.hpp"
-#include "Encoders.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include <Profiling.hpp>
-
-#include <armnn/TypesUtils.hpp>
-
-#include <functional>
-
-namespace armnn
-{
-
-RefComparisonWorkload::RefComparisonWorkload(const ComparisonQueueDescriptor& desc,
- const WorkloadInfo& info)
- : BaseWorkload<ComparisonQueueDescriptor>(desc, info)
-{}
-
-void RefComparisonWorkload::PostAllocationConfigure()
-{
- const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- m_Input0 = MakeDecoder<InType>(inputInfo0);
- m_Input1 = MakeDecoder<InType>(inputInfo1);
-
- m_Output = MakeEncoder<OutType>(outputInfo);
-}
-
-void RefComparisonWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefComparisonWorkload_Execute");
-
- const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- const TensorShape& inShape0 = inputInfo0.GetShape();
- const TensorShape& inShape1 = inputInfo1.GetShape();
- const TensorShape& outShape = outputInfo.GetShape();
-
- m_Input0->Reset(m_Data.m_Inputs[0]->Map());
- m_Input1->Reset(m_Data.m_Inputs[1]->Map());
- m_Output->Reset(m_Data.m_Outputs[0]->Map());
-
- using EqualFunction = ElementwiseBinaryFunction<std::equal_to<InType>>;
- using GreaterFunction = ElementwiseBinaryFunction<std::greater<InType>>;
- using GreaterOrEqualFunction = ElementwiseBinaryFunction<std::greater_equal<InType>>;
- using LessFunction = ElementwiseBinaryFunction<std::less<InType>>;
- using LessOrEqualFunction = ElementwiseBinaryFunction<std::less_equal<InType>>;
- using NotEqualFunction = ElementwiseBinaryFunction<std::not_equal_to<InType>>;
-
- switch (m_Data.m_Parameters.m_Operation)
- {
- case ComparisonOperation::Equal:
- {
- EqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
- break;
- }
- case ComparisonOperation::Greater:
- {
- GreaterFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
- break;
- }
- case ComparisonOperation::GreaterOrEqual:
- {
- GreaterOrEqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
- break;
- }
- case ComparisonOperation::Less:
- {
- LessFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
- break;
- }
- case ComparisonOperation::LessOrEqual:
- {
- LessOrEqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
- break;
- }
- case ComparisonOperation::NotEqual:
- {
- NotEqualFunction(inShape0, inShape1, outShape, *m_Input0, *m_Input1, *m_Output);
- break;
- }
- default:
- {
- throw InvalidArgumentException(std::string("Unsupported comparison operation ") +
- GetComparisonOperationAsCString(m_Data.m_Parameters.m_Operation), CHECK_LOCATION());
- }
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefComparisonWorkload.hpp b/src/backends/reference/workloads/RefComparisonWorkload.hpp
deleted file mode 100644
index a19e4a0540..0000000000
--- a/src/backends/reference/workloads/RefComparisonWorkload.hpp
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefComparisonWorkload : public BaseWorkload<ComparisonQueueDescriptor>
-{
-public:
- using BaseWorkload<ComparisonQueueDescriptor>::m_Data;
-
- RefComparisonWorkload(const ComparisonQueueDescriptor& descriptor, const WorkloadInfo& info);
- void PostAllocationConfigure() override;
- void Execute() const override;
-
-private:
- using InType = float;
- using OutType = bool;
-
- std::unique_ptr<Decoder<InType>> m_Input0;
- std::unique_ptr<Decoder<InType>> m_Input1;
- std::unique_ptr<Encoder<OutType>> m_Output;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefConcatWorkload.cpp b/src/backends/reference/workloads/RefConcatWorkload.cpp
deleted file mode 100644
index 152eae93b3..0000000000
--- a/src/backends/reference/workloads/RefConcatWorkload.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefConcatWorkload.hpp"
-
-#include "Concatenate.hpp"
-
-#include "Profiling.hpp"
-
-namespace armnn
-{
-
-void RefConcatWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefConcatWorkload_Execute");
- Concatenate(m_Data);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefConcatWorkload.hpp b/src/backends/reference/workloads/RefConcatWorkload.hpp
deleted file mode 100644
index 7d0b6b7cd1..0000000000
--- a/src/backends/reference/workloads/RefConcatWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefConcatWorkload : public BaseWorkload<ConcatQueueDescriptor>
-{
-public:
- using BaseWorkload<ConcatQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefConstantWorkload.cpp b/src/backends/reference/workloads/RefConstantWorkload.cpp
deleted file mode 100644
index 3506198410..0000000000
--- a/src/backends/reference/workloads/RefConstantWorkload.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefConstantWorkload.hpp"
-
-#include "RefWorkloadUtils.hpp"
-
-#include <armnn/Types.hpp>
-
-#include <boost/assert.hpp>
-
-#include <cstring>
-
-namespace armnn
-{
-
-RefConstantWorkload::RefConstantWorkload(
- const ConstantQueueDescriptor& descriptor, const WorkloadInfo& info)
- : BaseWorkload<ConstantQueueDescriptor>(descriptor, info) {}
-
-void RefConstantWorkload::PostAllocationConfigure()
-{
- const ConstantQueueDescriptor& data = this->m_Data;
-
- BOOST_ASSERT(data.m_LayerOutput != nullptr);
-
- const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[0]);
- BOOST_ASSERT(data.m_LayerOutput->GetTensorInfo().GetNumBytes() == outputInfo.GetNumBytes());
-
- memcpy(GetOutputTensorData<void>(0, data), data.m_LayerOutput->GetConstTensor<void>(),
- outputInfo.GetNumBytes());
-}
-
-void RefConstantWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefConstantWorkload_Execute");
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefConstantWorkload.hpp b/src/backends/reference/workloads/RefConstantWorkload.hpp
deleted file mode 100644
index ada488a7b2..0000000000
--- a/src/backends/reference/workloads/RefConstantWorkload.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-#include <armnn/Types.hpp>
-
-namespace armnn
-{
-
-// Base class template providing an implementation of the Constant layer common to all data types.
-class RefConstantWorkload : public BaseWorkload<ConstantQueueDescriptor>
-{
-public:
- RefConstantWorkload(const ConstantQueueDescriptor& descriptor, const WorkloadInfo& info);
-
- void PostAllocationConfigure() override;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefConvertFp16ToFp32Workload.cpp b/src/backends/reference/workloads/RefConvertFp16ToFp32Workload.cpp
deleted file mode 100644
index ef813eb69b..0000000000
--- a/src/backends/reference/workloads/RefConvertFp16ToFp32Workload.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefConvertFp16ToFp32Workload.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include <armnnUtils/FloatingPointConverter.hpp>
-
-#include <Half.hpp>
-
-namespace armnn
-{
-
-void RefConvertFp16ToFp32Workload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefConvertFp16ToFp32Workload_Execute");
-
- const Half* const input = GetInputTensorDataHalf(0, m_Data);
- float* const output = GetOutputTensorDataFloat(0, m_Data);
-
- unsigned int numElements = GetTensorInfo(m_Data.m_Inputs[0]).GetNumElements();
- armnnUtils::FloatingPointConverter::ConvertFloat16To32(input, numElements, output);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefConvertFp16ToFp32Workload.hpp b/src/backends/reference/workloads/RefConvertFp16ToFp32Workload.hpp
deleted file mode 100644
index 7c58e9f089..0000000000
--- a/src/backends/reference/workloads/RefConvertFp16ToFp32Workload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefConvertFp16ToFp32Workload : public Float16ToFloat32Workload<ConvertFp16ToFp32QueueDescriptor>
-{
-public:
- using Float16ToFloat32Workload<ConvertFp16ToFp32QueueDescriptor>::Float16ToFloat32Workload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefConvertFp32ToFp16Workload.cpp b/src/backends/reference/workloads/RefConvertFp32ToFp16Workload.cpp
deleted file mode 100644
index 559901f2f2..0000000000
--- a/src/backends/reference/workloads/RefConvertFp32ToFp16Workload.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefConvertFp32ToFp16Workload.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Profiling.hpp"
-
-#include <armnnUtils/FloatingPointConverter.hpp>
-
-#include <Half.hpp>
-
-namespace armnn
-{
-
-void RefConvertFp32ToFp16Workload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefConvertFp32ToFp16Workload_Execute");
-
- const float* const input = GetInputTensorDataFloat(0, m_Data);
- Half* const output = GetOutputTensorDataHalf(0, m_Data);
-
- // convert Fp32 input to Fp16 output
- unsigned int numElements = GetTensorInfo(m_Data.m_Inputs[0]).GetNumElements();
- armnnUtils::FloatingPointConverter::ConvertFloat32To16(input, numElements, output);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefConvertFp32ToFp16Workload.hpp b/src/backends/reference/workloads/RefConvertFp32ToFp16Workload.hpp
deleted file mode 100644
index 283766dfb5..0000000000
--- a/src/backends/reference/workloads/RefConvertFp32ToFp16Workload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefConvertFp32ToFp16Workload : public Float32ToFloat16Workload<ConvertFp32ToFp16QueueDescriptor>
-{
-public:
- using Float32ToFloat16Workload<ConvertFp32ToFp16QueueDescriptor>::Float32ToFloat16Workload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefConvolution2dWorkload.cpp b/src/backends/reference/workloads/RefConvolution2dWorkload.cpp
deleted file mode 100644
index dad9936f1b..0000000000
--- a/src/backends/reference/workloads/RefConvolution2dWorkload.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefConvolution2dWorkload.hpp"
-
-#include "ConvImpl.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include "Profiling.hpp"
-
-namespace armnn
-{
-RefConvolution2dWorkload::RefConvolution2dWorkload(
- const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info)
- : BaseWorkload<Convolution2dQueueDescriptor>(descriptor, info)
-{
- m_Weight = std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Weight));
- const TensorInfo& rFilterInfo = m_Weight->GetTensorInfo();
-
- m_FilterShape = rFilterInfo.GetShape();
- m_FilterDecoder = MakeDecoder<float>(rFilterInfo, m_Weight.get()->Map(true));
-
- if (descriptor.m_Parameters.m_BiasEnabled)
- {
- m_Bias = std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Bias));
- const TensorInfo& biasInfo = m_Bias->GetTensorInfo();
- m_BiasDecoder = MakeDecoder<float>(biasInfo, m_Bias->Map(true));
- }
-}
-
-void RefConvolution2dWorkload::PostAllocationConfigure()
-{
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- m_InputShape = inputInfo.GetShape();
- m_InputDecoder = MakeDecoder<float>(inputInfo);
-
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
- m_OutputShape = outputInfo.GetShape();
- m_OutputEncoder = MakeEncoder<float>(outputInfo);
-}
-
-void RefConvolution2dWorkload::Execute() const {
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefConvolution2dWorkload_Execute");
-
- m_InputDecoder->Reset(m_Data.m_Inputs[0]->Map());
- m_OutputEncoder->Reset(m_Data.m_Outputs[0]->Map());
-
- Convolve(m_InputShape, *m_InputDecoder, m_OutputShape, *m_OutputEncoder, m_FilterShape,
- *m_FilterDecoder, m_Data.m_Parameters.m_BiasEnabled, m_BiasDecoder.get(),
- m_Data.m_Parameters.m_DataLayout, m_Data.m_Parameters.m_PadTop, m_Data.m_Parameters.m_PadLeft,
- m_Data.m_Parameters.m_StrideX, m_Data.m_Parameters.m_StrideY,
- m_Data.m_Parameters.m_DilationX, m_Data.m_Parameters.m_DilationY);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefConvolution2dWorkload.hpp b/src/backends/reference/workloads/RefConvolution2dWorkload.hpp
deleted file mode 100644
index b6bdf23ffa..0000000000
--- a/src/backends/reference/workloads/RefConvolution2dWorkload.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn
-{
-
-class RefConvolution2dWorkload : public BaseWorkload<Convolution2dQueueDescriptor>
-{
-public:
- explicit RefConvolution2dWorkload(const Convolution2dQueueDescriptor& descriptor,
- const WorkloadInfo& info);
-
- void PostAllocationConfigure() override;
-
- virtual void Execute() const override;
-
-private:
- std::unique_ptr<ScopedCpuTensorHandle> m_Weight;
- std::unique_ptr<ScopedCpuTensorHandle> m_Bias;
-
- std::unique_ptr<Decoder<float>> m_InputDecoder;
- std::unique_ptr<Encoder<float>> m_OutputEncoder;
- std::unique_ptr<Decoder<float>> m_FilterDecoder;
- std::unique_ptr<Decoder<float>> m_BiasDecoder;
-
- TensorShape m_InputShape;
- TensorShape m_OutputShape;
- TensorShape m_FilterShape;
-};
-
-} //namespace armnn
-
diff --git a/src/backends/reference/workloads/RefDebugWorkload.cpp b/src/backends/reference/workloads/RefDebugWorkload.cpp
deleted file mode 100644
index af714a3ca7..0000000000
--- a/src/backends/reference/workloads/RefDebugWorkload.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefDebugWorkload.hpp"
-#include "Debug.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include <ResolveType.hpp>
-
-#include <cstring>
-
-namespace armnn
-{
-
-template<armnn::DataType DataType>
-void RefDebugWorkload<DataType>::Execute() const
-{
- using T = ResolveType<DataType>;
-
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, GetName() + "_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
-
- const T* inputData = GetInputTensorData<T>(0, m_Data);
- T* outputData = GetOutputTensorData<T>(0, m_Data);
-
- if (m_Callback)
- {
- m_Callback(m_Data.m_Guid, m_Data.m_SlotIndex, m_Data.m_Inputs[0]);
- }
- else
- {
- Debug(inputInfo, inputData, m_Data.m_Guid, m_Data.m_LayerName, m_Data.m_SlotIndex);
- }
-
- std::memcpy(outputData, inputData, inputInfo.GetNumElements()*sizeof(T));
-}
-
-template<armnn::DataType DataType>
-void RefDebugWorkload<DataType>::RegisterDebugCallback(const DebugCallbackFunction& func)
-{
- m_Callback = func;
-}
-
-template class RefDebugWorkload<DataType::Float16>;
-template class RefDebugWorkload<DataType::Float32>;
-template class RefDebugWorkload<DataType::QAsymmU8>;
-template class RefDebugWorkload<DataType::QAsymmS8>;
-template class RefDebugWorkload<DataType::QSymmS16>;
-template class RefDebugWorkload<DataType::QSymmS8>;
-template class RefDebugWorkload<DataType::Signed32>;
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefDebugWorkload.hpp b/src/backends/reference/workloads/RefDebugWorkload.hpp
deleted file mode 100644
index 5a2a1cdf1b..0000000000
--- a/src/backends/reference/workloads/RefDebugWorkload.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/TypesUtils.hpp>
-
-#include <backendsCommon/Workload.hpp>
-
-namespace armnn
-{
-
-template <armnn::DataType DataType>
-class RefDebugWorkload : public TypedWorkload<DebugQueueDescriptor, DataType>
-{
-public:
- RefDebugWorkload(const DebugQueueDescriptor& descriptor, const WorkloadInfo& info)
- : TypedWorkload<DebugQueueDescriptor, DataType>(descriptor, info)
- , m_Callback(nullptr) {}
-
- static const std::string& GetName()
- {
- static const std::string name = std::string("RefDebug") + GetDataTypeName(DataType) + "Workload";
- return name;
- }
-
- using TypedWorkload<DebugQueueDescriptor, DataType>::m_Data;
- using TypedWorkload<DebugQueueDescriptor, DataType>::TypedWorkload;
-
- void Execute() const override;
-
- void RegisterDebugCallback(const DebugCallbackFunction& func) override;
-
-private:
- DebugCallbackFunction m_Callback;
-};
-
-using RefDebugFloat16Workload = RefDebugWorkload<DataType::Float16>;
-using RefDebugFloat32Workload = RefDebugWorkload<DataType::Float32>;
-using RefDebugQAsymmU8Workload = RefDebugWorkload<DataType::QAsymmU8>;
-using RefDebugQAsymmS8Workload = RefDebugWorkload<DataType::QAsymmS8>;
-using RefDebugQSymmS16Workload = RefDebugWorkload<DataType::QSymmS16>;
-using RefDebugQSymmS8Workload = RefDebugWorkload<DataType::QSymmS8>;
-using RefDebugSigned32Workload = RefDebugWorkload<DataType::Signed32>;
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefDepthToSpaceWorkload.cpp b/src/backends/reference/workloads/RefDepthToSpaceWorkload.cpp
deleted file mode 100644
index 93c1120a1c..0000000000
--- a/src/backends/reference/workloads/RefDepthToSpaceWorkload.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefDepthToSpaceWorkload.hpp"
-
-#include "DepthToSpace.hpp"
-#include "RefWorkloadUtils.hpp"
-
-namespace armnn
-{
-
-void RefDepthToSpaceWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefDepthToSpaceWorkload_Execute");
-
- const TensorInfo inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
-
- DepthToSpace(inputInfo,
- m_Data.m_Parameters,
- m_Data.m_Inputs[0]->Map(),
- m_Data.m_Outputs[0]->Map(),
- GetDataTypeSize(inputInfo.GetDataType()));
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefDepthToSpaceWorkload.hpp b/src/backends/reference/workloads/RefDepthToSpaceWorkload.hpp
deleted file mode 100644
index a30fadc3e9..0000000000
--- a/src/backends/reference/workloads/RefDepthToSpaceWorkload.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-
-namespace armnn
-{
-
-class RefDepthToSpaceWorkload : public BaseWorkload<DepthToSpaceQueueDescriptor>
-{
-public:
- using BaseWorkload<DepthToSpaceQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefDepthwiseConvolution2dWorkload.cpp b/src/backends/reference/workloads/RefDepthwiseConvolution2dWorkload.cpp
deleted file mode 100644
index cfc81ce203..0000000000
--- a/src/backends/reference/workloads/RefDepthwiseConvolution2dWorkload.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefDepthwiseConvolution2dWorkload.hpp"
-
-#include "ConvImpl.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-#include "Profiling.hpp"
-#include <ResolveType.hpp>
-
-namespace armnn
-{
-
-RefDepthwiseConvolution2dWorkload::RefDepthwiseConvolution2dWorkload(
- const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info)
- : BaseWorkload<DepthwiseConvolution2dQueueDescriptor>(descriptor, info)
-{
- m_Weight = std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Weight));
- const TensorInfo& rFilterInfo = m_Weight->GetTensorInfo();
- m_FilterShape = rFilterInfo.GetShape();
- m_FilterDecoder = MakeDecoder<float>(rFilterInfo, m_Weight->Map(true));
-
- if (descriptor.m_Parameters.m_BiasEnabled)
- {
- m_Bias = std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Bias));
- const TensorInfo& biasInfo = m_Bias->GetTensorInfo();
- m_BiasDecoder = MakeDecoder<float>(biasInfo, m_Bias->Map(true));
- }
-}
-
-void RefDepthwiseConvolution2dWorkload::PostAllocationConfigure()
-{
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- m_InputShape = inputInfo.GetShape();
- m_InputDecoder = MakeDecoder<float>(inputInfo);
-
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
- m_OutputShape = outputInfo.GetShape();
- m_OutputEncoder = MakeEncoder<float>(outputInfo);
-}
-
-void RefDepthwiseConvolution2dWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefDepthwiseConvolution2dWorkload_Execute");
- std::unique_ptr<Decoder<float>> pBiasDecoder{};
-
- m_InputDecoder->Reset(m_Data.m_Inputs[0]->Map());
- m_OutputEncoder->Reset(m_Data.m_Outputs[0]->Map());
-
- Convolve(m_InputShape, *m_InputDecoder, m_OutputShape, *m_OutputEncoder,
- m_FilterShape, *m_FilterDecoder, m_Data.m_Parameters.m_BiasEnabled, m_BiasDecoder.get(),
- m_Data.m_Parameters.m_DataLayout, m_Data.m_Parameters.m_PadTop, m_Data.m_Parameters.m_PadLeft,
- m_Data.m_Parameters.m_StrideX, m_Data.m_Parameters.m_StrideY,
- m_Data.m_Parameters.m_DilationX,
- m_Data.m_Parameters.m_DilationY, true);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefDepthwiseConvolution2dWorkload.hpp b/src/backends/reference/workloads/RefDepthwiseConvolution2dWorkload.hpp
deleted file mode 100644
index 6d7037f660..0000000000
--- a/src/backends/reference/workloads/RefDepthwiseConvolution2dWorkload.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-#include <armnn/TypesUtils.hpp>
-
-namespace armnn
-{
-
-class RefDepthwiseConvolution2dWorkload : public BaseWorkload<DepthwiseConvolution2dQueueDescriptor> {
-public:
- explicit RefDepthwiseConvolution2dWorkload(const DepthwiseConvolution2dQueueDescriptor &descriptor,
- const WorkloadInfo &info);
-
- void PostAllocationConfigure() override;
-
- virtual void Execute() const override;
-
-private:
-
- std::unique_ptr <ScopedCpuTensorHandle> m_Weight;
- std::unique_ptr <ScopedCpuTensorHandle> m_Bias;
-
- std::unique_ptr <Decoder<float>> m_InputDecoder;
- std::unique_ptr <Encoder<float>> m_OutputEncoder;
- std::unique_ptr <Decoder<float>> m_FilterDecoder;
- std::unique_ptr <Decoder<float>> m_BiasDecoder;
-
- TensorShape m_InputShape;
- TensorShape m_OutputShape;
- TensorShape m_FilterShape;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefDequantizeWorkload.cpp b/src/backends/reference/workloads/RefDequantizeWorkload.cpp
deleted file mode 100644
index e6f5c6b359..0000000000
--- a/src/backends/reference/workloads/RefDequantizeWorkload.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefDequantizeWorkload.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Encoders.hpp"
-#include "Decoders.hpp"
-#include "Dequantize.hpp"
-
-namespace armnn
-{
-
-void RefDequantizeWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefDequantizeWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- auto inputDecoder = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
- auto outputEncoder = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
-
- Dequantize(*inputDecoder, *outputEncoder, inputInfo, outputInfo);
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefDequantizeWorkload.hpp b/src/backends/reference/workloads/RefDequantizeWorkload.hpp
deleted file mode 100644
index 8d019e3220..0000000000
--- a/src/backends/reference/workloads/RefDequantizeWorkload.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-
-namespace armnn
-{
-
-class RefDequantizeWorkload : public BaseWorkload<DequantizeQueueDescriptor>
-{
-public:
- using BaseWorkload<DequantizeQueueDescriptor>::m_Data;
- using BaseWorkload<DequantizeQueueDescriptor>::BaseWorkload;
-
- void Execute() const override;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefDetectionPostProcessWorkload.cpp b/src/backends/reference/workloads/RefDetectionPostProcessWorkload.cpp
deleted file mode 100644
index b9817ba1ea..0000000000
--- a/src/backends/reference/workloads/RefDetectionPostProcessWorkload.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefDetectionPostProcessWorkload.hpp"
-
-#include "Decoders.hpp"
-#include "DetectionPostProcess.hpp"
-#include "Profiling.hpp"
-#include "RefWorkloadUtils.hpp"
-
-namespace armnn
-{
-
-RefDetectionPostProcessWorkload::RefDetectionPostProcessWorkload(
- const DetectionPostProcessQueueDescriptor& descriptor, const WorkloadInfo& info)
- : BaseWorkload<DetectionPostProcessQueueDescriptor>(descriptor, info),
- m_Anchors(std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Anchors))) {}
-
-void RefDetectionPostProcessWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefDetectionPostProcessWorkload_Execute");
-
- const TensorInfo& boxEncodingsInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& scoresInfo = GetTensorInfo(m_Data.m_Inputs[1]);
- const TensorInfo& anchorsInfo = m_Anchors->GetTensorInfo();
-
- const TensorInfo& detectionBoxesInfo = GetTensorInfo(m_Data.m_Outputs[0]);
- const TensorInfo& detectionClassesInfo = GetTensorInfo(m_Data.m_Outputs[1]);
- const TensorInfo& detectionScoresInfo = GetTensorInfo(m_Data.m_Outputs[2]);
- const TensorInfo& numDetectionsInfo = GetTensorInfo(m_Data.m_Outputs[3]);
-
- auto boxEncodings = MakeDecoder<float>(boxEncodingsInfo, m_Data.m_Inputs[0]->Map());
- auto scores = MakeDecoder<float>(scoresInfo, m_Data.m_Inputs[1]->Map());
- auto anchors = MakeDecoder<float>(anchorsInfo, m_Anchors->Map(false));
-
- float* detectionBoxes = GetOutputTensorData<float>(0, m_Data);
- float* detectionClasses = GetOutputTensorData<float>(1, m_Data);
- float* detectionScores = GetOutputTensorData<float>(2, m_Data);
- float* numDetections = GetOutputTensorData<float>(3, m_Data);
-
- DetectionPostProcess(boxEncodingsInfo, scoresInfo, anchorsInfo,
- detectionBoxesInfo, detectionClassesInfo,
- detectionScoresInfo, numDetectionsInfo, m_Data.m_Parameters,
- *boxEncodings, *scores, *anchors, detectionBoxes,
- detectionClasses, detectionScores, numDetections);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefDetectionPostProcessWorkload.hpp b/src/backends/reference/workloads/RefDetectionPostProcessWorkload.hpp
deleted file mode 100644
index 799d0c6219..0000000000
--- a/src/backends/reference/workloads/RefDetectionPostProcessWorkload.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefDetectionPostProcessWorkload : public BaseWorkload<DetectionPostProcessQueueDescriptor>
-{
-public:
- explicit RefDetectionPostProcessWorkload(const DetectionPostProcessQueueDescriptor& descriptor,
- const WorkloadInfo& info);
- virtual void Execute() const override;
-
-private:
- std::unique_ptr<ScopedCpuTensorHandle> m_Anchors;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefElementwiseUnaryWorkload.cpp b/src/backends/reference/workloads/RefElementwiseUnaryWorkload.cpp
deleted file mode 100644
index 4fbb0d123f..0000000000
--- a/src/backends/reference/workloads/RefElementwiseUnaryWorkload.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefElementwiseUnaryWorkload.hpp"
-
-#include "Decoders.hpp"
-#include "ElementwiseFunction.hpp"
-#include "Encoders.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Abs.hpp"
-#include "Exp.hpp"
-#include "Rsqrt.hpp"
-#include "Sqrt.hpp"
-
-#include <Profiling.hpp>
-
-#include <armnn/TypesUtils.hpp>
-
-#include <functional>
-
-namespace armnn
-{
-
-RefElementwiseUnaryWorkload::RefElementwiseUnaryWorkload(const ElementwiseUnaryQueueDescriptor& desc,
- const WorkloadInfo& info)
- : BaseWorkload<ElementwiseUnaryQueueDescriptor>(desc, info)
-{}
-
-void RefElementwiseUnaryWorkload::PostAllocationConfigure()
-{
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- m_Input = MakeDecoder<InType>(inputInfo);
-
- m_Output = MakeEncoder<OutType>(outputInfo);
-}
-
-void RefElementwiseUnaryWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefElementwiseUnaryWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- const TensorShape& inShape = inputInfo.GetShape();
- const TensorShape& outShape = outputInfo.GetShape();
-
- m_Input->Reset(m_Data.m_Inputs[0]->Map());
- m_Output->Reset(m_Data.m_Outputs[0]->Map());
-
- using AbsFunction = ElementwiseUnaryFunction<abs<InType>>;
- using ExpFunction = ElementwiseUnaryFunction<exp<InType>>;
- using NegFunction = ElementwiseUnaryFunction<std::negate<InType>>;
- using RsqrtFunction = ElementwiseUnaryFunction<rsqrt<InType>>;
- using SqrtFunction = ElementwiseUnaryFunction<sqrt<InType>>;
-
- switch (m_Data.m_Parameters.m_Operation)
- {
- case UnaryOperation::Abs:
- {
- AbsFunction(inShape, outShape, *m_Input, *m_Output);
- break;
- }
- case UnaryOperation::Exp:
- {
- ExpFunction(inShape, outShape, *m_Input, *m_Output);
- break;
- }
- case UnaryOperation::Neg:
- {
- NegFunction(inShape, outShape, *m_Input, *m_Output);
- break;
- }
- case UnaryOperation::Rsqrt:
- {
- RsqrtFunction(inShape, outShape, *m_Input, *m_Output);
- break;
- }
- case UnaryOperation::Sqrt:
- {
- SqrtFunction(inShape, outShape, *m_Input, *m_Output);
- break;
- }
- default:
- {
- throw InvalidArgumentException(std::string("Unsupported unary operation ") +
- GetUnaryOperationAsCString(m_Data.m_Parameters.m_Operation), CHECK_LOCATION());
- }
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefElementwiseUnaryWorkload.hpp b/src/backends/reference/workloads/RefElementwiseUnaryWorkload.hpp
deleted file mode 100644
index efb2865ebd..0000000000
--- a/src/backends/reference/workloads/RefElementwiseUnaryWorkload.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefElementwiseUnaryWorkload : public BaseWorkload<ElementwiseUnaryQueueDescriptor>
-{
-public:
- using BaseWorkload<ElementwiseUnaryQueueDescriptor>::m_Data;
-
- RefElementwiseUnaryWorkload(const ElementwiseUnaryQueueDescriptor& descriptor, const WorkloadInfo& info);
- void PostAllocationConfigure() override;
- void Execute() const override;
-
-private:
- using InType = float;
- using OutType = float;
-
- std::unique_ptr<Decoder<InType>> m_Input;
- std::unique_ptr<Encoder<OutType>> m_Output;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefElementwiseWorkload.cpp b/src/backends/reference/workloads/RefElementwiseWorkload.cpp
deleted file mode 100644
index 18bf0a7ad9..0000000000
--- a/src/backends/reference/workloads/RefElementwiseWorkload.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefElementwiseWorkload.hpp"
-
-#include "Decoders.hpp"
-#include "ElementwiseFunction.hpp"
-#include "Encoders.hpp"
-#include "Profiling.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "StringMapping.hpp"
-#include <ResolveType.hpp>
-#include <vector>
-
-namespace armnn
-{
-
-template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
-RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::RefElementwiseWorkload(
- const ParentDescriptor& desc,
- const WorkloadInfo& info)
- : BaseWorkload<ParentDescriptor>(desc, info)
-{
-}
-
-template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
-void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::PostAllocationConfigure()
-{
- const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- m_Input0 = MakeDecoder<InType>(inputInfo0);
- m_Input1 = MakeDecoder<InType>(inputInfo1);
- m_Output = MakeEncoder<OutType>(outputInfo);
-}
-
-template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
-void RefElementwiseWorkload<Functor, ParentDescriptor, DebugString>::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, StringMapping::Instance().Get(DebugString));
- const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- const TensorShape& inShape0 = inputInfo0.GetShape();
- const TensorShape& inShape1 = inputInfo1.GetShape();
- const TensorShape& outShape = outputInfo.GetShape();
-
- m_Input0->Reset(m_Data.m_Inputs[0]->Map());
- m_Input1->Reset(m_Data.m_Inputs[1]->Map());
- m_Output->Reset(m_Data.m_Outputs[0]->Map());
-
- ElementwiseBinaryFunction<Functor>(inShape0,
- inShape1,
- outShape,
- *m_Input0,
- *m_Input1,
- *m_Output);
-}
-
-} //namespace armnn
-
-template class armnn::RefElementwiseWorkload<std::plus<float>,
- armnn::AdditionQueueDescriptor,
- armnn::StringMapping::RefAdditionWorkload_Execute>;
-
-template class armnn::RefElementwiseWorkload<std::minus<float>,
- armnn::SubtractionQueueDescriptor,
- armnn::StringMapping::RefSubtractionWorkload_Execute>;
-
-template class armnn::RefElementwiseWorkload<std::multiplies<float>,
- armnn::MultiplicationQueueDescriptor,
- armnn::StringMapping::RefMultiplicationWorkload_Execute>;
-
-template class armnn::RefElementwiseWorkload<std::divides<float>,
- armnn::DivisionQueueDescriptor,
- armnn::StringMapping::RefDivisionWorkload_Execute>;
-
-template class armnn::RefElementwiseWorkload<armnn::maximum<float>,
- armnn::MaximumQueueDescriptor,
- armnn::StringMapping::RefMaximumWorkload_Execute>;
-
-template class armnn::RefElementwiseWorkload<armnn::minimum<float>,
- armnn::MinimumQueueDescriptor,
- armnn::StringMapping::RefMinimumWorkload_Execute>;
diff --git a/src/backends/reference/workloads/RefElementwiseWorkload.hpp b/src/backends/reference/workloads/RefElementwiseWorkload.hpp
deleted file mode 100644
index 264ddce2de..0000000000
--- a/src/backends/reference/workloads/RefElementwiseWorkload.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/Types.hpp>
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-#include "BaseIterator.hpp"
-#include "ElementwiseFunction.hpp"
-#include "Maximum.hpp"
-#include "Minimum.hpp"
-#include "StringMapping.hpp"
-
-namespace armnn
-{
-
-template <typename Functor, typename ParentDescriptor, typename armnn::StringMapping::Id DebugString>
-class RefElementwiseWorkload : public BaseWorkload<ParentDescriptor>
-{
-public:
- using InType = typename ElementwiseBinaryFunction<Functor>::InType;
- using OutType = typename ElementwiseBinaryFunction<Functor>::OutType;
- using BaseWorkload<ParentDescriptor>::m_Data;
-
- RefElementwiseWorkload(const ParentDescriptor& descriptor, const WorkloadInfo& info);
- void PostAllocationConfigure() override;
- void Execute() const override;
-
-private:
- std::unique_ptr<Decoder<InType>> m_Input0;
- std::unique_ptr<Decoder<InType>> m_Input1;
- std::unique_ptr<Encoder<OutType>> m_Output;
-};
-
-using RefAdditionWorkload =
- RefElementwiseWorkload<std::plus<float>,
- AdditionQueueDescriptor,
- StringMapping::RefAdditionWorkload_Execute>;
-
-using RefSubtractionWorkload =
- RefElementwiseWorkload<std::minus<float>,
- SubtractionQueueDescriptor,
- StringMapping::RefSubtractionWorkload_Execute>;
-
-using RefMultiplicationWorkload =
- RefElementwiseWorkload<std::multiplies<float>,
- MultiplicationQueueDescriptor,
- StringMapping::RefMultiplicationWorkload_Execute>;
-
-using RefDivisionWorkload =
- RefElementwiseWorkload<std::divides<float>,
- DivisionQueueDescriptor,
- StringMapping::RefDivisionWorkload_Execute>;
-
-using RefMaximumWorkload =
- RefElementwiseWorkload<armnn::maximum<float>,
- MaximumQueueDescriptor,
- StringMapping::RefMaximumWorkload_Execute>;
-
-using RefMinimumWorkload =
- RefElementwiseWorkload<armnn::minimum<float>,
- MinimumQueueDescriptor,
- StringMapping::RefMinimumWorkload_Execute>;
-
-} // armnn
diff --git a/src/backends/reference/workloads/RefFakeQuantizationFloat32Workload.cpp b/src/backends/reference/workloads/RefFakeQuantizationFloat32Workload.cpp
deleted file mode 100644
index 3e16f60b11..0000000000
--- a/src/backends/reference/workloads/RefFakeQuantizationFloat32Workload.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefFakeQuantizationFloat32Workload.hpp"
-
-#include "RefWorkloadUtils.hpp"
-
-#include "Profiling.hpp"
-
-#include <boost/numeric/conversion/cast.hpp>
-
-namespace armnn
-{
-
-void FakeQuantization(const float* inputData, float* outputData, uint32_t numElements, float min, float max)
-{
- float scale = (max - min) / 255.f;
- int32_t offset = boost::numeric_cast<int32_t>((-min * 255.f) / (max - min));
-
- for (uint32_t i = 0; i < numElements; i++)
- {
- outputData[i] = static_cast<float>(armnn::Quantize<uint8_t>(inputData[i], scale, offset));
- }
-
-}
-
-void RefFakeQuantizationFloat32Workload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefFakeQuantizationFloat32Workload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
-
- const float* inputData = GetInputTensorDataFloat(0, m_Data);
- float* outputData = GetOutputTensorDataFloat(0, m_Data);
- FakeQuantization(inputData, outputData, inputInfo.GetNumElements(),
- m_Data.m_Parameters.m_Min,
- m_Data.m_Parameters.m_Max);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefFakeQuantizationFloat32Workload.hpp b/src/backends/reference/workloads/RefFakeQuantizationFloat32Workload.hpp
deleted file mode 100644
index 62fb8e88b7..0000000000
--- a/src/backends/reference/workloads/RefFakeQuantizationFloat32Workload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefFakeQuantizationFloat32Workload : public Float32Workload<FakeQuantizationQueueDescriptor>
-{
-public:
- using Float32Workload<FakeQuantizationQueueDescriptor>::Float32Workload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefFloorWorkload.cpp b/src/backends/reference/workloads/RefFloorWorkload.cpp
deleted file mode 100644
index d96b18b530..0000000000
--- a/src/backends/reference/workloads/RefFloorWorkload.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefFloorWorkload.hpp"
-
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Profiling.hpp"
-
-namespace armnn
-{
-
-void RefFloorWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefFloorFloat32Workload_Execute");
-
- const TensorInfo &inputTensorInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- std::unique_ptr<Decoder<float>> decoderPtr = MakeDecoder<float>(inputTensorInfo, m_Data.m_Inputs[0]->Map());
- Decoder<float> &decoder = *decoderPtr;
-
- const TensorInfo &outputTensorInfo = GetTensorInfo(m_Data.m_Outputs[0]);
- std::unique_ptr<Encoder<float>> encoderPtr = MakeEncoder<float>(outputTensorInfo, m_Data.m_Outputs[0]->Map());
- Encoder<float> &encoder = *encoderPtr;
-
- unsigned int numElements = GetTensorInfo(m_Data.m_Inputs[0]).GetNumElements();
-
- for (unsigned int i = 0; i < numElements; ++i)
- {
- encoder.Set(floorf(decoder.Get()));
- ++decoder;
- ++encoder;
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefFloorWorkload.hpp b/src/backends/reference/workloads/RefFloorWorkload.hpp
deleted file mode 100644
index 2dea3a4259..0000000000
--- a/src/backends/reference/workloads/RefFloorWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefFloorWorkload : public BaseWorkload<FloorQueueDescriptor>
-{
-public:
- using BaseWorkload<FloorQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefFullyConnectedWorkload.cpp b/src/backends/reference/workloads/RefFullyConnectedWorkload.cpp
deleted file mode 100644
index ac82db90e5..0000000000
--- a/src/backends/reference/workloads/RefFullyConnectedWorkload.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefFullyConnectedWorkload.hpp"
-
-#include "FullyConnected.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include "Profiling.hpp"
-
-namespace armnn
-{
-RefFullyConnectedWorkload::RefFullyConnectedWorkload(
- const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info)
- : BaseWorkload<FullyConnectedQueueDescriptor>(descriptor, info),
- m_Weight(std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Weight)))
-{
- const TensorInfo& rWeightInfo = m_Weight->GetTensorInfo();
- m_WeightShape = rWeightInfo.GetShape();
- m_WeightDecoder = MakeDecoder<float>(rWeightInfo, m_Weight->Map(true));
-
- if (descriptor.m_Parameters.m_BiasEnabled)
- {
- m_Bias = std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Bias));
- const TensorInfo& biasInfo = m_Bias->GetTensorInfo();
- m_BiasDecoder = MakeDecoder<float>(biasInfo, m_Bias->Map(true));
- }
-}
-
-void RefFullyConnectedWorkload::PostAllocationConfigure()
-{
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- BOOST_ASSERT(inputInfo.GetNumDimensions() > 1);
- m_InputShape = inputInfo.GetShape();
- m_InputDecoder = MakeDecoder<float>(inputInfo);
-
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
- m_OutputShape = outputInfo.GetShape();
- m_OutputEncoder = MakeEncoder<float>(outputInfo);
-
- m_NumActivations = 1; // Total number of activations in the input.
- for (unsigned int i = 1; i < inputInfo.GetNumDimensions(); i++)
- {
- m_NumActivations *= inputInfo.GetShape()[i];
- }
-}
-
-void RefFullyConnectedWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefFullyConnectedWorkload_Execute");
-
- m_InputDecoder->Reset(m_Data.m_Inputs[0]->Map());
- m_OutputEncoder->Reset(m_Data.m_Outputs[0]->Map());
-
- FullyConnected(m_InputShape,
- *m_InputDecoder,
- m_OutputShape,
- *m_OutputEncoder,
- *m_WeightDecoder,
- *m_BiasDecoder,
- m_Data.m_Parameters.m_BiasEnabled,
- m_NumActivations,
- m_Data.m_Parameters.m_TransposeWeightMatrix);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefFullyConnectedWorkload.hpp b/src/backends/reference/workloads/RefFullyConnectedWorkload.hpp
deleted file mode 100644
index d4a63d23ae..0000000000
--- a/src/backends/reference/workloads/RefFullyConnectedWorkload.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-#include "BaseIterator.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-
-namespace armnn
-{
-
-class RefFullyConnectedWorkload : public BaseWorkload<FullyConnectedQueueDescriptor>
-{
-public:
- explicit RefFullyConnectedWorkload(const FullyConnectedQueueDescriptor& descriptor,
- const WorkloadInfo& info);
-
- void PostAllocationConfigure() override;
-
- virtual void Execute() const override;
-
-private:
- std::unique_ptr<ScopedCpuTensorHandle> m_Weight;
- std::unique_ptr<ScopedCpuTensorHandle> m_Bias;
-
- std::unique_ptr<Decoder<float>> m_InputDecoder;
- std::unique_ptr<Encoder<float>> m_OutputEncoder;
- std::unique_ptr<Decoder<float>> m_WeightDecoder;
- std::unique_ptr<Decoder<float>> m_BiasDecoder;
-
- TensorShape m_InputShape;
- TensorShape m_OutputShape;
- TensorShape m_WeightShape;
- unsigned int m_NumActivations;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefGatherWorkload.cpp b/src/backends/reference/workloads/RefGatherWorkload.cpp
deleted file mode 100644
index 8edf14c8f8..0000000000
--- a/src/backends/reference/workloads/RefGatherWorkload.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefGatherWorkload.hpp"
-
-#include "Gather.hpp"
-#include "Profiling.hpp"
-#include "RefWorkloadUtils.hpp"
-#include <ResolveType.hpp>
-
-namespace armnn
-{
-
-void RefGatherWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefGatherWorkload_Execute");
-
- const TensorInfo& inputInfo0 = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& inputInfo1 = GetTensorInfo(m_Data.m_Inputs[1]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- std::unique_ptr<Decoder<float>> decoderPtr = MakeDecoder<float>(inputInfo0, m_Data.m_Inputs[0]->Map());
- Decoder<float>& decoder = *decoderPtr;
-
- const int32_t* indicesData = GetInputTensorData<int32_t>(1, m_Data);
-
- std::unique_ptr<Encoder<float>> encoderPtr = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
- Encoder<float>& encoder = *encoderPtr;
-
- Gather(inputInfo0, inputInfo1, outputInfo, decoder, indicesData, encoder);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefGatherWorkload.hpp b/src/backends/reference/workloads/RefGatherWorkload.hpp
deleted file mode 100644
index 30019a8d4d..0000000000
--- a/src/backends/reference/workloads/RefGatherWorkload.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-#include <armnn/TypesUtils.hpp>
-#include "BaseIterator.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn
-{
-
-class RefGatherWorkload : public BaseWorkload<GatherQueueDescriptor>
-{
-public:
- using BaseWorkload<GatherQueueDescriptor>::BaseWorkload;
- void Execute() const override;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefInstanceNormalizationWorkload.cpp b/src/backends/reference/workloads/RefInstanceNormalizationWorkload.cpp
deleted file mode 100644
index 875d11a00d..0000000000
--- a/src/backends/reference/workloads/RefInstanceNormalizationWorkload.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefInstanceNormalizationWorkload.hpp"
-
-#include "InstanceNorm.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include "Profiling.hpp"
-
-namespace armnn
-{
-
-RefInstanceNormalizationWorkload::RefInstanceNormalizationWorkload(
- const InstanceNormalizationQueueDescriptor& descriptor,
- const WorkloadInfo& info)
- : BaseWorkload<InstanceNormalizationQueueDescriptor>(descriptor, info) {}
-
-void RefInstanceNormalizationWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefInstanceNormalizationWorkload_Execute");
-
- std::unique_ptr<Decoder<float>> inputDecoder = MakeDecoder<float>(GetTensorInfo(m_Data.m_Inputs[0]),
- m_Data.m_Inputs[0]->Map());
- std::unique_ptr<Encoder<float>> outputEncoder = MakeEncoder<float>(GetTensorInfo(m_Data.m_Outputs[0]),
- m_Data.m_Outputs[0]->Map());
-
- InstanceNorm(m_Data, *inputDecoder, *outputEncoder);
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefInstanceNormalizationWorkload.hpp b/src/backends/reference/workloads/RefInstanceNormalizationWorkload.hpp
deleted file mode 100644
index 3d8a72c361..0000000000
--- a/src/backends/reference/workloads/RefInstanceNormalizationWorkload.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefInstanceNormalizationWorkload : public BaseWorkload<InstanceNormalizationQueueDescriptor>
-{
-public:
- explicit RefInstanceNormalizationWorkload(const InstanceNormalizationQueueDescriptor& descriptor,
- const WorkloadInfo& info);
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefL2NormalizationWorkload.cpp b/src/backends/reference/workloads/RefL2NormalizationWorkload.cpp
deleted file mode 100644
index 6fec1abe6f..0000000000
--- a/src/backends/reference/workloads/RefL2NormalizationWorkload.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefL2NormalizationWorkload.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-#include <Profiling.hpp>
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-#include <boost/numeric/conversion/cast.hpp>
-
-#include <cmath>
-
-using namespace armnnUtils;
-
-namespace armnn
-{
-RefL2NormalizationWorkload::RefL2NormalizationWorkload(
- const L2NormalizationQueueDescriptor& descriptor,
- const WorkloadInfo& info)
- : BaseWorkload<L2NormalizationQueueDescriptor>(descriptor, info) {}
-
-void RefL2NormalizationWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefL2NormalizationWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- auto inputDecoder = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
- auto outputEncoder = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
-
- DataLayoutIndexed dataLayout(m_Data.m_Parameters.m_DataLayout);
-
- const TensorShape& shape = inputInfo.GetShape();
- unsigned int paddedShapeArray[4];
- const int idxShift = 4 - boost::numeric_cast<int>(shape.GetNumDimensions());
-
- const unsigned int batches = (idxShift == 0) ? shape[0] : 1;
- paddedShapeArray[0] = batches;
-
- const int channelsIdx = boost::numeric_cast<int>(dataLayout.GetChannelsIndex());
- const unsigned int channels = (channelsIdx - idxShift >= 0)
- ? shape[boost::numeric_cast<unsigned int>(channelsIdx - idxShift)]
- : 1;
- paddedShapeArray[channelsIdx] = channels;
-
- const int heightIdx = boost::numeric_cast<int>(dataLayout.GetHeightIndex());
- const unsigned int height = (heightIdx - idxShift >= 0)
- ? shape[boost::numeric_cast<unsigned int>(heightIdx - idxShift)]
- : 1;
- paddedShapeArray[heightIdx] = height;
-
- const int widthIdx = boost::numeric_cast<int>(dataLayout.GetWidthIndex());
- const unsigned int width = (widthIdx - idxShift >= 0)
- ? shape[boost::numeric_cast<unsigned int>(widthIdx - idxShift)]
- : 1;
- paddedShapeArray[widthIdx] = width;
-
- const TensorShape& paddedShape = TensorShape(4, paddedShapeArray);
-
- for (unsigned int n = 0; n < batches; ++n)
- {
- for (unsigned int c = 0; c < channels; ++c)
- {
- for (unsigned int h = 0; h < height; ++h)
- {
- for (unsigned int w = 0; w < width; ++w)
- {
- float reduction = 0.0;
- for (unsigned int d = 0; d < channels; ++d)
- {
- unsigned int inputIndex = dataLayout.GetIndex(paddedShape, n, d, h, w);
-
- (*inputDecoder)[inputIndex];
- const float value = inputDecoder->Get();
- reduction += value * value;
- }
-
- unsigned int index = dataLayout.GetIndex(paddedShape, n, c, h, w);
-
- float maximum = reduction < m_Data.m_Parameters.m_Eps ? m_Data.m_Parameters.m_Eps : reduction;
-
- const float scale = 1.0f / sqrtf(maximum);
-
- (*inputDecoder)[index];
- (*outputEncoder)[index];
- outputEncoder->Set(inputDecoder->Get() * scale);
- }
- }
- }
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefL2NormalizationWorkload.hpp b/src/backends/reference/workloads/RefL2NormalizationWorkload.hpp
deleted file mode 100644
index 4beedc9992..0000000000
--- a/src/backends/reference/workloads/RefL2NormalizationWorkload.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefL2NormalizationWorkload : public BaseWorkload<L2NormalizationQueueDescriptor>
-{
-public:
- explicit RefL2NormalizationWorkload(const L2NormalizationQueueDescriptor& descriptor,
- const WorkloadInfo& info);
-
- void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefLogSoftmaxWorkload.cpp b/src/backends/reference/workloads/RefLogSoftmaxWorkload.cpp
deleted file mode 100644
index a987e79dda..0000000000
--- a/src/backends/reference/workloads/RefLogSoftmaxWorkload.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefLogSoftmaxWorkload.hpp"
-
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-#include "LogSoftmax.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include <Profiling.hpp>
-
-#include <boost/assert.hpp>
-
-namespace armnn
-{
-
-void RefLogSoftmaxWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefLogSoftmaxWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- std::unique_ptr<Decoder<float>> decoder = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
- std::unique_ptr<Encoder<float>> encoder = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
-
- BOOST_ASSERT(decoder != nullptr);
- BOOST_ASSERT(encoder != nullptr);
-
- LogSoftmax(*decoder, *encoder, inputInfo, m_Data.m_Parameters);
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefLogSoftmaxWorkload.hpp b/src/backends/reference/workloads/RefLogSoftmaxWorkload.hpp
deleted file mode 100644
index f5048d90b3..0000000000
--- a/src/backends/reference/workloads/RefLogSoftmaxWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefLogSoftmaxWorkload : public BaseWorkload<LogSoftmaxQueueDescriptor>
-{
-public:
- using BaseWorkload<LogSoftmaxQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefLstmWorkload.cpp b/src/backends/reference/workloads/RefLstmWorkload.cpp
deleted file mode 100644
index 70b3443d88..0000000000
--- a/src/backends/reference/workloads/RefLstmWorkload.cpp
+++ /dev/null
@@ -1,383 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefLstmWorkload.hpp"
-#include "Activation.hpp"
-#include "Encoders.hpp"
-#include "Decoders.hpp"
-#include "LstmUtils.hpp"
-#include "RefWorkloadUtils.hpp"
-
-namespace armnn
-{
-
-RefLstmWorkload::RefLstmWorkload(const LstmQueueDescriptor &descriptor, const WorkloadInfo &info)
- : BaseWorkload<LstmQueueDescriptor>(descriptor, info)
- , m_InputToInputWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_InputToInputWeights))
- , m_InputToForgetWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_InputToForgetWeights))
- , m_InputToCellWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_InputToCellWeights))
- , m_InputToOutputWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_InputToOutputWeights))
- , m_RecurrentToInputWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_RecurrentToInputWeights))
- , m_RecurrentToForgetWeightsTensor(AssignScopedCpuTensorHandle(descriptor.m_RecurrentToForgetWeights))
- , m_RecurrentToCellWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_RecurrentToCellWeights))
- , m_RecurrentToOutputWeightsTensor(AssignScopedCpuTensorHandle(descriptor.m_RecurrentToOutputWeights))
- , m_CellToInputWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_CellToInputWeights))
- , m_CellToForgetWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_CellToForgetWeights))
- , m_CellToOutputWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_CellToOutputWeights))
- , m_InputGateBiasTensor (AssignScopedCpuTensorHandle(descriptor.m_InputGateBias))
- , m_ForgetGateBiasTensor (AssignScopedCpuTensorHandle(descriptor.m_ForgetGateBias))
- , m_CellBiasTensor (AssignScopedCpuTensorHandle(descriptor.m_CellBias))
- , m_OutputGateBiasTensor (AssignScopedCpuTensorHandle(descriptor.m_OutputGateBias))
- , m_ProjectionWeightsTensor (AssignScopedCpuTensorHandle(descriptor.m_ProjectionWeights))
- , m_ProjectionBiasTensor (AssignScopedCpuTensorHandle(descriptor.m_ProjectionBias))
- , m_InputLayerNormWeights (AssignScopedCpuTensorHandle(descriptor.m_InputLayerNormWeights))
- , m_ForgetLayerNormWeights (AssignScopedCpuTensorHandle(descriptor.m_ForgetLayerNormWeights))
- , m_CellLayerNormWeights (AssignScopedCpuTensorHandle(descriptor.m_CellLayerNormWeights))
- , m_OutputLayerNormWeights (AssignScopedCpuTensorHandle(descriptor.m_OutputLayerNormWeights))
-{}
-
-void RefLstmWorkload::Execute() const
-{
- // This is a porting of the LSTM::Eval() method in the Android code base
- // Refer to: android/frameworks/ml/nn/common/operations/LSTM.cpp
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- const TensorShape& inputShape = inputInfo.GetShape();
- const DataType& outputType = outputInfo.GetDataType();
-
- std::unique_ptr<Encoder<float>> outputStateOut = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[1]->Map());
- std::unique_ptr<Encoder<float>> cellStateOut = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[2]->Map());
- std::unique_ptr<Encoder<float>> output = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[3]->Map());
-
- std::unique_ptr<Decoder<float>> cellStateOutDecoder = MakeDecoder<float>(outputInfo, m_Data.m_Outputs[2]->Map());
- std::unique_ptr<Decoder<float>> outputDecoder = MakeDecoder<float>(outputInfo, m_Data.m_Outputs[3]->Map());
-
- std::unique_ptr<Decoder<float>> inputData = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
- std::unique_ptr<Decoder<float>> outputStateIn = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[1]->Map());
- std::unique_ptr<Decoder<float>> cellStateIn = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[2]->Map());
-
- const uint32_t nBatch = inputShape[0];
- const uint32_t nInput = inputShape[1];
-
- const uint32_t nCell = m_InputToOutputWeightsTensor->GetShape()[0];
- const uint32_t nOutput = m_RecurrentToOutputWeightsTensor->GetShape()[1];
-
- const bool useCifg = m_Data.m_Parameters.m_CifgEnabled;
- const bool usePeephole = m_Data.m_Parameters.m_PeepholeEnabled;
- const bool useLayerNorm = m_Data.m_Parameters.m_LayerNormEnabled;
-
- // Index the scratch buffers pointers to the global scratch buffer.
- std::unique_ptr<Encoder<float>> inputGateScratch = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
- std::unique_ptr<Encoder<float>> cellScratch = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
- std::unique_ptr<Encoder<float>> forgetGateScratch = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
- std::unique_ptr<Encoder<float>> outputGateScratch = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
-
- std::unique_ptr<Decoder<float>> inputGateScratchDecoder =
- MakeDecoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
- std::unique_ptr<Decoder<float>> cellScratchDecoder =
- MakeDecoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
- std::unique_ptr<Decoder<float>> forgetGateScratchDecoder =
- MakeDecoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
- std::unique_ptr<Decoder<float>> outputGateScratchDecoder =
- MakeDecoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
-
- if (useCifg)
- {
- *cellScratch += (0 * nCell * nBatch);
- *forgetGateScratch += (1 * nCell * nBatch);
- *outputGateScratch += (2 * nCell * nBatch);
-
- *cellScratchDecoder += (0 * nCell * nBatch);
- *forgetGateScratchDecoder += (1 * nCell * nBatch);
- *outputGateScratchDecoder += (2 * nCell * nBatch);
- }
- else
- {
- *inputGateScratch += (0 * nCell * nBatch);
- *cellScratch += (1 * nCell * nBatch);
- *forgetGateScratch += (2 * nCell * nBatch);
- *outputGateScratch += (3 * nCell * nBatch);
-
- *inputGateScratchDecoder += (0 * nCell * nBatch);
- *cellScratchDecoder += (1 * nCell * nBatch);
- *forgetGateScratchDecoder += (2 * nCell * nBatch);
- *outputGateScratchDecoder += (3 * nCell * nBatch);
- }
-
- std::unique_ptr<Decoder<float>> inputToInputWeightsTensor;
- std::unique_ptr<Decoder<float>> inputToForgetWeightsTensor = MakeDecoder<float>(
- m_InputToForgetWeightsTensor->GetTensorInfo(), m_InputToForgetWeightsTensor->GetTensor<void>());
- std::unique_ptr<Decoder<float>> inputToCellWeightsTensor = MakeDecoder<float>(
- m_InputToCellWeightsTensor->GetTensorInfo(), m_InputToCellWeightsTensor->GetTensor<void>());
- std::unique_ptr<Decoder<float>> inputToOutputWeightsTensor = MakeDecoder<float>(
- m_InputToOutputWeightsTensor->GetTensorInfo(), m_InputToOutputWeightsTensor->GetTensor<void>());
-
- std::unique_ptr<Decoder<float>> recurrentToInputWeightsTensor;
- std::unique_ptr<Decoder<float>> recurrentToForgetWeightsTensor = MakeDecoder<float>(
- m_RecurrentToForgetWeightsTensor->GetTensorInfo(), m_RecurrentToForgetWeightsTensor->GetTensor<void>());
- std::unique_ptr<Decoder<float>> recurrentToCellWeightsTensor = MakeDecoder<float>(
- m_RecurrentToCellWeightsTensor->GetTensorInfo(), m_RecurrentToCellWeightsTensor->GetTensor<void>());
- std::unique_ptr<Decoder<float>> recurrentToOutputWeightsTensor = MakeDecoder<float>(
- m_RecurrentToOutputWeightsTensor->GetTensorInfo(), m_RecurrentToOutputWeightsTensor->GetTensor<void>());
-
- std::unique_ptr<Decoder<float>> inputGateBiasTensor;
- std::unique_ptr<Decoder<float>> forgetGateBiasTensor = MakeDecoder<float>(
- m_ForgetGateBiasTensor->GetTensorInfo(), m_ForgetGateBiasTensor->GetTensor<void>());
- std::unique_ptr<Decoder<float>> cellBiasTensor = MakeDecoder<float>(
- m_CellBiasTensor->GetTensorInfo(), m_CellBiasTensor->GetTensor<void>());
- std::unique_ptr<Decoder<float>> outputGateBiasTensor = MakeDecoder<float>(
- m_OutputGateBiasTensor->GetTensorInfo(), m_OutputGateBiasTensor->GetTensor<void>());
-
- std::unique_ptr<Decoder<float>> cellToInputWeightsTensor;
- std::unique_ptr<Decoder<float>> cellToForgetWeightsTensor;
- std::unique_ptr<Decoder<float>> cellToOutputWeightsTensor;
-
- std::unique_ptr<Decoder<float>> projectionWeightsTensor;
- std::unique_ptr<Decoder<float>> projectionBiasTensor;
-
- std::unique_ptr<Decoder<float>> inputLayerNormWeights;
- std::unique_ptr<Decoder<float>> forgetLayerNormWeights;
- std::unique_ptr<Decoder<float>> cellLayerNormWeights;
- std::unique_ptr<Decoder<float>> outputLayerNormWeights;
-
- if (useLayerNorm)
- {
- if (!useCifg)
- {
- inputLayerNormWeights = MakeDecoder<float>(
- m_InputLayerNormWeights->GetTensorInfo(), m_InputLayerNormWeights->GetTensor<void>());
- }
- forgetLayerNormWeights = MakeDecoder<float>(
- m_ForgetLayerNormWeights->GetTensorInfo(), m_ForgetLayerNormWeights->GetTensor<void>());
- cellLayerNormWeights = MakeDecoder<float>(
- m_CellLayerNormWeights->GetTensorInfo(), m_CellLayerNormWeights->GetTensor<void>());
- outputLayerNormWeights = MakeDecoder<float>(
- m_OutputLayerNormWeights->GetTensorInfo(), m_OutputLayerNormWeights->GetTensor<void>());
- }
-
- if (!useCifg)
- {
- inputToInputWeightsTensor = MakeDecoder<float>(
- m_InputToInputWeightsTensor->GetTensorInfo(), m_InputToInputWeightsTensor->GetTensor<void>());
- inputGateBiasTensor = MakeDecoder<float>(
- m_InputGateBiasTensor->GetTensorInfo(), m_InputGateBiasTensor->GetTensor<void>());
- recurrentToInputWeightsTensor = MakeDecoder<float>(
- m_RecurrentToInputWeightsTensor->GetTensorInfo(), m_RecurrentToInputWeightsTensor->GetTensor<void>());
- }
-
- if (usePeephole)
- {
- cellToForgetWeightsTensor = MakeDecoder<float>(
- m_CellToForgetWeightsTensor->GetTensorInfo(), m_CellToForgetWeightsTensor->GetTensor<void>());
- cellToOutputWeightsTensor = MakeDecoder<float>(
- m_CellToOutputWeightsTensor->GetTensorInfo(), m_CellToOutputWeightsTensor->GetTensor<void>());
- }
-
- if (!useCifg && usePeephole)
- {
- cellToInputWeightsTensor = MakeDecoder<float>(
- m_CellToInputWeightsTensor->GetTensorInfo(), m_CellToInputWeightsTensor->GetTensor<void>());
- }
-
- if (m_Data.m_Parameters.m_ProjectionEnabled)
- {
- projectionWeightsTensor = MakeDecoder<float>(
- m_ProjectionWeightsTensor->GetTensorInfo(), m_ProjectionWeightsTensor->GetTensor<void>());
- if (m_ProjectionBiasTensor)
- {
- projectionBiasTensor = MakeDecoder<float>(
- m_ProjectionBiasTensor->GetTensorInfo(), m_ProjectionBiasTensor->GetTensor<void>());
- }
- }
-
- if (!useLayerNorm)
- {
- // Initialize scratch buffers with bias.
- if (!useCifg)
- {
- VectorBatchVectorAssign(*inputGateBiasTensor,
- nCell, nBatch, *inputGateScratch);
- }
- VectorBatchVectorAssign(*forgetGateBiasTensor,
- nCell, nBatch, *forgetGateScratch);
- VectorBatchVectorAssign(*cellBiasTensor,
- nCell, nBatch, *cellScratch);
- VectorBatchVectorAssign(*outputGateBiasTensor,
- nCell, nBatch, *outputGateScratch);
- }
- else
- {
- // Initialize scratch buffers with zeroes.
- if (!useCifg)
- {
- ZeroVector(*inputGateScratch, nCell * nBatch);
- }
- ZeroVector(*forgetGateScratch, nCell * nBatch);
- ZeroVector(*cellScratch , nCell * nBatch);
- ZeroVector(*outputGateScratch, nCell * nBatch);
- }
-
- // For each batch and cell: compute input_weight * input.
- if (!useCifg)
- {
- MatrixBatchVectorMultiplyAccumulate(*inputToInputWeightsTensor,
- nCell, nInput, *inputData, nBatch, *inputGateScratch);
- }
- MatrixBatchVectorMultiplyAccumulate(*inputToForgetWeightsTensor,
- nCell, nInput, *inputData, nBatch, *forgetGateScratch);
- MatrixBatchVectorMultiplyAccumulate(*inputToCellWeightsTensor,
- nCell, nInput, *inputData, nBatch, *cellScratch);
- MatrixBatchVectorMultiplyAccumulate(*inputToOutputWeightsTensor,
- nCell, nInput, *inputData, nBatch, *outputGateScratch);
-
- // For each batch and cell: compute recurrent_weight * output_state.
- if (!useCifg)
- {
- MatrixBatchVectorMultiplyAccumulate(*recurrentToInputWeightsTensor,
- nCell, nOutput, *outputStateIn, nBatch, *inputGateScratch);
- }
- MatrixBatchVectorMultiplyAccumulate(*recurrentToForgetWeightsTensor,
- nCell, nOutput, *outputStateIn, nBatch, *forgetGateScratch);
- MatrixBatchVectorMultiplyAccumulate(*recurrentToCellWeightsTensor,
- nCell, nOutput, *outputStateIn, nBatch, *cellScratch);
- MatrixBatchVectorMultiplyAccumulate(*recurrentToOutputWeightsTensor,
- nCell, nOutput, *outputStateIn, nBatch, *outputGateScratch);
-
- // For each batch and cell: update input gate.
- if (!useCifg)
- {
- if (usePeephole)
- {
- VectorBatchVectorCwiseProductAccumulate(*cellToInputWeightsTensor,
- nCell, *cellStateIn, nBatch, *inputGateScratch);
- }
- if (useLayerNorm)
- {
- MeanStddevNormalization(*inputGateScratchDecoder,
- *inputGateScratch, nCell, nBatch, m_LayerNormEpsilon);
- VectorBatchVectorCwiseProduct(*inputLayerNormWeights,
- nCell, *inputGateScratchDecoder, nBatch, *inputGateScratch);
- VectorBatchVectorAdd(*inputGateBiasTensor,
- nCell, *inputGateScratchDecoder, nBatch, *inputGateScratch);
- }
- Activation(*inputGateScratchDecoder, *inputGateScratch,
- TensorInfo({nCell, nBatch}, outputType),
- ActivationFunction::Sigmoid, 0, 0);
- }
-
- // For each batch and cell: update forget gate.
- if (usePeephole)
- {
- VectorBatchVectorCwiseProductAccumulate(*cellToForgetWeightsTensor, nCell,
- *cellStateIn, nBatch, *forgetGateScratch);
- }
- if (useLayerNorm)
- {
- MeanStddevNormalization(*forgetGateScratchDecoder,
- *forgetGateScratch, nCell, nBatch, m_LayerNormEpsilon);
- VectorBatchVectorCwiseProduct(*forgetLayerNormWeights,
- nCell, *forgetGateScratchDecoder, nBatch, *forgetGateScratch);
- VectorBatchVectorAdd(*forgetGateBiasTensor,
- nCell, *forgetGateScratchDecoder, nBatch, *forgetGateScratch);
- }
- Activation(*forgetGateScratchDecoder, *forgetGateScratch,
- TensorInfo({nCell, nBatch}, outputType),
- ActivationFunction::Sigmoid, 0, 0);
-
- // For each batch and cell: update the cell.
- if (useLayerNorm)
- {
- MeanStddevNormalization(*cellScratchDecoder,
- *cellScratch, nCell, nBatch, m_LayerNormEpsilon);
- VectorBatchVectorCwiseProduct(*cellLayerNormWeights,
- nCell, *cellScratchDecoder, nBatch, *cellScratch);
- VectorBatchVectorAdd(*cellBiasTensor,
- nCell, *cellScratchDecoder, nBatch, *cellScratch);
- }
-
- VectorVectorCwiseProduct(*forgetGateScratchDecoder, *cellStateIn, nBatch * nCell, *cellStateOut);
-
- ActivationFunction armnnActivationFunc = ActivationFunction::Sigmoid;
- float a = 0;
- float b = 0;
- SetActivationParameters(m_Data.m_Parameters.m_ActivationFunc, armnnActivationFunc, a, b);
-
- if (m_Data.m_Parameters.m_ActivationFunc > 0)
- {
- Activation(*cellScratchDecoder, *cellScratch,
- TensorInfo({nCell, nBatch}, outputType),
- armnnActivationFunc, a, b);
- }
- if (useCifg)
- {
- Sub1Vector(*forgetGateScratchDecoder, nBatch * nCell, *forgetGateScratch);
- VectorVectorCwiseProductAccumulate(
- *cellScratchDecoder, *forgetGateScratchDecoder, nBatch * nCell, *cellStateOut);
- }
- else
- {
- VectorVectorCwiseProductAccumulate(
- *cellScratchDecoder, *inputGateScratchDecoder, nBatch * nCell, *cellStateOut);
- }
- if (m_Data.m_Parameters.m_ClippingThresCell > 0.0)
- {
- ClipVector(*cellStateOutDecoder, nBatch * nCell, m_Data.m_Parameters.m_ClippingThresCell, *cellStateOut);
- }
-
- // For each batch and cell: update the output gate.
- if (usePeephole)
- {
- VectorBatchVectorCwiseProductAccumulate(*cellToOutputWeightsTensor,
- nCell, *cellStateOutDecoder, nBatch, *outputGateScratch);
- }
- if (useLayerNorm)
- {
- MeanStddevNormalization(*outputGateScratchDecoder,
- *outputGateScratch, nCell, nBatch, m_LayerNormEpsilon);
- VectorBatchVectorCwiseProduct(*outputLayerNormWeights,
- nCell, *outputGateScratchDecoder, nBatch, *outputGateScratch);
- VectorBatchVectorAdd(*outputGateBiasTensor,
- nCell, *outputGateScratchDecoder, nBatch, *outputGateScratch);
- }
- Activation(*outputGateScratchDecoder, *outputGateScratch,
- TensorInfo({nCell, nBatch}, outputType),
- ActivationFunction::Sigmoid, 0, 0);
-
- if (m_Data.m_Parameters.m_ActivationFunc > 0)
- {
- Activation(*cellStateOutDecoder, *cellScratch,
- TensorInfo({nCell, nBatch}, outputType),
- armnnActivationFunc, a, b);
- }
-
- VectorVectorCwiseProduct(*outputGateScratchDecoder, *cellScratchDecoder, nBatch * nCell, *outputGateScratch);
-
- // For each batch: update the projection and output_state.
- if (m_Data.m_Parameters.m_ProjectionEnabled)
- {
- if (m_ProjectionBiasTensor)
- {
- VectorBatchVectorAssign(*projectionBiasTensor,
- nOutput, nBatch, *output);
- }
- MatrixBatchVectorMultiplyAccumulate(*projectionWeightsTensor,
- nOutput, nCell, *outputGateScratchDecoder, nBatch, *output);
-
- if (m_Data.m_Parameters.m_ClippingThresProj > 0.0)
- {
- ClipVector(*outputDecoder, nBatch * nOutput, m_Data.m_Parameters.m_ClippingThresProj, *output);
- }
- }
- else
- {
- CopyVector(*outputGateScratchDecoder, nBatch * nOutput, *output);
- }
-
- CopyVector(*outputDecoder, nBatch * nOutput, *outputStateOut);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefLstmWorkload.hpp b/src/backends/reference/workloads/RefLstmWorkload.hpp
deleted file mode 100644
index ce5a775269..0000000000
--- a/src/backends/reference/workloads/RefLstmWorkload.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/TypesUtils.hpp>
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefLstmWorkload : public BaseWorkload<LstmQueueDescriptor>
-{
-public:
- explicit RefLstmWorkload(const LstmQueueDescriptor& descriptor, const WorkloadInfo& info);
-
- virtual void Execute() const override;
-
-private:
- std::unique_ptr<ScopedCpuTensorHandle> m_InputToInputWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_InputToForgetWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_InputToCellWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_InputToOutputWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_RecurrentToInputWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_RecurrentToForgetWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_RecurrentToCellWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_RecurrentToOutputWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_CellToInputWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_CellToForgetWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_CellToOutputWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_InputGateBiasTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_ForgetGateBiasTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_CellBiasTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_OutputGateBiasTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_ProjectionWeightsTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_ProjectionBiasTensor;
- std::unique_ptr<ScopedCpuTensorHandle> m_InputLayerNormWeights;
- std::unique_ptr<ScopedCpuTensorHandle> m_ForgetLayerNormWeights;
- std::unique_ptr<ScopedCpuTensorHandle> m_CellLayerNormWeights;
- std::unique_ptr<ScopedCpuTensorHandle> m_OutputLayerNormWeights;
-
- float m_LayerNormEpsilon = static_cast<float>(1e-8);
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefMeanWorkload.cpp b/src/backends/reference/workloads/RefMeanWorkload.cpp
deleted file mode 100644
index 375ab395be..0000000000
--- a/src/backends/reference/workloads/RefMeanWorkload.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefMeanWorkload.hpp"
-
-#include "Mean.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include "Profiling.hpp"
-
-#include <vector>
-
-namespace armnn
-{
-
-RefMeanWorkload::RefMeanWorkload(const MeanQueueDescriptor& descriptor, const WorkloadInfo& info)
- :BaseWorkload<MeanQueueDescriptor>(descriptor, info) {}
-
-void RefMeanWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefMeanWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- auto inputDecoder = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
- auto outputEncoder = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
-
- Mean(inputInfo, outputInfo, m_Data.m_Parameters.m_Axis, *inputDecoder, *outputEncoder);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefMeanWorkload.hpp b/src/backends/reference/workloads/RefMeanWorkload.hpp
deleted file mode 100644
index c673f940e0..0000000000
--- a/src/backends/reference/workloads/RefMeanWorkload.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn
-{
-
-class RefMeanWorkload : public BaseWorkload<MeanQueueDescriptor>
-{
-public:
- explicit RefMeanWorkload (const MeanQueueDescriptor& descriptor, const WorkloadInfo& info);
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefNormalizationWorkload.cpp b/src/backends/reference/workloads/RefNormalizationWorkload.cpp
deleted file mode 100644
index 77497c4458..0000000000
--- a/src/backends/reference/workloads/RefNormalizationWorkload.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefNormalizationWorkload.hpp"
-
-#include <armnn/Logging.hpp>
-#include <armnn/Tensor.hpp>
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-#include <Profiling.hpp>
-
-#include <boost/numeric/conversion/cast.hpp>
-
-#include "RefWorkloadUtils.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-using namespace armnn;
-using namespace armnnUtils;
-
-namespace
-{
-
-// Helper function to compute "Within" normalization using Krichevsky 2012: Local Brightness Normalization.
-void NormalizeWithinUingLbr(Decoder<float>& inputData,
- Encoder<float>& outputData,
- const TensorShape& tensorShape,
- uint32_t norm_size,
- float alpha,
- float beta,
- float kappa)
-{
- const unsigned int batchSize = tensorShape[0];
- const unsigned int depth = tensorShape[1];
- const unsigned int rows = tensorShape[2];
- const unsigned int cols = tensorShape[3];
-
- int radius = boost::numeric_cast<int>(norm_size / 2u); /* Strong Assumption on rounding Mode */
-
- for (unsigned int n = 0; n < batchSize; n++)
- {
- for (unsigned int c = 0; c < depth; c++)
- {
- for (unsigned int h = 0; h < rows; h++)
- {
- for (unsigned int w = 0; w < cols; w++)
- {
- float accumulated_scale = 0.0;
- for (int y = -radius; y <= radius; y++)
- {
- for (int x = -radius; x <= radius; x++)
- {
- int i = boost::numeric_cast<int>(w) + x;
- int j = boost::numeric_cast<int>(h) + y;
-
- if ((i < 0) || (i >= boost::numeric_cast<int>(cols)))
- {
- continue;
- }
-
- if ((j < 0) || (j >= boost::numeric_cast<int>(rows)))
- {
- continue;
- }
-
- unsigned int inputIndex = n * cols * rows * depth +
- c * cols * rows +
- boost::numeric_cast<unsigned int>(j) * cols +
- boost::numeric_cast<unsigned int>(i);
- inputData[inputIndex];
- float inval = inputData.Get();
-
- accumulated_scale += inval*inval;
- }
- }
-
- unsigned int index = n * cols * rows * depth +
- c * cols * rows +
- h * cols +
- w;
- inputData[index];
- outputData[index];
- outputData.Set(inputData.Get() / (powf((kappa + (accumulated_scale * alpha)), beta)));
- }
- }
- }
- }
-}
-
-// Helper function to compute "Across" normalization using Krichevsky 2012: Local Brightness Normalization.
-void NormalizeAcrossUingLbr(Decoder<float>& inputData,
- Encoder<float>& outputData,
- const TensorShape& tensorShape,
- uint32_t norm_size,
- float alpha,
- float beta,
- float kappa,
- DataLayout dataLayout)
-{
- DataLayoutIndexed dataLayoutIndexed(dataLayout);
-
- const unsigned int batchSize = tensorShape[0];
- const unsigned int depth = tensorShape[dataLayoutIndexed.GetChannelsIndex()];
- const unsigned int rows = tensorShape[dataLayoutIndexed.GetHeightIndex()];
- const unsigned int cols = tensorShape[dataLayoutIndexed.GetWidthIndex()];
-
- int radius = boost::numeric_cast<int>(norm_size / 2u); /* Strong Assumption on rounding Mode */
-
- for (unsigned int n = 0; n < batchSize; n++)
- {
- for (unsigned int c = 0; c < depth; c++)
- {
- for (unsigned int h = 0; h < rows; h++)
- {
- for (unsigned int w = 0; w < cols; w++)
- {
- float accumulated_scale = 0.0;
- for (int z = -radius; z <= radius; z++)
- {
- int k = boost::numeric_cast<int>(c) + z;
-
- if ((k < 0) || (k >= boost::numeric_cast<int>(depth)))
- {
- continue;
- }
-
- unsigned inputIndex = dataLayoutIndexed.GetIndex(tensorShape,
- n,
- boost::numeric_cast<unsigned int>(k),
- h,
- w);
-
- inputData[inputIndex];
- float inval = inputData.Get();
-
- accumulated_scale += inval * inval;
- }
-
- float scale = kappa + (accumulated_scale * alpha);
- scale = powf(scale, -beta);
-
- unsigned index = dataLayoutIndexed.GetIndex(tensorShape, n, c, h, w);
-
- inputData[index];
- outputData[index];
- outputData.Set(scale * inputData.Get());
- }
- }
- }
- }
-}
-
-} // Anonymous namespace
-
-namespace armnn
-{
-
-RefNormalizationWorkload::RefNormalizationWorkload(const NormalizationQueueDescriptor& descriptor,
- const WorkloadInfo& info)
- : BaseWorkload(descriptor, info)
-{}
-
-void RefNormalizationWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefNormalizationWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
-
- auto inputDecoder = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
- auto outputEncoder = MakeEncoder<float>(inputInfo, m_Data.m_Outputs[0]->Map());
-
- if (NormalizationAlgorithmMethod::LocalBrightness == m_Data.m_Parameters.m_NormMethodType)
- {
- if (NormalizationAlgorithmChannel::Within == m_Data.m_Parameters.m_NormChannelType)
- {
- NormalizeWithinUingLbr(*inputDecoder,
- *outputEncoder,
- inputInfo.GetShape(),
- m_Data.m_Parameters.m_NormSize,
- m_Data.m_Parameters.m_Alpha,
- m_Data.m_Parameters.m_Beta,
- m_Data.m_Parameters.m_K);
- }
- else if (NormalizationAlgorithmChannel::Across == m_Data.m_Parameters.m_NormChannelType)
- {
- NormalizeAcrossUingLbr(*inputDecoder,
- *outputEncoder,
- inputInfo.GetShape(),
- m_Data.m_Parameters.m_NormSize,
- m_Data.m_Parameters.m_Alpha,
- m_Data.m_Parameters.m_Beta,
- m_Data.m_Parameters.m_K,
- m_Data.m_Parameters.m_DataLayout);
- }
- else
- {
- ARMNN_LOG(warning) << "Illegal NORMALIZATION mode in normalization_f32";
- return;
- }
- }
- else
- {
- ARMNN_LOG(warning) << "Lcr method (Jarret 2009: Local Contrast Normalization) not supported yet.";
- return;
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefNormalizationWorkload.hpp b/src/backends/reference/workloads/RefNormalizationWorkload.hpp
deleted file mode 100644
index 6d33c8afb2..0000000000
--- a/src/backends/reference/workloads/RefNormalizationWorkload.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefNormalizationWorkload : public BaseWorkload<NormalizationQueueDescriptor>
-{
-public:
- explicit RefNormalizationWorkload(const NormalizationQueueDescriptor& descriptor,
- const WorkloadInfo& info);
-
- virtual void Execute() const override;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefPadWorkload.cpp b/src/backends/reference/workloads/RefPadWorkload.cpp
deleted file mode 100644
index 356f6b1172..0000000000
--- a/src/backends/reference/workloads/RefPadWorkload.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefPadWorkload.hpp"
-
-#include "Pad.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include "Profiling.hpp"
-
-#include <ResolveType.hpp>
-
-#include <vector>
-
-namespace armnn
-{
-
-template <armnn::DataType DataType>
-void RefPadWorkload<DataType>::Execute() const
-{
- using T = ResolveType<DataType>;
-
- 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 T* inputData = GetInputTensorData<T>(0, m_Data);
- T* outputData = GetOutputTensorData<T>(0, m_Data);
-
- Pad(inputInfo, outputInfo, m_Data.m_Parameters.m_PadList, inputData, outputData, m_Data.m_Parameters.m_PadValue);
-}
-
-template class RefPadWorkload<DataType::Float32>;
-template class RefPadWorkload<DataType::Float16>;
-template class RefPadWorkload<DataType::QAsymmU8>;
-template class RefPadWorkload<DataType::QSymmS16>;
-
-} //namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/RefPadWorkload.hpp b/src/backends/reference/workloads/RefPadWorkload.hpp
deleted file mode 100644
index 28fb55386e..0000000000
--- a/src/backends/reference/workloads/RefPadWorkload.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-#include <armnn/TypesUtils.hpp>
-
-namespace armnn
-{
-
-template <armnn::DataType DataType>
-class RefPadWorkload : public TypedWorkload<PadQueueDescriptor, DataType>
-{
-public:
-
- static const std::string& GetName()
- {
- static const std::string name = std::string("RefPad") + GetDataTypeName(DataType) + "Workload";
- return name;
- }
-
- using TypedWorkload<PadQueueDescriptor, DataType>::m_Data;
- using TypedWorkload<PadQueueDescriptor, DataType>::TypedWorkload;
-
- void Execute() const override;
-};
-
-using RefPadFloat32Workload = RefPadWorkload<DataType::Float32>;
-using RefPadFloat16Workload = RefPadWorkload<DataType::Float16>;
-using RefPadQAsymm8Workload = RefPadWorkload<DataType::QAsymmU8>;
-using RefPadQSymm16Workload = RefPadWorkload<DataType::QSymmS16>;
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefPermuteWorkload.cpp b/src/backends/reference/workloads/RefPermuteWorkload.cpp
deleted file mode 100644
index d0e1431ffd..0000000000
--- a/src/backends/reference/workloads/RefPermuteWorkload.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefPermuteWorkload.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include <armnnUtils/Permute.hpp>
-
-#include <ResolveType.hpp>
-
-namespace armnn
-{
-
-template <armnn::DataType DataType>
-void RefPermuteWorkload<DataType>::Execute() const
-{
- using T = ResolveType<DataType>;
-
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, GetName() + "_Execute");
-
- const ITensorHandle* src = m_Data.m_Inputs[0];
- ITensorHandle* dst = m_Data.m_Outputs[0];
- const PermutationVector& mappings = m_Data.m_Parameters.m_DimMappings;
-
- armnnUtils::Permute(GetTensorInfo(dst).GetShape(), mappings,
- src->Map(), dst->Map(), sizeof(T));
-}
-
-template class RefPermuteWorkload<DataType::Float16>;
-template class RefPermuteWorkload<DataType::Float32>;
-template class RefPermuteWorkload<DataType::QAsymmU8>;
-template class RefPermuteWorkload<DataType::QSymmS16>;
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefPermuteWorkload.hpp b/src/backends/reference/workloads/RefPermuteWorkload.hpp
deleted file mode 100644
index 00a33850aa..0000000000
--- a/src/backends/reference/workloads/RefPermuteWorkload.hpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-
-#include <armnn/TypesUtils.hpp>
-
-namespace armnn
-{
-
-template <armnn::DataType DataType>
-class RefPermuteWorkload : public TypedWorkload<PermuteQueueDescriptor, DataType>
-{
-public:
- static const std::string& GetName()
- {
- static const std::string name = std::string("RefPermute") + GetDataTypeName(DataType) + "Workload";
- return name;
- }
-
- using TypedWorkload<PermuteQueueDescriptor, DataType>::m_Data;
- using TypedWorkload<PermuteQueueDescriptor, DataType>::TypedWorkload;
- void Execute() const override;
-};
-
-using RefPermuteFloat16Workload = RefPermuteWorkload<DataType::Float16>;
-using RefPermuteFloat32Workload = RefPermuteWorkload<DataType::Float32>;
-using RefPermuteQAsymm8Workload = RefPermuteWorkload<DataType::QAsymmU8>;
-using RefPermuteQSymm16Workload = RefPermuteWorkload<DataType::QSymmS16>;
-
-} //namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/RefPooling2dWorkload.cpp b/src/backends/reference/workloads/RefPooling2dWorkload.cpp
deleted file mode 100644
index becbae2934..0000000000
--- a/src/backends/reference/workloads/RefPooling2dWorkload.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefPooling2dWorkload.hpp"
-
-#include "Pooling2d.hpp"
-#include "RefWorkloadUtils.hpp"
-
-#include "Profiling.hpp"
-#include "BaseIterator.hpp"
-
-namespace armnn
-{
-void RefPooling2dWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefPooling2dWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- auto inputDecoder = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0] ->Map());
- auto outputEncoder = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
-
- Pooling2d(*inputDecoder,
- *outputEncoder,
- inputInfo,
- outputInfo,
- m_Data.m_Parameters);
-}
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefPooling2dWorkload.hpp b/src/backends/reference/workloads/RefPooling2dWorkload.hpp
deleted file mode 100644
index 7c4f35afc0..0000000000
--- a/src/backends/reference/workloads/RefPooling2dWorkload.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn
-{
-class RefPooling2dWorkload : public BaseWorkload<Pooling2dQueueDescriptor>
-{
-public:
- using BaseWorkload<Pooling2dQueueDescriptor>::BaseWorkload;
-
- virtual void Execute() const override;
-};
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefPreluWorkload.cpp b/src/backends/reference/workloads/RefPreluWorkload.cpp
deleted file mode 100644
index cdc0a63711..0000000000
--- a/src/backends/reference/workloads/RefPreluWorkload.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefPreluWorkload.hpp"
-
-#include "RefWorkloadUtils.hpp"
-#include "PreluImpl.hpp"
-
-#include <Profiling.hpp>
-
-namespace armnn
-{
-
-RefPreluWorkload::RefPreluWorkload(const PreluQueueDescriptor& descriptor,
- const WorkloadInfo& info)
- : BaseWorkload(descriptor, info)
-{}
-
-void RefPreluWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefPreluWorkload_Execute");
-
- std::unique_ptr<Decoder<float>> inputDecoder = MakeDecoder<float>(GetTensorInfo(m_Data.m_Inputs[0]),
- m_Data.m_Inputs[0]->Map());
- std::unique_ptr<Decoder<float>> alphaDecoder = MakeDecoder<float>(GetTensorInfo(m_Data.m_Inputs[1]),
- m_Data.m_Inputs[1]->Map());
- std::unique_ptr<Encoder<float>> outputEncoder = MakeEncoder<float>(GetTensorInfo(m_Data.m_Outputs[0]),
- m_Data.m_Outputs[0]->Map());
-
- PreluImpl(m_Data, *inputDecoder, *alphaDecoder, *outputEncoder);
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefPreluWorkload.hpp b/src/backends/reference/workloads/RefPreluWorkload.hpp
deleted file mode 100644
index 72839e67dc..0000000000
--- a/src/backends/reference/workloads/RefPreluWorkload.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefPreluWorkload : public BaseWorkload<PreluQueueDescriptor>
-{
-public:
- explicit RefPreluWorkload(const PreluQueueDescriptor& descriptor,
- const WorkloadInfo& info);
- virtual void Execute() const override;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefQuantizeWorkload.cpp b/src/backends/reference/workloads/RefQuantizeWorkload.cpp
deleted file mode 100644
index 2eef5f33db..0000000000
--- a/src/backends/reference/workloads/RefQuantizeWorkload.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefQuantizeWorkload.hpp"
-
-#include "RefWorkloadUtils.hpp"
-
-#include <armnn/TypesUtils.hpp>
-
-
-namespace armnn
-{
-
-namespace
-{
-
-void QuantizeImpl(Decoder<float>& in, Encoder<float>& out, size_t numValues)
-{
- for (unsigned int i = 0; i < numValues; i++)
- {
- in[i];
- out[i];
- out.Set(in.Get());
- }
-}
-
-} //namespace
-
-RefQuantizeWorkload::RefQuantizeWorkload(const QuantizeQueueDescriptor& descriptor, const WorkloadInfo &info)
- : BaseWorkload(descriptor, info)
- , m_NumElements(info.m_InputTensorInfos[0].GetNumElements())
-{
-}
-
-void RefQuantizeWorkload::PostAllocationConfigure()
-{
- const TensorInfo& inputInfo = armnn::GetTensorInfo(m_Data.m_Inputs[0]);
- m_InputDecoder = MakeDecoder<float>(inputInfo);
-
- const TensorInfo& outputInfo = armnn::GetTensorInfo(m_Data.m_Outputs[0]);
- m_OutputEncoder = MakeEncoder<float>(outputInfo);
-}
-
-void RefQuantizeWorkload::Execute() const
-{
- m_InputDecoder->Reset(m_Data.m_Inputs[0]->Map());
- m_OutputEncoder->Reset(m_Data.m_Outputs[0]->Map());
-
- QuantizeImpl(*m_InputDecoder, *m_OutputEncoder, m_NumElements);
-}
-
-} //namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/RefQuantizeWorkload.hpp b/src/backends/reference/workloads/RefQuantizeWorkload.hpp
deleted file mode 100644
index 9ae107607b..0000000000
--- a/src/backends/reference/workloads/RefQuantizeWorkload.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn {
-
-class RefQuantizeWorkload : public BaseWorkload<QuantizeQueueDescriptor>
-{
-public:
- RefQuantizeWorkload(const QuantizeQueueDescriptor& descriptor, const WorkloadInfo &info);
- void PostAllocationConfigure() override;
- void Execute() const override;
-
-private:
-
- std::unique_ptr<Decoder<float>> m_InputDecoder;
- std::unique_ptr<Encoder<float>> m_OutputEncoder;
-
- size_t m_NumElements;
-};
-
-} //namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/RefReshapeWorkload.cpp b/src/backends/reference/workloads/RefReshapeWorkload.cpp
deleted file mode 100644
index 6d29781937..0000000000
--- a/src/backends/reference/workloads/RefReshapeWorkload.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefReshapeWorkload.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Profiling.hpp"
-
-#include <cstring>
-
-namespace armnn
-{
-
-void RefReshapeWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefReshapeWorkload_Execute");
-
- void* output = GetOutputTensorData<void>(0, m_Data);
- const void* input = GetInputTensorData<void>(0, m_Data);
- unsigned int numBytes = GetTensorInfo(m_Data.m_Inputs[0]).GetNumBytes();
- memcpy(output, input, numBytes);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefReshapeWorkload.hpp b/src/backends/reference/workloads/RefReshapeWorkload.hpp
deleted file mode 100644
index 7359ff9cde..0000000000
--- a/src/backends/reference/workloads/RefReshapeWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefReshapeWorkload : public BaseWorkload<ReshapeQueueDescriptor>
-{
-public:
- using BaseWorkload<ReshapeQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp b/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp
deleted file mode 100644
index fc27c0f93d..0000000000
--- a/src/backends/reference/workloads/RefResizeBilinearWorkload.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefResizeBilinearWorkload.hpp"
-
-#include "RefWorkloadUtils.hpp"
-#include "Resize.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<Decoder<float>> decoderPtr = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
- Decoder<float> &decoder = *decoderPtr;
- std::unique_ptr<Encoder<float>> encoderPtr = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
- Encoder<float> &encoder = *encoderPtr;
-
- Resize(decoder, inputInfo, encoder, outputInfo, m_Data.m_Parameters.m_DataLayout, armnn::ResizeMethod::Bilinear);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefResizeBilinearWorkload.hpp b/src/backends/reference/workloads/RefResizeBilinearWorkload.hpp
deleted file mode 100644
index 8f86f6fd85..0000000000
--- a/src/backends/reference/workloads/RefResizeBilinearWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefResizeBilinearWorkload : public BaseWorkload<ResizeBilinearQueueDescriptor>
-{
-public:
- using BaseWorkload<ResizeBilinearQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefResizeWorkload.cpp b/src/backends/reference/workloads/RefResizeWorkload.cpp
deleted file mode 100644
index 624b426cbf..0000000000
--- a/src/backends/reference/workloads/RefResizeWorkload.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefResizeWorkload.hpp"
-
-#include "RefWorkloadUtils.hpp"
-#include "Resize.hpp"
-#include "BaseIterator.hpp"
-#include "Profiling.hpp"
-
-#include "BaseIterator.hpp"
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn
-{
-
-void RefResizeWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefResizeWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- std::unique_ptr<Decoder<float>> decoderPtr = MakeDecoder<float>(inputInfo, m_Data.m_Inputs[0]->Map());
- Decoder<float> &decoder = *decoderPtr;
- std::unique_ptr<Encoder<float>> encoderPtr = MakeEncoder<float>(outputInfo, m_Data.m_Outputs[0]->Map());
- Encoder<float> &encoder = *encoderPtr;
-
- Resize(decoder,
- inputInfo,
- encoder,
- outputInfo,
- m_Data.m_Parameters.m_DataLayout,
- m_Data.m_Parameters.m_Method,
- m_Data.m_Parameters.m_BilinearAlignCorners);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefResizeWorkload.hpp b/src/backends/reference/workloads/RefResizeWorkload.hpp
deleted file mode 100644
index 1ddfcdfba8..0000000000
--- a/src/backends/reference/workloads/RefResizeWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefResizeWorkload : public BaseWorkload<ResizeQueueDescriptor>
-{
-public:
- using BaseWorkload<ResizeQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefSliceWorkload.cpp b/src/backends/reference/workloads/RefSliceWorkload.cpp
deleted file mode 100644
index 2e448450c1..0000000000
--- a/src/backends/reference/workloads/RefSliceWorkload.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefSliceWorkload.hpp"
-
-#include "RefWorkloadUtils.hpp"
-#include "Slice.hpp"
-
-#include <Profiling.hpp>
-
-namespace armnn
-{
-
-void RefSliceWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSliceWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
-
- Slice(inputInfo,
- m_Data.m_Parameters,
- m_Data.m_Inputs[0]->Map(),
- m_Data.m_Outputs[0]->Map(),
- GetDataTypeSize(inputInfo.GetDataType()));
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefSliceWorkload.hpp b/src/backends/reference/workloads/RefSliceWorkload.hpp
deleted file mode 100644
index 006c7b775d..0000000000
--- a/src/backends/reference/workloads/RefSliceWorkload.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefSliceWorkload : public BaseWorkload<SliceQueueDescriptor>
-{
-public:
- using BaseWorkload<SliceQueueDescriptor>::BaseWorkload;
-
- virtual void Execute() const override;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefSoftmaxWorkload.cpp b/src/backends/reference/workloads/RefSoftmaxWorkload.cpp
deleted file mode 100644
index 0f6f837785..0000000000
--- a/src/backends/reference/workloads/RefSoftmaxWorkload.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefSoftmaxWorkload.hpp"
-
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Softmax.hpp"
-
-#include "Profiling.hpp"
-
-#include <vector>
-
-namespace armnn
-{
-
-void RefSoftmaxWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSoftmaxWorkload_Execute");
-
- const TensorInfo &inputTensorInfo = GetTensorInfo(m_Data.m_Inputs[0]);
-
- std::unique_ptr<Decoder<float>> decoderPtr = MakeDecoder<float>(inputTensorInfo, m_Data.m_Inputs[0]->Map());
- Decoder<float> &decoder = *decoderPtr;
-
- const TensorInfo &outputTensorInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- std::unique_ptr<Encoder<float>> encoderPtr = MakeEncoder<float>(outputTensorInfo, m_Data.m_Outputs[0]->Map());
- Encoder<float> &encoder = *encoderPtr;
-
- Softmax(decoder,
- encoder,
- inputTensorInfo,
- m_Data.m_Parameters.m_Beta,
- m_Data.m_Parameters.m_Axis);
-}
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefSoftmaxWorkload.hpp b/src/backends/reference/workloads/RefSoftmaxWorkload.hpp
deleted file mode 100644
index cf3623bf40..0000000000
--- a/src/backends/reference/workloads/RefSoftmaxWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefSoftmaxWorkload : public BaseWorkload<SoftmaxQueueDescriptor>
-{
-public:
- using BaseWorkload<SoftmaxQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefSpaceToBatchNdWorkload.cpp b/src/backends/reference/workloads/RefSpaceToBatchNdWorkload.cpp
deleted file mode 100644
index 1a721fe389..0000000000
--- a/src/backends/reference/workloads/RefSpaceToBatchNdWorkload.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefSpaceToBatchNdWorkload.hpp"
-#include "SpaceToBatchNd.hpp"
-
-#include "RefWorkloadUtils.hpp"
-#include <ResolveType.hpp>
-
-namespace armnn
-{
-
-void RefSpaceToBatchNdWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSpaceToBatchNdWorkload_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());
-
- SpaceToBatchNd(inputInfo, outputInfo, m_Data.m_Parameters, *decoder, *encoder);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefSpaceToBatchNdWorkload.hpp b/src/backends/reference/workloads/RefSpaceToBatchNdWorkload.hpp
deleted file mode 100644
index 940b910812..0000000000
--- a/src/backends/reference/workloads/RefSpaceToBatchNdWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-
-#include <armnn/TypesUtils.hpp>
-
-namespace armnn
-{
-
-class RefSpaceToBatchNdWorkload : public BaseWorkload<SpaceToBatchNdQueueDescriptor>
-{
-public:
- using BaseWorkload<SpaceToBatchNdQueueDescriptor>::BaseWorkload;
- void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefSpaceToDepthWorkload.cpp b/src/backends/reference/workloads/RefSpaceToDepthWorkload.cpp
deleted file mode 100644
index 1b12272506..0000000000
--- a/src/backends/reference/workloads/RefSpaceToDepthWorkload.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// 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
deleted file mode 100644
index 89e5585249..0000000000
--- a/src/backends/reference/workloads/RefSpaceToDepthWorkload.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// 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/RefSplitterWorkload.cpp b/src/backends/reference/workloads/RefSplitterWorkload.cpp
deleted file mode 100644
index ffe4eb880b..0000000000
--- a/src/backends/reference/workloads/RefSplitterWorkload.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefSplitterWorkload.hpp"
-#include "Splitter.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Profiling.hpp"
-
-namespace armnn
-{
-
-void RefSplitterWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefSplitterWorkload_Execute");
- Split(m_Data);
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefSplitterWorkload.hpp b/src/backends/reference/workloads/RefSplitterWorkload.hpp
deleted file mode 100644
index 95cc4a5db7..0000000000
--- a/src/backends/reference/workloads/RefSplitterWorkload.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn
-{
-
-class RefSplitterWorkload : public BaseWorkload<SplitterQueueDescriptor>
-{
-public:
- using BaseWorkload<SplitterQueueDescriptor>::BaseWorkload;
- virtual void Execute() const override;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefStackWorkload.cpp b/src/backends/reference/workloads/RefStackWorkload.cpp
deleted file mode 100644
index be36f40633..0000000000
--- a/src/backends/reference/workloads/RefStackWorkload.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefStackWorkload.hpp"
-
-#include "RefWorkloadUtils.hpp"
-#include "Stack.hpp"
-
-#include <Profiling.hpp>
-
-namespace armnn
-{
-
-RefStackWorkload::RefStackWorkload(const StackQueueDescriptor& descriptor,
- const WorkloadInfo& info)
- : BaseWorkload(descriptor, info)
-{}
-
-void RefStackWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefStackWorkload_Execute");
-
- // Can perform a simple concatenation when axis == 0
- if (!m_Data.m_Parameters.m_Axis)
- {
- float* output = GetOutputTensorData<float>(0, m_Data);
- BOOST_ASSERT(output != nullptr);
-
- unsigned int numInputs = m_Data.m_Parameters.m_NumInputs;
- unsigned int inputLength = GetTensorInfo(m_Data.m_Inputs[0]).GetNumElements();
-
- for (unsigned int inputIdx=0; inputIdx<numInputs; ++inputIdx)
- {
- const float* input = GetInputTensorData<float>(inputIdx, m_Data);
- for (unsigned int elmt=0; elmt<inputLength; ++elmt)
- {
- output[(inputIdx * inputLength) + elmt] = input[elmt];
- }
- }
- return;
- }
-
- std::vector<std::unique_ptr<Decoder<float>>> inputDecoders;
- for (unsigned int i=0; i<m_Data.m_Inputs.size(); ++i)
- {
- inputDecoders.push_back(MakeDecoder<float>(GetTensorInfo(m_Data.m_Inputs[i]),
- m_Data.m_Inputs[i]->Map()));
- }
- std::unique_ptr<Encoder<float>> outputEncoder = MakeEncoder<float>(GetTensorInfo(m_Data.m_Outputs[0]),
- m_Data.m_Outputs[0]->Map());
-
- Stack(m_Data, inputDecoders, *outputEncoder);
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefStackWorkload.hpp b/src/backends/reference/workloads/RefStackWorkload.hpp
deleted file mode 100644
index ceb27d9f60..0000000000
--- a/src/backends/reference/workloads/RefStackWorkload.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-class RefStackWorkload : public BaseWorkload<StackQueueDescriptor>
-{
-public:
- explicit RefStackWorkload(const StackQueueDescriptor& descriptor,
- const WorkloadInfo& info);
- virtual void Execute() const override;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefStridedSliceWorkload.cpp b/src/backends/reference/workloads/RefStridedSliceWorkload.cpp
deleted file mode 100644
index 8bb1670a48..0000000000
--- a/src/backends/reference/workloads/RefStridedSliceWorkload.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefStridedSliceWorkload.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "StridedSlice.hpp"
-
-#include <boost/format.hpp>
-
-namespace armnn
-{
-
-RefStridedSliceWorkload::RefStridedSliceWorkload(const StridedSliceQueueDescriptor& descriptor,
- const WorkloadInfo& info)
- : BaseWorkload(descriptor, info)
-{}
-
-void RefStridedSliceWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefStridedSliceWorkload_Execute");
-
- const TensorInfo& inputInfo = GetTensorInfo(m_Data.m_Inputs[0]);
- const TensorInfo& outputInfo = GetTensorInfo(m_Data.m_Outputs[0]);
-
- DataType inputDataType = inputInfo.GetDataType();
- DataType outputDataType = outputInfo.GetDataType();
-
- BOOST_ASSERT(inputDataType == outputDataType);
- boost::ignore_unused(outputDataType);
-
- StridedSlice(inputInfo,
- m_Data.m_Parameters,
- m_Data.m_Inputs[0]->Map(),
- m_Data.m_Outputs[0]->Map(),
- GetDataTypeSize(inputDataType));
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefStridedSliceWorkload.hpp b/src/backends/reference/workloads/RefStridedSliceWorkload.hpp
deleted file mode 100644
index 44aabc0106..0000000000
--- a/src/backends/reference/workloads/RefStridedSliceWorkload.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/Workload.hpp>
-
-namespace armnn
-{
-
-class RefStridedSliceWorkload : public BaseWorkload<StridedSliceQueueDescriptor>
-{
-public:
- RefStridedSliceWorkload(const StridedSliceQueueDescriptor& descriptor, const WorkloadInfo& info);
- void Execute() const override;
-};
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/RefTransposeConvolution2dWorkload.cpp b/src/backends/reference/workloads/RefTransposeConvolution2dWorkload.cpp
deleted file mode 100644
index 2ab76041ef..0000000000
--- a/src/backends/reference/workloads/RefTransposeConvolution2dWorkload.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefTransposeConvolution2dWorkload.hpp"
-
-#include "RefWorkloadUtils.hpp"
-#include "TransposeConvolution2d.hpp"
-
-#include <Profiling.hpp>
-
-namespace armnn
-{
-
-RefTransposeConvolution2dWorkload::RefTransposeConvolution2dWorkload(
- const TransposeConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) :
- BaseWorkload<TransposeConvolution2dQueueDescriptor>(descriptor, info)
-{
- // set up weights decoder
- m_Weights = std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Weight));
- const TensorInfo& weightsInfo = m_Weights->GetTensorInfo();
-
- m_WeightsDecoder = MakeDecoder<float>(weightsInfo, m_Weights->Map(true));
- m_WeightsShape = weightsInfo.GetShape();
-
- // set up biases decoder
- if (descriptor.m_Parameters.m_BiasEnabled)
- {
- m_Biases = std::make_unique<ScopedCpuTensorHandle>(*(descriptor.m_Bias));
- const TensorInfo& biasesInfo = m_Biases->GetTensorInfo();
- m_BiasesDecoder = MakeDecoder<float>(biasesInfo, m_Biases->Map(true));
- }
-}
-
-void RefTransposeConvolution2dWorkload::PostAllocationConfigure()
-{
- // set up input decoder
- const ITensorHandle* input = m_Data.m_Inputs[0];
- const TensorInfo& inputInfo = GetTensorInfo(input);
-
- m_InputShape = inputInfo.GetShape();
- m_InputDecoder = MakeDecoder<float>(inputInfo);
-
- // set up output encoder
- ITensorHandle* output = m_Data.m_Outputs[0];
- const TensorInfo& outputInfo = GetTensorInfo(output);
-
- m_OutputShape = outputInfo.GetShape();
- m_OutputEncoder = MakeEncoder<float>(outputInfo);
-}
-
-void RefTransposeConvolution2dWorkload::Execute() const
-{
- ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefTransposeConvolution2dWorkload_Execute");
-
- m_InputDecoder->Reset(m_Data.m_Inputs[0]->Map());
- m_OutputEncoder->Reset(m_Data.m_Outputs[0]->Map());
-
- TransposeConvolution2dImpl(m_Data.m_Parameters,
- m_InputShape,
- *m_InputDecoder,
- m_OutputShape,
- *m_OutputEncoder,
- m_WeightsShape,
- *m_WeightsDecoder,
- m_BiasesDecoder.get());
-}
-
-} // namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/RefTransposeConvolution2dWorkload.hpp b/src/backends/reference/workloads/RefTransposeConvolution2dWorkload.hpp
deleted file mode 100644
index 9ded8c971f..0000000000
--- a/src/backends/reference/workloads/RefTransposeConvolution2dWorkload.hpp
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-#include <backendsCommon/CpuTensorHandle.hpp>
-#include <backendsCommon/Workload.hpp>
-
-namespace armnn
-{
-
-class RefTransposeConvolution2dWorkload : public BaseWorkload<TransposeConvolution2dQueueDescriptor>
-{
-public:
- RefTransposeConvolution2dWorkload(const TransposeConvolution2dQueueDescriptor& descriptor,
- const WorkloadInfo& info);
- ~RefTransposeConvolution2dWorkload() = default;
-
- void PostAllocationConfigure() override;
-
- void Execute() const override;
-
-private:
- std::unique_ptr<ScopedCpuTensorHandle> m_Weights;
- std::unique_ptr<ScopedCpuTensorHandle> m_Biases;
-
- std::unique_ptr<Decoder<float>> m_InputDecoder;
- std::unique_ptr<Encoder<float>> m_OutputEncoder;
-
- std::unique_ptr<Decoder<float>> m_WeightsDecoder;
- std::unique_ptr<Decoder<float>> m_BiasesDecoder;
-
- TensorShape m_InputShape;
- TensorShape m_OutputShape;
- TensorShape m_WeightsShape;
-};
-
-} // namespace armnn \ No newline at end of file
diff --git a/src/backends/reference/workloads/RefWorkloadUtils.hpp b/src/backends/reference/workloads/RefWorkloadUtils.hpp
deleted file mode 100644
index c3260c8142..0000000000
--- a/src/backends/reference/workloads/RefWorkloadUtils.hpp
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <backendsCommon/CpuTensorHandle.hpp>
-
-#include <armnn/Tensor.hpp>
-#include <armnn/Types.hpp>
-
-#include <reference/RefTensorHandle.hpp>
-
-#include <Half.hpp>
-#include <boost/polymorphic_cast.hpp>
-
-namespace armnn
-{
-
-////////////////////////////////////////////
-/// float32 helpers
-////////////////////////////////////////////
-
-inline const TensorInfo& GetTensorInfo(const ITensorHandle* tensorHandle)
-{
- // We know that reference workloads use RefTensorHandles for inputs and outputs
- const RefTensorHandle* refTensorHandle =
- boost::polymorphic_downcast<const RefTensorHandle*>(tensorHandle);
- return refTensorHandle->GetTensorInfo();
-}
-
-template <typename DataType, typename PayloadType>
-const DataType* GetInputTensorData(unsigned int idx, const PayloadType& data)
-{
- const ITensorHandle* tensorHandle = data.m_Inputs[idx];
- return reinterpret_cast<const DataType*>(tensorHandle->Map());
-}
-
-template <typename DataType, typename PayloadType>
-DataType* GetOutputTensorData(unsigned int idx, const PayloadType& data)
-{
- ITensorHandle* tensorHandle = data.m_Outputs[idx];
- return reinterpret_cast<DataType*>(tensorHandle->Map());
-}
-
-template <typename PayloadType>
-const float* GetInputTensorDataFloat(unsigned int idx, const PayloadType& data)
-{
- return GetInputTensorData<float>(idx, data);
-}
-
-template <typename PayloadType>
-float* GetOutputTensorDataFloat(unsigned int idx, const PayloadType& data)
-{
- return GetOutputTensorData<float>(idx, data);
-}
-
-template <typename PayloadType>
-const Half* GetInputTensorDataHalf(unsigned int idx, const PayloadType& data)
-{
- return GetInputTensorData<Half>(idx, data);
-}
-
-template <typename PayloadType>
-Half* GetOutputTensorDataHalf(unsigned int idx, const PayloadType& data)
-{
- return GetOutputTensorData<Half>(idx, data);
-}
-
-////////////////////////////////////////////
-/// u8 helpers
-////////////////////////////////////////////
-
-template<typename T>
-std::vector<float> Dequantize(const T* quant, const TensorInfo& info)
-{
- std::vector<float> ret(info.GetNumElements());
- for (size_t i = 0; i < info.GetNumElements(); i++)
- {
- ret[i] = armnn::Dequantize(quant[i], info.GetQuantizationScale(), info.GetQuantizationOffset());
- }
- return ret;
-}
-
-template<typename T>
-inline void Dequantize(const T* inputData, float* outputData, const TensorInfo& info)
-{
- for (unsigned int i = 0; i < info.GetNumElements(); i++)
- {
- outputData[i] = Dequantize<T>(inputData[i], info.GetQuantizationScale(), info.GetQuantizationOffset());
- }
-}
-
-inline void Quantize(uint8_t* quant, const float* dequant, const TensorInfo& info)
-{
- for (size_t i = 0; i < info.GetNumElements(); i++)
- {
- quant[i] = armnn::Quantize<uint8_t>(dequant[i], info.GetQuantizationScale(), info.GetQuantizationOffset());
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/RefWorkloads.hpp b/src/backends/reference/workloads/RefWorkloads.hpp
deleted file mode 100644
index 7034b67aa5..0000000000
--- a/src/backends/reference/workloads/RefWorkloads.hpp
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "Activation.hpp"
-#include "ArgMinMax.hpp"
-#include "BatchNormImpl.hpp"
-#include "ConvImpl.hpp"
-#include "Concatenate.hpp"
-#include "ElementwiseFunction.hpp"
-#include "FullyConnected.hpp"
-#include "Gather.hpp"
-#include "Pooling2d.hpp"
-#include "RefActivationWorkload.hpp"
-#include "RefArgMinMaxWorkload.hpp"
-#include "RefBatchNormalizationWorkload.hpp"
-#include "RefBatchToSpaceNdWorkload.hpp"
-#include "RefComparisonWorkload.hpp"
-#include "RefConvolution2dWorkload.hpp"
-#include "RefConstantWorkload.hpp"
-#include "RefConcatWorkload.hpp"
-#include "RefConvertFp16ToFp32Workload.hpp"
-#include "RefConvertFp32ToFp16Workload.hpp"
-#include "RefDebugWorkload.hpp"
-#include "RefDepthToSpaceWorkload.hpp"
-#include "RefDepthwiseConvolution2dWorkload.hpp"
-#include "RefDequantizeWorkload.hpp"
-#include "RefDetectionPostProcessWorkload.hpp"
-#include "RefDequantizeWorkload.hpp"
-#include "RefElementwiseWorkload.hpp"
-#include "RefElementwiseUnaryWorkload.hpp"
-#include "RefFullyConnectedWorkload.hpp"
-#include "RefFloorWorkload.hpp"
-#include "RefFakeQuantizationFloat32Workload.hpp"
-#include "RefGatherWorkload.hpp"
-#include "RefInstanceNormalizationWorkload.hpp"
-#include "RefL2NormalizationWorkload.hpp"
-#include "RefLogSoftmaxWorkload.hpp"
-#include "RefLstmWorkload.hpp"
-#include "RefMeanWorkload.hpp"
-#include "RefNormalizationWorkload.hpp"
-#include "RefPooling2dWorkload.hpp"
-#include "RefPermuteWorkload.hpp"
-#include "RefPadWorkload.hpp"
-#include "RefPreluWorkload.hpp"
-#include "RefQuantizeWorkload.hpp"
-#include "RefReshapeWorkload.hpp"
-#include "RefResizeBilinearWorkload.hpp"
-#include "RefResizeWorkload.hpp"
-#include "RefSliceWorkload.hpp"
-#include "RefSplitterWorkload.hpp"
-#include "RefSoftmaxWorkload.hpp"
-#include "RefSpaceToBatchNdWorkload.hpp"
-#include "RefStackWorkload.hpp"
-#include "RefStridedSliceWorkload.hpp"
-#include "RefSpaceToDepthWorkload.hpp"
-#include "RefTransposeConvolution2dWorkload.hpp"
-#include "RefWorkloadUtils.hpp"
-#include "Resize.hpp"
-#include "Softmax.hpp"
-#include "Splitter.hpp"
-#include "TensorBufferArrayView.hpp"
diff --git a/src/backends/reference/workloads/Resize.cpp b/src/backends/reference/workloads/Resize.cpp
deleted file mode 100644
index a26e34a1ff..0000000000
--- a/src/backends/reference/workloads/Resize.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Resize.hpp"
-
-#include "TensorBufferArrayView.hpp"
-
-#include <boost/numeric/conversion/cast.hpp>
-
-#include <cmath>
-#include <algorithm>
-
-using namespace armnnUtils;
-
-namespace armnn
-{
-
-namespace
-{
-
-inline float Lerp(float a, float b, float w)
-{
- return w * b + (1.f - w) * a;
-}
-
-inline double EuclideanDistance(float Xa, float Ya, const unsigned int Xb, const unsigned int Yb)
-{
- return std::sqrt(pow(Xa - boost::numeric_cast<float>(Xb), 2) + pow(Ya - boost::numeric_cast<float>(Yb), 2));
-}
-
-}// anonymous namespace
-
-void Resize(Decoder<float>& in,
- const TensorInfo& inputInfo,
- Encoder<float>& out,
- const TensorInfo& outputInfo,
- DataLayoutIndexed dataLayout,
- armnn::ResizeMethod resizeMethod,
- bool alignCorners)
-{
- // We follow the definition of TensorFlow and AndroidNN: the top-left corner of a texel in the output
- // image is projected into the input image to figure out the interpolants and weights. Note that this
- // will yield different results than if projecting the centre of output texels.
-
- const unsigned int batchSize = inputInfo.GetShape()[0];
- const unsigned int channelCount = inputInfo.GetShape()[dataLayout.GetChannelsIndex()];
-
- const unsigned int inputHeight = inputInfo.GetShape()[dataLayout.GetHeightIndex()];
- const unsigned int inputWidth = inputInfo.GetShape()[dataLayout.GetWidthIndex()];
- const unsigned int outputHeight = outputInfo.GetShape()[dataLayout.GetHeightIndex()];
- const unsigned int outputWidth = outputInfo.GetShape()[dataLayout.GetWidthIndex()];
-
- const unsigned int sizeOffset = resizeMethod == armnn::ResizeMethod::Bilinear && alignCorners ? 1 : 0;
-
- // How much to scale pixel coordinates in the output image, to get the corresponding pixel coordinates
- // in the input image.
- const float scaleY = boost::numeric_cast<float>(inputHeight - sizeOffset)
- / boost::numeric_cast<float>(outputHeight - sizeOffset);
- const float scaleX = boost::numeric_cast<float>(inputWidth - sizeOffset)
- / boost::numeric_cast<float>(outputWidth - sizeOffset);
-
- TensorShape inputShape = inputInfo.GetShape();
- TensorShape outputShape = outputInfo.GetShape();
-
- for (unsigned int n = 0; n < batchSize; ++n)
- {
- for (unsigned int c = 0; c < channelCount; ++c)
- {
- for (unsigned int y = 0; y < outputHeight; ++y)
- {
- // Corresponding real-valued height coordinate in input image.
- const float iy = boost::numeric_cast<float>(y) * scaleY;
-
- // Discrete height coordinate of top-left texel (in the 2x2 texel area used for interpolation).
- const float fiy = floorf(iy);
- const unsigned int y0 = boost::numeric_cast<unsigned int>(fiy);
-
- // Interpolation weight (range [0,1]).
- const float yw = iy - fiy;
-
- for (unsigned int x = 0; x < outputWidth; ++x)
- {
- // Real-valued and discrete width coordinates in input image.
- const float ix = boost::numeric_cast<float>(x) * scaleX;
- const float fix = floorf(ix);
- const unsigned int x0 = boost::numeric_cast<unsigned int>(fix);
-
- // Interpolation weight (range [0,1]).
- const float xw = ix - fix;
-
- // Discrete width/height coordinates of texels below and to the right of (x0, y0).
- const unsigned int x1 = std::min(x0 + 1, inputWidth - 1u);
- const unsigned int y1 = std::min(y0 + 1, inputHeight - 1u);
-
- float interpolatedValue;
- switch (resizeMethod)
- {
- case armnn::ResizeMethod::Bilinear:
- {
- 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.
- interpolatedValue = Lerp(ly0, ly1, yw);
- break;
- }
- case armnn::ResizeMethod::NearestNeighbor:
- {
- // calculate euclidean distance to the 4 neighbours
- auto distance00 = EuclideanDistance(fix, fiy, x0, y0);
- auto distance01 = EuclideanDistance(fix, fiy, x0, y1);
- auto distance10 = EuclideanDistance(fix, fiy, x1, y0);
- auto distance11 = EuclideanDistance(fix, fiy, x1, y1);
-
- auto minimum = std::min( { distance00, distance01, distance10, distance11 } );
-
- unsigned int xNearest = 0;
- unsigned int yNearest = 0;
-
- if (minimum == distance00)
- {
- xNearest = x0;
- yNearest = y0;
- }
- else if (minimum == distance01)
- {
- xNearest = x0;
- yNearest = y1;
- }
- else if (minimum == distance10)
- {
- xNearest = x1;
- yNearest = y0;
- }
- else if (minimum == distance11)
- {
- xNearest = x1;
- yNearest = y1;
- }
- else
- {
- throw armnn::InvalidArgumentException("Resize Nearest Neighbor failure");
- }
-
- in[dataLayout.GetIndex(inputShape, n, c, yNearest, xNearest)];
- interpolatedValue = in.Get();
- break;
- }
- default:
- throw armnn::InvalidArgumentException("Unknown resize method: " +
- std::to_string(static_cast<int>(resizeMethod)));
- }
- out[dataLayout.GetIndex(outputShape, n, c, y, x)];
- out.Set(interpolatedValue);
- }
- }
- }
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Resize.hpp b/src/backends/reference/workloads/Resize.hpp
deleted file mode 100644
index cd8835fa08..0000000000
--- a/src/backends/reference/workloads/Resize.hpp
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-
-#include <armnn/Tensor.hpp>
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-namespace armnn
-{
-
-void Resize(Decoder<float>& in,
- const TensorInfo& inputInfo,
- Encoder<float>& out,
- const TensorInfo& outputInfo,
- armnnUtils::DataLayoutIndexed dataLayout = DataLayout::NCHW,
- ResizeMethod resizeMethod = ResizeMethod::NearestNeighbor,
- bool alignConers = false);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/Rsqrt.hpp b/src/backends/reference/workloads/Rsqrt.hpp
deleted file mode 100644
index 47ebcf36f6..0000000000
--- a/src/backends/reference/workloads/Rsqrt.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <iostream>
-
-namespace armnn
-{
- template<typename T>
-struct rsqrt : public std::unary_function<T, T>
- {
- T
- operator () (const T& inputData) const
- {
- return 1 / std::sqrt(inputData);
- }
- };
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Slice.cpp b/src/backends/reference/workloads/Slice.cpp
deleted file mode 100644
index c7ca3b156e..0000000000
--- a/src/backends/reference/workloads/Slice.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Slice.hpp"
-
-#include <boost/assert.hpp>
-#include <boost/core/ignore_unused.hpp>
-#include <boost/numeric/conversion/cast.hpp>
-
-namespace armnn
-{
-
-void Slice(const TensorInfo& inputInfo,
- const SliceDescriptor& descriptor,
- const void* inputData,
- void* outputData,
- unsigned int dataTypeSize)
-{
- const TensorShape& inputShape = inputInfo.GetShape();
- const unsigned int numDims = inputShape.GetNumDimensions();
-
- BOOST_ASSERT(descriptor.m_Begin.size() == numDims);
- BOOST_ASSERT(descriptor.m_Size.size() == numDims);
-
- constexpr unsigned int maxNumDims = 4;
- BOOST_ASSERT(numDims <= maxNumDims);
-
- std::vector<unsigned int> paddedInput(4);
- std::vector<unsigned int> paddedBegin(4);
- std::vector<unsigned int> paddedSize (4);
-
- const unsigned int numPaddingDims = maxNumDims - numDims;
- for (unsigned int i = 0u; i < maxNumDims; ++i)
- {
- if (i < numPaddingDims)
- {
- paddedInput[i] = 1u;
- paddedBegin[i] = 0u;
- paddedSize[i] = 1u;
- }
- else
- {
- const unsigned int j = i - numPaddingDims;
- paddedInput[i] = inputShape[j];
- paddedBegin[i] = descriptor.m_Begin[j];
- paddedSize[i] = descriptor.m_Size[j];
- }
- }
-
- unsigned int dim0 = paddedInput[0];
- unsigned int dim1 = paddedInput[1];
- unsigned int dim2 = paddedInput[2];
- unsigned int dim3 = paddedInput[3];
-
- unsigned int begin0 = paddedBegin[0];
- unsigned int begin1 = paddedBegin[1];
- unsigned int begin2 = paddedBegin[2];
- unsigned int begin3 = paddedBegin[3];
-
- unsigned int size0 = paddedSize[0];
- unsigned int size1 = paddedSize[1];
- unsigned int size2 = paddedSize[2];
- unsigned int size3 = paddedSize[3];
-
- BOOST_ASSERT(begin0 + size0 <= dim0);
- BOOST_ASSERT(begin1 + size1 <= dim1);
- BOOST_ASSERT(begin2 + size2 <= dim2);
- BOOST_ASSERT(begin3 + size3 <= dim3);
-
- const unsigned char* input = reinterpret_cast<const unsigned char*>(inputData);
- unsigned char* output = reinterpret_cast<unsigned char*>(outputData);
-
- boost::ignore_unused(dim0);
- for (unsigned int idx0 = begin0; idx0 < begin0 + size0; ++idx0)
- {
- for (unsigned int idx1 = begin1; idx1 < begin1 + size1; ++idx1)
- {
- for (unsigned int idx2 = begin2; idx2 < begin2 + size2; ++idx2)
- {
- for (unsigned int idx3 = begin3; idx3 < begin3 + size3; ++idx3)
- {
- const unsigned int inputOffset =
- (((idx0 * dim1 + idx1) * dim2 + idx2) * dim3 + idx3) * dataTypeSize;
-
- ::memcpy(output, input + inputOffset, dataTypeSize);
- output += dataTypeSize;
- }
- }
- }
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/Slice.hpp b/src/backends/reference/workloads/Slice.hpp
deleted file mode 100644
index 8559eb890e..0000000000
--- a/src/backends/reference/workloads/Slice.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/Descriptors.hpp>
-
-#include "BaseIterator.hpp"
-
-
-namespace armnn
-{
-
-void Slice(const TensorInfo& inputInfo,
- const SliceDescriptor& descriptor,
- const void* inputData,
- void* outputData,
- unsigned int dataTypeSize);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/Softmax.cpp b/src/backends/reference/workloads/Softmax.cpp
deleted file mode 100644
index 5036389a10..0000000000
--- a/src/backends/reference/workloads/Softmax.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Softmax.hpp"
-
-#include <armnnUtils/TensorUtils.hpp>
-
-#include <cmath>
-#include <vector>
-
-namespace armnn
-{
-
-/// Computes the softmax function on some inputs, into outputs, with a shape given by tensorInfo.
-void Softmax(Decoder<float>& in, Encoder<float>& out, const TensorInfo& inputTensorInfo, float beta, int axis)
-{
- BOOST_ASSERT_MSG(axis < static_cast<int>(inputTensorInfo.GetNumDimensions()),
- "Required axis index greater than number of dimensions.");
- BOOST_ASSERT_MSG(axis >= -static_cast<int>(inputTensorInfo.GetNumDimensions()),
- "Required axis index lower than negative of the number of dimensions");
-
- unsigned int uAxis = axis < 0 ?
- inputTensorInfo.GetNumDimensions() - static_cast<unsigned int>(abs(axis))
- : static_cast<unsigned int>(axis);
-
- const TensorShape& inputShape = inputTensorInfo.GetShape();
- const unsigned int outerSize = armnnUtils::GetNumElementsBetween(inputShape, 0, uAxis);
- const unsigned int axisSize = inputShape[uAxis];
- const unsigned int innerSize = armnnUtils::GetNumElementsBetween(inputShape,
- uAxis + 1,
- inputShape.GetNumDimensions());
-
- for (unsigned int outer = 0; outer < outerSize; ++outer)
- {
- unsigned int inputBeginIdx = outer * axisSize * innerSize;
- unsigned int inputEndIdx = inputBeginIdx + axisSize * innerSize;
- unsigned int outputBeginIdx = outer * axisSize * innerSize;
-
- for (unsigned int inner = 0; inner < innerSize; ++inner, ++inputBeginIdx, ++inputEndIdx, ++outputBeginIdx)
- {
- // Find max
- float maxValue = std::numeric_limits<float>::lowest();
- for (unsigned int iter = inputBeginIdx; iter < inputEndIdx; iter += innerSize)
- {
- in[iter];
- maxValue = std::max(maxValue, in.Get());
- }
-
- // Compute sum
- float sum = 0.0f;
- for (unsigned int iter = inputBeginIdx; iter < inputEndIdx; iter += innerSize)
- {
- in[iter];
- sum += std::exp((in.Get() - maxValue) * beta);
- }
-
- // Compute result
- unsigned int outputIter = outputBeginIdx;
- out[outputIter];
- for (unsigned int iter = inputBeginIdx; iter < inputEndIdx; iter += innerSize, outputIter += innerSize)
- {
- out[outputIter];
- in[iter];
- out.Set(std::exp((in.Get() - maxValue) * beta) / sum);
- }
- }
- }
-}
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Softmax.hpp b/src/backends/reference/workloads/Softmax.hpp
deleted file mode 100644
index 25c7449474..0000000000
--- a/src/backends/reference/workloads/Softmax.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "BaseIterator.hpp"
-#include <armnn/Tensor.hpp>
-
-namespace armnn
-{
-
-/// Computes the softmax function on some inputs, into outputs, with a shape given by tensorInfo.
-void Softmax(Decoder<float>& in, Encoder<float>& out, const TensorInfo& inputTensorInfo, float beta, int axis = -1);
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/SpaceToBatchNd.cpp b/src/backends/reference/workloads/SpaceToBatchNd.cpp
deleted file mode 100644
index b6bab17367..0000000000
--- a/src/backends/reference/workloads/SpaceToBatchNd.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "SpaceToBatchNd.hpp"
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-using namespace armnnUtils;
-
-namespace armnn
-{
-
-unsigned int GetOffset(const TensorShape& shape,
- unsigned int b,
- unsigned int h,
- unsigned int w,
- unsigned int c,
- const DataLayoutIndexed& dataLayout)
-{
- if (dataLayout.GetDataLayout() == 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;
- }
-}
-
-void SpaceToBatchNd(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- const SpaceToBatchNdDescriptor& 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 channels = inputShape[dataLayout.GetChannelsIndex()];
-
- const unsigned int inputBatchSize = inputShape[0];
- const unsigned int inputHeight = inputShape[dataLayout.GetHeightIndex()];
- const unsigned int inputWidth = inputShape[dataLayout.GetWidthIndex()];
-
- const unsigned int outputBatchSize = outputShape[0];
- const unsigned int outputHeight = outputShape[dataLayout.GetHeightIndex()];
- const unsigned int outputWidth = outputShape[dataLayout.GetWidthIndex()];
-
- const unsigned int blockHeight = params.m_BlockShape[0];
- const unsigned int blockWidth = params.m_BlockShape[1];
-
- const unsigned int paddingTop = params.m_PadList[0].first;
- const unsigned int paddingLeft = params.m_PadList[1].first;
-
- for (unsigned int outB = 0; outB < outputBatchSize; outB++)
- {
- unsigned int inB = outB % inputBatchSize;
-
- unsigned int shiftW = (outB / inputBatchSize) % blockWidth;
- unsigned int shiftH = (outB / inputBatchSize) / blockWidth;
-
- for (unsigned int outH = 0; outH < outputHeight; outH++)
- {
- for (unsigned int outW = 0; outW < outputWidth; outW++)
- {
- if (outH * blockHeight + shiftH < paddingTop ||
- outH * blockHeight + shiftH >= paddingTop + inputHeight ||
- outW * blockWidth + shiftW < paddingLeft ||
- outW * blockWidth + shiftW >= paddingLeft + inputWidth)
- {
- for (unsigned int c = 0; c < channels; c++)
- {
- unsigned int outOffset = GetOffset(outputShape,
- outB,
- outH,
- outW,
- c,
- dataLayout);
- outputData += outOffset;
- outputData.Set(0);
- outputData -= outOffset;
- }
- }
- else
- {
- for (unsigned int c = 0; c < channels; c++)
- {
- unsigned int inOffset = GetOffset(inputShape,
- inB,
- (outH * blockHeight + shiftH) - paddingTop,
- (outW * blockWidth + shiftW) - paddingLeft,
- c,
- dataLayout);
-
- unsigned int outOffset = GetOffset(outputShape,
- outB,
- outH,
- outW,
- c,
- dataLayout);
-
- outputData += outOffset;
- inputData += inOffset;
- outputData.Set(inputData.Get());
- inputData -= inOffset;
- outputData -= outOffset;
- }
- }
- }
- }
- }
-}
-
-void SpaceToBatchNd(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- const SpaceToBatchNdDescriptor& params,
- Decoder<float>& inputData,
- Encoder<float>& outData);
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/SpaceToBatchNd.hpp b/src/backends/reference/workloads/SpaceToBatchNd.hpp
deleted file mode 100644
index 57c9b6bc25..0000000000
--- a/src/backends/reference/workloads/SpaceToBatchNd.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// 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 SpaceToBatchNd(const TensorInfo& inputInfo,
- const TensorInfo& outputInfo,
- const SpaceToBatchNdDescriptor& params,
- Decoder<float>& inputData,
- Encoder<float>& outputData);
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/SpaceToDepth.cpp b/src/backends/reference/workloads/SpaceToDepth.cpp
deleted file mode 100644
index 604a9051af..0000000000
--- a/src/backends/reference/workloads/SpaceToDepth.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "SpaceToDepth.hpp"
-
-#include <armnnUtils/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
deleted file mode 100644
index f855884e94..0000000000
--- a/src/backends/reference/workloads/SpaceToDepth.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// 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
diff --git a/src/backends/reference/workloads/Splitter.cpp b/src/backends/reference/workloads/Splitter.cpp
deleted file mode 100644
index 3bddfb0cab..0000000000
--- a/src/backends/reference/workloads/Splitter.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "RefWorkloadUtils.hpp"
-#include <backendsCommon/WorkloadData.hpp>
-#include <armnn/Tensor.hpp>
-
-#include <boost/assert.hpp>
-#include "Splitter.hpp"
-
-#include <cmath>
-#include <limits>
-
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-namespace armnn
-{
-
-void Split(const SplitterQueueDescriptor& data)
-{
- const TensorInfo& inputInfo = GetTensorInfo(data.m_Inputs[0]);
-
- std::unique_ptr<Decoder<float>> decoderPtr =
- MakeDecoder<float>(inputInfo, data.m_Inputs[0]->Map());
- Decoder<float>& decoder = *decoderPtr;
-
- for (unsigned int index = 0; index < inputInfo.GetNumElements(); ++index)
- {
- unsigned int indices[MaxNumOfTensorDimensions] = { 0 };
-
- unsigned int indexRemainder = index;
- unsigned int dimensionStride = inputInfo.GetNumElements();
-
- for (unsigned int i = 0; i<inputInfo.GetNumDimensions(); i++)
- {
- dimensionStride /= inputInfo.GetShape()[i];
- indices[i] = indexRemainder / dimensionStride; // Use integer division to round down.
- indexRemainder -= indices[i] * dimensionStride;
- }
-
- for (unsigned int viewIdx = 0; viewIdx < data.m_ViewOrigins.size(); ++viewIdx)
- {
- SplitterQueueDescriptor::ViewOrigin const& view = data.m_ViewOrigins[viewIdx];
-
- //Split view extents are defined by the size of (the corresponding) input tensor.
- const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[viewIdx]);
- BOOST_ASSERT(outputInfo.GetNumDimensions() == inputInfo.GetNumDimensions());
-
- // Check all dimensions to see if this element is inside the given input view.
- bool insideView = true;
- for (unsigned int i = 0; i<outputInfo.GetNumDimensions(); i++)
- {
- if (indices[i] < view.m_Origin[i])
- {
- insideView = false;
- }
- if (indices[i] >= view.m_Origin[i] + outputInfo.GetShape()[i])
- {
- insideView = false;
- }
- }
-
- if (insideView)
- {
- std::unique_ptr<Encoder<float>> encoderPtr =
- MakeEncoder<float>(outputInfo, data.m_Outputs[viewIdx]->Map());
- Encoder<float>& encoder = *encoderPtr;
-
- unsigned int outIndex = 0;
- unsigned int dimensionStride = 1;
- float inputValue = 0.f;
-
- for (unsigned int i = outputInfo.GetNumDimensions(); i-- > 0;)
- {
- outIndex += dimensionStride * (indices[i] - view.m_Origin[i]);
- dimensionStride *= outputInfo.GetShape()[i];
- }
-
- decoder += index;
- inputValue = decoder.Get();
- decoder -= index;
-
- encoder += outIndex;
- encoder.Set(inputValue);
- break;
- }
- }
- }
-}
-
-} \ No newline at end of file
diff --git a/src/backends/reference/workloads/Splitter.hpp b/src/backends/reference/workloads/Splitter.hpp
deleted file mode 100644
index 271c6fdeb8..0000000000
--- a/src/backends/reference/workloads/Splitter.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "RefWorkloadUtils.hpp"
-#include <backendsCommon/WorkloadData.hpp>
-#include <armnn/Tensor.hpp>
-#include <boost/assert.hpp>
-
-namespace armnn
-{
-
-template <typename DataType>
-void Splitter(const SplitterQueueDescriptor& data)
-{
- const TensorInfo& inputInfo0 = GetTensorInfo(data.m_Inputs[0]);
-
- for (unsigned int index = 0; index < inputInfo0.GetNumElements(); ++index)
- {
- unsigned int indices[MaxNumOfTensorDimensions] = { 0 };
-
- unsigned int indexRemainder = index;
- unsigned int dimensionStride = inputInfo0.GetNumElements();
-
- for (unsigned int i = 0; i<inputInfo0.GetNumDimensions(); i++)
- {
- dimensionStride /= inputInfo0.GetShape()[i];
- indices[i] = indexRemainder / dimensionStride; // Use integer division to round down.
- indexRemainder -= indices[i] * dimensionStride;
- }
-
- for (unsigned int viewIdx = 0; viewIdx < data.m_ViewOrigins.size(); ++viewIdx)
- {
- SplitterQueueDescriptor::ViewOrigin const& view = data.m_ViewOrigins[viewIdx];
-
- //Split view extents are defined by the size of (the corresponding) input tensor.
- const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[viewIdx]);
- BOOST_ASSERT(outputInfo.GetNumDimensions() == inputInfo0.GetNumDimensions());
-
- // Check all dimensions to see if this element is inside the given input view.
- bool insideView = true;
- for (unsigned int i = 0; i<outputInfo.GetNumDimensions(); i++)
- {
- if (indices[i] < view.m_Origin[i])
- {
- insideView = false;
- }
- if (indices[i] >= view.m_Origin[i] + outputInfo.GetShape()[i])
- {
- insideView = false;
- }
- }
-
- if (insideView)
- {
- unsigned int outIndex = 0;
- unsigned int dimensionStride = 1;
-
- for (unsigned int i = outputInfo.GetNumDimensions(); i-- > 0;)
- {
- outIndex += dimensionStride * (indices[i] - view.m_Origin[i]);
- dimensionStride *= outputInfo.GetShape()[i];
- }
-
- //We are within the view, to copy input data to the output corresponding to this view.
- DataType* outputData = GetOutputTensorData<DataType>(viewIdx, data);
- BOOST_ASSERT(outputData);
-
- const DataType* inputData = GetInputTensorData<DataType>(0, data);
- BOOST_ASSERT(inputData);
-
- outputData[outIndex] = inputData[index];
- }
- }
- }
-}
-
-void Split(const SplitterQueueDescriptor& data);
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Sqrt.hpp b/src/backends/reference/workloads/Sqrt.hpp
deleted file mode 100644
index e4ff6a4829..0000000000
--- a/src/backends/reference/workloads/Sqrt.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Copyright © 2019 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <iostream>
-
-namespace armnn
-{
- template<typename T>
-struct sqrt : public std::unary_function<T, T>
- {
- T
- operator () (const T& inputData) const
- {
- return std::sqrt(inputData);
- }
- };
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/Stack.cpp b/src/backends/reference/workloads/Stack.cpp
deleted file mode 100644
index 386c8992eb..0000000000
--- a/src/backends/reference/workloads/Stack.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "Stack.hpp"
-#include "RefWorkloadUtils.hpp"
-
-namespace armnn
-{
-
-void Stack(const StackQueueDescriptor& data,
- std::vector<std::unique_ptr<Decoder<float>>>& inputs,
- Encoder<float>& output)
-{
- const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[0]);
- const TensorInfo& inputInfo = GetTensorInfo(data.m_Inputs[0]);
-
- unsigned int outputNumDims = outputInfo.GetNumDimensions();
- unsigned int inputNumDims = inputInfo.GetNumDimensions();
-
- const armnn::TensorShape& outputDims = outputInfo.GetShape();
- const armnn::TensorShape& inputDims = inputInfo.GetShape();
-
- unsigned int axis = data.m_Parameters.m_Axis;
-
- // Initialise output data
- unsigned int numOutputElements = 1;
- for (unsigned int i=0; i<outputNumDims; ++i)
- {
- numOutputElements *= outputDims[i];
- }
-
- const unsigned int iNumTensors = static_cast<unsigned int>(data.m_Inputs.size());
- const unsigned int iBatchSize = inputDims[0];
- const unsigned int iChannels = (inputNumDims > 1) ? inputDims[1] : 1;
- const unsigned int iHeight = (inputNumDims > 2) ? inputDims[2] : 1;
- const unsigned int iWidth = (inputNumDims > 3) ? inputDims[3] : 1;
-
- const unsigned int oBatchSize = outputDims[1];
- const unsigned int oChannels = (outputNumDims > 2) ? outputDims[2] : 1;
- const unsigned int oHeight = (outputNumDims > 3) ? outputDims[3] : 1;
- const unsigned int oWidth = (outputNumDims > 4) ? outputDims[4] : 1;
-
- // Array to store the input coordinates
- // iCoordinates[0] = i, iCoordinates[1] = bi, iCoordinates[2] = ci
- // iCoordinates[3] = hi, iCoordinates[4] = wi, iCoordinates[5] = 0
- // iCoordinates[5] will be always zero and used for not incrementing
- // the output when the input has less than 4 dimensions
- std::array<unsigned int, 6> iCoordinates{ 0 };
-
- // Array of pointers used to map the output coordinates to the input ones, in accordance with the axis
- // This array is initialized with &iCoordinates[5] since this will be always zero
- std::array<unsigned int *, 5> oCoordinates = { &iCoordinates[5],
- &iCoordinates[5],
- &iCoordinates[5],
- &iCoordinates[5],
- &iCoordinates[5] };
-
- // Set the axis coordinate
- oCoordinates[axis] = &iCoordinates[0];
-
- // Map the output coordinates, accounting for the axis
- unsigned int dim_shift = 0;
- for(unsigned int dim = 0; dim < inputNumDims; ++dim)
- {
- if(dim == axis)
- {
- dim_shift++;
- }
- oCoordinates[dim + dim_shift] = &iCoordinates[dim + 1];
- }
-
- // Alias for the input coordinates
- unsigned int &i = iCoordinates[0];
- unsigned int &bi = iCoordinates[1];
- unsigned int &ci = iCoordinates[2];
- unsigned int &hi = iCoordinates[3];
- unsigned int &wi = iCoordinates[4];
-
- // Alias for the output coordinates
- unsigned int &o = *(oCoordinates[0]);
- unsigned int &bo = *(oCoordinates[1]);
- unsigned int &co = *(oCoordinates[2]);
- unsigned int &ho = *(oCoordinates[3]);
- unsigned int &wo = *(oCoordinates[4]);
-
- // Stack tensors
- for(; i < iNumTensors; ++(i))
- {
- for(bi = 0; bi < iBatchSize; ++(bi))
- {
- for(ci = 0; ci < iChannels; ++(ci))
- {
- for(hi = 0; hi < iHeight; ++(hi))
- {
- for(wi = 0; wi < iWidth; ++(wi))
- {
- output[o * oWidth * oHeight * oChannels * oBatchSize +
- bo * oWidth * oHeight * oChannels +
- co * oWidth * oHeight +
- ho * oWidth +
- wo];
-
- output.Set(inputs[i]->Get());
-
- ++(*(inputs[i]));
- }
- }
- }
- }
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/Stack.hpp b/src/backends/reference/workloads/Stack.hpp
deleted file mode 100644
index cd86d41552..0000000000
--- a/src/backends/reference/workloads/Stack.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "Encoders.hpp"
-#include "Decoders.hpp"
-
-#include <backendsCommon/WorkloadData.hpp>
-
-namespace armnn
-{
-
-void Stack (const StackQueueDescriptor& data,
- std::vector<std::unique_ptr<Decoder<float>>>& inputs,
- Encoder<float>& output);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/StridedSlice.cpp b/src/backends/reference/workloads/StridedSlice.cpp
deleted file mode 100644
index 62f06dc5ec..0000000000
--- a/src/backends/reference/workloads/StridedSlice.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "StridedSlice.hpp"
-
-#include <ResolveType.hpp>
-
-#include <boost/assert.hpp>
-#include <boost/numeric/conversion/cast.hpp>
-
-#include <cstring>
-
-namespace armnn
-{
-
-namespace
-{
-
-void PadParams(StridedSliceDescriptor& p, unsigned int dimCount)
-{
- BOOST_ASSERT_MSG(dimCount <= 4, "Expected input with at most 4 dimensions");
-
- const unsigned int beginIndicesCount =
- boost::numeric_cast<unsigned int>(p.m_Begin.size());
-
- BOOST_ASSERT(dimCount >= beginIndicesCount);
- const unsigned int padCount = dimCount - beginIndicesCount;
-
- p.m_Begin.resize(dimCount);
- p.m_End.resize(dimCount);
- p.m_Stride.resize(dimCount);
-
- for (unsigned int i = beginIndicesCount; i > 0; --i)
- {
- p.m_Stride[i + padCount - 1] = p.m_Stride[i - 1];
- p.m_Begin[i + padCount - 1] = p.m_Begin[i - 1];
- p.m_End[i + padCount - 1] = p.m_End[i - 1];
- }
-
- for (unsigned int i = 0; i < padCount; ++i)
- {
- p.m_Stride[i] = 1;
- p.m_Begin[i] = 0;
- p.m_End[i] = 0;
- }
-
- p.m_ShrinkAxisMask <<= padCount;
- p.m_EllipsisMask <<= padCount;
- p.m_NewAxisMask <<= padCount;
- p.m_BeginMask <<= padCount;
- p.m_EndMask <<= padCount;
- p.m_BeginMask |= (1 << padCount) - 1;
- p.m_EndMask |= (1 << padCount) - 1;
-}
-
-bool LoopCondition(int index, int stop, int stride)
-{
- return stride > 0 ? index >= stop : index <= stop;
-}
-
-TensorShape ExtendShape(const TensorShape& inputShape,
- unsigned int newNumDimensions)
-{
- if (inputShape.GetNumDimensions() >= newNumDimensions)
- {
- return inputShape;
- }
-
- std::vector<unsigned int> newSizes(newNumDimensions, 0);
-
- unsigned int diff = newNumDimensions - inputShape.GetNumDimensions();
-
- for (unsigned int i = 0; i < diff; i++)
- {
- newSizes[i] = 1;
- }
-
- for (unsigned int i = diff; i < newNumDimensions; i++)
- {
- newSizes[i] = inputShape[i - diff];
- }
-
- return TensorShape(newNumDimensions, newSizes.data());
-}
-
-} // Anonymous namespace
-
-void StridedSlice(const TensorInfo& inputInfo,
- const StridedSliceDescriptor& params,
- const void* inputData,
- void* outputData,
- unsigned int dataTypeSize)
-{
- const unsigned char* input = reinterpret_cast<const unsigned char*>(inputData);
- unsigned char* output = reinterpret_cast<unsigned char*>(outputData);
-
- const TensorShape inputShape = ExtendShape(inputInfo.GetShape(), 4);
-
- StridedSliceDescriptor paddedParams = params;
-
- // Pad parameters to 4 dimensions
- PadParams(paddedParams, 4);
-
- const int start0 = paddedParams.GetStartForAxis(inputShape, 0);
- const int stop0 = paddedParams.GetStopForAxis (inputShape, 0, start0);
-
- const int start1 = paddedParams.GetStartForAxis(inputShape, 1);
- const int stop1 = paddedParams.GetStopForAxis (inputShape, 1, start1);
-
- const int start2 = paddedParams.GetStartForAxis(inputShape, 2);
- const int stop2 = paddedParams.GetStopForAxis (inputShape, 2, start2);
-
- const int start3 = paddedParams.GetStartForAxis(inputShape, 3);
- const int stop3 = paddedParams.GetStopForAxis (inputShape, 3, start3);
-
- const int step = boost::numeric_cast<int>(dataTypeSize);
-
- for (int in0 = start0;
- !LoopCondition(in0, stop0, paddedParams.m_Stride[0]);
- in0 += paddedParams.m_Stride[0])
- {
- for (int in1 = start1;
- !LoopCondition(in1, stop1, paddedParams.m_Stride[1]);
- in1 += paddedParams.m_Stride[1])
- {
- for (int in2 = start2;
- !LoopCondition(in2, stop2, paddedParams.m_Stride[2]);
- in2 += paddedParams.m_Stride[2])
- {
- for (int in3 = start3;
- !LoopCondition(in3, stop3, paddedParams.m_Stride[3]);
- in3 += paddedParams.m_Stride[3])
- {
- int dim1 = boost::numeric_cast<int>(inputShape[1]);
- int dim2 = boost::numeric_cast<int>(inputShape[2]);
- int dim3 = boost::numeric_cast<int>(inputShape[3]);
-
- int inputOffset = (((in0 * dim1 + in1) * dim2 + in2) * dim3 + in3) * step;
- ::memcpy(output, input + inputOffset, dataTypeSize);
- output += step;
- }
- }
- }
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/StridedSlice.hpp b/src/backends/reference/workloads/StridedSlice.hpp
deleted file mode 100644
index b13a8e4e33..0000000000
--- a/src/backends/reference/workloads/StridedSlice.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/Descriptors.hpp>
-#include <armnn/Tensor.hpp>
-
-namespace armnn
-{
-
-void StridedSlice(const TensorInfo& inputInfo,
- const StridedSliceDescriptor& params,
- const void* inputData,
- void* outputData,
- unsigned int dataTypeSize);
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/StringMapping.cpp b/src/backends/reference/workloads/StringMapping.cpp
deleted file mode 100644
index 3ca8843812..0000000000
--- a/src/backends/reference/workloads/StringMapping.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "StringMapping.hpp"
-
-namespace armnn
-{
-
-const StringMapping& StringMapping::Instance()
-{
- static StringMapping instance;
- return instance;
-}
-
-} // armnn
diff --git a/src/backends/reference/workloads/StringMapping.hpp b/src/backends/reference/workloads/StringMapping.hpp
deleted file mode 100644
index 1654b78088..0000000000
--- a/src/backends/reference/workloads/StringMapping.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-namespace armnn
-{
-
-///
-/// StringMapping is helper class to be able to use strings as template
-/// parameters, so this allows simplifying code which only differs in
-/// a string, such as a debug string literal.
-///
-struct StringMapping
-{
-public:
- enum Id {
- RefAdditionWorkload_Execute,
- RefDivisionWorkload_Execute,
- RefMaximumWorkload_Execute,
- RefMinimumWorkload_Execute,
- RefMultiplicationWorkload_Execute,
- RefSubtractionWorkload_Execute,
- MAX_STRING_ID
- };
-
- const char * Get(Id id) const
- {
- return m_Strings[id];
- }
-
- static const StringMapping& Instance();
-
-private:
- StringMapping()
- {
- m_Strings[RefAdditionWorkload_Execute] = "RefAdditionWorkload_Execute";
- m_Strings[RefDivisionWorkload_Execute] = "RefDivisionWorkload_Execute";
- m_Strings[RefMaximumWorkload_Execute] = "RefMaximumWorkload_Execute";
- m_Strings[RefMinimumWorkload_Execute] = "RefMinimumWorkload_Execute";
- m_Strings[RefMultiplicationWorkload_Execute] = "RefMultiplicationWorkload_Execute";
- m_Strings[RefSubtractionWorkload_Execute] = "RefSubtractionWorkload_Execute";
- }
-
- StringMapping(const StringMapping &) = delete;
- StringMapping& operator=(const StringMapping &) = delete;
-
- const char * m_Strings[MAX_STRING_ID];
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/TensorBufferArrayView.hpp b/src/backends/reference/workloads/TensorBufferArrayView.hpp
deleted file mode 100644
index e03c42fe60..0000000000
--- a/src/backends/reference/workloads/TensorBufferArrayView.hpp
+++ /dev/null
@@ -1,42 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include <armnn/Tensor.hpp>
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-#include <boost/assert.hpp>
-
-namespace armnn
-{
-
-// Utility class providing access to raw tensor memory based on indices along each dimension.
-template <typename DataType>
-class TensorBufferArrayView
-{
-public:
- TensorBufferArrayView(const TensorShape& shape, DataType* data,
- armnnUtils::DataLayoutIndexed dataLayout = DataLayout::NCHW)
- : m_Shape(shape)
- , m_Data(data)
- , m_DataLayout(dataLayout)
- {
- BOOST_ASSERT(m_Shape.GetNumDimensions() == 4);
- }
-
- DataType& Get(unsigned int b, unsigned int c, unsigned int h, unsigned int w) const
- {
- return m_Data[m_DataLayout.GetIndex(m_Shape, b, c, h, w)];
- }
-
-private:
- const TensorShape m_Shape;
- DataType* m_Data;
- armnnUtils::DataLayoutIndexed m_DataLayout;
-};
-
-} //namespace armnn
diff --git a/src/backends/reference/workloads/TransposeConvolution2d.cpp b/src/backends/reference/workloads/TransposeConvolution2d.cpp
deleted file mode 100644
index 5698014181..0000000000
--- a/src/backends/reference/workloads/TransposeConvolution2d.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#include "TransposeConvolution2d.hpp"
-
-#include <armnnUtils/DataLayoutIndexed.hpp>
-
-namespace armnn
-{
-
-using namespace armnnUtils;
-
-void TransposeConvolution2dImpl(const TransposeConvolution2dDescriptor& descriptor,
- const TensorShape& inputShape,
- Decoder<float>& inputDecoder,
- const TensorShape& outputShape,
- Encoder<float>& outputEncoder,
- const TensorShape& weightsShape,
- Decoder<float>& weightsDecoder,
- Decoder<float>* biasesDecoder)
-{
- if (descriptor.m_BiasEnabled && !biasesDecoder)
- {
- throw InvalidArgumentException("Biases enabled but no bias data provided");
- }
- const DataLayoutIndexed dataLayoutIndexed(descriptor.m_DataLayout);
- const unsigned int channelsIndex = dataLayoutIndexed.GetChannelsIndex();
- const unsigned int heightIndex = dataLayoutIndexed.GetHeightIndex();
- const unsigned int widthIndex = dataLayoutIndexed.GetWidthIndex();
-
- unsigned int numBatches = inputShape[0];
-
- unsigned int inputWidth = inputShape[widthIndex];
- unsigned int inputHeight = inputShape[heightIndex];
- unsigned int inputDepth = inputShape[channelsIndex];
-
- unsigned int weightsHeight = weightsShape[heightIndex];
- unsigned int weightsWidth = weightsShape[widthIndex];
-
- unsigned int outputHeight = outputShape[heightIndex];
- unsigned int outputWidth = outputShape[widthIndex];
- unsigned int outputDepth = outputShape[channelsIndex];
-
- unsigned int paddingLeft = descriptor.m_PadLeft;
- unsigned int paddingTop = descriptor.m_PadTop;
-
- unsigned int strideX = descriptor.m_StrideX;
- unsigned int strideY = descriptor.m_StrideY;
-
- std::vector<float> outputBuffer(outputShape.GetNumElements(), 0);
-
- for (unsigned int batch = 0u; batch < numBatches; ++batch)
- {
- for (unsigned int yInput = 0u; yInput < inputHeight; ++yInput)
- {
- for (unsigned int xInput = 0u; xInput < inputWidth; ++xInput)
- {
- unsigned int xOutputOrigin = xInput * strideX - paddingLeft;
- unsigned int yOutputOrigin = yInput * strideY - paddingTop;
-
- for (unsigned int dOutput = 0u; dOutput < outputDepth; ++dOutput)
- {
- for (unsigned int yWeights = 0u; yWeights < weightsHeight; ++yWeights)
- {
- for (unsigned int xWeights = 0u; xWeights < weightsWidth; ++xWeights)
- {
- unsigned int yOutput = yOutputOrigin + yWeights;
- unsigned int xOutput = xOutputOrigin + xWeights;
-
- if (yOutput < outputHeight && xOutput< outputWidth)
- {
- for (unsigned int dInput = 0u; dInput < inputDepth; dInput++)
- {
- const unsigned int inputIndex =
- dataLayoutIndexed.GetIndex(inputShape, batch, dInput, yInput, xInput);
- inputDecoder[inputIndex];
-
- const unsigned int weightsIndex =
- dataLayoutIndexed.GetIndex(weightsShape, dOutput, dInput, yWeights, xWeights);
- weightsDecoder.SetIndex(weightsIndex, dOutput);
-
- const unsigned int outputIndex =
- dataLayoutIndexed.GetIndex(outputShape, batch, dOutput, yOutput, xOutput);
- outputEncoder[outputIndex];
-
- float output = outputBuffer[outputIndex];
- output += inputDecoder.Get() * weightsDecoder.Get();
- outputBuffer[outputIndex] = output;
- }
- }
- }
- }
- }
- }
- }
- }
-
- // Apply bias (if enabled)
- if (descriptor.m_BiasEnabled)
- {
- outputEncoder[0];
- Decoder<float>& rBiasesDecoder = *biasesDecoder;
-
- for (unsigned int batch = 0u; batch < numBatches; ++batch)
- {
- for (unsigned int dOutput = 0u; dOutput < outputDepth; ++dOutput)
- {
- rBiasesDecoder.SetIndex(dOutput, dOutput);
- for (unsigned int yOutput = 0u; yOutput < outputHeight; ++yOutput)
- {
- for (unsigned int xOutput = 0u; xOutput < outputWidth; ++xOutput)
- {
- const unsigned int outputIndex =
- dataLayoutIndexed.GetIndex(outputShape, batch, dOutput, yOutput, xOutput);
- outputBuffer[outputIndex] += rBiasesDecoder.Get();
- }
- }
- }
- }
- }
- outputEncoder[0];
- for (float output : outputBuffer)
- {
- outputEncoder.Set(output);
- ++outputEncoder;
- }
-}
-
-} // namespace armnn
diff --git a/src/backends/reference/workloads/TransposeConvolution2d.hpp b/src/backends/reference/workloads/TransposeConvolution2d.hpp
deleted file mode 100644
index f20f327b38..0000000000
--- a/src/backends/reference/workloads/TransposeConvolution2d.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-
-#pragma once
-
-#include "Decoders.hpp"
-#include "Encoders.hpp"
-
-#include <armnn/Descriptors.hpp>
-#include <armnn/Tensor.hpp>
-
-namespace armnn
-{
-
-void TransposeConvolution2dImpl(const TransposeConvolution2dDescriptor& descriptor,
- const TensorShape& inputShape,
- Decoder<float>& inputDecoder,
- const TensorShape& outputShape,
- Encoder<float>& outputEncoder,
- const TensorShape& weightsShape,
- Decoder<float>& weightsDecoder,
- Decoder<float>* biasesDecoder);
-
-} // namespace armnn \ No newline at end of file