【问题标题】:clojure pmap/preduce vs fork-joinclojure pmap/preduce vs fork-join
【发布时间】:2010-09-17 19:58:42
【问题描述】:

看起来像 clojure will have a fork-join implementation,它看起来像 java 的 fork join 框架的功能包装器。

我想知道这些和 pmap/preduce 之间的区别是什么?

【问题讨论】:

  • 这将成为 Clojure-conj 会议上的演讲主题:clojure-conj.org/speakers#liebke David liebke 现在正在积极地为下一个版本的 clojure 开发它
  • @Alex 那篇摘要是引发这个问题的原因:)。
  • 是否考虑过 ClojureCLR 上 fork-join 的实现策略,或者通常确保 fork-join API 对替代实现友好?

标签: concurrency clojure


【解决方案1】:

Fork-join 比基于序列的pmap/preduce 更通用,并且应该允许对并行性进行更细粒度的控制。用于执行此操作的确切 API 仍悬而未决。

【讨论】:

    【解决方案2】:

    通过查看该代码,它们的功能将基本相同 - 唯一的区别是 pmap 使用在代理线程池上运行的 Futures 作为其底层原语,而 pvmap 使用 fork-join。

    我不能肯定地说,但我希望在一般情况下表现更好的任何一个都将成为pmap 的标准实现,除非有足够大的权衡以使两者都值得.

    看起来(至少现在)fork-join 框架只支持向量,所以它不像pmap 那样半懒惰。

    【讨论】:

      【解决方案3】:

      这些幻灯片包含一些图表,显示了两种方法之间的比较:http://data-sorcery.org/2010/10/23/clojureconj/

      【讨论】:

        【解决方案4】:

        据我所知,一个区别是pmap 只会在它给出的任何程度的“块状”下运行。该函数映射到给定给pmap 的序列的每个成员。如果粒度太小,并行性的潜在好处就会被创建和管理太多Futures 的开销所吞噬。

        Fork-join 启用工作窃取,因此每个线程上运行的数量可以自适应。

        【讨论】:

          【解决方案5】:

          pmap 或 pvmap 都不会使我们不必使用正确的块大小。对于我的项目,这通常意味着将数据分成块并在每个块上使用 map,然后使用 pmap 并行映射块。然后缩小并展平。

          【讨论】:

            猜你喜欢
            • 2013-11-26
            • 2013-07-26
            • 2012-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多