aboutsummaryrefslogtreecommitdiff
path: root/src/backends/aclCommon/ArmComputeTensorUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/aclCommon/ArmComputeTensorUtils.cpp')
-rw-r--r--src/backends/aclCommon/ArmComputeTensorUtils.cpp247
1 files changed, 0 insertions, 247 deletions
diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.cpp b/src/backends/aclCommon/ArmComputeTensorUtils.cpp
deleted file mode 100644
index 49fef5bf17..0000000000
--- a/src/backends/aclCommon/ArmComputeTensorUtils.cpp
+++ /dev/null
@@ -1,247 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#include <aclCommon/ArmComputeTensorUtils.hpp>
-#include <aclCommon/ArmComputeUtils.hpp>
-
-#include "armnn/Exceptions.hpp"
-#include <armnn/Descriptors.hpp>
-
-namespace armnn
-{
-namespace armcomputetensorutils
-{
-
-arm_compute::DataType GetArmComputeDataType(armnn::DataType dataType, bool multiScales)
-{
- switch(dataType)
- {
- case armnn::DataType::Boolean:
- return arm_compute::DataType::U8;
- case armnn::DataType::Float16:
- return arm_compute::DataType::F16;
- case armnn::DataType::Float32:
- return arm_compute::DataType::F32;
- case armnn::DataType::QAsymmS8:
- return arm_compute::DataType::QASYMM8_SIGNED;
- case armnn::DataType::QAsymmU8:
- return arm_compute::DataType::QASYMM8;
- case armnn::DataType::QSymmS16:
- return arm_compute::DataType::QSYMM16;
- case armnn::DataType::QSymmS8:
- {
- return multiScales ? arm_compute::DataType::QSYMM8_PER_CHANNEL : arm_compute::DataType::QSYMM8;
- }
- ARMNN_NO_DEPRECATE_WARN_BEGIN
- case armnn::DataType::QuantizedSymm8PerAxis:
- return arm_compute::DataType::QSYMM8_PER_CHANNEL;
- ARMNN_NO_DEPRECATE_WARN_END
- case armnn::DataType::Signed32:
- return arm_compute::DataType::S32;
- default:
- BOOST_ASSERT_MSG(false, "Unknown data type");
- return arm_compute::DataType::UNKNOWN;
- }
-}
-
-arm_compute::Coordinates BuildArmComputeReductionCoordinates(size_t inputDimensions,
- unsigned int originalInputRank,
- const std::vector<unsigned int>& armnnAxes)
-{
- arm_compute::Coordinates outAclCoords;
-
- if (armnnAxes.empty())
- {
- // If no reduction axes were provided, then the input must be reduced along all dimensions.
- // Since Compute Library does not accept an empty vector as the reduction dimensions, we then
- // manually create a vector including all the input dimensions (in reversed order) as:
- //
- // { inputDimensions - 1, inputDimensions - 2, ..., 1, 0 }
- //
- outAclCoords.set_num_dimensions(inputDimensions);
- std::generate(outAclCoords.begin(), outAclCoords.end(), [d = inputDimensions - 1] () mutable { return d--; });
- }
- else
- {
- // Create a vector of reduction dimensions (in reversed order) with the given reduction axes.
- //
- // Adjust the given reduction axes according to the original rank of the input tensor (before ACL applied any
- // dimension correction).
- // For example, if the input tensor originally had 4 dimensions, and one of the reduction axes was 2, then the
- // new value for that reduction axis should be 1.
- //
- // Example:
- // ArmNN input shape = { 1, 1, 3, 2 } -> ACL input shape = { 2, 3 }
- // ArmNN reduction axis = { 2 } -> ACL reduction axis = { 1 }
- // ArmNN reduction axis = { 3 } -> ACL reduction axis = { 0 }
- //
- // The transformation: ACL reduction axis index = original rank - ArmNN reduction axis index - 1
- //
- outAclCoords.set_num_dimensions(armnnAxes.size());
- std::transform(armnnAxes.begin(), armnnAxes.end(),
- outAclCoords.begin(),
- [originalInputRank](unsigned int i){ return originalInputRank - i - 1; });
- }
-
- return outAclCoords;
-}
-
-arm_compute::TensorShape BuildArmComputeTensorShape(const armnn::TensorShape& tensorShape)
-{
- arm_compute::TensorShape shape;
-
- // armnn tensors are (batch, channels, height, width).
- // arm_compute tensors are (width, height, channels, batch).
- for (unsigned int i = 0; i < tensorShape.GetNumDimensions(); i++)
- {
- // Note that our dimensions are stored in the opposite order to ACL's.
- shape.set(tensorShape.GetNumDimensions() - i - 1, tensorShape[i], false);
-
- // TensorShape::set() flattens leading ones, so that batch size 1 cannot happen.
- // arm_compute tensors expect this.
- }
-
- // prevent arm_compute issue where tensor is flattened to nothing
- if (shape.num_dimensions() == 0)
- {
- shape.set_num_dimensions(1);
- }
-
- return shape;
-}
-
-// Utility function used to build a TensorInfo object, that can be used to initialise
-// ARM Compute Tensor and CLTensor allocators.
-arm_compute::TensorInfo BuildArmComputeTensorInfo(const armnn::TensorInfo& tensorInfo)
-{
- bool multiScales = tensorInfo.HasMultipleQuantizationScales();
- const arm_compute::TensorShape aclTensorShape = BuildArmComputeTensorShape(tensorInfo.GetShape());
- const arm_compute::DataType aclDataType = GetArmComputeDataType(tensorInfo.GetDataType(), multiScales);
-
- const arm_compute::QuantizationInfo aclQuantizationInfo = multiScales ?
- arm_compute::QuantizationInfo(tensorInfo.GetQuantizationScales()) :
- arm_compute::QuantizationInfo(tensorInfo.GetQuantizationScale(), tensorInfo.GetQuantizationOffset());
-
- return arm_compute::TensorInfo(aclTensorShape, 1, aclDataType, aclQuantizationInfo);
-}
-
-arm_compute::TensorInfo BuildArmComputeTensorInfo(const armnn::TensorInfo& tensorInfo,
- armnn::DataLayout dataLayout)
-{
- arm_compute::TensorInfo aclTensorInfo = BuildArmComputeTensorInfo(tensorInfo);
- aclTensorInfo.set_data_layout(ConvertDataLayout(dataLayout));
-
- return aclTensorInfo;
-}
-
-arm_compute::DataLayout ConvertDataLayout(armnn::DataLayout dataLayout)
-{
- switch(dataLayout)
- {
- case armnn::DataLayout::NHWC : return arm_compute::DataLayout::NHWC;
-
- case armnn::DataLayout::NCHW : return arm_compute::DataLayout::NCHW;
-
- default: throw InvalidArgumentException("Unknown armnn::DataLayout: [" +
- std::to_string(static_cast<int>(dataLayout)) + "]");
- }
-}
-
-arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDescriptor& descriptor,
- bool fpMixedPrecision)
-{
- using arm_compute::PoolingType;
- using arm_compute::DimensionRoundingType;
- using arm_compute::PadStrideInfo;
- using arm_compute::PoolingLayerInfo;
- using arm_compute::Size2D;
- using arm_compute::DataLayout;
-
- // Resolve ARM Compute layer parameters.
- const PoolingType poolingType = ConvertPoolingAlgorithmToAclPoolingType(descriptor.m_PoolType);
-
- const DataLayout dataLayout = ConvertDataLayout(descriptor.m_DataLayout);
-
- bool isGlobalPooling = (descriptor.m_StrideX==0 && descriptor.m_StrideY==0);
- //use specific constructor if global pooling
- if(isGlobalPooling)
- {
- return arm_compute::PoolingLayerInfo(poolingType, dataLayout);
- }
-
- const DimensionRoundingType rounding = ConvertOutputShapeRoundingToAclDimensionRoundingType(
- descriptor.m_OutputShapeRounding);
- const PadStrideInfo padStrideInfo(descriptor.m_StrideX,
- descriptor.m_StrideY,
- descriptor.m_PadLeft,
- descriptor.m_PadRight,
- descriptor.m_PadTop,
- descriptor.m_PadBottom,
- rounding);
-
- const bool excludePadding = (descriptor.m_PaddingMethod == PaddingMethod::Exclude);
-
- const Size2D poolSize(descriptor.m_PoolWidth, descriptor.m_PoolHeight);
-
- return arm_compute::PoolingLayerInfo(poolingType, poolSize, dataLayout, padStrideInfo, excludePadding,
- fpMixedPrecision);
-}
-
-arm_compute::NormalizationLayerInfo BuildArmComputeNormalizationLayerInfo(const NormalizationDescriptor& descriptor)
-{
- const arm_compute::NormType normType =
- ConvertNormalizationAlgorithmChannelToAclNormType(descriptor.m_NormChannelType);
- return arm_compute::NormalizationLayerInfo(normType,
- descriptor.m_NormSize,
- descriptor.m_Alpha,
- descriptor.m_Beta,
- descriptor.m_K,
- false);
-}
-
-arm_compute::PermutationVector BuildArmComputePermutationVector(const armnn::PermutationVector& perm)
-{
- arm_compute::PermutationVector aclPerm;
-
- unsigned int start = 0;
- while ((start < perm.GetSize()) && (start == perm[start]))
- {
- ++start;
- }
-
- for (unsigned int i = start; i < perm.GetSize(); ++i)
- {
- aclPerm.set(i - start, perm[i] - start);
- }
-
- return aclPerm;
-}
-
-arm_compute::Size2D BuildArmComputeSize2D(const unsigned int width, const unsigned int height)
-{
- return arm_compute::Size2D(width, height);
-}
-
-arm_compute::PixelValue GetPixelValue(arm_compute::ITensor& input, float pixelValue)
-{
- switch (input.info()->data_type())
- {
- case arm_compute::DataType::F16:
- return arm_compute::PixelValue(static_cast<Half>(pixelValue));
- case arm_compute::DataType::F32:
- return arm_compute::PixelValue(pixelValue);
- case arm_compute::DataType::QASYMM8:
- return arm_compute::PixelValue(static_cast<uint8_t>(pixelValue));
- case arm_compute::DataType::QSYMM16:
- return arm_compute::PixelValue(static_cast<int16_t>(pixelValue));
- case arm_compute::DataType::QSYMM8_PER_CHANNEL:
- return arm_compute::PixelValue(static_cast<int8_t>(pixelValue));
- default:
- throw InvalidArgumentException("Unsupported DataType: [" +
- std::to_string(static_cast<int>(input.info()->data_type())) + "]");
- }
-}
-
-} // namespace armcomputetensorutils
-} // namespace armnn