如何正确地并行化嵌套的for循环

How to parallelize correctly a nested for loops

本文关键字:for 循环 嵌套 并行化 正确地      更新时间:2023-10-16

我正在使用OpenMP并行化嵌套的标量for循环:

double P[N][N];
double x=0.0,y=0.0;
for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction(x,y);
        y+=1;
    }
    x+=1;
}

在这个循环中,重要的是矩阵p在标量和并行版本中必须是相同的:

我所有可能的尝试都没有成功…

这里的问题是您已经添加了迭代到迭代的依赖关系:

x+=1;
y+=1;
因此,按照代码现在的状态,它是不可并行化的。尝试这样做将导致不正确的结果。(正如你可能看到的)

幸运的是,在您的情况下,您可以直接计算它们,而无需引入此依赖关系:

for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction((double)i, (double)N*i + j);
    }
}

现在你可以尝试使用OpenMP pragma来处理这个问题,看看它是否有效:

#pragma omp parallel for
for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction((double)i, (double)N*i + j);
    }
}