2017-02-16 43 views
0

我有一個問題:我必須將這段代碼與OMP並行化。C - 並行重現omp

存在數據依賴性問題,我不知道如何解決它。 有什麼建議嗎?

for (n = 2; n < N+1; n++) { 
    dz = *(dynamic_d + n-1)*z; 
    *(dynamic_A + n) = *(dynamic_A + n-1) + dz * (*(dynamic_A + n-2)); 
    *(dynamic_B + n) = *(dynamic_B + n-1) + dz * (*(dynamic_B + n-2)); 
} 
+1

'dynamic_B'和'dynamic_A'的計算可以以任何方式同時執行。 – StoryTeller

回答

1

您不能並行循環迭代由於depdency,但你可以分割的dynamic_A計算VS dynamic_B使用部分:

#pragma omp parallel sections 
{ 
    #pragma omp section 
    { 
     // NOTE: Declare n and dz locally so that it is private! 
     for (int n = 2; n < N+1; n++) { 
      my_type dz = dynamic_d[n-1] * z; 
      dynamic_A[n] = dynamic_A[n-1] + dz * dynamic_A[n-2]; 
     } 
    } 
    #pragma omp section 
    { 
     for (int n = 2; n < N+1; n++) { 
      my_type dz = dynamic_d[n-1] * z; 
      dynamic_B[n] = dynamic_B[n-1] + dz * dynamic_B[n-2]; 
     } 
    } 
} 

請使用數組索引,而不是邪惡的指針運算引用異常。

+0

謝謝你的答案。有用!但現在我有另一個問題,我不得不併行另一個for循環的外部循環。你能再幫我一次嗎? – Glorius