我听说在Haskell中,创建一个多线程应用程序就像采用标准Haskell应用程序并使用-threaded
标志进行编译一样简单。但是,其他情况描述了在实际源代码中使用par
命令。
Haskell多线程的状态是什么?引入程序有多容易?是否有一个很好的多线程教程可以解决这些不同的命令及其用途?
答案 0 :(得分:65)
Haskell多线程的状态是什么?
成熟。实施大约15年,具有5年的交易记忆。 GHC是一种广泛使用的编译器,具有大量开源支持和商业支持。
引入程序有多容易?
这取决于算法。有时它可以是par
的一行使用来获得并行性。有时必须开发新的算法。通常,在Haskell中引入安全并行性和并发性比在典型语言中更容易,性能也很好。
是否有一个很好的多线程教程可以解决这些不同的命令及其用途?
Haskell中有3种主要的并行和并发编程模型。
par
这些是主要的事情。在所有情况下,使用-threaded编译以使用多核运行时,但并行化特定问题的难易程度取决于您使用的算法以及您从该列表中采用的并行编程模型。
以下是an introduction to the main parallel programming models in Haskell,以及如何实现加速。
我认为Chapter 24 of Real World Haskell是一个很好的教程。
答案 1 :(得分:18)
还有并发术语。
如果代码没有任何变化,你的haskell rts会尝试将它们用于某些内部进程,但是要在你的应用程序中使用,你应该给出一个由par b (f a b)
完成的提示,这会强制Haskell在计算时不那么懒惰b
的{{1}},即使f
不需要结果。
对于每个需要其所有参数的函数(如a+b
)都不这样做的原因之一是同步(调度计算和等待结果)会产生一些开销,而您可能不希望花费(2*3)+(3*4)
的额外刻度只是因为你可以并行计算乘法。并且您可能会丢失一些缓存命中或类似的东西或在单处理器上执行此操作时所做的优化(即,您无论如何都需要将结果从一个处理器传递到另一个处理器)。
当然使用par
的代码是丑陋的,当您使用light子元素折叠列表或其他一些数据结构时,您可能想要计算一些轻元素的块以确保开销/ calc会非常小。要解决此问题,您可以查看parallel。
还有Data Parallel Haskell(DPH)。
如果您的程序更多关于IO monad,那么您肯定需要进行许多更改。请参阅forkIO
,Software Transactional Memory (STM)以及Concurrency category