我正在尝试在C ++中实现一个简单的累积和代码,如下所示:
x[0] = 0;
for (k=1;k<100; k++)
x[k] = x[k-1] + x[k];
在这个site上,记下一个实现来消除循环遗留依赖性。对于两个线程,代码看起来应该是这样的:
x[0] = 0;
x[49] = 74; //pre calculated
//the outer loop is parallelized (two instances)
#pragma omp parallel for private(m,k)
for(m=0;m<2;m++) {
for (k=m*49+1; k<m*50+50; k++) {
x[k] = x[k-1] + x[k];
}
}
问题是我仍然在这里看到循环携带依赖(两个线程并行运行,但一个需要来自另一个的数据)。
有人可以在这里加一些解释吗?消除这种依赖的最佳方法是什么?
答案 0 :(得分:0)
由于x[49]
的值已经存在,因此无需再次计算:您可以跳过k = 0
和k = 49
的迭代。这就是循环在两个嵌套循环中展开的原因。
然而,那里似乎有一个错误。内循环应该只有一个循环进位依赖,它应该在外循环的迭代中传播。这是因为没有正确定义限制:
m = 0
,k = 1 .. 48
(您已经有0和49)。m = 1
,k = 50 ..99
(再次,你已经49岁了!)。因此,循环应保留如下:
for( m = 0; m < 2; m++ ) {
for (k=m*49+1; k<m*51+49; k++) {
x[k] = x[k-1] + x[k];
}
}
如果您将添加更改为:
x[k+1] = x[k] + x[k+1];
它可以简化一点你的下界......
for( m = 0; m < 2; m++ ) {
for (k=m*50; k < m*51+48; k++) {
x[k+1] = x[k] + x[k+1];
}
}