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による並列化プログラミングと数値計算法

Posted by at 3:06 午後
Edited on: 2009年07月14日 12:39 午後
Categories: プログラム全般

2009年06月16日

変数の型 Round関数 StrToFloat

- Delphiの変数の型

整数:Integer

単精度:single

倍精度:double


- Round( )

Round(実数) :実数 X を丸めてもっとも近い整数にした値を返します。



- StrToFloat( )

StrToFloat(文字列):文字を実数に変換します。


Posted by at 8:17 午後
Edited on: 2009年06月16日 8:32 午後
Categories: Delphi