Skip to content

Commit ee9c11c

Browse files
committed
Add optional argument to neglect domain_local_await
1 parent 71cbf58 commit ee9c11c

File tree

2 files changed

+51
-43
lines changed

2 files changed

+51
-43
lines changed

lib/multicore_bench.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Times : sig
55
budgetf:float ->
66
n_domains:int ->
77
?ensure_multi_domain:bool ->
8+
?domain_local_await:[< `Busy_wait | `Neglect > `Busy_wait ] ->
89
?n_warmups:int ->
910
?n_runs_min:int ->
1011
?before:(unit -> unit) ->

lib/times.ml

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
type t = { inverted : bool; times_per_domain : float array array; runs : int }
22

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) () =
56
let barrier_init = Barrier.make n_domains in
67
let barrier_before = Barrier.make n_domains in
78
let barrier_after = Barrier.make n_domains in
@@ -23,7 +24,7 @@ let record ~budgetf ~n_domains ?(ensure_multi_domain = true) ?(n_warmups = 3)
2324
in
2425
Gc.full_major ();
2526
let budget_start = Mtime_clock.elapsed () in
26-
let prepare_for_await () =
27+
let with_busy_wait () =
2728
let open struct
2829
type state = Init | Released | Awaiting of { mutable released : bool }
2930
end in
@@ -49,46 +50,52 @@ let record ~budgetf ~n_domains ?(ensure_multi_domain = true) ?(n_warmups = 3)
4950
Domain_local_await.{ release; await }
5051
in
5152
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 ()
9299
in
93100
let domains =
94101
Array.init (n_domains - 1) @@ fun domain_i ->

0 commit comments

Comments
 (0)