【问题标题】:Why is there no 'forall' in std.parallel?为什么 std.parallel 中没有“forall”?
【发布时间】:2011-06-27 00:13:09
【问题描述】:

我一直在浏览新的std.parallel 库。我不是语言或库设计者,所以请原谅我的无知,但如果语言中有 forall 语句,或者至少在 std.parallel 中,这不是有益的吗?

例如,而不是这个:

auto logs = new double[1_000_000];
foreach(i, ref elem; taskPool.parallel(logs)){
        elem = log(i + 1.0);
}

我们可以这样写:

auto logs = new double[1_000_000];
forall!((x){ return log(x + 1.0); })(logs);

foreach本质上是连续的,我们可以随时打破它,而forall保证所有元素都会被处理。这是一个正确的说法吗? forall 实施只是时间问题,还是有充分的理由不实施?

【问题讨论】:

    标签: language-design language-features d


    【解决方案1】:

    我认为您误解了 std.parallelism 对 foreach 的作用。如果你look at the documentation,它特别指出

    从并行 foreach 中中断 通过一个中断循环,标记为中断, 标记为继续、返回或转到 语句抛出一个 ParallelForeach 错误。

    所以,你不能在任何时候摆脱它,除非你抛出一个异常——这正是forall 的情况。当您将foreachparallel 一起使用时,您是在告诉它分发该循环的迭代以分离线程。它们几乎肯定是按顺序分配的,但它们是并行执行的,您并不真正关心顺序。如果你这样做了,你就不能并行地做它们。所以,在这里添加forall 不会给你带来任何好处。

    D 本质上是一种顺序语言,就像大多数编程语言一样。它提供了一些与线程相关的强大功能(例如默认为线程本地存储),但我预计需要进行相当多的重新设计才能将forall 之类的内容直接放入语言中。事实证明,这是没有必要的。该语言足够强大,可以在其之上构建并行性。 std.parallelism 有效地为您提供forall。只是它是通过使用现有的语言功能 foreach 来做到这一点的,而不是必须更改语言以理解并包含 forall 作为内置功能。

    并且,正如CyberShadow notes 一样,一个新模块 std.parallel_algorithm 正在开发中,它将具有 std.algorithm 中许多函数的并行版本,以便您免费获得这种并行性。总体而言,std.parallelism 似乎在为 D 提供易于使用但功能强大的并行功能方面做得很好。

    【讨论】:

      【解决方案2】:

      这个怎么样?

      auto logs = array(taskPool.amap!`log(a + 1.0)`(iota(0, 1_000_000)));
      

      我应该注意到std.parallel_algorithmin the works

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多