Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use multicores in Ocaml to do Monte Carlo simulations?

Ocaml process can use just one core and in order to use multiple cores I have to run several processes.

Are there any Ocaml frameworks to use to parallelize Monte Carlo simulations?

like image 738
Alfa07 Avatar asked Aug 17 '09 10:08

Alfa07


1 Answers

Use the following invoke combinator to apply a function to a value in another (forked) process and then block waiting for its result when the () value is applied:

  let invoke (f : 'a -> 'b) x : unit -> 'b =
    let input, output = Unix.pipe() in
    match Unix.fork() with
    | -1 -> (let v = f x in fun () -> v)
    | 0 ->
        Unix.close input;
        let output = Unix.out_channel_of_descr output in
        Marshal.to_channel output (try `Res(f x) with e -> `Exn e) [];
        close_out output;
        exit 0
    | pid ->
        Unix.close output;
        let input = Unix.in_channel_of_descr input in
        fun () ->
          let v = Marshal.from_channel input in
          ignore (Unix.waitpid [] pid);
          close_in input;
          match v with
          | `Res x -> x
          | `Exn e -> raise e
like image 72
J D Avatar answered Nov 19 '22 05:11

J D