package papi

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file papi.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
(* Copyright (c) 2019 David Kaloper Meršinjak. All rights reserved.
   See LICENSE.md *)

(* Ordering must match the ordering of `error_table[]'! *)
type error =
  EINVAL | ENOMEM | ESYS | ECMP | ECLOST | EBUG | ENOEVNT | ECNFLCT | ENOTRUN
| EISRUN | ENOEVST | ENOTPRESET | ENOCNTR | EMISC | EPERM | ENOINIT | ENOCMP
| ENOSUPP | ENOIMPL | EBUF | EINVAL_DOM | EATTR | ECOUNT | ECOMBO

exception Error of (error * string)
let () = Callback.register_exception "PAPI_EXCEPTION_CTOR" (Error (EMISC, ""));

(* Ordering must match the ordering of `event_table[]'! *)
type event =
  L1_DCM | L1_ICM | L2_DCM | L2_ICM | L3_DCM | L3_ICM | L1_TCM | L2_TCM
| L3_TCM | CA_SNP | CA_SHR | CA_CLN | CA_INV | CA_ITV | L3_LDM | L3_STM
| BRU_IDL | FXU_IDL | FPU_IDL | LSU_IDL | TLB_DM | TLB_IM | TLB_TL | L1_LDM
| L1_STM | L2_LDM | L2_STM | BTAC_M | PRF_DM | L3_DCH | TLB_SD | CSR_FAL
| CSR_SUC | CSR_TOT | MEM_SCY | MEM_RCY | MEM_WCY | STL_ICY | FUL_ICY
| STL_CCY | FUL_CCY | HW_INT | BR_UCN | BR_CN | BR_TKN | BR_NTK | BR_MSP
| BR_PRC | FMA_INS | TOT_IIS | TOT_INS | INT_INS | FP_INS | LD_INS | SR_INS
| BR_INS | VEC_INS | RES_STL | FP_STAL | TOT_CYC | LST_INS | SYC_INS | L1_DCH
| L2_DCH | L1_DCA | L2_DCA | L3_DCA | L1_DCR | L2_DCR | L3_DCR | L1_DCW
| L2_DCW | L3_DCW | L1_ICH | L2_ICH | L3_ICH | L1_ICA | L2_ICA | L3_ICA
| L1_ICR | L2_ICR | L3_ICR | L1_ICW | L2_ICW | L3_ICW | L1_TCH | L2_TCH
| L3_TCH | L1_TCA | L2_TCA | L3_TCA | L1_TCR | L2_TCR | L3_TCR | L1_TCW
| L2_TCW | L3_TCW | FML_INS | FAD_INS | FDV_INS | FSQ_INS | FNV_INS | FP_OPS
| SP_OPS | DP_OPS | VEC_SP | VEC_DP | REF_CYC

let events = [|
  L1_DCM; L1_ICM; L2_DCM; L2_ICM; L3_DCM; L3_ICM; L1_TCM; L2_TCM; L3_TCM;
  CA_SNP; CA_SHR; CA_CLN; CA_INV; CA_ITV; L3_LDM; L3_STM; BRU_IDL; FXU_IDL;
  FPU_IDL; LSU_IDL; TLB_DM; TLB_IM; TLB_TL; L1_LDM; L1_STM; L2_LDM; L2_STM;
  BTAC_M; PRF_DM; L3_DCH; TLB_SD; CSR_FAL; CSR_SUC; CSR_TOT; MEM_SCY; MEM_RCY;
  MEM_WCY; STL_ICY; FUL_ICY; STL_CCY; FUL_CCY; HW_INT; BR_UCN; BR_CN; BR_TKN;
  BR_NTK; BR_MSP; BR_PRC; FMA_INS; TOT_IIS; TOT_INS; INT_INS; FP_INS; LD_INS;
  SR_INS; BR_INS; VEC_INS; RES_STL; FP_STAL; TOT_CYC; LST_INS; SYC_INS; L1_DCH;
  L2_DCH; L1_DCA; L2_DCA; L3_DCA; L1_DCR; L2_DCR; L3_DCR; L1_DCW; L2_DCW;
  L3_DCW; L1_ICH; L2_ICH; L3_ICH; L1_ICA; L2_ICA; L3_ICA; L1_ICR; L2_ICR;
  L3_ICR; L1_ICW; L2_ICW; L3_ICW; L1_TCH; L2_TCH; L3_TCH; L1_TCA; L2_TCA;
  L3_TCA; L1_TCR; L2_TCR; L3_TCR; L1_TCW; L2_TCW; L3_TCW; FML_INS; FAD_INS;
  FDV_INS; FSQ_INS; FNV_INS; FP_OPS; SP_OPS; DP_OPS; VEC_SP; VEC_DP; REF_CYC
|]

type eventset = int
external init    : unit -> unit = "caml_papi_library_init"
external shutdown : unit -> unit = "caml_papi_shutdown"
external hw_counters : unit -> int = "caml_papi_hw_counters"
external create  : unit -> eventset = "caml_papi_create_eventset"
external cleanup : eventset -> unit = "caml_papi_cleanup_eventset"
external destroy : eventset -> unit = "caml_papi_destroy_eventset"
external add : eventset -> event -> unit = "caml_papi_add_event"
external query : event -> bool = "caml_papi_query_event"
external num_events : eventset -> int = "caml_papi_num_events"
external start : eventset -> unit = "caml_papi_start"
external stop : eventset -> unit = "caml_papi_stop"
external reset : eventset -> unit = "caml_papi_reset"
external read : eventset -> ?off:int -> float array -> unit = "caml_papi_read"
external accum : eventset -> ?off:int -> float array -> unit = "caml_papi_accum"
external strerror : error -> string = "caml_papi_strerror"
external name  : event -> string = "caml_papi_event_name"
external description : event -> string = "caml_papi_event_descr"

let pf = Format.fprintf
(* let pp_eventset ppf = pf ppf "%d" *)
let pp_event ppf e = pf ppf "@[%s@ (%s)@]" (name e) (description e)
let pp_error ppf err =
  let descr = try strerror err with
    Error (ENOINIT, _) -> "Please call Papi.init" in
  Format.pp_print_string ppf descr
let pp_exn_error ppf (err, f) = pf ppf "@[%s:@ %a@]" f pp_error err