【问题标题】:How to choose between parList and parBuffer?如何在 parList 和 parBuffer 之间进行选择?
【发布时间】:2012-05-14 21:17:44
【问题描述】:

我从 Haskell 并行开始,我已经成功地学会了如何使用一些策略,例如:r0, rseq, rdeepseq, parList, parMap。现在我正在进一步寻求更高的效率。所以这是我的问题:parListparBuffer 有什么区别?每种策略在哪些情况下是有效的?

【问题讨论】:

    标签: haskell parallel-processing


    【解决方案1】:

    论文提到了这两个组合器 (link here)。

    parList 并行评估所有项目,同时将它们全部关闭。我建议这在您想一次使用整个列表时很有用,例如在地图折叠问题中。如果你想对一堆数字求和然后求和,请使用parList 进行求值,然后执行求和。

    parBuffer 计算前 n 个元素,当您消耗超出此值时,它会触发下一个 n,依此类推。因此,parBuffer 在您要从头开始以块的形式使用列表时或当列表非常大(或无限)并且您不会全部评估时是有意义的。例如,如果您想从一些计算成本高的项目列表中找到前 10 个答案,您可以使用 take 10 . filter fparBuffer 来并行评估列表中的连续块,直到找到前十个您正在寻找的物品。

    【讨论】:

    • 不完全是:parBuffer 在使用 head 元素时评估元素 n+1。这意味着您应该始终拥有下一个 n 元素,可从任何消耗缓冲区的点获得。来自链接论文中的脚注:“通常不会在长列表上使用 parList,因为会产生太多火花,相反 parBuffer 往往更实用”。
    猜你喜欢
    • 2023-03-25
    • 2012-11-27
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多