D语言中并行for循环及索引数组初始化的简化方法问询
D语言并行化与数组初始化优化解答
问题1:无需手动循环,初始化元素值等于索引的数组
当然有,D语言标准库的std.range.iota可以直接生成从0开始的连续整数范围,再通过array()方法转换为数组,完全替代手动循环初始化:
import std.range; auto yRange = iota(imageHeight).array;
iota(n)默认生成从0到n-1的整数序列,正好对应数组的索引值,一步就能得到目标数组。
问题2:更简便的循环并行化方式
可以直接用范围配合std.parallelism.parallel实现类似C++ OpenMP的简洁写法,不需要先创建数组。正确的写法如下:
import std.parallelism; import std.range; foreach(y; parallel(iota(imageHeight))) { // 内层循环与光线投射逻辑... }
parallel可以直接接受iota生成的输入范围,自动将遍历任务并行化,写法和你期望的语法示例非常接近,而且比手动创建数组再并行更高效(省去了数组内存分配和填充的开销)。注意这里不需要ref修饰y,因为我们只是读取索引值,值传递足够用;如果需要修改共享数据,要额外注意线程安全。
内容的提问来源于stack exchange,提问作者David Frogley
相关产品推荐
相关产品推荐

