1
1
type t = { inverted : bool ; times_per_domain : float array array ; runs : int }
2
2
3
- let record ~budgetf ~n_domains ?(ensure_multi_domain = true ) ?(n_warmups = 3 )
4
- ?(n_runs_min = 7 ) ?(before = Fun. id) ~init ~work ?(after = Fun. id) () =
3
+ let record ~budgetf ~n_domains ?(ensure_multi_domain = true )
4
+ ?(domain_local_await = `Busy_wait ) ?(n_warmups = 3 ) ?(n_runs_min = 7 )
5
+ ?(before = Fun. id) ~init ~work ?(after = Fun. id) () =
5
6
let barrier_init = Barrier. make n_domains in
6
7
let barrier_before = Barrier. make n_domains in
7
8
let barrier_after = Barrier. make n_domains in
@@ -23,7 +24,7 @@ let record ~budgetf ~n_domains ?(ensure_multi_domain = true) ?(n_warmups = 3)
23
24
in
24
25
Gc. full_major () ;
25
26
let budget_start = Mtime_clock. elapsed () in
26
- let prepare_for_await () =
27
+ let with_busy_wait () =
27
28
let open struct
28
29
type state = Init | Released | Awaiting of { mutable released : bool }
29
30
end in
@@ -49,46 +50,52 @@ let record ~budgetf ~n_domains ?(ensure_multi_domain = true) ?(n_warmups = 3)
49
50
Domain_local_await. { release; await }
50
51
in
51
52
let main domain_i =
52
- Domain_local_await. using ~prepare_for_await ~while_running: (fun () ->
53
- for _ = 1 to n_warmups do
54
- if domain_i = 0 then begin
55
- before () ;
56
- Gc. major ()
57
- end ;
58
- let state = init domain_i in
59
- Barrier. await barrier_before;
60
- work domain_i state;
61
- Barrier. await barrier_after;
62
- if domain_i = 0 then after ()
63
- done ;
64
- while ! runs < n_runs_min || not ! budget_used do
65
- Barrier. await barrier_init;
66
- if domain_i = 0 then begin
67
- before () ;
68
- if
69
- let budget_stop = Mtime_clock. elapsed () in
70
- let elapsedf =
71
- Mtime.Span. to_float_ns
72
- (Mtime.Span. abs_diff budget_stop budget_start)
73
- *. (1. /. 1_000_000_000.0 )
74
- in
75
- budgetf < elapsedf
76
- then budget_used := true ;
77
- incr runs;
78
- Gc. major ()
79
- end ;
80
- let state = init domain_i in
81
- Barrier. await barrier_before;
82
- let start = Mtime_clock. elapsed () in
83
- work domain_i state;
84
- let stop = Mtime_clock. elapsed () in
85
- Barrier. await barrier_after;
86
- if domain_i = 0 then after () ;
87
- Stack. push
88
- (Mtime.Span. to_float_ns (Mtime.Span. abs_diff stop start)
89
- *. (1. /. 1_000_000_000.0 ))
90
- results.(domain_i)
91
- done )
53
+ let benchmark () =
54
+ for _ = 1 to n_warmups do
55
+ if domain_i = 0 then begin
56
+ before () ;
57
+ Gc. major ()
58
+ end ;
59
+ let state = init domain_i in
60
+ Barrier. await barrier_before;
61
+ work domain_i state;
62
+ Barrier. await barrier_after;
63
+ if domain_i = 0 then after ()
64
+ done ;
65
+ while ! runs < n_runs_min || not ! budget_used do
66
+ Barrier. await barrier_init;
67
+ if domain_i = 0 then begin
68
+ before () ;
69
+ if
70
+ let budget_stop = Mtime_clock. elapsed () in
71
+ let elapsedf =
72
+ Mtime.Span. to_float_ns
73
+ (Mtime.Span. abs_diff budget_stop budget_start)
74
+ *. (1. /. 1_000_000_000.0 )
75
+ in
76
+ budgetf < elapsedf
77
+ then budget_used := true ;
78
+ incr runs;
79
+ Gc. major ()
80
+ end ;
81
+ let state = init domain_i in
82
+ Barrier. await barrier_before;
83
+ let start = Mtime_clock. elapsed () in
84
+ work domain_i state;
85
+ let stop = Mtime_clock. elapsed () in
86
+ Barrier. await barrier_after;
87
+ if domain_i = 0 then after () ;
88
+ Stack. push
89
+ (Mtime.Span. to_float_ns (Mtime.Span. abs_diff stop start)
90
+ *. (1. /. 1_000_000_000.0 ))
91
+ results.(domain_i)
92
+ done
93
+ in
94
+ match domain_local_await with
95
+ | `Busy_wait ->
96
+ Domain_local_await. using ~prepare_for_await: with_busy_wait
97
+ ~while_running: benchmark
98
+ | `Neglect -> benchmark ()
92
99
in
93
100
let domains =
94
101
Array. init (n_domains - 1 ) @@ fun domain_i ->
0 commit comments