2016-02-13 48 views
0

鑑於Python中的以下示例,我想知道如何在Haskell中實現等效代碼,該代碼也是高效且並行的。在Python在Haskell中實現高效的並行映射並減少

第一個例子:功能映射在Python

f = lambda x: 2*x 
print map(f, [1,2,3,4]) 

第二個例子:功能降低

g = lambda x,y: x*y 
print reduce(g, [1,2,3,4], 1) 

我想在Haskell並行代碼,以便能夠有效地利用多核處理器。

注意:這些只是玩具的例子,我不打算用這些玩具的例子加快速度。它們只是爲了說明如何實現運算符映射並與Haskell並行減少。

+0

嘗試閱讀https://wiki.haskell.org/Applications_and_libraries/Concurrency_and_parallelism另外,來自Control.Parallel.Strategies的'parMap'可以解決第一個問題,雖然上面這些非常簡單的函數可能會使性能變得更糟。 – chi

+0

歡迎來到stackoverflow,請告訴我們你已經嘗試了什麼,並告訴我們一些你的努力。你已經知道了多少haskell。使用多核心通常不是一個初學者問題。你可能會在[Simon Marlowe的優秀書]中找到一些信息(http://chimera.labs.oreilly.com/books/1230000000929)。在並行之前 - 只需檢查簡單的單核解決方案是否足夠快。 – epsilonhalbe

回答

1

對於功能圖,在Haskell等效順序版本將是:

f x = 2*x 
dxs = map f [1,2,3,4] 
main = print dxs 

Haskell中並行版本將是:

import Control.Parallel.Strategies 
import Control.Parallel 

f x = 2*x 
dxs = parMap rpar f [1,2,3,4] 
main = print(dxs) 
+0

我想這是與Haskell並行實現map運算符的最有效方法。讓我知道是否有更有效的方法。 –

0

另一種方式是

import Control.Parallel 

newtype PMonoid a = PM {unPM :: a} 

instance Monoid a => Monoid (PMonoid a) where 
    mempty = PM mempty 
    (PM a) <> (PM b) = PM (a `par` b `pseq` a <> b) 

這將使foldMap平行。 (特別是,地圖操作憑藉懶惰而獲得並行性。)

你們很多想要成立deepseq,但它並不是必需的。