From 890bf652dd82c2f951e511630f0907994ffc1cee Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Tue, 29 Sep 2020 15:12:36 +0100 Subject: IVGCVSW-4997 'Superfluous memcopy workloads' * If Output Layer is already connected to MemCopy Layer do not insert CopyMemGenericWorkload. Signed-off-by: Sadik Armagan Change-Id: I9f813be5a3de2bc62d16864edb3eeaf371ef48e0 --- src/armnn/LoadedNetwork.cpp | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'src/armnn') diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp index 7b64a88470..33625744c5 100644 --- a/src/armnn/LoadedNetwork.cpp +++ b/src/armnn/LoadedNetwork.cpp @@ -685,24 +685,29 @@ void LoadedNetwork::EnqueueOutput(const BindableLayer& layer, ITensorHandle* ten } else { - // If we got here then we didn't export the memory, so add an output workload which performs a memcopy. - outputQueueDescriptor.m_Inputs.push_back(inputTensorHandle); - info.m_InputTensorInfos.push_back(inputTensorInfo); + const Layer& connectedLayer = layer.GetInputSlots()[0].GetConnectedOutputSlot()->GetOwningLayer(); + // Do not add MemCopy Layer if OutputLayer is already connected the MemCopy Layer + if (connectedLayer.GetType() != LayerType::MemCopy) + { + // If we got here then we didn't export the memory, so add an output workload which performs a memcopy. + outputQueueDescriptor.m_Inputs.push_back(inputTensorHandle); + info.m_InputTensorInfos.push_back(inputTensorInfo); - std::unique_ptr outputWorkload = - std::make_unique(outputQueueDescriptor, info); - ARMNN_ASSERT_MSG(outputWorkload, "No output workload created"); + std::unique_ptr outputWorkload = + std::make_unique(outputQueueDescriptor, info); + ARMNN_ASSERT_MSG(outputWorkload, "No output workload created"); - std::unique_ptr timelineUtils = - TimelineUtilityMethods::GetTimelineUtils(m_ProfilingService); - if (timelineUtils) - { - // Add Output Workload to the post-optimisation network structure - AddWorkloadStructure(timelineUtils, outputWorkload, layer); - timelineUtils->Commit(); - } + std::unique_ptr timelineUtils = + TimelineUtilityMethods::GetTimelineUtils(m_ProfilingService); + if (timelineUtils) + { + // Add Output Workload to the post-optimisation network structure + AddWorkloadStructure(timelineUtils, outputWorkload, layer); + timelineUtils->Commit(); + } - m_OutputQueue.push_back(move(outputWorkload)); + m_OutputQueue.push_back(move(outputWorkload)); + } } } -- cgit v1.2.1