循环展开以实现并行性

时间:2012-03-12 06:48:50

标签: loops parallel-processing loop-unrolling

在一次演讲中,我的教授给了我们以下循环:

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]的内容,因此我们仍然无法并行运行每次迭代。

我说对了吗?如果是这样,是否有一个正确展开的第一个循环版本,每个迭代可以并行化?

1 个答案:

答案 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];

在此版本中,您可以看到依赖性问题已消失。