能够做到这一点以获得最大速度不是很重要吗?
编辑:
例如,Clojure 有pmap,它使用多个核心。
Harrop 博士写道(2011 年 1 月 9 日):
添加到语言中的新功能,例如 OCaml 3.12 中的一流模块,远没有多核功能那么有价值。
能够做到这一点以获得最大速度不是很重要吗?
编辑:
例如,Clojure 有pmap,它使用多个核心。
Harrop 博士写道(2011 年 1 月 9 日):
添加到语言中的新功能,例如 OCaml 3.12 中的一流模块,远没有多核功能那么有价值。
是的,它可以; 为此,您应该使用多处理模型,在该模型中,您的程序会产生多个进程以独立进行计算,然后合并结果。
最简单的方法是使用Unix.fork
系统调用将您的程序分成两个进程。例如,在线书籍Unix system programming in OCaml中对此进行了描述。如果您要跨内核拆分的计算具有简单的结构(迭代,映射到输入池),Parmap是一个库,它可以让您轻松地从并行性中受益,只需更改应用程序中的一些函数调用(如果它结构已经很好了)。如果您想做更复杂的事情(直接访问共享内存结构、消息框...),Ocaml-net 项目通过Netmulticore库支持许多方便的功能。
如果你想做分布式编程(在多台机器的集群上运行的程序),OcamlMPI库为著名的分布式消息传递框架 MPI 提供支持。还有更具实验性和高级别的JoCaml扩展,它使用一种有趣的、更具研究性的方法来进行并发通信。
请注意,如果您没有特定的性能限制,或者如果您的应用程序本质上是顺序的,那么尝试并行化一些计算是没有意义的(以更高的同步簿记开销为代价),在后一种情况下,因为阿姆达尔定律。
如果您的并行代码生成大量数据,那么在 OCaml 中没有简单的方法可以有效地将其取回。传统的解决方法是派生进程并将结果编组回父进程,但您的父进程随后将所有数据反序列化在一个核心上,将所有数据重新分配到自己的堆上。这在多核上效率非常低,并且意味着 OCaml 无法表达大多数并行算法的有效实现,包括pmap
.