mirror of
https://github.com/c-cube/moonpool.git
synced 2025-12-05 19:00:33 -05:00
57 lines
1.3 KiB
OCaml
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%!"
|