生態系の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;
}
※コメント投稿者のブログIDはブログ作成者のみに通知されます