@@ -14,47 +14,6 @@ module Times = struct
14
14
let runs = ref 0 |> Multicore_magic. copy_as_padded in
15
15
Gc. full_major () ;
16
16
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
58
17
let prepare_for_await () =
59
18
let open struct
60
19
type state = Init | Released | Awaiting of { mutable released : bool }
@@ -80,12 +39,53 @@ module Times = struct
80
39
in
81
40
Domain_local_await. { release; await }
82
41
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;
89
89
let n = Stack. length results.(0 ) in
90
90
let times = Array. create_float n in
91
91
for run_i = 0 to n - 1 do
0 commit comments