【发布时间】:2012-05-14 21:17:44
【问题描述】:
我从 Haskell 并行开始,我已经成功地学会了如何使用一些策略,例如:r0, rseq, rdeepseq, parList, parMap。现在我正在进一步寻求更高的效率。所以这是我的问题:parList 和 parBuffer 有什么区别?每种策略在哪些情况下是有效的?
【问题讨论】:
标签: haskell parallel-processing
我从 Haskell 并行开始,我已经成功地学会了如何使用一些策略,例如:r0, rseq, rdeepseq, parList, parMap。现在我正在进一步寻求更高的效率。所以这是我的问题:parList 和 parBuffer 有什么区别?每种策略在哪些情况下是有效的?
【问题讨论】:
标签: haskell parallel-processing
论文提到了这两个组合器 (link here)。
parList 并行评估所有项目,同时将它们全部关闭。我建议这在您想一次使用整个列表时很有用,例如在地图折叠问题中。如果你想对一堆数字求和然后求和,请使用parList 进行求值,然后执行求和。
parBuffer 计算前 n 个元素,当您消耗超出此值时,它会触发下一个 n,依此类推。因此,parBuffer 在您要从头开始以块的形式使用列表时或当列表非常大(或无限)并且您不会全部评估时是有意义的。例如,如果您想从一些计算成本高的项目列表中找到前 10 个答案,您可以使用 take 10 . filter f 和 parBuffer 来并行评估列表中的连续块,直到找到前十个您正在寻找的物品。
【讨论】:
parBuffer 在使用 head 元素时评估元素 n+1。这意味着您应该始终拥有下一个 n 元素,可从任何消耗缓冲区的点获得。来自链接论文中的脚注:“通常不会在长列表上使用 parList,因为会产生太多火花,相反 parBuffer 往往更实用”。