C++ 如何正确并行化嵌套for循环
我正在使用OpenMP并行化一个标量嵌套for循环:C++ 如何正确并行化嵌套for循环,c++,c,for-loop,nested,openmp,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; } double P[N][N]; 双x=0.0,y=0.0; 对于(int i=0;i而言,这里的
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;
}
double P[N][N];
双x=0.0,y=0.0;
对于(int i=0;i而言,这里的问题是您已使用以下项将迭代添加到迭代依赖项中:
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);
}
}
for(int i=0;谢谢你的回答。我能再问你一个问题吗?如果我想在内环之前每次y=0都重置怎么办?openmp实现将如何更改?然后将(double)N*i+j
更改为(double)j
。这里的关键是我导出了x
和y
的表达式,作为循环索引的函数。这可以让你打破依赖关系。多亏了你的回答,他们向我阐明了如何解开循环,为OpenMP并行化做好准备。最后一个问题,为什么要使用串行和并行版本e给我一小部分不同的元素?for(int i=0;iIt不应该不同,除非你在某个地方有bug。你可能想把它作为一个单独的问题发布。另外两件事:1)我不太熟悉ordered
指令,但我认为你使用它的方式可能会弄巧成拙。2)如果可能,并行化外环而不是内环。
#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);
}
}