概要
GCC の OpenMP 実装は、libgomp というランタイムライブラリ使ってますが、OpenMP/Clang で利用されている Intel OpenMP Runtime Library に差し替えることが可能です。
まぁ、後者の README.txt には gcc compatible ですよ的なことは書いてあるので、できて当たり前なんでしょうけど。
The following compilers are known to do compatible code generation for
this RTL: icc/icl, gcc. See the documentation for more detail.
やり方
リンク時にライブラリを指定をするだけ。Linux の場合はライブラリ名 libiomp5.so なのでこんな感じです。
gcc -o prog -fopenmp -O2 -liomp5 source.c
ただ、-fopenmp オプションはリンク時に自動的に -lgomp するようなので、これだと libgomp と libiomp5 が両方リンクされて気持ち悪い!という感じになります。気になる場合はコンパイルとリンクを分けて、リンク時のみ -liomp5 すれば OK です。
gcc -c -o obj.o -fopenmp -O2 source.c
gcc -o prog -liomp5 obj.o
その他
OpenMP 仕様のサポート状況はライブラリやバージョンにより異なるので、差し替えによって挙動が変わる可能性はあります。
ただ、Intel ライブラリには for ループに関して、Work-Stealing や TSS(Trapezoid Self-Scheduling) が こっそり 実装されているので、差し替えることでこれらのスケジューリングアルゴリズムを試すことができます。
#pragma omp for で schedule(runtime) を用いたうえで、実行時に環境変数 OMP_SCHEDULE を Work-Stealing の場合は static_steal
と、TSS の場合は trapezoidal
とそれぞれ指定します。
-
Work-Stealing
OMP_SCHEDULE=static_steal <exec_prog>
-
TSS
OMP_SCHEDULE=trapezoidal[,minimum_chunk] <exec_prog>
あとがき
始めて Qiita を使ってみたよ。
差し替えなんてせずに最初から OpenMP/Clang 使えよというツッコミはあるでしょうけど、処理系をインストールし辛い環境の人もいますしね・・・
私の場合、Intel OpenMP Runtime Library 使ってベンチマーク取りたいけど、clang でベンチマークプログラムのコンパイルがとおらないという状況だったので