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

一个OCaml程序可以使用多个处理器核吗?,ocaml,Ocaml,为了达到最高速度,能够做到这一点难道不重要吗 编辑: 例如,Clojure拥有pmap,它使用多个核心 哈洛普博士写道(2011年1月9日): 正在添加到语言中的新功能,例如一流的 OCAML3.12中的模块远没有多核那么有价值 能力是可以的。是的,它可以;为此,您应该使用多处理模型,在该模型中,您的程序生成多个进程以独立地进行计算,然后合并结果 最简单的方法是使用Unix.fork系统调用将程序分成两个进程。例如,在线书籍中描述了这一点。如果要跨核心拆分的计算具有简单的结构(迭代、在输入池上的

为了达到最高速度,能够做到这一点难道不重要吗

编辑:

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

哈洛普博士写道(2011年1月9日):
正在添加到语言中的新功能,例如一流的 OCAML3.12中的模块远没有多核那么有价值
能力是可以的。

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

最简单的方法是使用
Unix.fork
系统调用将程序分成两个进程。例如,在线书籍中描述了这一点。如果要跨核心拆分的计算具有简单的结构(迭代、在输入池上的映射),那么它是一个库,只需更改应用程序中的一些函数调用(如果它已经具有良好的结构),就可以让您很容易地从并行性中获益。如果您想做更复杂的事情(直接访问共享内存结构、消息框……),OCAMLNET项目通过库支持许多方便的特性

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


请注意,如果您没有特定的性能约束,或者如果您的应用程序本身是顺序的,那么尝试并行一些计算(以较高的同步簿记开销为代价)是没有意义的,在后一种情况下,因为。

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

什么使您认为它不能?您提到了Unix.fork和Parmap。这些能在Windows下工作吗(没有Cygwin)?这是个好问题;如果您没有Cygwin,您应该使用Unix.create\u process,我认为parmap不支持这一点。本文描述了在没有Cygwin的Windows上支持的
Unix
的子集。但请注意,JoCaml此时不会使用多个内核。