@@ -7,15 +7,19 @@ let run_one ~budgetf ?(n_adders = 2) ?(blocking_add = false) ?(n_takers = 2)
77
88 let t = Mvar. create None in
99
10- let n_msgs_to_take = Atomic. make n_msgs |> Multicore_magic. copy_as_padded in
11- let n_msgs_to_add = Atomic. make n_msgs |> Multicore_magic. copy_as_padded in
10+ let n_msgs_to_take = Countdown. create ~n_domains: n_takers () in
11+ let n_msgs_to_add = Countdown. create ~n_domains: n_adders () in
1212
13- let init _ = () in
13+ let init _ =
14+ Countdown. non_atomic_set n_msgs_to_take n_msgs;
15+ Countdown. non_atomic_set n_msgs_to_add n_msgs
16+ in
1417 let work i () =
1518 if i < n_adders then
19+ let domain_index = i in
1620 if blocking_add then
1721 let rec work () =
18- let n = Util . alloc n_msgs_to_add in
22+ let n = Countdown . alloc n_msgs_to_add ~domain_index ~batch: 1000 in
1923 if 0 < n then begin
2024 for i = 1 to n do
2125 Mvar. put t i
@@ -26,45 +30,43 @@ let run_one ~budgetf ?(n_adders = 2) ?(blocking_add = false) ?(n_takers = 2)
2630 work ()
2731 else
2832 let rec work () =
29- let n = Util . alloc n_msgs_to_add in
33+ let n = Countdown . alloc n_msgs_to_add ~domain_index ~batch: 1000 in
3034 if 0 < n then begin
3135 for i = 1 to n do
3236 while not (Mvar. try_put t i) do
33- Domain. cpu_relax ()
37+ Backoff. once Backoff. default |> ignore
3438 done
3539 done ;
3640 work ()
3741 end
3842 in
3943 work ()
40- else if blocking_take then
41- let rec work () =
42- let n = Util. alloc n_msgs_to_take in
43- if n <> 0 then begin
44- for _ = 1 to n do
45- ignore (Mvar. take t)
46- done ;
47- work ()
48- end
49- in
50- work ()
5144 else
52- let rec work () =
53- let n = Util. alloc n_msgs_to_take in
54- if n <> 0 then begin
55- for _ = 1 to n do
56- while Option. is_none (Mvar. take_opt t) do
57- Domain. cpu_relax ()
58- done
59- done ;
60- work ()
61- end
62- in
63- work ()
64- in
65- let after () =
66- Atomic. set n_msgs_to_take n_msgs;
67- Atomic. set n_msgs_to_add n_msgs
45+ let domain_index = i - n_adders in
46+ if blocking_take then
47+ let rec work () =
48+ let n = Countdown. alloc n_msgs_to_take ~domain_index ~batch: 1000 in
49+ if n <> 0 then begin
50+ for _ = 1 to n do
51+ ignore (Mvar. take t)
52+ done ;
53+ work ()
54+ end
55+ in
56+ work ()
57+ else
58+ let rec work () =
59+ let n = Countdown. alloc n_msgs_to_take ~domain_index ~batch: 1000 in
60+ if n <> 0 then begin
61+ for _ = 1 to n do
62+ while Option. is_none (Mvar. take_opt t) do
63+ Backoff. once Backoff. default |> ignore
64+ done
65+ done ;
66+ work ()
67+ end
68+ in
69+ work ()
6870 in
6971
7072 let config =
@@ -79,7 +81,7 @@ let run_one ~budgetf ?(n_adders = 2) ?(blocking_add = false) ?(n_takers = 2)
7981 (format " taker" blocking_take n_takers)
8082 in
8183
82- Times. record ~budgetf ~n_domains ~init ~work ~after ()
84+ Times. record ~budgetf ~n_domains ~init ~work ()
8385 |> Times. to_thruput_metrics ~n: n_msgs ~singular: " message" ~config
8486
8587let run_suite ~budgetf =
@@ -88,4 +90,5 @@ let run_suite ~budgetf =
8890 (Util. cross [ 1 ; 2 ] [ false ; true ])
8991 |> List. concat_map
9092 @@ fun ((n_adders , blocking_add ), (n_takers , blocking_take )) ->
91- run_one ~budgetf ~n_adders ~blocking_add ~n_takers ~blocking_take ()
93+ if Domain. recommended_domain_count () < n_adders + n_takers then []
94+ else run_one ~budgetf ~n_adders ~blocking_add ~n_takers ~blocking_take ()
0 commit comments