aboutsummaryrefslogtreecommitdiff
path: root/src/backends/aclCommon/ArmComputeUtils.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/aclCommon/ArmComputeUtils.hpp')
-rw-r--r--src/backends/aclCommon/ArmComputeUtils.hpp173
1 files changed, 0 insertions, 173 deletions
diff --git a/src/backends/aclCommon/ArmComputeUtils.hpp b/src/backends/aclCommon/ArmComputeUtils.hpp
deleted file mode 100644
index 4d690901c6..0000000000
--- a/src/backends/aclCommon/ArmComputeUtils.hpp
+++ /dev/null
@@ -1,173 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include <armnn/Descriptors.hpp>
-#include <armnn/Tensor.hpp>
-
-#include <arm_compute/core/Types.h>
-
-#include <boost/assert.hpp>
-
-namespace armnn
-{
-
-inline arm_compute::NormalizationLayerInfo
-CreateAclNormalizationLayerInfoForL2Normalization(const armnn::TensorInfo& tensorInfo,
- armnn::DataLayout dataLayout)
-{
- unsigned int depthDimension = dataLayout == armnn::DataLayout::NCHW ? 1 : 3;
- const unsigned int depth = tensorInfo.GetShape()[depthDimension];
-
- // At the time of writing, {CL|Neon}L2Normalization performs the reduction only along dimension 0. This version of
- // L2 Normalization always performs the reduction along the depth axis, though. Thus, we repurpose
- // {CL|Neon}NormalizationLayers to act as depthwise L2 normalizations by carefully chosing the normalization
- // parameters.
- //
- // Please refer to both the reference implementation of the normalization layer and the implementation of
- // {CL|Neon}NormalizationLayer when checking the derivations for the parameter values below.
-
- // Make sure normalization covers the entire depth range. ACL requires the normalization size to be odd.
- // CL: This does not result in extra kernel threads not doing any work: See usage of the RADIUS parameter in
- // ACL's normalization_layer_cross_map() CL function.
- const uint32_t normSize = depth * 2u + 1u;
-
- // See ACL's NormalizationLayerInfo::scale_coeff() definition.
- // For the reference implementation, to make alpha_ become 1, we'd have to use alpha = normSize instead.
- const float alpha = 1.0f;
-
- // Don't offset the reduction.
- const float kappa = 0.0f;
-
- // pow(reduction, -0.5) = 1 / sqrt(reduction)
- const float beta = 0.5f;
-
- return arm_compute::NormalizationLayerInfo(arm_compute::NormType::CROSS_MAP, normSize, alpha, beta, kappa, false);
-}
-
-inline arm_compute::ActivationLayerInfo::ActivationFunction
-ConvertActivationFunctionToAclActivationFunction(ActivationFunction armnnFunction)
-{
- using AclActivationFunction = arm_compute::ActivationLayerInfo::ActivationFunction;
-
- switch (armnnFunction)
- {
- case ActivationFunction::Linear: return AclActivationFunction::LINEAR;
- // Arm compute's 'logistic' function is non-parameterized, so it is exactly a sigmoid function.
- case ActivationFunction::Sigmoid: return AclActivationFunction::LOGISTIC;
- case ActivationFunction::ReLu: return AclActivationFunction::RELU;
- case ActivationFunction::BoundedReLu: return AclActivationFunction::LU_BOUNDED_RELU;
- case ActivationFunction::SoftReLu: return AclActivationFunction::SOFT_RELU;
- case ActivationFunction::LeakyReLu: return AclActivationFunction::LEAKY_RELU;
- case ActivationFunction::Abs: return AclActivationFunction::ABS;
- case ActivationFunction::Sqrt: return AclActivationFunction::SQRT;
- case ActivationFunction::Square: return AclActivationFunction::SQUARE;
- case ActivationFunction::TanH: return AclActivationFunction::TANH;
- default: throw InvalidArgumentException("Unsupported activation function");
- }
-}
-
-inline arm_compute::ActivationLayerInfo
-ConvertActivationDescriptorToAclActivationLayerInfo(const ActivationDescriptor& actDesc)
-{
- return arm_compute::ActivationLayerInfo(ConvertActivationFunctionToAclActivationFunction(actDesc.m_Function),
- actDesc.m_A, actDesc.m_B);
-}
-
-inline arm_compute::PoolingType ConvertPoolingAlgorithmToAclPoolingType(PoolingAlgorithm poolingAlgorithm)
-{
- using arm_compute::PoolingType;
-
- switch (poolingAlgorithm)
- {
- case PoolingAlgorithm::Max: return PoolingType::MAX;
- case PoolingAlgorithm::Average: return PoolingType::AVG;
- case PoolingAlgorithm::L2: return PoolingType::L2;
- default: throw InvalidArgumentException("Unsupported pooling algorithm");
- }
-}
-
-inline arm_compute::DimensionRoundingType ConvertOutputShapeRoundingToAclDimensionRoundingType(OutputShapeRounding
- rounding)
-{
- using arm_compute::DimensionRoundingType;
-
- switch (rounding)
- {
- case OutputShapeRounding::Ceiling: return DimensionRoundingType::CEIL;
- case OutputShapeRounding::Floor: return DimensionRoundingType::FLOOR;
- default: throw InvalidArgumentException("Unsupported Output Shape Rounding type");
- }
-}
-
-inline arm_compute::NormType
-ConvertNormalizationAlgorithmChannelToAclNormType(NormalizationAlgorithmChannel channelType)
-{
- using arm_compute::NormType;
- switch (channelType)
- {
- case NormalizationAlgorithmChannel::Across: return NormType::CROSS_MAP;
- case NormalizationAlgorithmChannel::Within: return NormType::IN_MAP_2D;
- default: throw InvalidArgumentException("Unsupported normalization algorithm channel type");
- }
-}
-
-inline arm_compute::FullyConnectedLayerInfo
-ConvertFullyConnectedDescriptorToAclFullyConnectedLayerInfo(const FullyConnectedDescriptor& fullyConnectedDesc)
-{
- arm_compute::FullyConnectedLayerInfo fc_info;
- fc_info.transpose_weights = fullyConnectedDesc.m_TransposeWeightMatrix;
- return fc_info;
-}
-
-inline arm_compute::InterpolationPolicy ConvertResizeMethodToAclInterpolationPolicy(ResizeMethod resizeMethod)
-{
- switch (resizeMethod)
- {
- case ResizeMethod::Bilinear:
- return arm_compute::InterpolationPolicy::BILINEAR;
- case ResizeMethod::NearestNeighbor:
- return arm_compute::InterpolationPolicy::NEAREST_NEIGHBOR;
- default:
- throw InvalidArgumentException("Unsupported resize method");
- }
-}
-
-inline unsigned int ComputeSoftmaxAclAxis(const SoftmaxDescriptor& softmaxDesc, const armnn::TensorInfo& tensor)
-{
- // Detect the Android default value of -1 and return the ACL default value of 1.
- if (softmaxDesc.m_Axis == -1)
- {
- return 1;
- }
-
- unsigned int dim = tensor.GetNumDimensions();
-
- BOOST_ASSERT(dim != 0);
-
- // Currently ArmNN support axis 1.
- return dim - 1;
-}
-
-inline std::set<unsigned int> ComputeSplitAxis(const armnn::SplitterDescriptor& desc, const TensorShape& input)
-{
- unsigned int numSplit = desc.GetNumViews();
- unsigned int numDimensions = desc.GetNumDimensions();
- std::set<unsigned int> splitAxis;
-
- for (unsigned int i = 0; i < numSplit; ++i)
- {
- for (unsigned int dimIdx = 0; dimIdx < numDimensions; ++dimIdx)
- {
- if (desc.GetViewSizes(i)[dimIdx] != input[dimIdx])
- {
- splitAxis.insert(dimIdx);
- }
- }
- }
- return splitAxis;
-}
-
-} // namespace armnn