gpt4 book ai didi

language-design - 为什么std.parallel中没有 'forall'?

转载 作者:行者123 更新时间:2023-12-02 06:22:50 25 4
gpt4 key购买 nike

我一直在研究新的 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 的实现只是时间问题,还是有充分的理由不实现?

最佳答案

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

Break­ing from a par­al­lel fore­ach loop via a break, la­beled break, la­beled con­tinue, re­turn or goto state­ment throws a Par­al­lelFore­achEr­ror.

因此,您不能在任何时候中断它,除非您抛出异常 - 这正是 forall 的情况。当您将 foreachparallel 一起使用时,您是在告诉它分发该循环的迭代以分离线程。它们几乎肯定是按顺序分发的,但它们是并行执行的,您并不真正关心顺序。如果这样做,则无法同时执行它们。因此,添加 forall 在这里不会给您带来任何好处。

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

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

关于language-design - 为什么std.parallel中没有 'forall'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6487619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com