55
55
56
56
perf_event_attr () = perf_event_attr (ntuple (x-> 0 , fieldcount (perf_event_attr))... )
57
57
58
+ const PERF_TYPE_HARDWARE = 0
59
+ const PERF_TYPE_SOFTWARE = 1
60
+
58
61
const EVENT_TYPES =
59
62
[
60
- (:hw , 0 , # PERF_TYPE_HARDWARE
63
+ (:hw , PERF_TYPE_HARDWARE,
61
64
[(:cycles , 0 ), # PERF_COUNT_HW_CPU_CYCLES
62
65
(:instructions , 1 ), # PERF_COUNT_HW_INSTRUCTIONS
63
66
(:cache_access , 2 ), # PERF_COUNT_HW_CACHE_REFERENCES
@@ -69,7 +72,7 @@ const EVENT_TYPES =
69
72
(:stalled_cycles_backend , 8 ), # PERF_COUNT_HW_STALLED_CYCLES_BACKEND
70
73
(:scaled_cycles , 9 ) # PERF_COUNT_HW_REF_CPU_CYCLES
71
74
]),
72
- (:sw , 1 , # PERF_TYPE_SOFTWARE
75
+ (:sw , PERF_TYPE_SOFTWARE,
73
76
[(:cpu_clock , 0 ), # PERF_COUNT_SW_CPU_CLOCK
74
77
(:task_clock , 1 ), # PEF_COUNT_SW_TASK_CLOCK
75
78
(:page_faults , 2 ), # PERF_COUNT_SW_PAGE_FAULTS
@@ -390,9 +393,47 @@ const NAME_TO_EVENT = Dict(
390
393
" iTLB-load-misses" => EventType (:cache , :TLB_insn , :read , :miss ),
391
394
" iTLB-loads" => EventType (:cache , :TLB_insn , :read , :access ),
392
395
)
393
-
394
396
const EVENT_TO_NAME = Dict (event => name for (name, event) in NAME_TO_EVENT)
395
397
398
+ function is_supported (event:: EventType )
399
+ attr = perf_event_attr ()
400
+ attr. typ = event. category
401
+ attr. size = sizeof (perf_event_attr)
402
+ attr. config = event. event
403
+ fd = perf_event_open (attr, 0 , - 1 , - 1 , 0 )
404
+ if fd ≥ 0
405
+ ret = ccall (:close , Cint, (Cint,), fd)
406
+ if ret != 0
407
+ @warn " failed to close file descriptor for some reason"
408
+ end
409
+ return true
410
+ end
411
+ return false
412
+ end
413
+
414
+ is_supported (name:: AbstractString ) = haskey (NAME_TO_EVENT, name) && is_supported (NAME_TO_EVENT[name])
415
+
416
+ function list ()
417
+ for t in [PERF_TYPE_HARDWARE, PERF_TYPE_SOFTWARE, PERF_TYPE_HW_CACHE]
418
+ events = collect (filter (x -> x[2 ]. category == t, NAME_TO_EVENT))
419
+ sort! (events, by = x -> x[1 ]) # sort events by name
420
+ if t == PERF_TYPE_HARDWARE
421
+ println (" hardware:" )
422
+ elseif t == PERF_TYPE_SOFTWARE
423
+ println (" software:" )
424
+ elseif t == PERF_TYPE_HW_CACHE
425
+ println (" cache:" )
426
+ else
427
+ @assert false
428
+ end
429
+ for (name, event) in events
430
+ @printf " %-25s%s" name (is_supported (event) ? " supported" : " not supported" )
431
+ println ()
432
+ end
433
+ t != PERF_TYPE_HW_CACHE && println ()
434
+ end
435
+ end
436
+
396
437
function parse_pstats_options (opts)
397
438
# default events
398
439
events = parse_groups ("
0 commit comments