From 8770d4fb9c831af4077f5397e60715b6a56b4516 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Tue, 11 Nov 2025 00:00:54 -0500 Subject: [PATCH] repro for #41 --- Makefile | 8 ++++++ examples/repro_41/dune | 5 ++++ examples/repro_41/run.ml | 54 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 examples/repro_41/dune create mode 100644 examples/repro_41/run.ml diff --git a/Makefile b/Makefile index 8ca1e86a..0c140e18 100644 --- a/Makefile +++ b/Makefile @@ -67,6 +67,14 @@ bench-pi: './_build/default/benchs/pi.exe -n $(PI_NSTEPS) -j 16 -mode forkjoin -kind=pool' \ './_build/default/benchs/pi.exe -n $(PI_NSTEPS) -j 20 -mode forkjoin -kind=pool' +bench-repro-41: + dune build $(DUNE_OPTS_BENCH) examples/repro_41/run.exe + hyperfine --warmup=1 \ + "./_build/default/examples/repro_41/run.exe 4 domainslib" \ + "./_build/default/examples/repro_41/run.exe 4 moonpool" \ + "./_build/default/examples/repro_41/run.exe 5 moonpool" \ + "./_build/default/examples/repro_41/run.exe 5 seq" + .PHONY: test clean bench-fib bench-pi VERSION=$(shell awk '/^version:/ {print $$2}' moonpool.opam) diff --git a/examples/repro_41/dune b/examples/repro_41/dune new file mode 100644 index 00000000..f6f84a6e --- /dev/null +++ b/examples/repro_41/dune @@ -0,0 +1,5 @@ +(executables + (names run) + (enabled_if + (>= %{ocaml_version} 5.0)) + (libraries moonpool trace trace-tef domainslib)) diff --git a/examples/repro_41/run.ml b/examples/repro_41/run.ml new file mode 100644 index 00000000..769c663b --- /dev/null +++ b/examples/repro_41/run.ml @@ -0,0 +1,54 @@ +(* fibo.ml *) +let cutoff = 25 +let input = 40 + +let rec fibo_seq n = + if n <= 1 then + n + else + fibo_seq (n - 1) + fibo_seq (n - 2) + +let rec fibo_domainslib ctx n = + if n <= cutoff then + fibo_seq n + else + let open Domainslib in + let fut1 = Task.async ctx (fun () -> fibo_domainslib ctx (n - 1)) in + let fut2 = Task.async ctx (fun () -> fibo_domainslib ctx (n - 2)) in + Task.await ctx fut1 + Task.await ctx fut2 + +let rec fibo_moonpool ctx n = + if n <= cutoff then + fibo_seq n + else + let open Moonpool in + let fut1 = Fut.spawn ~on:ctx (fun () -> fibo_moonpool ctx (n - 1)) in + let fut2 = Fut.spawn ~on:ctx (fun () -> fibo_moonpool ctx (n - 2)) in + Fut.await fut1 + Fut.await fut2 + +let usage = + "fibo.exe [ domainslib | moonpool | moonpool_fifo | seq ]" + +let num_domains = try int_of_string Sys.argv.(1) with _ -> failwith usage +let implem = try Sys.argv.(2) with _ -> failwith usage + +let () = + let output = + match implem with + | "moonpool" -> + let open Moonpool in + let ctx = Ws_pool.create ~num_threads:num_domains () in + Ws_pool.run_wait_block ctx (fun () -> fibo_moonpool ctx input) + | "moonpool_fifo" -> + let open Moonpool in + let ctx = Fifo_pool.create ~num_threads:num_domains () in + Ws_pool.run_wait_block ctx (fun () -> fibo_moonpool ctx input) + | "domainslib" -> + let open Domainslib in + let pool = Task.setup_pool ~num_domains () in + Task.run pool (fun () -> fibo_domainslib pool input) + | "seq" -> fibo_seq input + | _ -> failwith usage + in + print_int output; + print_newline ()