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については最後の参考文献を参照のこと。


#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());
}
}
もしくはparallelとforをまとめて

#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/
にいくつか。

詳細な仕様は
http://www.openmp.org/mp-documents/spec30.pdf