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)以及许多其他并发类别