Haskell多线程有多难?

Man*_*tis 62 concurrency multithreading haskell multicore

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

Haskell多线程的状态是什么?引入程序有多容易?是否有一个很好的多线程教程可以解决这些不同的命令及其用途?

Don*_*art 66

Haskell多线程的状态是什么?

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

引入程序有多容易?

这取决于算法.有时它可以是一行使用par来获得并行性.有时必须开发新的算法.通常,在Haskell中引入安全并行性和并发性比在典型语言中更容易,性能也很好.

是否有一个很好的多线程教程可以解决这些不同的命令及其用途?

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

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

这些是主要的事情.在所有情况下,使用-threaded编译以使用多核运行时,但并行化特定问题的难易程度取决于您使用的算法以及您从该列表中采用的并行编程模型.

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

我认为真实世界Haskell的第24章是一个很好的教程.


ony*_*ony 18

还有并发术语.

在没有任何代码更改的情况下,你的haskell rts会尝试将它们用于某些内部进程,但是要在你的应用程序中使用,你应该给出一个暗示,即使不需要它,par b (f a b)Haskell在计算时不会那么懒惰.结果.bf

对于需要其所有参数(例如a+b)的每个函数都不执行此操作的原因之一是同步(调度计算和等待结果)会产生一些开销,您可能不希望(2*3)+(3*4)因为您而花费额外的时间可以并行计算乘法.并且您可能会松开一些缓存命中或类似的东西或在单处理器上执行此操作时进行的优化(即,您无论如何都需要将结果从一个处理器传递到另一个处理器).

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

还有Data Parallel Haskell(DPH).

如果您的程序更多关于IO monad,那么您肯定需要进行许多更改.见forkIO,软件事务内存(STM)和许多其他人并发类