2010-06-10 119 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