8 #include <client/src/ProfilingUtils.hpp> 14 namespace timelinedecoder
17 static const char *
const CONNECTION =
"connection";
18 static const char *
const BACKEND_ID =
"backendId";
19 static const char *
const NAME =
"name";
20 static const char *
const TYPE =
"type";
21 static const char *
const WORKLOAD =
"workload";
22 static const char *
const WORKLOAD_EXECUTION =
"workload_execution";
23 static const char *
const INFERENCE =
"inference";
24 static const char *
const LAYER =
"layer";
25 static const char *
const ENTITY =
"Entity";
26 static const char *
const EVENTCLASS =
"EventClass";
27 static const char *
const EVENT =
"Event";
33 this->m_Model.
jsonEntities.insert({entity.m_Guid, jsonEntity});
34 return TimelineStatus::TimelineStatus_Success;
41 this->m_Model.
eventClasses.insert({eventClass.m_Guid, eventClass});
42 this->m_Model.
jsonEntities.insert({eventClass.m_Guid, jsonEntity});
43 return TimelineStatus::TimelineStatus_Success;
50 this->m_Model.
events.insert({
event.m_Guid,
event});
52 return TimelineStatus::TimelineStatus_Success;
57 this->m_Model.
labels.insert({label.m_Guid, label});
58 return TimelineStatus::TimelineStatus_Success;
63 if (relationship.m_RelationshipType == ITimelineDecoder::RelationshipType::RetentionLink)
65 HandleRetentionLink(relationship);
67 else if (relationship.m_RelationshipType == ITimelineDecoder::RelationshipType::LabelLink)
69 HandleLabelLink(relationship);
71 else if (relationship.m_RelationshipType == ITimelineDecoder::RelationshipType::ExecutionLink)
73 HandleExecutionLink(relationship);
80 m_Model.
relationships.insert({relationship.m_Guid, relationship});
83 return TimelineStatus::TimelineStatus_Success;
87 void JSONTimelineDecoder::HandleExecutionLink(
const ITimelineDecoder::Relationship& relationship)
89 uint64_t tailGuid = relationship.m_TailGuid;
90 uint64_t headGuid = relationship.m_HeadGuid;
92 if (m_Model.
jsonEntities.count(relationship.m_HeadGuid) != 0)
98 m_Model.
relationships.insert({relationship.m_Guid, relationship});
105 m_Model.
relationships.insert({relationship.m_Guid, relationship});
109 void JSONTimelineDecoder::HandleLabelLink(
const ITimelineDecoder::Relationship& relationship)
111 if (m_Model.
labels.count(relationship.m_TailGuid) != 0)
113 if (m_Model.
labels.at(relationship.m_TailGuid).m_Name == CONNECTION)
115 HandleConnectionLabel(relationship);
117 else if (m_Model.
labels.at(relationship.m_TailGuid).m_Name == BACKEND_ID)
119 HandleBackendIdLabel(relationship);
121 else if (m_Model.
labels.at(relationship.m_TailGuid).m_Name == NAME)
123 HandleNameLabel(relationship);
125 else if (m_Model.
labels.at(relationship.m_TailGuid).m_Name == TYPE)
127 HandleTypeLabel(relationship);
134 m_Model.
relationships.insert({relationship.m_Guid, relationship});
141 m_Model.
relationships.insert({relationship.m_Guid, relationship});
145 void JSONTimelineDecoder::HandleTypeLabel(
const ITimelineDecoder::Relationship& relationship)
147 if (m_Model.
relationships.count(relationship.m_HeadGuid) != 0)
149 Relationship labelRelation = m_Model.
relationships.at(relationship.m_HeadGuid);
150 if (m_Model.
jsonEntities.count(labelRelation.m_HeadGuid) != 0)
153 std::string type = m_Model.
labels.at(labelRelation.m_TailGuid).m_Name;
162 m_Model.
relationships.insert({relationship.m_Guid, relationship});
166 void JSONTimelineDecoder::HandleNameLabel(
const ITimelineDecoder::Relationship& relationship)
168 if (m_Model.
relationships.count(relationship.m_HeadGuid) != 0)
170 Relationship labelRelation = m_Model.
relationships.at(relationship.m_HeadGuid);
172 std::string name = m_Model.
labels.at(labelRelation.m_TailGuid).m_Name;
180 m_Model.
relationships.insert({relationship.m_Guid, relationship});
184 void JSONTimelineDecoder::HandleBackendIdLabel(
const ITimelineDecoder::Relationship& relationship)
186 if (m_Model.
relationships.count(relationship.m_HeadGuid) != 0)
188 Relationship labelRelation = m_Model.
relationships.at(relationship.m_HeadGuid);
190 std::string backendName = m_Model.
labels.at(labelRelation.m_TailGuid).m_Name;
191 headEntity.
extendedData.insert({BACKEND_ID, backendName});
198 m_Model.
relationships.insert({relationship.m_Guid, relationship});
202 void JSONTimelineDecoder::HandleConnectionLabel(
const ITimelineDecoder::Relationship& relationship)
204 if (m_Model.
relationships.count(relationship.m_HeadGuid) != 0)
206 Relationship retentionRelation = m_Model.
relationships.at(relationship.m_HeadGuid);
216 m_Model.
relationships.insert({relationship.m_Guid, relationship});
220 void JSONTimelineDecoder::HandleRetentionLink(
const ITimelineDecoder::Relationship& relationship)
223 .count(relationship.m_HeadGuid) != 0)
227 tailJSONEntity.
SetParent(headJSONEntity);
228 m_Model.
jsonEntities.insert({relationship.m_HeadGuid, headJSONEntity});
229 m_Model.
relationships.insert({relationship.m_Guid, relationship});
236 m_Model.
relationships.insert({relationship.m_Guid, relationship});
258 json.append(
"\tArmNN");
259 json.append(
": {\n");
273 std::string jsonEntityString;
276 return GetLayerJSONString(entity, counter, jsonEntityString);
278 else if (entity.
GetType() == WORKLOAD)
280 return GetWorkloadJSONString(entity, counter, jsonEntityString);
282 else if (entity.
GetType() == WORKLOAD_EXECUTION)
284 return GetWorkloadExecutionJSONString(entity, jsonEntityString);
286 else if (entity.
GetType() == INFERENCE)
288 return jsonEntityString;
297 return jsonEntityString;
302 std::string& jsonEntityString)
const 306 throw arm::pipe::ProfilingException(
307 "Workload Execution Entity Packet does not have the expected Event packets attached");
315 uint64_t wall_clock_time = event2.m_TimeStamp - event1.m_TimeStamp;
316 jsonEntityString.append(
"\t\t\t");
317 jsonEntityString.append(
"raw : [");
318 jsonEntityString.append(std::to_string(wall_clock_time));
319 jsonEntityString.append(
"], \n");
320 jsonEntityString.append(
"\t\t\t");
321 jsonEntityString.append(
"unit : us,\n");
322 jsonEntityString.append(
"\t\t\t");
323 jsonEntityString.append(
"}\n");
325 return jsonEntityString;
329 std::string& jsonEntityString)
331 jsonEntityString.append(
"\t\t\t");
332 jsonEntityString.append(
"backendId :");
333 jsonEntityString.append(entity.
extendedData.at(BACKEND_ID));
334 jsonEntityString.append(
",\n");
340 return jsonEntityString;
344 std::string& jsonEntityString)
346 jsonEntityString.append(
"\t\t");
347 jsonEntityString.append(entity.
GetName());
348 jsonEntityString.append(
"_");
349 jsonEntityString.append(std::to_string(counter));
350 jsonEntityString.append(
": {\n");
351 jsonEntityString.append(
"\t\t\t");
352 jsonEntityString.append(
"type: Measurement,\n");
358 return jsonEntityString;
363 std::vector<uint64_t>::iterator it = std::find(headEntity.
childEntities.begin(),
381 this->name = entityName;
391 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) 2021 ARM Limited and Contributors.
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
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