7 #include "../profiling/ProfilingUtils.hpp" 13 namespace timelinedecoder
16 static const char *
const CONNECTION =
"connection";
17 static const char *
const BACKEND_ID =
"backendId";
18 static const char *
const NAME =
"name";
19 static const char *
const TYPE =
"type";
20 static const char *
const WORKLOAD =
"workload";
21 static const char *
const WORKLOAD_EXECUTION =
"workload_execution";
22 static const char *
const INFERENCE =
"inference";
23 static const char *
const LAYER =
"layer";
24 static const char *
const ENTITY =
"Entity";
25 static const char *
const EVENTCLASS =
"EventClass";
26 static const char *
const EVENT =
"Event";
32 this->m_Model.
jsonEntities.insert({entity.m_Guid, jsonEntity});
33 return TimelineStatus::TimelineStatus_Success;
40 this->m_Model.
eventClasses.insert({eventClass.m_Guid, eventClass});
41 this->m_Model.
jsonEntities.insert({eventClass.m_Guid, jsonEntity});
42 return TimelineStatus::TimelineStatus_Success;
49 this->m_Model.
events.insert({
event.m_Guid,
event});
51 return TimelineStatus::TimelineStatus_Success;
56 this->m_Model.
labels.insert({label.m_Guid, label});
57 return TimelineStatus::TimelineStatus_Success;
62 if (relationship.m_RelationshipType == ITimelineDecoder::RelationshipType::RetentionLink)
64 HandleRetentionLink(relationship);
66 else if (relationship.m_RelationshipType == ITimelineDecoder::RelationshipType::LabelLink)
68 HandleLabelLink(relationship);
70 else if (relationship.m_RelationshipType == ITimelineDecoder::RelationshipType::ExecutionLink)
72 HandleExecutionLink(relationship);
79 m_Model.
relationships.insert({relationship.m_Guid, relationship});
82 return TimelineStatus::TimelineStatus_Success;
86 void JSONTimelineDecoder::HandleExecutionLink(
const ITimelineDecoder::Relationship& relationship)
88 uint64_t tailGuid = relationship.m_TailGuid;
89 uint64_t headGuid = relationship.m_HeadGuid;
91 if (m_Model.
jsonEntities.count(relationship.m_HeadGuid) != 0)
97 m_Model.
relationships.insert({relationship.m_Guid, relationship});
104 m_Model.
relationships.insert({relationship.m_Guid, relationship});
108 void JSONTimelineDecoder::HandleLabelLink(
const ITimelineDecoder::Relationship& relationship)
110 if (m_Model.
labels.count(relationship.m_TailGuid) != 0)
112 if (m_Model.
labels.at(relationship.m_TailGuid).m_Name == CONNECTION)
114 HandleConnectionLabel(relationship);
116 else if (m_Model.
labels.at(relationship.m_TailGuid).m_Name == BACKEND_ID)
118 HandleBackendIdLabel(relationship);
120 else if (m_Model.
labels.at(relationship.m_TailGuid).m_Name == NAME)
122 HandleNameLabel(relationship);
124 else if (m_Model.
labels.at(relationship.m_TailGuid).m_Name == TYPE)
126 HandleTypeLabel(relationship);
133 m_Model.
relationships.insert({relationship.m_Guid, relationship});
140 m_Model.
relationships.insert({relationship.m_Guid, relationship});
144 void JSONTimelineDecoder::HandleTypeLabel(
const ITimelineDecoder::Relationship& relationship)
146 if (m_Model.
relationships.count(relationship.m_HeadGuid) != 0)
148 Relationship labelRelation = m_Model.
relationships.at(relationship.m_HeadGuid);
149 if (m_Model.
jsonEntities.count(labelRelation.m_HeadGuid) != 0)
152 std::string type = m_Model.
labels.at(labelRelation.m_TailGuid).m_Name;
161 m_Model.
relationships.insert({relationship.m_Guid, relationship});
165 void JSONTimelineDecoder::HandleNameLabel(
const ITimelineDecoder::Relationship& relationship)
167 if (m_Model.
relationships.count(relationship.m_HeadGuid) != 0)
169 Relationship labelRelation = m_Model.
relationships.at(relationship.m_HeadGuid);
171 std::string name = m_Model.
labels.at(labelRelation.m_TailGuid).m_Name;
179 m_Model.
relationships.insert({relationship.m_Guid, relationship});
183 void JSONTimelineDecoder::HandleBackendIdLabel(
const ITimelineDecoder::Relationship& relationship)
185 if (m_Model.
relationships.count(relationship.m_HeadGuid) != 0)
187 Relationship labelRelation = m_Model.
relationships.at(relationship.m_HeadGuid);
189 std::string backendName = m_Model.
labels.at(labelRelation.m_TailGuid).m_Name;
190 headEntity.
extendedData.insert({BACKEND_ID, backendName});
197 m_Model.
relationships.insert({relationship.m_Guid, relationship});
201 void JSONTimelineDecoder::HandleConnectionLabel(
const ITimelineDecoder::Relationship& relationship)
203 if (m_Model.
relationships.count(relationship.m_HeadGuid) != 0)
205 Relationship retentionRelation = m_Model.
relationships.at(relationship.m_HeadGuid);
215 m_Model.
relationships.insert({relationship.m_Guid, relationship});
219 void JSONTimelineDecoder::HandleRetentionLink(
const ITimelineDecoder::Relationship& relationship)
222 .count(relationship.m_HeadGuid) != 0)
226 tailJSONEntity.
SetParent(headJSONEntity);
227 m_Model.
jsonEntities.insert({relationship.m_HeadGuid, headJSONEntity});
228 m_Model.
relationships.insert({relationship.m_Guid, relationship});
235 m_Model.
relationships.insert({relationship.m_Guid, relationship});
257 json.append(
"\tArmNN");
258 json.append(
": {\n");
272 std::string jsonEntityString;
275 return GetLayerJSONString(entity, counter, jsonEntityString);
277 else if (entity.
GetType() == WORKLOAD)
279 return GetWorkloadJSONString(entity, counter, jsonEntityString);
281 else if (entity.
GetType() == WORKLOAD_EXECUTION)
283 return GetWorkloadExecutionJSONString(entity, jsonEntityString);
285 else if (entity.
GetType() == INFERENCE)
287 return jsonEntityString;
296 return jsonEntityString;
301 std::string& jsonEntityString)
const 305 throw Exception(
"Workload Execution Entity Packet does not have the expected Event packets attached");
313 uint64_t wall_clock_time = event2.m_TimeStamp - event1.m_TimeStamp;
314 jsonEntityString.append(
"\t\t\t");
315 jsonEntityString.append(
"raw : [");
316 jsonEntityString.append(std::to_string(wall_clock_time));
317 jsonEntityString.append(
"], \n");
318 jsonEntityString.append(
"\t\t\t");
319 jsonEntityString.append(
"unit : us,\n");
320 jsonEntityString.append(
"\t\t\t");
321 jsonEntityString.append(
"}\n");
323 return jsonEntityString;
327 std::string& jsonEntityString)
329 jsonEntityString.append(
"\t\t\t");
330 jsonEntityString.append(
"backendId :");
331 jsonEntityString.append(entity.
extendedData.at(BACKEND_ID));
332 jsonEntityString.append(
",\n");
338 return jsonEntityString;
342 std::string& jsonEntityString)
344 jsonEntityString.append(
"\t\t");
345 jsonEntityString.append(entity.
GetName());
346 jsonEntityString.append(
"_");
347 jsonEntityString.append(std::to_string(counter));
348 jsonEntityString.append(
": {\n");
349 jsonEntityString.append(
"\t\t\t");
350 jsonEntityString.append(
"type: Measurement,\n");
356 return jsonEntityString;
361 std::vector<uint64_t>::iterator it = std::find(headEntity.
childEntities.begin(),
379 this->name = entityName;
389 this->type = entityType;
Event class records measurements reported by BeginEvent()/EndEvent() and returns measurements when Ev...
std::map< uint64_t, EventClass > eventClasses
std::vector< uint64_t > connected_entities
void SetType(std::string entityType)
void AddConnection(JSONEntity &headEntity, JSONEntity &connectedEntity)
Copyright (c) 2020 ARM Limited.
std::map< uint64_t, JSONEntity > jsonEntities
void SetParent(JSONEntity &parent)
std::map< uint64_t, Event > events
std::vector< uint64_t > childEntities
void SetName(std::string entityName)
std::string GetJSONEntityString(JSONEntity &entity, int &counter)
virtual TimelineStatus CreateEntity(const Entity &) override
virtual TimelineStatus CreateEventClass(const EventClass &) override
std::string GetJSONString(JSONEntity &rootEntity)
std::map< uint64_t, Label > labels
Base class for all ArmNN exceptions so that users can filter to just those.
std::map< uint64_t, Relationship > relationships
virtual TimelineStatus CreateLabel(const Label &) override
virtual TimelineStatus CreateEvent(const Event &) override
std::map< std::string, std::string > extendedData
void PrintJSON(JSONEntity &entity, std::ostream &os)
virtual TimelineStatus CreateRelationship(const Relationship &) override