OpenMPメモ
お手軽並列化(?)のOpenMPを使ってみる。
- 準備
omp.hをincludeする。gccでのコンパイルは以下のような感じで。
$ g++ -fopenmp hoge.cc
OMP_NUM_THREADSで並列数を指定する。デフォルトはCPUのコア数? 他にも挙動を制御する環境変数多数あり。
$ OMP_NUM_THREADS=4 ./a.out
- 並列実行 (omp parallel)
複数のthreadで同じコードを並列実行する。例えばこんな感じで。
#pragma omp parallel
{
printf("hello world from %d of %d\n", omp_get_thread_num(), omp_get_num_threads());
}
- ループの分割実行 (omp for)
複数のthreadでループの中身を分割して実行する。scheduleの方法はdynamicだと、ループ内の処理が終わったthreadから次の処理を行う。つまり早い者勝ちで処理を行っていく。他のscheduleについては最後の参考文献を参照のこと。
もしくはparallelとforをまとめて
#pragma omp parallel
{
#pragma omp for schedule(dynamic)
for(int i = 0; i < 100; i++)
{
printf("%dth loop by %d\n", omp_get_thread_num());
}
}
#pragma omp parallel for schedule(dynamic)
for(int i = 0; i < 100; i++)
{
printf("%dth loop by %d\n", omp_get_thread_num());
}
- 参考文献
日本語の簡単な文献は
http://www.na.cse.nagoya-u.ac.jp/~reiji/lect/hpc02/OpenMPintro.html
http://www.hpcs.is.tsukuba.ac.jp/~taisuke/EXPERIMENT/openmp-txt.pdf
英語のチュートリアルは
https://computing.llnl.gov/tutorials/openMP/
他にも
http://openmp.org/wp/resources/
にいくつか。