2017-02-16 2 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_Bdynamic_Aの計算を分割することができます:

#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]; 
     } 
    } 
} 

代わりabnormityを参照とんでもないポインタ演算の配列インデックスを使用してください。

+0

お返事ありがとうございます。できます!しかし、今私は別の問題がある、私はこのforループの外にある別のループのために並列化する必要があります。もう一度お手伝いできますか? – Glorius