我正在使用 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 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)