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

时间:2011-12-01 08:11:11

标签: c++ c for-loop nested openmp

我正在使用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在标量和并行版本中必须相同:

我所有可能的试验都没有成功......

1 个答案:

答案 0 :(得分:13)

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

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);
    }
}