【问题标题】:Loop unrolling to achieve parallelism循环展开以实现并行性
【发布时间】:2012-03-12 06:48:49
【问题描述】:

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

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 行设置了在第 4 行的下一次迭代中将变为 b[i] 的内容,因此我们仍然无法并行运行每个迭代。

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

【问题讨论】:

    标签: loops parallel-processing loop-unrolling


    【解决方案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];
    

    在这个版本上,可以看到依赖问题没有了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多