Arl*_*len 2 language-features d language-design
我一直在浏览新的std.parallel库.我不是语言或图书馆设计师,所以请原谅我的无知,但如果forall语言中有声明,或者至少在std.parallel中,它会不会有益吗?
例如,而不是这样:
auto logs = new double[1_000_000];
foreach(i, ref elem; taskPool.parallel(logs)){
elem = log(i + 1.0);
}
Run Code Online (Sandbox Code Playgroud)
我们可以这样写:
auto logs = new double[1_000_000];
forall!((x){ return log(x + 1.0); })(logs);
Run Code Online (Sandbox Code Playgroud)
foreach本质上是顺序的,我们可以随时突破它,同时forall保证所有元素都将被处理.这是正确的陈述吗?forall实施之前只是一个时间问题,还是有充分的理由没有它?
这个怎么样?
auto logs = array(taskPool.amap!`log(a + 1.0)`(iota(0, 1_000_000)));
Run Code Online (Sandbox Code Playgroud)
我要指出,std.parallel_algorithm是在作品中.
我认为你误解了std.parallelism正在做什么foreach.如果您查看文档,它会明确指出
从并行的foreach循环中断,标记为break,标记为continue,return或goto语句抛出ParallelForeachError.
所以,除非你抛出异常,否则你不能在任何时候突破它 - 这正是情况所依据的forall.当你使用foreach时parallel,你告诉它将该循环的迭代分离出来以分离线程.它们几乎肯定是按顺序发出的,但它们是并行执行的,而你并不关心订单.如果你这样做,你就无法并行完成.所以,添加一个forall不会在这里买任何东西.
与大多数编程语言一样,D本质上是一种顺序语言.它提供了一些与线程相关的强大功能(例如默认为线程本地存储),但我希望它需要进行一些重新设计才能forall直接在语言中添加.事实证明,没有必要.该语言足够强大,可以在其上构建并行性.std.parallelism有效地给你forall.它只是通过使用现有的语言功能foreach而不是必须改变语言来理解和包含forall内置功能.
而且,正如CyberShadow所说,一个新的模块std.parallel_algorithm正在进行中,它将具有std.algorithm中许多函数的并行版本,以便您免费获得并行性.总体而言,std.parallelism似乎在为D提供易于使用但强大的并行功能方面做得很好.