2010-06-10 128 views
58

我听说在Haskell,创建多线程应用程序是为取一个标准的Haskell应用,并与-threaded标志编译一样容易。但是,其他情况在实际源代码中描述了使用par命令。Haskell多线程有多困难?

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

+0

我相信* Simon Marlow的Haskell *中的并行和并行编程通常被认为是本主题的最佳介绍。 – 2017-02-13 18:53:26

回答

61

什么是Haskell的多线程的状态?

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

引入程序有多简单?

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

是否有一个很好的多线程教程来说明这些不同的命令及其用法?

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

  • 通过通过DPH库

这些通过forkIO/MVars和软件事务内存

  • 数据并行par
  • 明确的并发和并行隐含并行性是主要的事情。在所有情况下,使用-threaded编译以使用多核运行时,但并行处理特定问题有多容易取决于您使用的算法以及从该列表中采用的并行编程模型。

    这里是an introduction to the main parallel programming models in Haskell,以及如何实现加速。

    我认为Chapter 24 of Real World Haskell是一个很好的教程。

  • 16

    还有并发项。

    没有在代码中的任何改变你的哈斯克尔RTS将尝试使用他们的一些内部流程,但在你的应用程序中使用,你应该给出正在通过par b (f a b)做了提示,迫使哈斯克尔是对b计算研究不是那么懒,甚至如果f将不需要它的结果。

    对于每个需要其所有参数的函数(如a+b),不要这样做的原因之一是同步(调度计算和等待结果)会带来一些开销,并且您可能不希望花费额外的时间,仅仅因为您可以并行计算乘法运算,因此需要输入(2*3)+(3*4)。而且你可能会丢失一些缓存命中或类似的东西,或者是在单处理器上完成时的优化(即无论如何都需要将结果从一个处理器传递到另一个处理器)。

    当然,使用par的代码是丑陋的,当您使用光子元素折叠列表或其他数据结构时,您可能需要计算一些光元素的块,以确保开销/计算将会真的很小。要解决这个问题,你可以看看parallel

    还有数据并行的Haskell(DPH)。

    如果你的程序更多的是关于IO monad比你肯定需要很多改变。见forkIOSoftware Transactional Memory (STM)和许多其他人Concurrency category