LoginSignup
9
8

More than 5 years have passed since last update.

GCC から Intel OpenMP Runtime Library を利用する

Last updated at Posted at 2015-02-06

概要

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 でベンチマークプログラムのコンパイルがとおらないという状況だったので :disappointed_relieved:

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8