diff options
author | David Monahan <david.monahan@arm.com> | 2023-11-22 13:24:25 +0000 |
---|---|---|
committer | David Monahan <david.monahan@arm.com> | 2023-12-07 15:21:09 +0000 |
commit | 8a570466aca7ae1619fe8fa715b68419fceb142f (patch) | |
tree | 22d80676e01f4a92fc6d927b6c26d6e5939c5170 /src/backends/gpuFsa/GpuFsaLayerSupport.cpp | |
parent | 748657f2941d28bec810b7eec21e46e288002036 (diff) | |
download | armnn-8a570466aca7ae1619fe8fa715b68419fceb142f.tar.gz |
IVGCVSW-8157 - Rebase existing GpuFsa patches to 23.11
Squashed commit of the following:
IVGCVSW-7159 Add GpuFsa backend skeleton
IVGCVSW-7380 Update the GpuFsa Skeleton to build and load ACL
IVGCVSW-7381 Add IsLayerSupported implementation to GpuFsa backend
IVGCVSW-7382 Implementation of Conv2d within GpuFsa
Signed-off-by: James Conroy <james.conroy@arm.com>
Signed-off-by: Matthew Sloyan <matthew.sloyan@arm.com>
Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: Id23d9ee598535de7b38a99ca223cdf0ad2102cef
Diffstat (limited to 'src/backends/gpuFsa/GpuFsaLayerSupport.cpp')
-rw-r--r-- | src/backends/gpuFsa/GpuFsaLayerSupport.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/backends/gpuFsa/GpuFsaLayerSupport.cpp b/src/backends/gpuFsa/GpuFsaLayerSupport.cpp new file mode 100644 index 0000000000..063af2732e --- /dev/null +++ b/src/backends/gpuFsa/GpuFsaLayerSupport.cpp @@ -0,0 +1,111 @@ +// +// Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "GpuFsaLayerSupport.hpp" + +#include <armnn/Types.hpp> +#include <armnn/utility/IgnoreUnused.hpp> +#include <armnn/utility/PolymorphicDowncast.hpp> + +#if defined(ARMCOMPUTEGPUFSA_ENABLED) +#include "layerValidators/GpuFsaConvolution2dValidate.hpp" +#endif + +#include <vector> + +namespace armnn +{ + +template<typename ... Args> +bool IsGpuFsaBackendSupported(Optional<std::string&> reasonIfUnsupported, Args... args) +{ + IgnoreUnused(reasonIfUnsupported, (args)...); +#if defined(ARMCOMPUTEGPUFSA_ENABLED) + return true; +#else + if (reasonIfUnsupported) + { + reasonIfUnsupported.value() = "The armnn library has been built without CL support"; + } + return false; +#endif +} + +#if defined(ARMCOMPUTEGPUFSA_ENABLED) +#define FORWARD_GPUFSA_LAYER_SUPPORT_FUNC(expr) (expr) +#else +#define FORWARD_GPUFSA_LAYER_SUPPORT_FUNC(expr) IsGpuFsaBackendSupported(reasonIfUnsupported) +#endif + +#if defined(ARMCOMPUTEGPUFSA_ENABLED) +template<class FuncType, class... Args> +inline bool CheckIsLayerSupported(FuncType&& func, Optional<std::string&> reasonIfUnsupported, Args&&... args) +{ + arm_compute::Status aclStatus = func(std::forward<Args>(args)...); + const bool supported = (aclStatus.error_code() == arm_compute::ErrorCode::OK); + if (!supported && reasonIfUnsupported) + { + reasonIfUnsupported.value() = aclStatus.error_description(); + } + return supported; +} + +#define FORWARD_LAYER_VALIDATE_FUNC(func, reasonIfUnsupported, ...) \ + return CheckIsLayerSupported(func, reasonIfUnsupported, __VA_ARGS__); +#else +#define FORWARD_LAYER_VALIDATE_FUNC(func, reasonIfUnsupported, ...) \ + return IsGpuFsaBackendSupported(reasonIfUnsupported, __VA_ARGS__); +#endif + +bool GpuFsaLayerSupport::IsLayerSupported(const LayerType& type, + const std::vector<TensorInfo>& infos, + const BaseDescriptor& descriptor, + const Optional<LstmInputParamsInfo>& lstmParamsInfo, + const Optional<QuantizedLstmInputParamsInfo>& quantizedLstmInputParamsInfo, + Optional<std::string&> reasonIfUnsupported) const +{ + IgnoreUnused(lstmParamsInfo); + IgnoreUnused(quantizedLstmInputParamsInfo); + + switch (type) { + case LayerType::Convolution2d: + { + if (infos.size() != 4) + { + throw InvalidArgumentException("Invalid number of Convolution2d TensorInfos. " + "TensorInfos should be of format: {input, output, weights, biases}."); + } + + auto desc = *(PolymorphicDowncast<const Convolution2dDescriptor*>(&descriptor)); + if (infos[3] == TensorInfo()) + { + FORWARD_LAYER_VALIDATE_FUNC(GpuFsaConvolution2dValidate, + reasonIfUnsupported, + infos[0], + desc, + infos[2], + EmptyOptional()); + } + else + { + FORWARD_LAYER_VALIDATE_FUNC(GpuFsaConvolution2dValidate, + reasonIfUnsupported, + infos[0], + desc, + infos[2], + infos[3]); + } + } + case LayerType::Constant: + case LayerType::Input: + case LayerType::Output: + return IsGpuFsaBackendSupported(reasonIfUnsupported, infos[0]); + default: + // Layers not supported in the GpuFsa backend. + return false; + } +} + +} // namespace armnn
\ No newline at end of file |