xref: /aosp_15_r20/external/armnn/src/profiling/test/TimelineModel.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #pragma once
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ProfilingException.hpp>
9*89c4ff92SAndroid Build Coastguard Worker #include <server/include/timelineDecoder/ITimelineDecoder.hpp>
10*89c4ff92SAndroid Build Coastguard Worker 
11*89c4ff92SAndroid Build Coastguard Worker #include <map>
12*89c4ff92SAndroid Build Coastguard Worker #include <sstream>
13*89c4ff92SAndroid Build Coastguard Worker #include <vector>
14*89c4ff92SAndroid Build Coastguard Worker 
15*89c4ff92SAndroid Build Coastguard Worker namespace arm
16*89c4ff92SAndroid Build Coastguard Worker {
17*89c4ff92SAndroid Build Coastguard Worker 
18*89c4ff92SAndroid Build Coastguard Worker namespace pipe
19*89c4ff92SAndroid Build Coastguard Worker {
20*89c4ff92SAndroid Build Coastguard Worker using LabelMap = std::map<uint64_t, arm::pipe::ITimelineDecoder::Label>;
21*89c4ff92SAndroid Build Coastguard Worker using Attribute = std::pair<std::string, std::string>;
22*89c4ff92SAndroid Build Coastguard Worker using Attributes = std::map<std::string, Attribute>;
23*89c4ff92SAndroid Build Coastguard Worker class Entity;
24*89c4ff92SAndroid Build Coastguard Worker class Connection
25*89c4ff92SAndroid Build Coastguard Worker {
26*89c4ff92SAndroid Build Coastguard Worker public:
Connection(uint64_t guid,Entity * head,Entity * tail)27*89c4ff92SAndroid Build Coastguard Worker     Connection(uint64_t guid, Entity* head, Entity* tail) :
28*89c4ff92SAndroid Build Coastguard Worker         m_Guid(guid), m_HeadEntity(head), m_TailEntity(tail)
29*89c4ff92SAndroid Build Coastguard Worker     {
30*89c4ff92SAndroid Build Coastguard Worker         if (head == nullptr)
31*89c4ff92SAndroid Build Coastguard Worker         {
32*89c4ff92SAndroid Build Coastguard Worker             std::stringstream ss;
33*89c4ff92SAndroid Build Coastguard Worker             ss << "connection [" << guid << "] head cannot be null";
34*89c4ff92SAndroid Build Coastguard Worker             throw arm::pipe::ProfilingException(ss.str());
35*89c4ff92SAndroid Build Coastguard Worker         }
36*89c4ff92SAndroid Build Coastguard Worker         if (tail == nullptr)
37*89c4ff92SAndroid Build Coastguard Worker         {
38*89c4ff92SAndroid Build Coastguard Worker             std::stringstream ss;
39*89c4ff92SAndroid Build Coastguard Worker             ss << "connection [" << guid << "] tail cannot be null";
40*89c4ff92SAndroid Build Coastguard Worker             throw arm::pipe::ProfilingException(ss.str());
41*89c4ff92SAndroid Build Coastguard Worker         }
42*89c4ff92SAndroid Build Coastguard Worker     }
43*89c4ff92SAndroid Build Coastguard Worker 
GetGuid() const44*89c4ff92SAndroid Build Coastguard Worker     uint64_t GetGuid() const {return m_Guid;}
GetHead() const45*89c4ff92SAndroid Build Coastguard Worker     const Entity* GetHead() const {return m_HeadEntity;}
GetTail() const46*89c4ff92SAndroid Build Coastguard Worker     const Entity* GetTail() const {return m_TailEntity;}
47*89c4ff92SAndroid Build Coastguard Worker private:
48*89c4ff92SAndroid Build Coastguard Worker     uint64_t m_Guid;
49*89c4ff92SAndroid Build Coastguard Worker     Entity* m_HeadEntity;
50*89c4ff92SAndroid Build Coastguard Worker     Entity* m_TailEntity;
51*89c4ff92SAndroid Build Coastguard Worker };
52*89c4ff92SAndroid Build Coastguard Worker class EventClassObj
53*89c4ff92SAndroid Build Coastguard Worker {
54*89c4ff92SAndroid Build Coastguard Worker public:
EventClassObj(uint64_t guid,const std::string & name)55*89c4ff92SAndroid Build Coastguard Worker     EventClassObj(uint64_t guid, const std::string& name) : m_Guid(guid), m_Name(name) {}
GetGuid() const56*89c4ff92SAndroid Build Coastguard Worker     uint64_t GetGuid() const {return m_Guid;}
GetName() const57*89c4ff92SAndroid Build Coastguard Worker     const std::string& GetName() const {return m_Name;}
58*89c4ff92SAndroid Build Coastguard Worker private:
59*89c4ff92SAndroid Build Coastguard Worker     uint64_t m_Guid;
60*89c4ff92SAndroid Build Coastguard Worker     std::string m_Name;
61*89c4ff92SAndroid Build Coastguard Worker };
62*89c4ff92SAndroid Build Coastguard Worker class EventObj
63*89c4ff92SAndroid Build Coastguard Worker {
64*89c4ff92SAndroid Build Coastguard Worker public:
EventObj(uint64_t guid,uint64_t timestamp,uint64_t threadId)65*89c4ff92SAndroid Build Coastguard Worker     EventObj(uint64_t guid, uint64_t timestamp, uint64_t threadId) :
66*89c4ff92SAndroid Build Coastguard Worker         m_Guid(guid), m_TimeStamp(timestamp), m_ThreadId(threadId) {}
GetGuid() const67*89c4ff92SAndroid Build Coastguard Worker     uint64_t GetGuid() const {return m_Guid;}
GetTimeStamp() const68*89c4ff92SAndroid Build Coastguard Worker     uint64_t GetTimeStamp() const {return m_TimeStamp;}
GetThreadId() const69*89c4ff92SAndroid Build Coastguard Worker     uint64_t GetThreadId() const {return m_ThreadId;}
SetEventClass(EventClassObj * evtClass)70*89c4ff92SAndroid Build Coastguard Worker     void SetEventClass(EventClassObj* evtClass) {m_EventClass = evtClass;}
GetEventClass()71*89c4ff92SAndroid Build Coastguard Worker     std::string GetEventClass()
72*89c4ff92SAndroid Build Coastguard Worker     {
73*89c4ff92SAndroid Build Coastguard Worker         if (m_EventClass == nullptr)
74*89c4ff92SAndroid Build Coastguard Worker         {
75*89c4ff92SAndroid Build Coastguard Worker             return "";
76*89c4ff92SAndroid Build Coastguard Worker         }
77*89c4ff92SAndroid Build Coastguard Worker         else
78*89c4ff92SAndroid Build Coastguard Worker         {
79*89c4ff92SAndroid Build Coastguard Worker             return m_EventClass->GetName();
80*89c4ff92SAndroid Build Coastguard Worker         }
81*89c4ff92SAndroid Build Coastguard Worker     }
82*89c4ff92SAndroid Build Coastguard Worker private:
83*89c4ff92SAndroid Build Coastguard Worker     uint64_t m_Guid;
84*89c4ff92SAndroid Build Coastguard Worker     uint64_t m_TimeStamp;
85*89c4ff92SAndroid Build Coastguard Worker     uint64_t m_ThreadId;
86*89c4ff92SAndroid Build Coastguard Worker     EventClassObj* m_EventClass;
87*89c4ff92SAndroid Build Coastguard Worker };
88*89c4ff92SAndroid Build Coastguard Worker class Entity
89*89c4ff92SAndroid Build Coastguard Worker {
90*89c4ff92SAndroid Build Coastguard Worker public:
Entity(uint64_t guid)91*89c4ff92SAndroid Build Coastguard Worker     Entity(uint64_t guid) : m_Guid(guid) {}
GetGuid() const92*89c4ff92SAndroid Build Coastguard Worker     uint64_t GetGuid() const {return m_Guid;}
AddChild(Entity * child)93*89c4ff92SAndroid Build Coastguard Worker     void AddChild(Entity* child)
94*89c4ff92SAndroid Build Coastguard Worker     {
95*89c4ff92SAndroid Build Coastguard Worker         if (child != nullptr)
96*89c4ff92SAndroid Build Coastguard Worker         {
97*89c4ff92SAndroid Build Coastguard Worker             m_Children.push_back(child);
98*89c4ff92SAndroid Build Coastguard Worker         }
99*89c4ff92SAndroid Build Coastguard Worker     }
AddAttribute(const std::string & type,const std::string & value)100*89c4ff92SAndroid Build Coastguard Worker     void AddAttribute(const std::string& type, const std::string& value)
101*89c4ff92SAndroid Build Coastguard Worker     {
102*89c4ff92SAndroid Build Coastguard Worker         Attribute attr(type, value);
103*89c4ff92SAndroid Build Coastguard Worker         m_Attributes.emplace(type, attr);
104*89c4ff92SAndroid Build Coastguard Worker     }
AddConnection(const Connection & connection)105*89c4ff92SAndroid Build Coastguard Worker     void AddConnection(const Connection& connection)
106*89c4ff92SAndroid Build Coastguard Worker     {
107*89c4ff92SAndroid Build Coastguard Worker         m_Connections.push_back(connection);
108*89c4ff92SAndroid Build Coastguard Worker     }
AddExecution(Entity * execution)109*89c4ff92SAndroid Build Coastguard Worker     void AddExecution(Entity* execution)
110*89c4ff92SAndroid Build Coastguard Worker     {
111*89c4ff92SAndroid Build Coastguard Worker         if (execution != nullptr)
112*89c4ff92SAndroid Build Coastguard Worker         {
113*89c4ff92SAndroid Build Coastguard Worker             m_Executions.push_back(execution);
114*89c4ff92SAndroid Build Coastguard Worker         }
115*89c4ff92SAndroid Build Coastguard Worker     }
AddEvent(EventObj * event)116*89c4ff92SAndroid Build Coastguard Worker     void AddEvent(EventObj* event)
117*89c4ff92SAndroid Build Coastguard Worker     {
118*89c4ff92SAndroid Build Coastguard Worker         if (event != nullptr)
119*89c4ff92SAndroid Build Coastguard Worker         {
120*89c4ff92SAndroid Build Coastguard Worker             m_Events.push_back(event);
121*89c4ff92SAndroid Build Coastguard Worker         }
122*89c4ff92SAndroid Build Coastguard Worker     }
GetAttributes() const123*89c4ff92SAndroid Build Coastguard Worker     const Attributes& GetAttributes() const {return m_Attributes;}
GetChildren() const124*89c4ff92SAndroid Build Coastguard Worker     const std::vector<Entity*>& GetChildren() const {return m_Children;}
GetConnections() const125*89c4ff92SAndroid Build Coastguard Worker     const std::vector<Connection>& GetConnections() const {return m_Connections;}
GetExecutions() const126*89c4ff92SAndroid Build Coastguard Worker     const std::vector<Entity*>& GetExecutions() const {return m_Executions;}
GetEvents() const127*89c4ff92SAndroid Build Coastguard Worker     const std::vector<EventObj*>& GetEvents() const {return m_Events;}
128*89c4ff92SAndroid Build Coastguard Worker private:
129*89c4ff92SAndroid Build Coastguard Worker     uint64_t m_Guid;
130*89c4ff92SAndroid Build Coastguard Worker     Attributes m_Attributes;
131*89c4ff92SAndroid Build Coastguard Worker     std::vector<Entity*> m_Children;
132*89c4ff92SAndroid Build Coastguard Worker     std::vector<Connection> m_Connections;
133*89c4ff92SAndroid Build Coastguard Worker     std::vector<Entity*> m_Executions;
134*89c4ff92SAndroid Build Coastguard Worker     std::vector<EventObj*> m_Events;
135*89c4ff92SAndroid Build Coastguard Worker };
136*89c4ff92SAndroid Build Coastguard Worker using Entities = std::map<uint64_t, Entity>;
137*89c4ff92SAndroid Build Coastguard Worker struct ModelRelationship
138*89c4ff92SAndroid Build Coastguard Worker {
ModelRelationshiparm::pipe::ModelRelationship139*89c4ff92SAndroid Build Coastguard Worker     ModelRelationship(const arm::pipe::ITimelineDecoder::Relationship& relationship) : m_Relationship(relationship) {}
140*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::ITimelineDecoder::Relationship m_Relationship;
141*89c4ff92SAndroid Build Coastguard Worker     std::vector<Entity*> m_RelatedEntities;
142*89c4ff92SAndroid Build Coastguard Worker };
143*89c4ff92SAndroid Build Coastguard Worker using Relationships = std::map<uint64_t, ModelRelationship>;
144*89c4ff92SAndroid Build Coastguard Worker using EventClasses = std::map<uint64_t, EventClassObj>;
145*89c4ff92SAndroid Build Coastguard Worker using Events = std::map<uint64_t, EventObj>;
146*89c4ff92SAndroid Build Coastguard Worker class TimelineModel
147*89c4ff92SAndroid Build Coastguard Worker {
148*89c4ff92SAndroid Build Coastguard Worker public:
149*89c4ff92SAndroid Build Coastguard Worker     void AddLabel(const arm::pipe::ITimelineDecoder::Label& label);
150*89c4ff92SAndroid Build Coastguard Worker     std::string* FindLabel(uint64_t guid);
151*89c4ff92SAndroid Build Coastguard Worker     void AddEntity(uint64_t guid);
152*89c4ff92SAndroid Build Coastguard Worker     Entity* FindEntity(uint64_t id);
153*89c4ff92SAndroid Build Coastguard Worker     void AddRelationship(const arm::pipe::ITimelineDecoder::Relationship& relationship);
154*89c4ff92SAndroid Build Coastguard Worker     ModelRelationship* FindRelationship(uint64_t id);
GetLabelMap() const155*89c4ff92SAndroid Build Coastguard Worker     const LabelMap& GetLabelMap() const {return m_LabelMap;}
GetEntities() const156*89c4ff92SAndroid Build Coastguard Worker     const Entities& GetEntities() const {return m_Entities;}
GetErrors() const157*89c4ff92SAndroid Build Coastguard Worker     const std::vector<arm::pipe::ProfilingException>& GetErrors() const {return m_Errors;}
158*89c4ff92SAndroid Build Coastguard Worker     bool IsInferenceGuid(uint64_t guid) const;
159*89c4ff92SAndroid Build Coastguard Worker     void AddEventClass(const arm::pipe::ITimelineDecoder::EventClass& eventClass);
GetEventClasses() const160*89c4ff92SAndroid Build Coastguard Worker     const EventClasses& GetEventClasses() const {return m_EventClasses;}
161*89c4ff92SAndroid Build Coastguard Worker     EventClassObj* FindEventClass(uint64_t id);
162*89c4ff92SAndroid Build Coastguard Worker     void AddEvent(const arm::pipe::ITimelineDecoder::Event& event);
163*89c4ff92SAndroid Build Coastguard Worker     EventObj* FindEvent(uint64_t id);
164*89c4ff92SAndroid Build Coastguard Worker private:
165*89c4ff92SAndroid Build Coastguard Worker     LabelMap m_LabelMap;
166*89c4ff92SAndroid Build Coastguard Worker     Entities m_Entities;
167*89c4ff92SAndroid Build Coastguard Worker     Relationships m_Relationships;
168*89c4ff92SAndroid Build Coastguard Worker     std::vector<arm::pipe::ProfilingException> m_Errors;
169*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint64_t> m_InferenceGuids;
170*89c4ff92SAndroid Build Coastguard Worker     EventClasses m_EventClasses;
171*89c4ff92SAndroid Build Coastguard Worker     Events m_Events;
172*89c4ff92SAndroid Build Coastguard Worker 
173*89c4ff92SAndroid Build Coastguard Worker     void HandleLabelLink(const arm::pipe::ITimelineDecoder::Relationship& relationship);
174*89c4ff92SAndroid Build Coastguard Worker     void HandleConnection(const arm::pipe::ITimelineDecoder::Relationship& relationship);
175*89c4ff92SAndroid Build Coastguard Worker     void HandleChild(const arm::pipe::ITimelineDecoder::Relationship& relationship);
176*89c4ff92SAndroid Build Coastguard Worker     void HandleExecutionOf(const arm::pipe::ITimelineDecoder::Relationship& relationship);
177*89c4ff92SAndroid Build Coastguard Worker     void HandleExecutionLink(const arm::pipe::ITimelineDecoder::Relationship& relationship);
178*89c4ff92SAndroid Build Coastguard Worker };
179*89c4ff92SAndroid Build Coastguard Worker 
180*89c4ff92SAndroid Build Coastguard Worker std::vector<std::string> GetModelDescription(const TimelineModel& model);
181*89c4ff92SAndroid Build Coastguard Worker std::string GetEntityDescription(const Entity& entity);
182*89c4ff92SAndroid Build Coastguard Worker std::string GetChildDescription(Entity* entity);
183*89c4ff92SAndroid Build Coastguard Worker std::string GetConnectionDescription(const Connection& connection);
184*89c4ff92SAndroid Build Coastguard Worker std::string GetExecutionDescription(Entity* execution);
185*89c4ff92SAndroid Build Coastguard Worker std::string GetEventDescription(EventObj* event);
186*89c4ff92SAndroid Build Coastguard Worker 
187*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
188*89c4ff92SAndroid Build Coastguard Worker 
189*89c4ff92SAndroid Build Coastguard Worker } // namespace arm