我对将OCaml用于项目感兴趣,但我不确定它的并行化功能在哪里。 OCaml中是否有消息传递功能? OCaml能否有效地使用1个以上的CPU?
我读过的关于这个主题的大部分内容是在2002 - 2006年写的,我还没有看到更新的内容。
谢谢!
答案 0 :(得分:22)
official party line on threads and Ocaml没有改变。值得注意的一句话:
(...)一般来说,整个标准库不是线程安全的。可能应该说明一下 线程库的文档,但每个标准库模块记录它没有多大意义。 - X. Leroy
(关于Ocaml线程如何仍然有用,请参阅a remark by the culprit himself in another question on SO)
最常用的并行化范例是消息传递,值得注意的是X. Leroy的OcamlMPI,提供了SPMD样式与MPI standard编程的绑定。 The same CWN issue I pointed to above提供了示例和许多其他相关项目的参考。
另一个消息传递解决方案是JoCaml,开创了新的并发通信方式join calculus。请注意,它与OCaml编译器是二进制兼容的。
并没有阻止GC并行运行的运行时的完美结合:请参阅this other issue of the CWN中对OCAML4MC的讨论。
还有:
Netmulticore - 多处理通过映射共享内存共享ocaml值。
CamlP3l - Caml并行程序的编译器。
OCaml-Java - 发出Java字节码的OCaml编译器
我最近没有关注过Ocaml& amp;但是,并行编程。 我要离开此CW,以便其他人可以更新我提到的内容。如果此问题可以达到与the analogous one for Haskell完全相同的水平,那就太棒了。
答案 1 :(得分:8)
目前,OCaml运行时不支持并行运行多个内核,因此单个OCaml进程无法利用多个内核。这不太可能直接改变; OCaml开发人员最感兴趣的方向是增加并行性,这似乎允许多个OCaml运行时在一个进程中并行运行;这将允许非常快速的消息传递,但不允许多个线程在共享内存配置中并行运行。主要的垃圾是垃圾收集器;几年前,该团队尝试了并发GC,但它在单线程案例中引入了令人无法接受的减速。
有几个项目,即Functory和OCamlnet,它们通过使用多个流程提供多核幸福的并行性。
通常,OCaml社区倾向于支持消息传递方法,这可以通过单进程共享内存多线程跨进程边界(如OCamlnet)完成。如果您的程序可以分成多个进程(很多可以!),那么是的,您可以有效地使用多个CPU。
答案 2 :(得分:1)
BSMLlib为OCaml中的数据并行编程提供了简化的编程接口。 它的执行相当于BSP风格的消息传递,但它对于OCaml的一个子集来说是确定性的,甚至是声明性的。 关键概念是'一个par值类型,它对应一个值向量,每个进程一个。
http://traclifo.univ-orleans.fr/BSML/ http://fr.wikipedia.org/wiki/Bulk_Synchronous_Parallel_ML
GaétanHains 巴黎东部大学