moonpool/test/t_bench1.ml
2023-05-31 23:25:31 -04:00

57 lines
1.3 KiB
OCaml

open Moonpool
let ( let@ ) = ( @@ )
let rec fib x =
if x <= 1 then
1
else
fib (x - 1) + fib (x - 2)
let run ~psize ~n ~j () : _ Fut.t =
Printf.printf "pool size=%d, n=%d, j=%d\n%!" psize n j;
let pool =
Pool.create
~on_init_thread:(fun ~dom_id:_ ~t_id () ->
Tracy.name_thread (Printf.sprintf "t_%d" t_id))
~min:psize ~per_domain:0 ()
in
let loop () =
let@ _sp = Tracy.with_ ~file:__FILE__ ~line:__LINE__ ~name:"loop" () in
for _i = 1 to n do
let () =
let@ _sp = Tracy.with_ ~file:__FILE__ ~line:__LINE__ ~name:"iter" () in
Tracy.add_text _sp (string_of_int _i);
ignore (Sys.opaque_identity (fib 30) : int)
in
Thread.yield ()
done
in
let fut = Fut.for_ ~on:pool j (fun _ -> loop ()) in
fut
let () =
Tracy.enable ();
let j = ref 10 in
let n = ref 10 in
let psize = ref 4 in
let opts =
[
"-psize", Arg.Set_int psize, " pool size";
"-j", Arg.Set_int j, " number of tasks";
"-n", Arg.Set_int n, " number of iterations per task";
]
|> Arg.align
in
Arg.parse opts ignore "";
(* start two distinct pools *)
let fut1 = run ~psize:!psize ~n:!n ~j:!j () in
let fut2 = run ~psize:!psize ~n:!n ~j:!j () in
Fut.wait_block_exn fut1;
Fut.wait_block_exn fut2;
Printf.printf "done\n%!"