diff options
author | Matthew Bentham <matthew.bentham@arm.com> | 2022-02-08 15:03:07 +0000 |
---|---|---|
committer | Matthew Bentham <matthew.bentham@arm.com> | 2022-02-08 15:25:06 +0000 |
commit | 67d6390c3b37c83bad2180ee4dc54893143c7b29 (patch) | |
tree | 41b0392841c3e070e60f264ebdf1910be49c9176 /src | |
parent | c42a987aa53d0fd842c34dee90abef5a9ff15fa4 (diff) | |
download | armnn-67d6390c3b37c83bad2180ee4dc54893143c7b29.tar.gz |
Handle optional biases better in Neon/Cl FullyConnected workloads
Use armnn::Optional for optional bias TensorInfos, similar to how
it's already done in Convolution etc.
Fixes some test failures found using -fsanitize=undefined
Change-Id: I7b887e63e2ffab14aeab14415069be738d938ebb
Signed-off-by: Matthew Bentham <matthew.bentham@arm.com>
Diffstat (limited to 'src')
6 files changed, 23 insertions, 8 deletions
diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp index 0fc5da78d1..018adec781 100644 --- a/src/backends/cl/ClBackend.cpp +++ b/src/backends/cl/ClBackend.cpp @@ -399,11 +399,18 @@ OptimizationViews ClBackend::OptimizeSubgraphView(const SubgraphView& subgraph, { FullyConnectedLayer* baseLayer = PolymorphicDowncast<FullyConnectedLayer*>(&base); + Optional<TensorInfo> biases; + + if (baseLayer->GetParameters().m_BiasEnabled) + { + biases = baseLayer->m_Bias->GetTensorInfo(); + } + arm_compute::Status status = ClFullyConnectedWorkloadValidate( baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(), activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(), baseLayer->m_Weight->GetTensorInfo(), - baseLayer->m_Bias->GetTensorInfo(), + biases, baseLayer->GetParameters(), &activationDesc); diff --git a/src/backends/cl/workloads/ClFullyConnectedWorkload.cpp b/src/backends/cl/workloads/ClFullyConnectedWorkload.cpp index 3eb53e64b4..017f4fff6b 100644 --- a/src/backends/cl/workloads/ClFullyConnectedWorkload.cpp +++ b/src/backends/cl/workloads/ClFullyConnectedWorkload.cpp @@ -19,7 +19,7 @@ using namespace armcomputetensorutils; arm_compute::Status ClFullyConnectedWorkloadValidate(const TensorInfo& input, const TensorInfo& output, const TensorInfo& weights, - const TensorInfo& biases, + const Optional<TensorInfo>& biases, const FullyConnectedDescriptor& descriptor, const ActivationDescriptor* activationDescriptor) { @@ -31,7 +31,8 @@ arm_compute::Status ClFullyConnectedWorkloadValidate(const TensorInfo& input, arm_compute::TensorInfo* optionalAclBiases = nullptr; if (descriptor.m_BiasEnabled) { - aclBiases = BuildArmComputeTensorInfo(biases); + ARMNN_ASSERT(biases.has_value()); + aclBiases = BuildArmComputeTensorInfo(biases.value()); optionalAclBiases = &aclBiases; } diff --git a/src/backends/cl/workloads/ClFullyConnectedWorkload.hpp b/src/backends/cl/workloads/ClFullyConnectedWorkload.hpp index 210757779f..3ab9f986a8 100644 --- a/src/backends/cl/workloads/ClFullyConnectedWorkload.hpp +++ b/src/backends/cl/workloads/ClFullyConnectedWorkload.hpp @@ -18,7 +18,7 @@ namespace armnn arm_compute::Status ClFullyConnectedWorkloadValidate(const TensorInfo& input, const TensorInfo& output, const TensorInfo& weights, - const TensorInfo& biases, + const Optional<TensorInfo>& biases, const FullyConnectedDescriptor& descriptor, const ActivationDescriptor* activationDescriptor = nullptr); diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp index 66547ad4df..7089f23efa 100644 --- a/src/backends/neon/NeonBackend.cpp +++ b/src/backends/neon/NeonBackend.cpp @@ -250,12 +250,18 @@ OptimizationViews NeonBackend::OptimizeSubgraphView(const SubgraphView& subgraph else if (base.GetType() == LayerType::FullyConnected) { FullyConnectedLayer* baseLayer = PolymorphicDowncast<FullyConnectedLayer*>(&base); + Optional<TensorInfo> biases; + + if (baseLayer->GetParameters().m_BiasEnabled) + { + biases = baseLayer->m_Bias->GetTensorInfo(); + } arm_compute::Status status = NeonFullyConnectedWorkloadValidate( baseLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(), activationLayer->GetInputSlot(0).GetConnectedOutputSlot()->GetTensorInfo(), baseLayer->m_Weight->GetTensorInfo(), - baseLayer->m_Bias->GetTensorInfo(), + biases, baseLayer->GetParameters(), &activationDesc); diff --git a/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp b/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp index 39a56965d9..26c68b7d1d 100644 --- a/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp +++ b/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp @@ -24,7 +24,7 @@ using ACLMemManagerOnDemand = std::shared_ptr<arm_compute::MemoryManagerOnDemand arm_compute::Status NeonFullyConnectedWorkloadValidate(const TensorInfo& input, const TensorInfo& output, const TensorInfo& weights, - const TensorInfo& biases, + const Optional<TensorInfo>& biases, const FullyConnectedDescriptor& descriptor, const ActivationDescriptor* activationDescriptor) { @@ -36,7 +36,8 @@ arm_compute::Status NeonFullyConnectedWorkloadValidate(const TensorInfo& input, arm_compute::TensorInfo* optionalAclBiases = nullptr; if (descriptor.m_BiasEnabled) { - aclBiases = BuildArmComputeTensorInfo(biases); + ARMNN_ASSERT(biases.has_value()); + aclBiases = BuildArmComputeTensorInfo(biases.value()); optionalAclBiases = &aclBiases; } diff --git a/src/backends/neon/workloads/NeonFullyConnectedWorkload.hpp b/src/backends/neon/workloads/NeonFullyConnectedWorkload.hpp index b5f616057f..419a3299f2 100644 --- a/src/backends/neon/workloads/NeonFullyConnectedWorkload.hpp +++ b/src/backends/neon/workloads/NeonFullyConnectedWorkload.hpp @@ -20,7 +20,7 @@ namespace armnn arm_compute::Status NeonFullyConnectedWorkloadValidate(const TensorInfo& input, const TensorInfo& output, const TensorInfo& weights, - const TensorInfo& biases, + const Optional<TensorInfo>& biases, const FullyConnectedDescriptor& descriptor, const ActivationDescriptor* activationDescriptor = nullptr); |