在一次讲座中,我的教授给了我们以下循环:
for (int i = 0; i < 100; i++) {
a[i] = a[i] + b[i];
b[i + 1] = c[i] + d[i];
}
他指出了循环迭代之间的依赖关系,因为第 3 行设置了一个值,该值将在第 2 行的下一次迭代中使用(设置在下一次迭代b[i+1]
中成为b[i]
)。因此,我们不能并行运行循环的每次迭代。
然后他给了我们这个展开的版本:
a[1] = a[1] + b[1];
for (int i = 0; i < 98; i++) {
b[i+1] = c[i] + d[i];
a[i+1] = a[i] + b[i];
}
b[99] = c[99] + d[99];
他声称循环的每次迭代现在都可以并行运行。我看到的问题是第 3 行设置了b[i]
第 4 行的下一次迭代中的内容,因此我们仍然不能并行运行每个迭代。
我这样说对吗?如果是这样,是否有第一个循环的正确展开版本,其中每次迭代都可以并行化?