如何正确并行嵌套的for循环
问题描述:
我使用OpenMP工作并行嵌套for循环标:如何正确并行嵌套的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);
}
}
好的谢谢你的答案。 我可以问你另一个问题吗? 如果我想在内循环之前每次都重置y = 0会怎么样? openmp实现将如何改变? – linello
然后将'(double)N * i + j'改为'(double)j'。这里的关键是我将'x'和'y'的表达式作为循环索引的函数。这可以让你打破依赖关系。 – Mysticial
非常感谢您的回答,他们澄清了我如何解决循环,为OpenMP并行化做好准备。 最后一个问题,为什么这段代码的串行和并行版本只给我一小部分不同的元素? '的for(int i = 0; I
linello