【发布时间】:2010-11-05 13:24:31
【问题描述】:
我需要一个例子,如何使用 ocaml-threads 编写并行迭代函数。我的第一个想法是有一个类似的功能:
let procs = 4 ;;
let rec _part part i lst = match lst with
[] -> ()
| hd::tl ->
let idx = i mod procs in
(* Printf.printf "part idx=%i\n" idx; *)
let accu = part.(idx) in
part.(idx) <- (hd::accu);
_part part (i+1) tl ;;
那么并行迭代器可能看起来像这样(这里是基于进程的变体):
let iter f lst = let part = Array.create procs [] in
_part part 0 lst;
let rec _do i =
(* Printf.printf "do idx=%i\n" i; *)
match Unix.fork () with
0 -> (* Code of child *)
if i < procs then
begin
(* Printf.printf "child %i\n" i; *)
List.iter f part.(i)
end
| pid -> (* Code of father *)
(* Printf.printf "father %i\n" i; *)
if i >= procs then ignore (Unix.waitpid [] pid)
else _do (i+1)
in
_do 0 ;;
由于 Thread-module 的用法有点不同,我该如何使用 ocaml 的 thread 模块来编码呢?
还有另一个问题,_part() 函数必须扫描整个列表以将它们分成 n 个部分,然后每个部分将通过每个自己的进程进行管道传输(此处)。仍然存在不先拆分列表的解决方案吗?
【问题讨论】:
-
您已经知道,如果您将模块
Thread与 INRIA 的 OCaml 一起使用,您不会从并行性中获得任何加速?这是一个有趣的编程练习,只是不实用。 -
是的,我知道一般垃圾收集器中缺少并行性。但我仍然希望有一个更好的 ocaml 实现。但是,如果我使用线程在硬盘上写东西,我已经看到线程在 linux 的 htop 中工作。您能否详细解释一下 ocaml 有哪些限制(或指出这些信息)?上面的问题是要了解Threads-module的正确用法。
-
我把解释放在下面的答案中,给了自己更多的空间。
标签: multithreading iteration ocaml parallel-processing