From 6fba29488f6053cb28be4d7e7a99cf5ecd41c08f Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Tue, 18 Apr 2023 12:48:46 +0100 Subject: IVGCVSW-7454 Fix CpuAcc FC dynamic weights * Pass to ACL the flag for constant weights and bias in FC, conv and DWconv workloads Signed-off-by: Teresa Charlin Change-Id: Iae2810c8d1a402d4afc1e757846665315a80d3ea --- .../neon/workloads/NeonFullyConnectedWorkload.cpp | 52 ++++++++++++++++------ 1 file changed, 38 insertions(+), 14 deletions(-) (limited to 'src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp') diff --git a/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp b/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp index 7bb23f870b..ee3de807e6 100644 --- a/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp +++ b/src/backends/neon/workloads/NeonFullyConnectedWorkload.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2017,2022 Arm Ltd and Contributors. All rights reserved. +// Copyright © 2017,2022-2023 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // @@ -63,15 +63,20 @@ NeonFullyConnectedWorkload::NeonFullyConnectedWorkload(const FullyConnectedQueue ACLMemManagerOnDemand& memoryManager) : NeonBaseWorkload(descriptor, info) { - m_Data.ValidateInputsOutputs("NeonFullyConnectedWorkload", 1, 1); + m_Data.ValidateInputsOutputs("NeonFullyConnectedWorkload", descriptor.m_Parameters.GetNumInputs(), 1); arm_compute::ITensor& input = PolymorphicDowncast(m_Data.m_Inputs[0])->GetTensor(); - arm_compute::ITensor& output = PolymorphicDowncast(m_Data.m_Outputs[0])->GetTensor(); - - // Copy the weights' tensor into arm_compute tensor. - m_WeightsTensor = std::make_unique(); + arm_compute::ITensor& weights = PolymorphicDowncast(m_Data.m_Inputs[1])->GetTensor(); m_WeightsTensorInfo = info.m_InputTensorInfos[1]; - BuildArmComputeTensor(*m_WeightsTensor, m_WeightsTensorInfo); + weights.info()->set_are_values_constant(m_WeightsTensorInfo.IsConstant()); + arm_compute::ITensor& output = PolymorphicDowncast(m_Data.m_Outputs[0])->GetTensor(); + if (m_WeightsTensorInfo.IsConstant()) + { + // Copy the weights' tensor into arm_compute tensor. + m_WeightsTensor = std::make_unique(); + BuildArmComputeTensor(*m_WeightsTensor, m_WeightsTensorInfo); + m_WeightsTensor->info()->set_are_values_constant(m_WeightsTensorInfo.IsConstant()); + } if (m_Data.m_Parameters.m_BiasEnabled) { @@ -79,6 +84,10 @@ NeonFullyConnectedWorkload::NeonFullyConnectedWorkload(const FullyConnectedQueue m_BiasesTensor = std::make_unique(); m_BiasesTensorInfo = info.m_InputTensorInfos[2]; BuildArmComputeTensor(*m_BiasesTensor, m_BiasesTensorInfo); + m_BiasesTensor->info()->set_are_values_constant(m_BiasesTensorInfo.IsConstant()); + + // We do not support dynamic bias + ARMNN_ASSERT(m_BiasesTensorInfo.IsConstant() == true); } const arm_compute::ActivationLayerInfo activationInfo = ConvertAdditionalInfoToAclActivationLayerInfo(descriptor); @@ -86,7 +95,14 @@ NeonFullyConnectedWorkload::NeonFullyConnectedWorkload(const FullyConnectedQueue ConvertFullyConnectedDescriptorToAclFullyConnectedLayerInfo(descriptor.m_Parameters, activationInfo); auto layer = std::make_unique(memoryManager); - layer->configure(&input, m_WeightsTensor.get(), m_BiasesTensor.get(), &output, fc_info); + if (m_WeightsTensorInfo.IsConstant()) + { + layer->configure(&input, m_WeightsTensor.get(), m_BiasesTensor.get(), &output, fc_info); + } + else + { + layer->configure(&input, &weights, m_BiasesTensor.get(), &output, fc_info); + } m_FullyConnectedLayer.reset(layer.release()); // Add details for profiling output @@ -105,8 +121,6 @@ NeonFullyConnectedWorkload::NeonFullyConnectedWorkload(const FullyConnectedQueue descriptor.m_Parameters, detailsInfo, this->GetGuid()); - - // Force Compute Library to perform the necessary copying and reshaping. } void NeonFullyConnectedWorkload::Execute() const @@ -115,15 +129,25 @@ void NeonFullyConnectedWorkload::Execute() const // The constant tensors may not be fully in place until the workload is Executed if (!prepared) { - InitializeArmComputeTensorData(*m_WeightsTensor, m_WeightsTensorInfo, m_Data.m_Inputs[1]); + if (m_WeightsTensorInfo.IsConstant()) + { + InitializeArmComputeTensorData(*m_WeightsTensor, m_WeightsTensorInfo, m_Data.m_Inputs[1]); + m_WeightsTensor->info()->set_are_values_constant(m_WeightsTensorInfo.IsConstant()); + } if (m_Data.m_Parameters.m_BiasEnabled) { InitializeArmComputeTensorData(*m_BiasesTensor, m_BiasesTensorInfo, m_Data.m_Inputs[2]); + m_BiasesTensor->info()->set_are_values_constant(m_BiasesTensorInfo.IsConstant()); + } + if (m_WeightsTensorInfo.IsConstant()) + { + FreeTensorIfUnused(m_WeightsTensor); + } + if (m_BiasesTensorInfo.IsConstant()) + { + FreeTensorIfUnused(m_BiasesTensor); } - m_FullyConnectedLayer->prepare(); - FreeTensorIfUnused(m_WeightsTensor); - FreeTensorIfUnused(m_BiasesTensor); prepared = true; } m_FullyConnectedLayer->run(); -- cgit v1.2.1