aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Bentham <matthew.bentham@arm.com>2022-02-08 15:03:07 +0000
committerMatthew Bentham <matthew.bentham@arm.com>2022-02-08 15:25:06 +0000
commit67d6390c3b37c83bad2180ee4dc54893143c7b29 (patch)
tree41b0392841c3e070e60f264ebdf1910be49c9176
parentc42a987aa53d0fd842c34dee90abef5a9ff15fa4 (diff)
downloadarmnn-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>
-rw-r--r--src/backends/cl/ClBackend.cpp9
-rw-r--r--src/backends/cl/workloads/ClFullyConnectedWorkload.cpp5
-rw-r--r--src/backends/cl/workloads/ClFullyConnectedWorkload.hpp2
-rw-r--r--src/backends/neon/NeonBackend.cpp8
-rw-r--r--src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp5
-rw-r--r--src/backends/neon/workloads/NeonFullyConnectedWorkload.hpp2
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);