2011-12-01 127 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