OpenMP* 互換ライブラリーの使用

このセクションでは、コマンドラインで OpenMP 互換ライブラリーを設定して使用するのに必要なステップを説明します。Windows* システムでは、Microsoft* Visual Studio* 開発環境で OpenMP 互換ライブラリーを使用してコンパイルされたアプリケーションをビルドすることもできます。

インテル(R) コンパイラーで提供されている互換ライブラリーおよびレガシー・ライブラリーのサポートについては、「OpenMP* ソース互換とその他のコンパイラーとの相互運用性」を参照してください。

OpenMP ライブラリーにより使用されるオプションとライブラリーのリストは、「OpenMP* のサポート・ライブラリー」を参照してください。

 

C/C++ コンパイルで、コンパイル時に使用される omp.h のバージョンがそのコンパイラーにより提供されているバージョンであることを確認します。例えば、Linux システムの場合、GNU C/C++ コンパイラーでのコンパイル時に、GNU C/C++ コンパイラーが提供している omp.h を使用します。同様に、Fortran コンパイルでは、コンパイル時に使用される omp_lib.h または omp_lib.mod のバージョンがコンパイラーで提供されているバージョンであることを確認します。

次の表は、C および C++ ソースファイルに使用するコンパイラーのコマンドをリストしています。

オペレーティング・システム

C ソースモジュール

C++ ソースモジュール

Linux

GNU: gcc
Intel: icc

GNU: g++
Intel: icpc

Mac OS X

GNU: gcc
Intel: icc

GNU: g++
Intel: icpc

Windows

Visual C++: cl
Intel: icl

Visual C++: cl
Intel: icl

インテル(R) Fortran コンパイラーのコマンドは ifort (Linux、Mac OS X、Windows オペレーティング・システム) です。

インテル(R) コンパイラーで使用される OpenMP ライブラリーとオプションについての情報は、「OpenMP* サポート・ライブラリー」を参照してください。

コマンドライン例: Windows OS

互換ライブラリーを使用して、1 つのコマンドでアプリケーション全体をコンパイルおよびリンク (ビルド) するには、次のインテル(R) コンパイラー・コマンドを指定します。

ファイルの種類

コマンド

C ソース、ダイナミック・リンク

icl /MD /Qopenmp /Qopenmp-lib:compat hello.c

C++ ソース、ダイナミック・リンク

icl /MD /Qopenmp /Qopenmp-lib:compat hello.cpp

Fortran ソース、ダイナミック・リンク

ifort /MD /Qopenmp /Qopenmp-lib:compat hello.f90

デフォルトでは、インテル(R) コンパイラーは OpenMP ライブラリーのダイナミック・リンクを行います。スタティック・リンク (非推奨) を行うには、/MD オプションの代わりに、/MT オプションを使用し、/Qopenmp-link:static オプションを追加します。インテル(R) コンパイラー・オプションの /Qopenmp-link は、Windows OS システムでリンカーがスタティックまたはダイナミック OpenMP ライブラリーのいずれを使用するかを制御します (デフォルトは /Qopenmp-link:dynamic)。

Microsoft Visual C++ コンパイラーを使用する場合は、インテル(R) OpenMP 互換ライブラリーとリンクします。Microsoft OpenMP ランタイム・ライブラリー (vcomp) にリンクされるのを避け、リンカーオプション (/link の後) として、インテルの OpenMP 互換ライブラリー名を明示的に渡す必要があります。

ファイルの種類

コマンド

C ソース、ダイナミック・リンク

cl /MD /openmp hello.c /link /nodefaultlib:vcomp libiomp5md.lib

C++ ソース、ダイナミック・リンク

cl /MD /openmp hello.cpp /link /nodefaultlib:vcomp libiomp5md.lib

スタティック・リンクは推奨されていませんが、これを行うには上記の /MD オプションの代わりに、/MT オプションを使用します。

また、インテル(R) C++ コンパイラーと Visual C++ コンパイラーの両方を使用して、アプリケーションの一部をコンパイルし、オブジェクト・ファイルを作成することができます (オブジェクト・レベルの相互運用性)。この例では、インテル(R) コンパイラーはアプリケーション全体をリンクします。

ファイルの種類

コマンド

C ソース、ダイナミック・リンク

cl /MD /openmp hello.cpp /c f1.c f2.c

icl /MD /Qopenmp /Qopenmp-lib:compat /c f3.c f4.c

icl /MD /Qopenmp /Qopenmp-lib:compat f1.obj f2.obj f3.obj f4.obj /Feapp /link /nodefaultlib:vcomp

最初のコマンドは、Visual C++ コンパイラーでコンパイルされた 2 つのオブジェクト・ファイルを生成します。2 番目のコマンドはインテル(R) コンパイラーによってコンパイルされたさらに 2 つのオブジェクト・ファイルを生成します。最後のコマンドは 4 つのオブジェクト・ファイルをアプリケーションにリンクします。

また、下記の 3 行目は、Visual C++ リンカーを使用してアプリケーションをリンクし、互換ライブラリーの libiomp5md.lib を 3 番目のコマンドの終わりに指定しています。

ファイルの種類

コマンド

C ソース、ダイナミック・リンク

cl /MD /openmp hello.cpp /c f1.c f2.c

icl /MD /Qopenmp /Qopenmp-lib:compat /c f3.c f4.c

link f1.obj f2.obj f3.obj f4.obj /out:app.exe /nodefaultlib:vcomp libiomp5md.lib

次の例は、インテル(R) コンパイラーで複数のファイルのプロシージャー間の最適化を使用し、Visual C++ コンパイラーで複数のファイルをコンパイルし、Visual C++ リンカーでオブジェクト・ファイルをリンクして、実行ファイルを作成する例を示しています。

ファイルの種類

コマンド

C ソース、ダイナミック・リンク

icl /MD /Qopenmp /Qopenmp-lib:compat /O3 /Qipo /Qipo-c f1.c f2.c f3.c

cl /MD /openmp /O2 /c f4.c f5.c

cl /MD /openmp /O2 ipo_out.obj f4.obj f5.obj /Feapp /link /nodefaultlib:vcomp libiomp5md.lib

最初のコマンドは、インテル(R) C++ コンパイラーを使用して、デフォルトで、po_out.obj という名前の最適化された複数ファイル情報を持つ単一のオブジェクト・ファイルを生成します (/Fe オプションは必要ありません。「IPO の使用」を参照してください)。2 番目のコマンドは、Visual C++ コンパイラーを使用してさらに 2 つのオブジェクト・ファイルを生成します。3 番目のコマンドは、インテル(R) コンパイラーの OpenMP 互換ライブラリーを使用して、Visual C++ の cl コマンドで 3 つすべてのオブジェクト・ファイルをリンクします。スタティック・リンク (非推奨) を行うには、/MD オプションの代わりに、/MT オプションを使用します。

コマンドライン例: Linux OS および Mac OS X

互換ライブラリーを使用して、1 つのコマンドでアプリケーション全体をコンパイルおよびリンク (ビルド) するには、次のインテル(R) コンパイラー・コマンドを指定します。

ファイルの種類

コマンド

C ソース

icc -openmp -openmp-lib=compat hello.c

C++ ソース

icpc -openmp -openmp-lib=compat hello.cpp

Fortran ソース

ifort -openmp -openmp-lib=compat hello.f90

デフォルトでは、インテル(R) コンパイラーは OpenMP ライブラリーのダイナミック・リンクを行います。スタティック・リンク (非推奨) を行うには、-openmp-link static オプションを追加します。インテル(R) コンパイラー・オプションの -openmp-link は、Linux OS および Mac OS X システムでリンカーがスタティックまたはダイナミック OpenMP ライブラリーのいずれを使用するかを制御します (デフォルトは -openmp-link dynamic)。

また、インテル(R) C++ コンパイラー (icc/icpc) と GNU コンパイラー (gcc/g++) の両方を使用して、アプリケーションの一部をコンパイルし、オブジェクト・ファイルを作成することができます (オブジェクト・レベルの相互運用性)。この例では、GNU コンパイラーは、C ファイルの foo.c (gcc オプション -fopenmp で OpenMP サポートは有効) をコンパイルし、インテル(R) コンパイラーは、OpenMP 互換ライブラリーを使用してアプリケーションをリンクしています。

ファイルの種類

コマンド

C ソース

gcc -fopenmp -c foo.c

icc -openmp -openmp-lib=compat foo.o

C++ ソース

g++ -fopenmp -c foo.cpp

icpc -openmp -openmp-lib=compat foo.o

インテル(R) コンパイラーの OpenMP 互換ライブラリーを使用して、GNU gcc または g++ コンパイラーでアプリケーションをリンクする場合は、-l オプションでインテル(R) OpenMP 互換ライブラリー名、-l オプションで GNU pthread ライブラリー、-L オプションでインテル(R) C++ コンパイラーがインストールされている場所にあるインテルのライブラリーへのパスを明示的に渡す必要があります。

ファイルの種類

コマンド

C ソース

gcc -fopenmp -c foo.c bar.c

gcc foo.o bar.o -liomp5 -lpthread -L<icc_dir>/lib

オブジェクト・ファイルを混在させることもできますが、gcc -l オプション、-L オプション、-lpthread オプションを指定しなくても済むように、インテル(R) コンパイラーでアプリケーションをリンクするほうが簡単です。

ファイルの種類

コマンド

C ソース

gcc -fopenmp -c foo.c

icc -openmp -c bar.c

icc -openmp -openmp=compat foo.o bar.o

GNU gcc コンパイラー、インテル(R) C++ コンパイラー、インテル(R) Fortran コンパイラーでコンパイルされた OpenMP オブジェクト・ファイルを混在させることができます。この例では、インテル(R) Fortran コンパイラーを使用して、すべてのオブジェクトをリンクしています。

ファイルの種類

コマンド

C ソースと Fortran ソースの混在

ifort -openmp -c foo.f

icc -openmp -c ibar.c

gcc -fopenmp -c gbar.c

ifort -openmp -openmp-lib=compat foo.o ibar.o gbar.o

インテル(R) Fortran コンパイラーを使用する際、インテル(R) Fortran コンパイラー (ifort) でコンパイルされたメインプログラムが Fortran オブジェクト・ファイルにない場合は、リンク時に -nofor-main オプションを ifort コマンドラインに指定します。

GNU Fortran コンパイラー (gfortran) でインテル(R) Fortran コンパイラー (ifort) により作成されたオブジェクトを混在させないでください。代わりに、すべての Fortran ソースを同じ Fortran コンパイラーで再コンパイルしてください。GNU Fortran コンパイラーは、Linux オペレーティング・システムでのみ利用できます。

同様に、GNU Fortran コンパイラー (gfortran) でリンクすると、インテル(R) C++ コンパイラー、GNU C/C++ コンパイラー、GNU Fortran コンパイラー (gfortran) でコンパイルされたオブジェクト・ファイルを混在させることができます。インテル(R) コンパイラーの OpenMP 互換ライブラリーを使用して、GNU gfortran コンパイラーによりアプリケーションをリンクする場合は、-l オプションでインテル(R) OpenMP 互換ライブラリー名とインテルの irc ライブラリー、-l オプションで GNU pthread ライブラリー、-L オプションでインテル C++ コンパイラーがインストールされている場所にあるインテルのライブラリーへのパスを明示的に渡す必要があります。リンク行で -fopenmp オプションを指定する必要はありません。

ファイルの種類

コマンド

C ソースと GNU Fortran ソースの混在

gfortran -fopenmp -c foo.f

icc -openmp -c ibar.c

gcc -fopenmp -c gbar.c

gfortran foo.o ibar.o gbar.o -lirc -liomp5 -lpthread -lc -L<icc_dir>/lib

また、インテル(R) コンパイラーを使用してアプリケーションをリンクするこができますが、-l オプションを使用して、リンク行で複数の gfortran ライブラリーを渡す必要があります。

ファイルの種類

コマンド

C ソースと Fortran ソースの混在

gfortran -fopenmp -c foo.f

icc -openmp -c ibar.c

icc -openmp -openmp-lib=compat foo.o bar.o -lgfortranbegin -lgfortran