cache line locking on AMD x86_64 utilising L3 CAT pseudo-locking
1let () =
2 print_endline "testing icepick ocaml bindings...";
3 print_endline "";
4
5 try
6 let topo = Icepick.Topology.discover () in
7 Printf.printf "l3 cache:\n";
8 Printf.printf " ways: %d\n" (Icepick.Topology.l3_ways topo);
9 Printf.printf " size: %d mb\n" (Icepick.Topology.l3_size topo / 1024 / 1024);
10 Printf.printf " way size: %d kb\n" (Icepick.Topology.way_size topo / 1024);
11 Printf.printf " max clos: %d\n" (Icepick.Topology.max_clos topo);
12 Printf.printf " ccx count: %d\n" (Icepick.Topology.ccx_count topo);
13 Printf.printf " cat: %b\n" (Icepick.Topology.cat_supported topo);
14 print_endline "";
15
16 print_endline "attempting to lock 2mb region...";
17 let region = Icepick.Region.lock topo ~size:(2 * 1024 * 1024) ~clos:1 () in
18 Printf.printf " locked %d bytes at 0x%nx\n"
19 (Icepick.Region.size region)
20 (Icepick.Region.ptr region);
21 Printf.printf " clos: %d\n" (Icepick.Region.clos region);
22
23 print_endline "verifying...";
24 let stats = Icepick.verify region in
25 Printf.printf " mean latency: %d ns\n" stats.mean_ns;
26 Printf.printf " p99 latency: %d ns\n" stats.p99_ns;
27
28 print_endline "unlocking...";
29 Icepick.Region.unlock region;
30 print_endline "done."
31
32 with Icepick.Icepick_error msg ->
33 Printf.printf "icepick error: %s\n" msg;
34 print_endline "(this is expected if cat is not supported on this cpu)"