Haskellmultithreading有多难?

我听说在Haskell中,创build一个multithreading应用程序就像使用一个标准的Haskell应用程序并使用-threaded标志编译它一样简单。 但是,其他情况下,在实际源代码中描述了使用par命令。

什么是Haskellmultithreading的状态? 引入程序有多简单? 是否有一个很好的multithreading教程,可以查看这些不同的命令及其用法?

什么是Haskellmultithreading的状态?

成熟。 实施时间约15年,交易记忆5年。 GHC是一个广泛使用的编译器,具有大量的开源支持和商业支持。

引入程序有多简单?

这取决于algorithm。 有时它可以是一个平行的使用平行。 有时候需要开发新的algorithm。 一般来说,在Haskell中引入安全的并行性和并发性比在典型的语言中更容易,性能也是好的。

是否有一个很好的multithreading教程,可以查看这些不同的命令及其用法?

Haskell中有3个主要的并行和并发编程模型。

  • 隐含的并行性通过par
  • 通过forkIO / MVars和软件事务内存显式并发和并行
  • 数据并行性通过DPH库

这些是主要的东西。 在所有情况下,使用-threaded进行编译以使用多核运行时,但是要并行处理特定问题有多容易取决于您使用的algorithm以及从该列表中采用的并行编程模型。

下面介绍一下Haskell中的主要并行编程模型,以及如何实现加速。

我认为现实世界中的Haskell第24章是一个很好的教程。

还有并发术语。

在没有任何代码变化的情况下,Haskell rts会尝试将它们用于某些内部过程,但要在应用程序中使用,您应该提供一个由par b (fab)完成的提示,这会强制Haskell对b计算不那么懒如果f不会要求结果。

其中一个原因就是,对于每个需要所有参数(比如a+b )的函数,这样做是因为同步(调度计算和等待结果)会带来一些开销,并且您可能不想花费额外的时间(2*3)+(3*4) ,因为您可以并行计算乘法。 你可能会放弃一些caching命中或类似的东西,或者当你在单处理器上做这样的优化时(即你需要从一个处理器传递结果到另一个处理器)。

当然,使用par代码是丑陋的,当你用轻子元素折叠列表或其他数据结构时,你可能需要计算一些轻元素的块,以确保开销/ calc将非常小。 要解决这个问题,你可以平行观察。

还有Data Parallel Haskell(DPH)。

如果你的程序是关于IO monad的,那你肯定需要做很多改变。 请参阅forkIO , 软件事务内存(STM)以及许多其他并发类别