2009-08-17 5 views
9

Процесс Ocaml может использовать только одно ядро, и для использования нескольких ядер я должен запускать несколько процессов.Как использовать мультикоры в Ocaml для моделирования в Монте-Карло?

Есть ли какие-либо рамки Ocaml для параллелизации симуляций Монте-Карло?

ответ

3

В настоящее время единственный способ сделать это с MPI, и вы можете найти привязки ocaml для него на Xavier Leroy's website.

+2

ocaml4multicore доступен (с ограничениями), см .: http://www.algo-prog.info/ocmc/web/ – nlucaroni

8

Используйте следующую invoke комбинатора применить функцию к значению в другом (раздвоенном) процессе, а затем блокирует в ожидании его результат, когда применяются значение ():

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