プロが教えるわが家の防犯対策術!

c言語でポアソン方程式を差分法で解くプログラムを作成し、それをOpenMPで並列化して、スレッド数を1,2,4,8と増やしながら処理時間の計測をしました。
 スレッド数が2の時は処理時間が短くなったのですが、4,8と増やしていくごとに処理時間が逆に増えてしまいました。デュアルコア4プロセッサなのでコア数以上のスレッド数ではないはずなのですがこれはなぜなんでしょうか?

計測した解析領域は
48×48
72×72

の二つです。どちらも4、8スレッドの時は遅くなってしまいました。以下に並列化部分のソースを載せます。並列化した場所は、連立方程式を解く部分で、求解には、ガウス・ジョルダン法を用いています。並列化でまずいところがあればそちらも指摘お願いします。

for(k=0;k<=size-1;k++) {
pivot=a[k][k];
#pragma omp parallel for
for(j=0;j<=size-1;j++) {
a[k][j]=a[k][j]/pivot;
}
b[k]=b[k]/pivot;

#pragma omp parallel for private(j,tmp)
for(i=0;i<=size-1;i++) {
tmp=a[i][k];
if(i!=k) {
for(j=0;j<=size-1;j++) {
a[i][j]=a[i][j]-(tmp*a[k][j]);
}
b[i]=b[i]-(tmp*b[k]);
}
}
}

A 回答 (1件)

OpenMPのことはよく知りませんが、並列処理を行うということは、


その処理後に同期処理も行われると思います。

ちなみに、上記の処理というのは、十分に時間がかかる処理でしょうか?
一瞬で終わるような処理を分割しても、同期処理のオーバーヘッドの方が重く、
遅くなったりするのではないかと思いますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。計測結果を再検討したところやはり同期処理の時間が関係していそうです。

お礼日時:2011/11/04 18:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!