From df31cfe29f9dccc4c2055a1d2a97de644b07d522 Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Fri, 22 Nov 2019 11:26:06 +0000 Subject: IVGCVSW-4070 Implement "send post-optimized network structure" * Send post-optimisation network structure if profiling service is enabled * Refactor TimelineUtilityMethods * Fix RecordEvent to link eventGuid with eventClassGuid * Add common types and guid to LabelsAndEventClasses * Add CreateRelationship to TimelineUtilityMethods * Add CreateTypedEntity to TimelineUtilityMethods * Add MarkEntityWithType to TimelineUtilityMethods * Move VerifyTimeline functions to ProfilingTestUtils * Post-optimisation network structure unit tests to Ref, Cl, Neon Signed-off-by: Narumol Prangnawarat Change-Id: I0194f2037c236450c912f4c3cb11e46b80c0f512 --- src/armnn/LoadedNetwork.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) (limited to 'src/armnn/LoadedNetwork.cpp') diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp index e9a3545e35..36a56b044e 100644 --- a/src/armnn/LoadedNetwork.cpp +++ b/src/armnn/LoadedNetwork.cpp @@ -17,6 +17,9 @@ #include #include #include +#include +#include +#include #include #include @@ -27,6 +30,7 @@ namespace armnn { using namespace std; +using namespace armnn::profiling; namespace { @@ -39,6 +43,43 @@ std::string ToErrorMessage(const char * prefix, const ExceptionType & error) return ss.str(); } +void AddLayerStructure(std::unique_ptr& timelineUtils, + const Layer& layer, + ProfilingGuid networkGuid) +{ + // Add layer to the post-optimisation network structure + std::string layerName = layer.GetNameStr().empty() ? "" : layer.GetNameStr(); + timelineUtils->CreateNamedTypedChildEntity(layer.GetGuid(), + networkGuid, + layerName, + LabelsAndEventClasses::LAYER_GUID); + for (auto&& input : layer.GetInputSlots()) + { + const IOutputSlot* source = input.GetConnectedOutputSlot(); + BOOST_ASSERT(source != NULL); + timelineUtils->CreateConnectionRelationship(ProfilingRelationshipType::RetentionLink, + source->GetOwningLayerGuid(), + layer.GetGuid()); + } +} + +void AddWorkloadStructure(std::unique_ptr& timelineUtils, + std::unique_ptr& workload, + const Layer& layer) +{ + // Add workload to the post-optimisation network structure + timelineUtils->CreateTypedEntity(workload->GetGuid(), LabelsAndEventClasses::WORKLOAD_GUID); + timelineUtils->MarkEntityWithLabel(workload->GetGuid(), + layer.GetBackendId().Get(), + LabelsAndEventClasses::BACKENDID_GUID); + + // Link the workload to the layer + timelineUtils->CreateRelationship(ProfilingRelationshipType::RetentionLink, + layer.GetGuid(), + workload->GetGuid()); + +} + } // anonymous std::unique_ptr LoadedNetwork::MakeLoadedNetwork(std::unique_ptr net, @@ -149,9 +190,22 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr net, } } + ProfilingGuid networkGuid = m_OptimizedNetwork->GetGuid(); + std::unique_ptr timelineUtils = TimelineUtilityMethods::GetTimelineUtils(); + if (timelineUtils) + { + timelineUtils->CreateTypedEntity(networkGuid, LabelsAndEventClasses::NETWORK_GUID); + } + //Then create workloads. for (auto&& layer : order) { + if (timelineUtils) + { + // Add layer to the post-optimisation network structure + AddLayerStructure(timelineUtils, *layer, networkGuid); + } + const IWorkloadFactory& workloadFactory = GetWorkloadFactory(*layer); switch (layer->GetType()) @@ -168,13 +222,20 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr net, if (!workload) { - const char* const layerName = layer->GetNameStr().length() != 0 ? layer->GetName() : ""; + const char* const layerName = + layer->GetNameStr().length() != 0 ? layer->GetName() : ""; throw InvalidArgumentException(boost::str( boost::format("No workload created for layer (name: '%1%' type: '%2%') (compute '%3%')") % layerName % static_cast(layer->GetType()) % layer->GetBackendId().Get() )); } + if (timelineUtils) + { + // Add workload to the post-optimisation network structure + AddWorkloadStructure(timelineUtils, workload, *layer); + } + m_WorkloadQueue.push_back(move(workload)); // release the constant data in the layer.. layer->ReleaseConstantData(); @@ -183,6 +244,12 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr net, } } + if (timelineUtils) + { + // Commit to send the post-optimisation network structure + timelineUtils->Commit(); + } + // Set up memory. m_OptimizedNetwork->GetGraph().AllocateDynamicBuffers(); -- cgit v1.2.1