OpenMP:Loop继承依赖

时间:2016-11-13 15:19:18

标签: c++ dependencies openmp

我正在尝试在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];
    }
  }

问题是我仍然在这里看到循环携带依赖(两个线程并行运行,但一个需要来自另一个的数据)。

有人可以在这里加一些解释吗?消除这种依赖的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

由于x[49]的值已经存在,因此无需再次计算:您可以跳过k = 0k = 49的迭代。这就是循环在两个嵌套循环中展开的原因。

然而,那里似乎有一个错误。内循环应该只有一个循环进位依赖,它应该在外循环的迭代中传播。这是因为没有正确定义限制:

  • 使用m = 0k = 1 .. 48(您已经有0和49)。
  • m = 1k = 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];
  }
}