2012-04-07 36 views
0

我有以下嵌套for循環。我想並行化第一個循環,但第二個循環不能並行化。所以我希望每個線程本身執行第二個循環,這意味着第二個循環對每個線程都必須是特殊的(對於代碼中的每個「i」)。如何爲嵌套循環配置openMP以保持內部循環不被並行化?

我該怎麼做?

#pragma omp parallel for 
    for (i=k+1;i<row;i++){ 
     for (n=0;n<k;n++){ 
      // #pragma omp atomic 
      dummy += L[i][n]*L[k][n]; 
      L[i][k] = (A[i][k] - dummy)/L[k][k]; 
     } 
     dummy = 0; 
    } 
+1

它不會,並行適用於下一個循環,但不會後續...... – Anycorn 2012-04-07 07:47:49

+0

但結果證明是錯誤的這個循環。第二個循環必須遭受來自多個線程的某種形式的干預。 – 2012-04-07 07:51:44

回答

1

omp parallel for pragma僅適用於立即跟隨它的循環。 i循環將在線程之間分配。在i的每次迭代中,n循環將在同一個線程上執行。你的代碼已經做了你想做的事情。

+0

謝謝。但結果證明是完全不同的,所以我認爲多線程應該在第二個循環中扮演角色。 – 2012-04-07 07:52:52

+0

那麼,你使用omp原子的本能是正確的 - 你正在更新共享變量dummy。儘管如此,您應該使用OpenMP減少子句。 – 2012-04-07 07:59:20

+1

經過仔細檢查,您的虛擬變量只能在迭代中使用,所以我會在內循環開始之前在外循環內聲明它並將其設置爲0。這不需要原子雜注。 – 2012-04-07 08:40:47