@@ -14,47 +14,6 @@ module Times = struct
1414 let runs = ref 0 |> Multicore_magic. copy_as_padded in
1515 Gc. full_major () ;
1616 let budget_start = Mtime_clock. elapsed () in
17- let main domain_i =
18- for _ = 1 to n_warmups do
19- if domain_i = 0 then begin
20- before () ;
21- Gc. major ()
22- end ;
23- let state = init domain_i in
24- Barrier. await barrier_before;
25- work domain_i state;
26- Barrier. await barrier_after;
27- if domain_i = 0 then after ()
28- done ;
29- while ! runs < n_runs_min || not ! budget_used do
30- Barrier. await barrier_init;
31- if domain_i = 0 then begin
32- before () ;
33- if
34- let budget_stop = Mtime_clock. elapsed () in
35- let elapsedf =
36- Mtime.Span. to_float_ns
37- (Mtime.Span. abs_diff budget_stop budget_start)
38- *. (1. /. 1_000_000_000.0 )
39- in
40- budgetf < elapsedf
41- then budget_used := true ;
42- incr runs;
43- Gc. major ()
44- end ;
45- let state = init domain_i in
46- Barrier. await barrier_before;
47- let start = Mtime_clock. elapsed () in
48- work domain_i state;
49- let stop = Mtime_clock. elapsed () in
50- Barrier. await barrier_after;
51- if domain_i = 0 then after () ;
52- Stack. push
53- (Mtime.Span. to_float_ns (Mtime.Span. abs_diff stop start)
54- *. (1. /. 1_000_000_000.0 ))
55- results.(domain_i)
56- done
57- in
5817 let prepare_for_await () =
5918 let open struct
6019 type state = Init | Released | Awaiting of { mutable released : bool }
@@ -80,12 +39,53 @@ module Times = struct
8039 in
8140 Domain_local_await. { release; await }
8241 in
83- Domain_local_await. using ~prepare_for_await ~while_running: (fun () ->
84- let domains =
85- Array. init n_domains @@ fun domain_i ->
86- Domain. spawn @@ fun () -> main domain_i
87- in
88- Array. iter Domain. join domains);
42+ let main domain_i =
43+ Domain_local_await. using ~prepare_for_await ~while_running: (fun () ->
44+ for _ = 1 to n_warmups do
45+ if domain_i = 0 then begin
46+ before () ;
47+ Gc. major ()
48+ end ;
49+ let state = init domain_i in
50+ Barrier. await barrier_before;
51+ work domain_i state;
52+ Barrier. await barrier_after;
53+ if domain_i = 0 then after ()
54+ done ;
55+ while ! runs < n_runs_min || not ! budget_used do
56+ Barrier. await barrier_init;
57+ if domain_i = 0 then begin
58+ before () ;
59+ if
60+ let budget_stop = Mtime_clock. elapsed () in
61+ let elapsedf =
62+ Mtime.Span. to_float_ns
63+ (Mtime.Span. abs_diff budget_stop budget_start)
64+ *. (1. /. 1_000_000_000.0 )
65+ in
66+ budgetf < elapsedf
67+ then budget_used := true ;
68+ incr runs;
69+ Gc. major ()
70+ end ;
71+ let state = init domain_i in
72+ Barrier. await barrier_before;
73+ let start = Mtime_clock. elapsed () in
74+ work domain_i state;
75+ let stop = Mtime_clock. elapsed () in
76+ Barrier. await barrier_after;
77+ if domain_i = 0 then after () ;
78+ Stack. push
79+ (Mtime.Span. to_float_ns (Mtime.Span. abs_diff stop start)
80+ *. (1. /. 1_000_000_000.0 ))
81+ results.(domain_i)
82+ done )
83+ in
84+ let domains =
85+ Array. init n_domains @@ fun domain_i ->
86+ Domain. spawn @@ fun () -> main domain_i
87+ in
88+ Array. iter Domain. join domains;
8989 let n = Stack. length results.(0 ) in
9090 let times = Array. create_float n in
9191 for run_i = 0 to n - 1 do
0 commit comments