OCaml程序可以使用多个处理器核心吗?

时间:2013-01-26 19:23:42

标签: ocaml

为了获得最大速度,能够做到这一点是不是很重要?

编辑:

例如,Clojure有 pmap ,它使用多个核心。

博士。 Harrop写道(2011年1月9日):
新功能被添加到语言中,例如头等 OCaml 3.12中的模块远没有多核那么有价值 能力本来就是。

2 个答案:

答案 0 :(得分:6)

是的,它可以;为此,您应该使用多处理模型,您可以在其中编程生成多个进程以独立进行计算,然后合并结果。

最简单的方法是使用Unix.fork系统调用将程序分成两个进程。例如,在在线书籍Unix system programming in OCaml中对此进行了描述。如果要跨核分割的计算具有简单的结构(迭代,映射输入池),Parmap是一个库,它可以让您轻松地从并行性中受益,只需更改一些函数调用即可申请(如果已经结构良好)。如果你想做更复杂的事情(直接访问共享内存结构,消息框......),Ocaml-net项目通过Netmulticore库支持许多方便的功能。

如果要进行分布式编程(在多台机器的集群上运行的程序),OcamlMPI库为众所周知的分布式消息传递框架MPI提供支持。还有更多实验性和高级JoCaml扩展,它使用了一种有趣的,更具研究性的并发通信方法。

请注意,如果您没有特定的性能限制,或者您的应用程序本质上是顺序的,那么尝试并行化某些计算(以更高的同步簿记开销为代价)是没有意义的,后一种情况是因为Amdahl's law

答案 1 :(得分:0)

如果您的并行代码生成大量数据,那么就没有简单的方法可以在OCaml中有效地恢复它。传统的解决方法是将进程分叉并将结果编组回父进程,但是您的父进程然后反序列化单个核心上的所有数据,在其自己的堆上重新分配所有内容。这在多核上效率非常低,并且意味着OCaml无法表达大多数并行算法的有效实现,包括pmap