在一次演讲中,我的教授给了我们以下循环:
for (int i = 0; i < 100; i++) {
a[i] = a[i] + b[i];
b[i + 1] = c[i] + d[i];
}
他指出了循环迭代之间的依赖关系,因为第三行设置了第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行设置了第4行下一次迭代中将成为b[i]
的内容,因此我们仍然无法并行运行每次迭代。
我说对了吗?如果是这样,是否有一个正确展开的第一个循环版本,每个迭代可以并行化?
答案 0 :(得分:1)
我猜你写下教授给出的展开版本时犯了一个错误。为了等同于第一个算法,它应该如下所示:
a[0] = a[0] + b[0];
for (int i=0 ; i<99 ; ++i) {
b[i+1] = c[i] + d[i];
a[i+1] = a[i+1] + b[i+1];
}
b[100] = c[100] + d[100];
在此版本中,您可以看到依赖性问题已消失。