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