@@ -10,62 +10,101 @@ module Atomic = struct
1010 modify ~backoff: (Backoff. once backoff) x f
1111end
1212
13- type t = Op : string * int * 'a * ('a Atomic .t -> _ ) * ('a Atomic .t -> _ ) -> t
13+ type _ op =
14+ | Get : int op
15+ | Incr : int op
16+ | Push_and_pop : int list op
17+ | Cas_int : int op
18+ | Xchg_int : int op
19+ | Swap : (int * int ) op
20+
21+ let run_one (type a ) ~budgetf ?(n_iter = 500 * Util. iter_factor) (op : a op ) =
22+ let name, extra, (value : a ) =
23+ match op with
24+ | Get -> (" get" , 10 , 42 )
25+ | Incr -> (" incr" , 1 , 0 )
26+ | Push_and_pop -> (" push & pop" , 2 , [] )
27+ | Cas_int -> (" cas int" , 1 , 0 )
28+ | Xchg_int -> (" xchg int" , 1 , 0 )
29+ | Swap -> (" swap" , 1 , (4 , 2 ))
30+ in
1431
15- let run_one ~budgetf ?(n_iter = 500 * Util. iter_factor)
16- (Op (name , extra , value , op1 , op2 )) =
1732 let n_iter = n_iter * extra in
1833
1934 let loc = Atomic. make value in
2035
2136 let init _ = () in
2237 let work _ () =
23- let rec loop i =
24- if i > 0 then begin
25- op1 loc |> ignore;
26- op2 loc |> ignore;
27- op1 loc |> ignore;
28- op2 loc |> ignore;
29- op1 loc |> ignore;
30- op2 loc |> ignore;
31- op1 loc |> ignore;
32- op2 loc |> ignore;
33- op1 loc |> ignore;
34- op2 loc |> ignore;
35- op1 loc |> ignore;
36- op2 loc |> ignore;
37- op1 loc |> ignore;
38- op2 loc |> ignore;
39- op1 loc |> ignore;
40- op2 loc |> ignore;
41- op1 loc |> ignore;
42- op2 loc |> ignore;
43- op1 loc |> ignore;
44- op2 loc |> ignore;
45- loop (i - (2 * 10 ))
46- end
47- in
48- loop n_iter
38+ match op with
39+ | Get ->
40+ let rec loop i =
41+ if i > 0 then begin
42+ Sys. opaque_identity (Atomic. get loc) |> ignore;
43+ Sys. opaque_identity (Atomic. get loc) |> ignore;
44+ loop (i - 2 )
45+ end
46+ in
47+ loop n_iter
48+ | Incr ->
49+ let rec loop i =
50+ if i > 0 then begin
51+ Atomic. incr loc;
52+ Atomic. incr loc;
53+ loop (i - 2 )
54+ end
55+ in
56+ loop n_iter
57+ | Push_and_pop ->
58+ let push x = Atomic. modify x (fun xs -> 101 :: xs)
59+ and pop x = Atomic. modify x (function [] -> [] | _ :: xs -> xs) in
60+ let rec loop i =
61+ if i > 0 then begin
62+ push loc;
63+ pop loc |> ignore;
64+ loop (i - 2 )
65+ end
66+ in
67+ loop n_iter
68+ | Cas_int ->
69+ let rec loop i =
70+ if i > 0 then begin
71+ Atomic. compare_and_set loc 0 1 |> ignore;
72+ Atomic. compare_and_set loc 1 0 |> ignore;
73+ loop (i - 2 )
74+ end
75+ in
76+ loop n_iter
77+ | Xchg_int ->
78+ let rec loop i =
79+ if i > 0 then begin
80+ Atomic. exchange loc 1 |> ignore;
81+ Atomic. exchange loc 0 |> ignore;
82+ loop (i - 2 )
83+ end
84+ in
85+ loop n_iter
86+ | Swap ->
87+ let swap x = Atomic. modify x (fun (x , y ) -> (y, x)) in
88+ let rec loop i =
89+ if i > 0 then begin
90+ swap loc;
91+ swap loc;
92+ loop (i - 2 )
93+ end
94+ in
95+ loop n_iter
4996 in
5097
5198 Times. record ~budgetf ~n_domains: 1 ~init ~work ()
5299 |> Times. to_thruput_metrics ~n: n_iter ~singular: " op" ~config: name
53100
54101let run_suite ~budgetf =
55102 [
56- (let get x = Atomic. get x in
57- Op (" get" , 10 , 42 , get, get));
58- (let incr x = Atomic. incr x in
59- Op (" incr" , 1 , 0 , incr, incr));
60- (let push x = Atomic. modify x (fun xs -> 101 :: xs)
61- and pop x = Atomic. modify x (function [] -> [] | _ :: xs -> xs) in
62- Op (" push & pop" , 2 , [] , push, pop));
63- (let cas01 x = Atomic. compare_and_set x 0 1
64- and cas10 x = Atomic. compare_and_set x 1 0 in
65- Op (" cas int" , 1 , 0 , cas01, cas10));
66- (let xchg1 x = Atomic. exchange x 1 and xchg0 x = Atomic. exchange x 0 in
67- Op (" xchg int" , 1 , 0 , xchg1, xchg0));
68- (let swap x = Atomic. modify x (fun (x , y ) -> (y, x)) in
69- Op (" swap" , 2 , (4 , 2 ), swap, swap));
103+ run_one ~budgetf Get ;
104+ run_one ~budgetf Incr ;
105+ run_one ~budgetf Push_and_pop ;
106+ run_one ~budgetf Cas_int ;
107+ run_one ~budgetf Xchg_int ;
108+ run_one ~budgetf Swap ;
70109 ]
71- |> List. concat_map @@ run_one ~budgetf
110+ |> List. concat
0 commit comments