2011-12-16 66 views
1

這個openMP代碼塊運行良好,但我需要確保沒有競爭條件。因此,我已將j變量設爲私有。複雜的openMP代碼競爭條件的識別

通過這樣做,我認爲任何競爭條件都不應該存在於最內層循環中的賦值操作。如果我錯了,請糾正我。

#pragma omp parallel for private(i,j,k) shared (result_buffer,trans_a,element_b) 
for (i=0; i<N; i++) 
result_buffer[i]=0; 
{ 
    for (j = 0; j<(N/comm_size); j++) 
    {    
      for(k=0; k<N; k++) 
      result_buffer[k]=result_buffer[k]+trans_a[j*N+k]*element_b[j]; 
    }    
} 
+0

嗯...是在result_buffer [i] = 0之前的第一個`{`應該*';'? – Mysticial 2011-12-16 01:10:28

+0

沒有..它在最外面的'For'循環裏面。 – 2011-12-16 01:17:20

回答

2

那麼,有一個問題,現在是你的「外循環」不是一個外循環,因爲你沒有在正確的地點做{}

所以在這個意義上說,不,你沒有競爭條件,因爲pragma將僅適用於這一點:

for (i=0; i<N; i++) 
    result_buffer[i]=0; 

,而不是代碼的其餘部分。你的其他兩個循環是不是並行化,因此沒有競爭條件。


這且不說,如果你打算你的代碼是這樣的:

​​

然後是的,你有競爭狀態。您的內循環修改整個result_buffer數組。外循環的所有迭代也將衝突在相同的數據集上。 所以會有比賽條件。

就像現在這樣,可並行化的唯一循環就是最內層循環。