@@ -10,41 +10,79 @@ using Dagger
1010
1111function logs_to_chrome_trace (logs:: Dict )
1212 execution_logs = Dict {Int,Any} ()
13+ tid_to_uid = Dict {Int,UInt} ()
14+ uid_to_name = Dict {UInt,String} ()
1315 add_unknown_procs_metadata = false
14- Dagger. logs_event_pairs (logs) do w, start_idx, finish_idx
15- category = logs[w][:core ][start_idx]. category
16- if category == :compute
17- tid = logs[w][:id ][start_idx]. thunk_id # thunk id
18- if ! haskey (execution_logs, tid)
19- execution_logs[tid] = Dict {Symbol,Any} ()
16+ for w in keys (logs)
17+ for idx in 1 : length (logs[w][:core ])
18+ category = logs[w][:core ][idx]. category
19+ kind = logs[w][:core ][idx]. kind
20+ if category == :compute
21+ tid = logs[w][:id ][idx]. thunk_id # thunk id
22+ if ! haskey (execution_logs, tid)
23+ execution_logs[tid] = Dict {Symbol,Any} ()
24+ end
25+ if kind == :start
26+ # start time
27+ execution_logs[tid][:ts ] = logs[w][:core ][idx]. timestamp / 1e3 # us
28+ # proc
29+ proc = logs[w][:id ][idx]. processor
30+ if proc isa Dagger. ThreadProc
31+ execution_logs[tid][:pid ] = proc. owner
32+ execution_logs[tid][:tid ] = proc. tid # thread id
33+ else
34+ @warn " Compute event for [$tid ] executed on non-Dagger.ThreadProc processor. Assigning unknown pid and tid"
35+ execution_logs[tid][:pid ] = - 1
36+ execution_logs[tid][:tid ] = - 1
37+ add_unknown_procs_metadata = true
38+ end
39+ else
40+ # stop time (temporary as duration is used in the trace format)
41+ execution_logs[tid][:_stop ] = logs[w][:core ][idx]. timestamp / 1e3 # us
42+ end
43+ elseif category == :add_thunk && kind == :start
44+ tid = logs[w][:id ][idx]. thunk_id
45+ if ! haskey (execution_logs, tid)
46+ execution_logs[tid] = Dict {Symbol,Any} ()
47+ end
48+ # auto name
49+ execution_logs[tid][:name ] = logs[w][:taskfuncnames ][idx]
50+ # uid-tid mapping for user task name
51+ if haskey (logs[w], :taskuidtotid )
52+ uid_tid = logs[w][:taskuidtotid ][idx]
53+ if uid_tid != = nothing
54+ uid, tid = uid_tid:: Pair{UInt,Int}
55+ tid_to_uid[tid] = uid
56+ end
57+ end
58+ elseif category == :data_annotation && kind == :start
59+ # user task name
60+ id = logs[w][:id ][idx]:: NamedTuple
61+ name = String (id. name)
62+ obj = id. objectid:: Dagger.LoggedMutableObject
63+ objid = obj. objid
64+ uid_to_name[objid] = name
2065 end
21- t_start = logs[w][:core ][start_idx]. timestamp / 1e3 # us
22- t_stop = logs[w][:core ][finish_idx]. timestamp / 1e3 # us
23- proc = logs[w][:id ][start_idx]. processor
24- execution_logs[tid][:ts ] = t_start
25- execution_logs[tid][:dur ] = t_stop - t_start
26- if proc isa Dagger. ThreadProc
27- execution_logs[tid][:pid ] = proc. owner
28- execution_logs[tid][:tid ] = proc. tid # thread id
29- else
30- @warn " Compute event for [$tid ] executed on non-Dagger.ThreadProc processor. Assigning unknown pid and tid"
31- execution_logs[tid][:pid ] = - 1
32- execution_logs[tid][:tid ] = - 1
33- add_unknown_procs_metadata = true
34- end
35- elseif category == :add_thunk
36- tid = logs[w][:id ][start_idx]. thunk_id
37- if ! haskey (execution_logs, tid)
38- execution_logs[tid] = Dict {Symbol,Any} ()
39- end
40- fname = logs[w][:taskfuncnames ][start_idx]
41- execution_logs[tid][:name ] = fname
4266 end
4367 end
4468 events = Vector {Dict{Symbol,Any}} ()
45- for (_, v) in execution_logs
69+ for (tid, v) in execution_logs
70+ if ! haskey (v, :ts ) || ! haskey (v, :_stop )
71+ continue
72+ end
73+ v[:dur ] = v[:_stop ] - v[:ts ]
74+ delete! (v, :_stop )
75+
4676 v[:ph ] = " X"
4777 v[:cat ] = " compute"
78+
79+ # replace auto name with user task name if present
80+ if haskey (tid_to_uid, tid)
81+ uid = tid_to_uid[tid]
82+ if haskey (uid_to_name, uid)
83+ v[:name ] = uid_to_name[uid]
84+ end
85+ end
4886 push! (events, v)
4987 end
5088 if add_unknown_procs_metadata
0 commit comments