2011-12-01 130 views
7

我使用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必须是标量相同,并行版本:

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

回答

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

好的谢谢你的答案。 我可以问你另一个问题吗? 如果我想在内循环之前每次都重置y = 0会怎么样? openmp实现将如何改变? – linello

+0

然后将'(double)N * i + j'改为'(double)j'。这里的关键是我将'x'和'y'的表达式作为循环索引的函数。这可以让你打破依赖关系。 – Mysticial

+0

非常感谢您的回答,他们澄清了我如何解决循环,为OpenMP并行化做好准备。 最后一个问题,为什么这段代码的串行和并行版本只给我一小部分不同的元素? '的for(int i = 0; I linello