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/profiling/TimelineUtilityMethods.cpp | 237 +++++++++++++++++++++++++------ 1 file changed, 190 insertions(+), 47 deletions(-) (limited to 'src/profiling/TimelineUtilityMethods.cpp') diff --git a/src/profiling/TimelineUtilityMethods.cpp b/src/profiling/TimelineUtilityMethods.cpp index c1ae610e49..d540c5970b 100644 --- a/src/profiling/TimelineUtilityMethods.cpp +++ b/src/profiling/TimelineUtilityMethods.cpp @@ -13,25 +13,60 @@ namespace armnn namespace profiling { +std::unique_ptr TimelineUtilityMethods::GetTimelineUtils() +{ + if (ProfilingService::Instance().IsEnabled()) + { + std::unique_ptr sendTimelinepacket = ProfilingService::Instance().GetSendTimelinePacket(); + return std::make_unique(sendTimelinepacket); + } + else + { + std::unique_ptr empty; + return empty; + } +} + + void TimelineUtilityMethods::SendWellKnownLabelsAndEventClasses() { // Send the "name" label, this call throws in case of error - m_SendTimelinePacket.SendTimelineLabelBinaryPacket(LabelsAndEventClasses::NAME_GUID, - LabelsAndEventClasses::NAME_LABEL); + m_SendTimelinePacket->SendTimelineLabelBinaryPacket(LabelsAndEventClasses::NAME_GUID, + LabelsAndEventClasses::NAME_LABEL); // Send the "type" label, this call throws in case of error - m_SendTimelinePacket.SendTimelineLabelBinaryPacket(LabelsAndEventClasses::TYPE_GUID, - LabelsAndEventClasses::TYPE_LABEL); + m_SendTimelinePacket->SendTimelineLabelBinaryPacket(LabelsAndEventClasses::TYPE_GUID, + LabelsAndEventClasses::TYPE_LABEL); // Send the "index" label, this call throws in case of error - m_SendTimelinePacket.SendTimelineLabelBinaryPacket(LabelsAndEventClasses::INDEX_GUID, - LabelsAndEventClasses::INDEX_LABEL); + m_SendTimelinePacket->SendTimelineLabelBinaryPacket(LabelsAndEventClasses::INDEX_GUID, + LabelsAndEventClasses::INDEX_LABEL); + + // Send the "backendId" label, this call throws in case of error + m_SendTimelinePacket->SendTimelineLabelBinaryPacket(LabelsAndEventClasses::BACKENDID_GUID, + LabelsAndEventClasses::BACKENDID_LABEL); + + // Send the "layer" label, this call throws in case of error + m_SendTimelinePacket->SendTimelineLabelBinaryPacket(LabelsAndEventClasses::LAYER_GUID, + LabelsAndEventClasses::LAYER); + + // Send the "workload" label, this call throws in case of error + m_SendTimelinePacket->SendTimelineLabelBinaryPacket(LabelsAndEventClasses::WORKLOAD_GUID, + LabelsAndEventClasses::WORKLOAD); + + // Send the "network" label, this call throws in case of error + m_SendTimelinePacket->SendTimelineLabelBinaryPacket(LabelsAndEventClasses::NETWORK_GUID, + LabelsAndEventClasses::NETWORK); + + // Send the "connection" label, this call throws in case of error + m_SendTimelinePacket->SendTimelineLabelBinaryPacket(LabelsAndEventClasses::CONNECTION_GUID, + LabelsAndEventClasses::CONNECTION); // Send the "start of life" event class, this call throws in case of error - m_SendTimelinePacket.SendTimelineEventClassBinaryPacket(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS); + m_SendTimelinePacket->SendTimelineEventClassBinaryPacket(LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS); // Send the "end of life" event class, this call throws in case of error - m_SendTimelinePacket.SendTimelineEventClassBinaryPacket(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS); + m_SendTimelinePacket->SendTimelineEventClassBinaryPacket(LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS); } ProfilingDynamicGuid TimelineUtilityMethods::CreateNamedTypedEntity(const std::string& name, const std::string& type) @@ -56,7 +91,7 @@ ProfilingDynamicGuid TimelineUtilityMethods::CreateNamedTypedEntity(const std::s return entityGuid; } -void TimelineUtilityMethods::CreateNamedTypedEntity(ProfilingDynamicGuid entityGuid, +void TimelineUtilityMethods::CreateNamedTypedEntity(ProfilingGuid entityGuid, const std::string& name, const std::string& type) { @@ -73,7 +108,7 @@ void TimelineUtilityMethods::CreateNamedTypedEntity(ProfilingDynamicGuid entityG } // Send Entity Binary Packet of the entity to the external profiling service - m_SendTimelinePacket.SendTimelineEntityBinaryPacket(entityGuid); + m_SendTimelinePacket->SendTimelineEntityBinaryPacket(entityGuid); // Create name entity and send the relationship of the entity with the given name NameEntity(entityGuid, name); @@ -82,6 +117,26 @@ void TimelineUtilityMethods::CreateNamedTypedEntity(ProfilingDynamicGuid entityG TypeEntity(entityGuid, type); } +void TimelineUtilityMethods::CreateNamedTypedEntity(ProfilingGuid entityGuid, + const std::string& name, + ProfilingStaticGuid typeGuid) +{ + // Check that the entity name is valid + if (name.empty()) + { + throw InvalidArgumentException("Invalid entity name, the entity name cannot be empty"); + } + + // Send Entity Binary Packet of the entity to the external profiling service + m_SendTimelinePacket->SendTimelineEntityBinaryPacket(entityGuid); + + // Create name entity and send the relationship of the entity with the given name + NameEntity(entityGuid, name); + + // Create type entity and send the relationship of the entity with the given type + MarkEntityWithType(entityGuid, typeGuid); +} + ProfilingStaticGuid TimelineUtilityMethods::DeclareLabel(const std::string& labelName) { // Check that the label name is valid @@ -95,52 +150,74 @@ ProfilingStaticGuid TimelineUtilityMethods::DeclareLabel(const std::string& labe ProfilingStaticGuid labelGuid = ProfilingService::Instance().GenerateStaticId(labelName); // Send the new label to the external profiling service, this call throws in case of error - m_SendTimelinePacket.SendTimelineLabelBinaryPacket(labelGuid, labelName); + m_SendTimelinePacket->SendTimelineLabelBinaryPacket(labelGuid, labelName); return labelGuid; } -void TimelineUtilityMethods::CreateTypedLabel(ProfilingGuid entityGuid, - const std::string& entityName, - ProfilingStaticGuid labelTypeGuid) +void TimelineUtilityMethods::MarkEntityWithLabel(ProfilingGuid entityGuid, + const std::string& labelName, + ProfilingStaticGuid labelTypeGuid) { - // Check that the entity name is valid - if (entityName.empty()) + // Check that the label name is valid + if (labelName.empty()) { - // The entity name is invalid + // The label name is invalid throw InvalidArgumentException("Invalid entity name, the entity name cannot be empty"); } - // Declare a label with the entity's name, this call throws in case of error - ProfilingStaticGuid labelGuid = DeclareLabel(entityName); + // Declare a label with the label's name, this call throws in case of error + ProfilingStaticGuid labelGuid = DeclareLabel(labelName); + + // Generate a GUID for the label relationship + ProfilingDynamicGuid relationshipGuid = ProfilingService::Instance().NextGuid(); + + // Send the new label link to the external profiling service, this call throws in case of error + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::LabelLink, + relationshipGuid, + entityGuid, + labelGuid); + + // Generate a GUID for the label relationship + ProfilingDynamicGuid relationshipLabelGuid = ProfilingService::Instance().NextGuid(); + + // Send the new label link to the external profiling service, this call throws in case of error + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::LabelLink, + relationshipLabelGuid, + relationshipGuid, + labelTypeGuid); +} +void TimelineUtilityMethods::MarkEntityWithType(ProfilingGuid entityGuid, + ProfilingStaticGuid typeNameGuid) +{ // Generate a GUID for the label relationship ProfilingDynamicGuid relationshipGuid = ProfilingService::Instance().NextGuid(); // Send the new label link to the external profiling service, this call throws in case of error - m_SendTimelinePacket.SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::LabelLink, - relationshipGuid, - entityGuid, - labelGuid); + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::LabelLink, + relationshipGuid, + entityGuid, + typeNameGuid); // Generate a GUID for the label relationship ProfilingDynamicGuid relationshipLabelGuid = ProfilingService::Instance().NextGuid(); // Send the new label link to the external profiling service, this call throws in case of error - m_SendTimelinePacket.SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::LabelLink, - relationshipLabelGuid, - relationshipGuid, - labelTypeGuid); + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::LabelLink, + relationshipLabelGuid, + relationshipGuid, + LabelsAndEventClasses::TYPE_GUID); } void TimelineUtilityMethods::NameEntity(ProfilingGuid entityGuid, const std::string& name) { - CreateTypedLabel(entityGuid, name, LabelsAndEventClasses::NAME_GUID); + MarkEntityWithLabel(entityGuid, name, LabelsAndEventClasses::NAME_GUID); } void TimelineUtilityMethods::TypeEntity(ProfilingGuid entityGuid, const std::string& type) { - CreateTypedLabel(entityGuid, type, LabelsAndEventClasses::TYPE_GUID); + MarkEntityWithLabel(entityGuid, type, LabelsAndEventClasses::TYPE_GUID); } ProfilingDynamicGuid TimelineUtilityMethods::CreateNamedTypedChildEntity(ProfilingGuid parentEntityGuid, @@ -168,15 +245,15 @@ ProfilingDynamicGuid TimelineUtilityMethods::CreateNamedTypedChildEntity(Profili ProfilingDynamicGuid retentionLinkGuid = ProfilingService::Instance().NextGuid(); // Send the new retention link to the external profiling service, this call throws in case of error - m_SendTimelinePacket.SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::RetentionLink, - retentionLinkGuid, - parentEntityGuid, - childEntityGuid); + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::RetentionLink, + retentionLinkGuid, + parentEntityGuid, + childEntityGuid); return childEntityGuid; } -void TimelineUtilityMethods::CreateNamedTypedChildEntity(ProfilingDynamicGuid childEntityGuid, +void TimelineUtilityMethods::CreateNamedTypedChildEntity(ProfilingGuid childEntityGuid, ProfilingGuid parentEntityGuid, const std::string& entityName, const std::string& entityType) @@ -202,10 +279,76 @@ void TimelineUtilityMethods::CreateNamedTypedChildEntity(ProfilingDynamicGuid ch ProfilingDynamicGuid retentionLinkGuid = ProfilingService::Instance().NextGuid(); // Send the new retention link to the external profiling service, this call throws in case of error - m_SendTimelinePacket.SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::RetentionLink, - retentionLinkGuid, - parentEntityGuid, - childEntityGuid); + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::RetentionLink, + retentionLinkGuid, + parentEntityGuid, + childEntityGuid); +} + +void TimelineUtilityMethods::CreateNamedTypedChildEntity(ProfilingGuid childEntityGuid, + ProfilingGuid parentEntityGuid, + const std::string& entityName, + ProfilingStaticGuid typeGuid) +{ + // Check that the entity name is valid + if (entityName.empty()) + { + // The entity name is invalid + throw InvalidArgumentException("Invalid entity name, the entity name cannot be empty"); + } + + // Create a named type entity from the given guid, name and type, this call throws in case of error + CreateNamedTypedEntity(childEntityGuid, entityName, typeGuid); + + // Generate a GUID for the retention link relationship + ProfilingDynamicGuid retentionLinkGuid = ProfilingService::Instance().NextGuid(); + + // Send the new retention link to the external profiling service, this call throws in case of error + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::RetentionLink, + retentionLinkGuid, + parentEntityGuid, + childEntityGuid); +} + +ProfilingDynamicGuid TimelineUtilityMethods::CreateRelationship(ProfilingRelationshipType relationshipType, + ProfilingGuid headGuid, + ProfilingGuid tailGuid) +{ + // Generate a GUID for the relationship + ProfilingDynamicGuid relationshipGuid = ProfilingService::Instance().NextGuid(); + + // Send the new retention link to the external profiling service, this call throws in case of error + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(relationshipType, + relationshipGuid, + headGuid, + tailGuid); + return relationshipGuid; +} + +ProfilingDynamicGuid TimelineUtilityMethods::CreateConnectionRelationship(ProfilingRelationshipType relationshipType, + ProfilingGuid headGuid, + ProfilingGuid tailGuid) +{ + // Generate a GUID for the relationship + ProfilingDynamicGuid relationshipGuid = ProfilingService::Instance().NextGuid(); + + // Send the new retention link to the external profiling service, this call throws in case of error + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(relationshipType, + relationshipGuid, + headGuid, + tailGuid); + + MarkEntityWithType(relationshipGuid, LabelsAndEventClasses::CONNECTION_GUID); + return relationshipGuid; +} + +void TimelineUtilityMethods::CreateTypedEntity(ProfilingGuid entityGuid, ProfilingStaticGuid entityTypeGuid) +{ + // Send Entity Binary Packet of the entity to the external profiling service + m_SendTimelinePacket->SendTimelineEntityBinaryPacket(entityGuid); + + // Create type entity and send the relationship of the entity with the given type + MarkEntityWithType(entityGuid, entityTypeGuid); } ProfilingDynamicGuid TimelineUtilityMethods::RecordEvent(ProfilingGuid entityGuid, ProfilingStaticGuid eventClassGuid) @@ -220,25 +363,25 @@ ProfilingDynamicGuid TimelineUtilityMethods::RecordEvent(ProfilingGuid entityGui ProfilingDynamicGuid eventGuid = ProfilingService::Instance().NextGuid(); // Send the new timeline event to the external profiling service, this call throws in case of error - m_SendTimelinePacket.SendTimelineEventBinaryPacket(timestamp, threadId, eventGuid); + m_SendTimelinePacket->SendTimelineEventBinaryPacket(timestamp, threadId, eventGuid); // Generate a GUID for the execution link ProfilingDynamicGuid executionLinkId = ProfilingService::Instance().NextGuid(); // Send the new execution link to the external profiling service, this call throws in case of error - m_SendTimelinePacket.SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::ExecutionLink, - executionLinkId, - entityGuid, - eventGuid); + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::ExecutionLink, + executionLinkId, + entityGuid, + eventGuid); // Generate a GUID for the data relationship link ProfilingDynamicGuid eventClassLinkId = ProfilingService::Instance().NextGuid(); // Send the new data relationship link to the external profiling service, this call throws in case of error - m_SendTimelinePacket.SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::DataLink, - eventClassLinkId, - entityGuid, - eventClassGuid); + m_SendTimelinePacket->SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType::DataLink, + eventClassLinkId, + eventGuid, + eventClassGuid); return eventGuid; } -- cgit v1.2.1