2009年07月10日
OpenMPによる並列化
数値計算の並列化に興味があったので、OpenMPを試してみた。
既存のソースに指示文を追加するだけで並列化できる優れもの。
まずは、結果から
「みごとにCPU数(Thread number)が増えると、処理時間が短くなった。」
計算内容
FDTDによる電磁界計算
3000x3000の配列 が6つ
200stepにかかる時間を調べた。
C言語で作成
配列が小さい方が効率が良かった。グラフのピンクの線は、並列化なしの-O3で最適化した場合を示しているが、大きな配列の場合は、並列度が低いとシングルプロセスの方が速った。
また、OpenMPの指示文を加えれば、単に速くなるというものでもなく、それなりに四苦八苦した。何も考えずに加えると、遅くなるだけでなく、間違った計算をすることにもなる。共有メモリ型の並列化ではFirst-touchも考慮しないといけないらしい。First-touchは、立木先生からアドバイスを頂いた。private( )もしっかり指定しておいた方が無難。
まぁ、とにかくデカイ配列の計算が少しでも速くなりそうなので満足。
備忘録
指示文はこんな感じ。
#pragma omp parallel private(i,j)
{
#pragma omp for
for(i=0; i<i_max; i++){
for(j=0; j<j_max; j++){
Ez[i][j]=0.0;
Ez0[i][j]=0.0;
}
}
}
参考文献:牛島 省,OpenMPによる並列化プログラミングと数値計算法