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)
94 JSONEntity& tailJSONEntity = m_Model.
jsonEntities.at(tailGuid);
95 JSONEntity& headJSONEntity = m_Model.
jsonEntities.at(headGuid);
96 tailJSONEntity.SetParent(headJSONEntity);
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)
152 JSONEntity& headEntity = m_Model.
jsonEntities.at(labelRelation.m_HeadGuid);
153 std::string type = m_Model.
labels.at(labelRelation.m_TailGuid).m_Name;
154 headEntity.SetType(type);
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);
171 JSONEntity& headEntity = m_Model.
jsonEntities.at(labelRelation.m_HeadGuid);
172 std::string name = m_Model.
labels.at(labelRelation.m_TailGuid).m_Name;
173 headEntity.SetName(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);
189 JSONEntity& headEntity = m_Model.
jsonEntities.at(labelRelation.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);
207 JSONEntity& headEntity = m_Model.
jsonEntities.at(retentionRelation.m_HeadGuid);
208 JSONEntity& tailEntity = m_Model.
jsonEntities.at(retentionRelation.m_TailGuid);
209 headEntity.AddConnection(headEntity, tailEntity);
216 m_Model.
relationships.insert({relationship.m_Guid, relationship});
220 void JSONTimelineDecoder::HandleRetentionLink(
const ITimelineDecoder::Relationship& relationship)
223 .count(relationship.m_HeadGuid) != 0)
225 JSONEntity& tailJSONEntity = m_Model.
jsonEntities.at(relationship.m_TailGuid);
226 JSONEntity& headJSONEntity = m_Model.
jsonEntities.at(relationship.m_HeadGuid);
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");
312 Event event1 = m_Model.
events.at(jsonEventOne.GetGuid());
313 Event event2 = m_Model.
events.at(jsonEventTwo.GetGuid());
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;
328 std::string JSONTimelineDecoder::GetWorkloadJSONString(
const JSONTimelineDecoder::JSONEntity& entity,
int& counter,
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");
335 for (uint64_t child_entity_id : entity.childEntities)
337 JSONEntity &childEntity = m_Model.
jsonEntities.at(child_entity_id);
340 return jsonEntityString;
343 std::string JSONTimelineDecoder::GetLayerJSONString(JSONTimelineDecoder::JSONEntity& entity,
int& counter,
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");
353 for (uint64_t child_entity_id : entity.childEntities)
355 JSONEntity& childEntity = m_Model.
jsonEntities.at(child_entity_id);
358 return jsonEntityString;
363 std::vector<uint64_t>::iterator it = std::find(headEntity.
childEntities.begin(),
381 this->name = entityName;
391 this->type = entityType;