IVGCVSW-4997 'Superfluous memcopy workloads'
* If Output Layer is already connected to MemCopy Layer do not insert
CopyMemGenericWorkload.
Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
Change-Id: I9f813be5a3de2bc62d16864edb3eeaf371ef48e0
diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp
index 7b64a88..3362574 100644
--- a/src/armnn/LoadedNetwork.cpp
+++ b/src/armnn/LoadedNetwork.cpp
@@ -685,24 +685,29 @@
}
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);
-
- std::unique_ptr<IWorkload> outputWorkload =
- std::make_unique<CopyMemGenericWorkload>(outputQueueDescriptor, info);
- ARMNN_ASSERT_MSG(outputWorkload, "No output workload created");
-
- std::unique_ptr<TimelineUtilityMethods> timelineUtils =
- TimelineUtilityMethods::GetTimelineUtils(m_ProfilingService);
- if (timelineUtils)
+ 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)
{
- // Add Output Workload to the post-optimisation network structure
- AddWorkloadStructure(timelineUtils, outputWorkload, layer);
- timelineUtils->Commit();
- }
+ // 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);
- m_OutputQueue.push_back(move(outputWorkload));
+ std::unique_ptr<IWorkload> outputWorkload =
+ std::make_unique<CopyMemGenericWorkload>(outputQueueDescriptor, info);
+ ARMNN_ASSERT_MSG(outputWorkload, "No output workload created");
+
+ std::unique_ptr<TimelineUtilityMethods> 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));
+ }
}
}