diff options
Diffstat (limited to 'src/backends/reference/workloads')
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 |