2011-12-29 10 views
2

openMPを使ってこのループを並列にすることが可能かどうか疑問に思っています。このループではどのようにopenMPを使用できますか?

大まかでは、競争条件に問題があります。私は外側ループによって生成される内側ループのnと、D = A [n]との競合条件をどのように扱うのか不明です。これを並列化しようとするのが実用的だと思いますか?

for(n=0; n < 10000000; ++n) { 

    for (n2=0; n2< 100; ++n2) { 
     A[n]=A[n]+B[n2][n+C[n2]+200]; 

     } 

    D=D+A[n]; 

} 
+0

注 '内側のループでn2'はどのような方法でN ''に依存しないこと - あなたは、その内側のループを置き換えることができます100個の明示的に書かれた行が問題なく... – sarnold

答えて

4

はい、ポインタがエイリアス化されていないと仮定すると、これは実際には並列化可能です。

次のようにそれは実際にやや最適化することができ
int D = 0; // Or whatever the type is. 

#pragma omp parallel for reduction(+:D) private(n2) 
for (n=0; n < 10000000; ++n) { 

    for (n2 = 0; n2 < 100; ++n2) { 
     A[n] = A[n] + B[n2][n + C[n2] + 200]; 
    } 

    D += A[n]; 
} 

int D = 0; // Or whatever the type is. 

#pragma omp parallel for reduction(+:D) private(n2) 
for (n=0; n < 10000000; ++n) { 

    int tmp = A[n] 
    for (n2 = 0; n2 < 100; ++n2) { 
     tmp += B[n2][n + C[n2] + 200]; 
    } 

    A[n] = tmp; 
    D += tmp; 
} 
+0

'(+:D)'はスマイリーのように見えます。 – Xeo

+1

「D」を使う考えはありません。 :)しかし、あなたが使うことができる他のものがたくさんあると思います: '(+:P)'、 '(+:O)'、 '+:XD' ... – Mysticial

+0

LOL。 '(+:vI)'を使用することもできます。助けてくれてありがとう、実際にはとても簡単でした。残念なことに私のプログラムはこのインスタンスでompを使って実行するのに時間がかかります。 – MVTC

関連する問題