OCaml的并行化能力是怎样的?
我对使用OCaml进行项目感兴趣,但我不确定它的并行化function在哪里。 OCaml中有消息传递的能力吗? OCaml能够有效使用多个CPU吗?
我读到的大部分内容都是在2002 – 2006年写的,而且我还没有看到更近的内容。
谢谢!
Caml每周新闻 (“CWN”, 摘自caml list的有趣信息摘要)的2009年版本显示:
-
线程和Ocaml上的官方队伍没有改变。 值得一提的是:
(…)一般来说,整个标准库不是线程安全的。 可能应该在线程库的文档中说明,但是按照标准库模块logging它没有太多的意义。 – X. Leroy
(关于Ocaml线程如何仍然有用,请参阅SO的另一个问题,由罪犯自己发表一个评论 )
-
并行性最常采用的模式是消息传递,值得注意的是X.Leroy的OcamlMPI ,它提供了针对MPI标准的 SPMD风格的编程绑定。 上面提到的同一个CWN问题提供了对示例的引用,以及许多其他相关的项目。
-
另一个消息传递解决scheme是JoCaml ,开创了被称为连接演算的新型并发通信方式。 请注意,它与OCaml编译器是二进制兼容的。
-
这并不妨碍运行时GC的并行性好的运行时间,但是: 在CWN的这个其他问题中可以看到OCAML4MC的讨论。
还有:
-
Netmulticore – 通过映射共享内存多处理共享ocaml值。
-
CamlP3l – 用于Caml并行程序的编译器。
-
OCaml-Java – 发出Java字节码的OCaml编译器
尽pipe如此,我还没有跟随关于Ocaml和并行编程的更多讨论。 我要离开这个CW,以便其他人可以更新我提到的内容。 如果这个问题可以达到与Haskell类似的完整度,那将是非常好的。
目前,OCaml运行时不支持并行运行多个内核,因此一个OCaml进程不能利用多个内核。 这不太可能直接改变; OCaml开发者最感兴趣的方向是增加并行性,似乎允许多个OCaml运行时间在一个进程中并行运行; 这将允许非常快速的消息传递,但不会允许多个线程在共享内存configuration中并行运行。 主要的挂断是垃圾收集器; 几年前,团队尝试了一个并发GC,但是在单线程的情况下引入了令人难以接受的减速。
有几个项目,即Functory和OCamlnet ,通过使用多个进程来提供多核心的并行性。
一般来说,OCaml社区倾向于支持消息传递方法,这可以通过跨进程边界(如OCamlnet)完成,而不是单进程共享内存multithreading。 如果你的程序可以分成多个进程(很多可以!),那么是的,你可以有效地使用多个CPU。
BSMLlib为OCaml中的数据并行编程提供了一个简化的编程接口。 它的执行相当于BSP风格的消息传递,但对OCaml的一个子集是确定性的,甚至是声明性的。 关键的概念是“一个对应于价值向量的标准types,每个过程一个。
http://traclifo.univ-orleans.fr/BSML/ http://fr.wikipedia.org/wiki/Bulk_Synchronous_Parallel_ML
GaétanHains University Paris-Est