臺灣と瀬田で數理生態學と妄想

翹首望東天, 神馳奈良邊. 三笠山頂上, 想又皎月圓(阿倍仲麻呂). 明日できることは今日しない

並列化メモ

2011-10-15 09:36:19 | 研究

生態系のODEモデルで、二つのパラメータの値を変えたときのモデルを長時間走らせた後の結果を、2次元のcontour plotにしたいときなど、
それぞれのパラメータの組み合わせ間では計算は独立なので、どうせなら並列化して複数のコアを使って計算時間を短縮したい。
二つのパラメータを徐々に変えて行く時、内側のループだけOpenMP を使って並列化したい。
OpenMPは勝手にスレッドを作ってくれるけど、問題は、ちゃんとどの変数をスレッド間で共有するかしないかを指定すること。

OpenMP入門マニュアル

http://www.cc.kyushu-u.ac.jp/scp/system/library/OpenMP/openmp0109.pdf

オプション -fopenmpでコンパイルする (gcc OSX)
オプション -openmpでコンパイルする (icc Linux)

#include

double a, b, c;

//global変数の一部をprivateにする、ただし、OSXではコンパイル時に”threadprivate variables not supported in this target”というエラーが発生して無理。Linuxではうまくいく。
#ifdef _OPENMP
#pragma omp threadprivate(b)
#endif

int main(int arg, char *argv[])
{

double *v;
double *out;
double t;
int j, k;

out = d_vector(10);
for (j = 1; j <=10; j++) {

a = j*1.5;

#ifdef _OPENMP
#pragma omp parallel for private (k, t, v) //直下のfor loopを並列化、メモリを共有しない変数を指定, ループに使うkは指定しなくても自動でprivate化される。内側のループのtは共有化されないようにprivateに指定する
#endif

for(k = 1;k <= 10; k++) {

b = k*2.0;
v = d_vector(10);               //これでいいのかな?
for(t = 0; t <= 100;) {

rk4(v); //ODEを解く
t += deltat;

}
out[k] = v[1];
free_d_vector(v);

}
for(k = 1; k <= 10; k++) printf(.... , j, k, b, out[k]);  //上のfor loopではkの順に結果が出る訳ではないので、データの出力は別のループを用意


free_d_vector(out);
return 0;

}

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 日本の天気が台湾ぽくなって... | トップ | 口頭発表 »
最新の画像もっと見る

コメントを投稿

研究」カテゴリの最新記事