IVGCVSW-4997 'Superfluous memcopy workloads'
authorSadik Armagan <sadik.armagan@arm.com>
Tue, 29 Sep 2020 14:12:36 +0000 (15:12 +0100)
committerSadik Armagan <sadik.armagan@arm.com>
Fri, 2 Oct 2020 12:04:08 +0000 (12:04 +0000)
* 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

src/armnn/LoadedNetwork.cpp

index 7b64a88..3362574 100644 (file)
@@ -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<IWorkload> outputWorkload =
-            std::make_unique<CopyMemGenericWorkload>(outputQueueDescriptor, info);
-        ARMNN_ASSERT_MSG(outputWorkload, "No output workload created");
+            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();
-        }
+            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));
+            m_OutputQueue.push_back(move(outputWorkload));
+        }
     }
 }