5555
5656perf_event_attr () = perf_event_attr (ntuple (x-> 0 , fieldcount (perf_event_attr))... )
5757
58+ const PERF_TYPE_HARDWARE = 0
59+ const PERF_TYPE_SOFTWARE = 1
60+
5861const EVENT_TYPES =
5962 [
60- (:hw , 0 , # PERF_TYPE_HARDWARE
63+ (:hw , PERF_TYPE_HARDWARE,
6164 [(:cycles , 0 ), # PERF_COUNT_HW_CPU_CYCLES
6265 (:instructions , 1 ), # PERF_COUNT_HW_INSTRUCTIONS
6366 (:cache_access , 2 ), # PERF_COUNT_HW_CACHE_REFERENCES
@@ -69,7 +72,7 @@ const EVENT_TYPES =
6972 (:stalled_cycles_backend , 8 ), # PERF_COUNT_HW_STALLED_CYCLES_BACKEND
7073 (:scaled_cycles , 9 ) # PERF_COUNT_HW_REF_CPU_CYCLES
7174 ]),
72- (:sw , 1 , # PERF_TYPE_SOFTWARE
75+ (:sw , PERF_TYPE_SOFTWARE,
7376 [(:cpu_clock , 0 ), # PERF_COUNT_SW_CPU_CLOCK
7477 (:task_clock , 1 ), # PEF_COUNT_SW_TASK_CLOCK
7578 (:page_faults , 2 ), # PERF_COUNT_SW_PAGE_FAULTS
@@ -390,9 +393,47 @@ const NAME_TO_EVENT = Dict(
390393 " iTLB-load-misses" => EventType (:cache , :TLB_insn , :read , :miss ),
391394 " iTLB-loads" => EventType (:cache , :TLB_insn , :read , :access ),
392395)
393-
394396const EVENT_TO_NAME = Dict (event => name for (name, event) in NAME_TO_EVENT)
395397
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+
396437function parse_pstats_options (opts)
397438 # default events
398439 events = parse_groups ("
0 commit comments