blob: c1ae610e49a88e8fdbeb2ae2612550b0a52a0d24 [file] [log] [blame]
//
// Copyright © 2019 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "TimelineUtilityMethods.hpp"
#include "ProfilingService.hpp"
#include "LabelsAndEventClasses.hpp"
namespace armnn
{
namespace profiling
{
void TimelineUtilityMethods::SendWellKnownLabelsAndEventClasses()
{
// Send the "name" label, this call throws in case of error
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);
// Send the "index" label, this call throws in case of error
m_SendTimelinePacket.SendTimelineLabelBinaryPacket(LabelsAndEventClasses::INDEX_GUID,
LabelsAndEventClasses::INDEX_LABEL);
// Send the "start of life" event class, this call throws in case of error
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);
}
ProfilingDynamicGuid TimelineUtilityMethods::CreateNamedTypedEntity(const std::string& name, const std::string& type)
{
// Check that the entity name is valid
if (name.empty())
{
throw InvalidArgumentException("Invalid entity name, the entity name cannot be empty");
}
// Check that the entity type is valid
if (type.empty())
{
throw InvalidArgumentException("Invalid entity type, the entity type cannot be empty");
}
// Generate dynamic GUID of the entity
ProfilingDynamicGuid entityGuid = ProfilingService::Instance().NextGuid();
CreateNamedTypedEntity(entityGuid, name, type);
return entityGuid;
}
void TimelineUtilityMethods::CreateNamedTypedEntity(ProfilingDynamicGuid entityGuid,
const std::string& name,
const std::string& type)
{
// Check that the entity name is valid
if (name.empty())
{
throw InvalidArgumentException("Invalid entity name, the entity name cannot be empty");
}
// Check that the entity type is valid
if (type.empty())
{
throw InvalidArgumentException("Invalid entity type, the entity type 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
TypeEntity(entityGuid, type);
}
ProfilingStaticGuid TimelineUtilityMethods::DeclareLabel(const std::string& labelName)
{
// Check that the label name is valid
if (labelName.empty())
{
// The label name is invalid
throw InvalidArgumentException("Invalid label name, the label name cannot be empty");
}
// Generate a static GUID for the given label name
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);
return labelGuid;
}
void TimelineUtilityMethods::CreateTypedLabel(ProfilingGuid entityGuid,
const std::string& entityName,
ProfilingStaticGuid labelTypeGuid)
{
// 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");
}
// Declare a label with the entity's name, this call throws in case of error
ProfilingStaticGuid labelGuid = DeclareLabel(entityName);
// 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::NameEntity(ProfilingGuid entityGuid, const std::string& name)
{
CreateTypedLabel(entityGuid, name, LabelsAndEventClasses::NAME_GUID);
}
void TimelineUtilityMethods::TypeEntity(ProfilingGuid entityGuid, const std::string& type)
{
CreateTypedLabel(entityGuid, type, LabelsAndEventClasses::TYPE_GUID);
}
ProfilingDynamicGuid TimelineUtilityMethods::CreateNamedTypedChildEntity(ProfilingGuid parentEntityGuid,
const std::string& entityName,
const std::string& entityType)
{
// 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");
}
// Check that the entity type is valid
if (entityType.empty())
{
// The entity type is invalid
throw InvalidArgumentException("Invalid entity type, the entity type cannot be empty");
}
// Create a named type entity from the given name and type, this call throws in case of error
ProfilingDynamicGuid childEntityGuid = CreateNamedTypedEntity(entityName, entityType);
// 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);
return childEntityGuid;
}
void TimelineUtilityMethods::CreateNamedTypedChildEntity(ProfilingDynamicGuid childEntityGuid,
ProfilingGuid parentEntityGuid,
const std::string& entityName,
const std::string& entityType)
{
// 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");
}
// Check that the entity type is valid
if (entityType.empty())
{
// The entity type is invalid
throw InvalidArgumentException("Invalid entity type, the entity type 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, entityType);
// 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::RecordEvent(ProfilingGuid entityGuid, ProfilingStaticGuid eventClassGuid)
{
// Take a timestamp
uint64_t timestamp = GetTimestamp();
// Get the thread id
std::thread::id threadId = std::this_thread::get_id();
// Generate a GUID for the event
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);
// 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);
// 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);
return eventGuid;
}
} // namespace profiling
} // namespace armnn