簡體   English   中英

在Haskell / GHC中馴服並行性

[英]Taming parallelism in Haskell/GHC

一個由Haskell的新手提出的有關使並行性有效工作的問題。

代碼第14天到來挑戰涉及創建整數序列的MD5哈希,尋找給出滿足特定屬性的哈希的前n個整數。 我基本上是通過創建哈希然后過濾它們來實現的。

我認為嘗試並行處理是一件好事,它使用多個內核來生成哈希。

哈希創建的非並行版本如下所示:

md5sequenceS :: [String]
md5sequenceS = [makeMd5 i | i <- [0..]]
    where makeMd5 i = stretch $ getHash (salt ++ show i)
          stretch h0 = foldr (\_ h -> getHash h) h0 [1..2016]

...雖然運行緩慢,但工作正常,大約需要四分鍾的時間。

並行版本如下所示:

md5sequenceS :: [String]
md5sequenceS = parMap rdeepseq (makeMd5) [0..]
    where makeMd5 i = stretch $ getHash (salt ++ show i)
          stretch h0 = foldr (\_ h -> getHash h) h0 [1..2016]

...除parMap rdeepseq位外,與之前相同。 這行不通:它消耗了我計算機上的所有可用內存,並且在30分鍾的掛牆時間后仍然無法產生答案。 但是,它確實完全使用了所有處理器。

我應該如何應對這種失控的並行性?

(問題規范並未提供我需要生成多少哈希的任何線索,但事實證明,我需要哈希約30,000個整數。)

編輯以包括接受的答案

parBuffer策略可以用作

md5sequenceS = withStrategy (parBuffer 100 rdeepseq) $ map (makeMd5) [0..]
    where makeMd5 i = stretch $ getHash (salt ++ show i)
          stretch h0 = foldr (\_ h -> getHash h) h0 [1..2016]

與單線程版本相比,性能不是很好,但這是一個不同的問題...

parMap將強制評估所有列表,在您的情況下該列表是無限的。

除了使用parMap ,您可以考慮使用其他策略,例如parBuffer ,它可以處理無限列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM