如何在C,Open MP中并行化嵌套(依赖)for循环

时间:2014-09-16 14:55:02

标签: c parallel-processing openmp

我无法并行化一段C代码。

块是这样的:

for(n = 0; n < N; n++)
  {
  for(x = 0; x < X; x++)
    {
    var_1[x] = var_1[x] * 3 * var_2[x];
    var_2[x] = var_2[x] * 2;
    }
  for(y = 0; y < Y; y++)
    {
    var_3[y] = var_1[y] * var_2[y];
    }
  }

这不是实际的代码(它是一个赋值所以我不能发布源代码)但问题是变量位于嵌套循环中,每次迭代都依赖于前一个。

简单地在外部循环前添加#pragma omp不起作用,因为每个线程的工作都是从var_1,var_2和var_3的初始值开始。

如果我能解释得更好,请告诉我!我很失落。

1 个答案:

答案 0 :(得分:0)

当HighPerformanceMark评论时,内部循环没有循环携带依赖性。这首先邀请矢量化,其次是并行化,至少对我而言。第一,更重要的是,最便宜的计算是你从未做过的最便宜的计算。在编写时,var_3[]在任一循环中都不会读取。您可以删除第二个内循环,并仅在外循环的最后一次迭代后计算var_3[] 我怀疑进一步的性能提升完全是学术性的。在我看来,这个算法将很快溢出(如果在整数上使用),或者失去精度(如果在浮点数上使用),所以最大迭代次数必须很小。