このセクションでは、コマンドラインで OpenMP* ライブラリーを設定して使用するのに必要なステップを説明します。Windows* システムでは、Microsoft* Visual Studio* 開発環境で OpenMP* ライブラリーを使用してコンパイルされたアプリケーションをビルドすることもできます。
OpenMP* ライブラリーにより使用されるオプションとライブラリーのリストは、「OpenMP* のサポート・ライブラリー」を参照してください。
インテル® oneAPI DPC++/C++ コンパイラーへのアクセスを確立するために環境を設定し、リンクで適切な OpenMP* ライブラリーが利用できるようにします。Windows* システムでは、適切なバッチ (.bat) ファイルを実行するか、またはすでに環境設定されているコマンドライン・ウィンドウ (コンパイラーのプログラムメニューから起動可能) を使用します。Linux* および macOS* システムでは、適切なスクリプトファイルをソース (読み込み) します (setvars ファイル)。
コンパイルで、コンパイル時に使用される omp.h のバージョンがそのコンパイラーにより提供されているバージョンであることを確認します。例えば、Linux* システムでコンパイルする場合は、gcc により提供される omp.h を使用します。
gcc コンパイラーまたは Microsoft* コンパイラーの使用時は、不適切なヘッダー/モジュールファイルを誤って使用することがあるので注意してください。これを避けるには、別のディレクトリーにヘッダー/モジュールファイルをコピーし、-I オプションを使用して、正しい include パスを指定します。
プログラムでデータ構造やクラスが使用されており、それらが omp.h ファイルで定義されるデータ型を持つメンバーを含む場合、そのようなデータ構造を使用するソースファイルはすべて同じ omp.h ファイルでコンパイルする必要があります。
次の表は、C および C++ ソースファイルに使用するコンパイラーのコマンドをリストしています。
オペレーティング・システム |
C ソースモジュール |
C++ ソースモジュール |
---|---|---|
Linux* |
gcc |
g++ |
Windows* |
Visual C++*: cl |
Visual C++*: cl |
コンパイラーで使用される OpenMP* ライブラリーとオプションに関する情報は、「OpenMP* サポート・ライブラリー」を参照してください。
互換ライブラリーを使用して、1 つのコマンドでアプリケーション全体をコンパイルおよびリンク (ビルド) するには、次のコマンドを指定します。
ファイルの種類 |
コマンド |
---|---|
C ソース、ダイナミック・リンク |
icx /MD /Qopenmp hello.c |
C++ ソース、ダイナミック・リンク |
icpx /MD /Qopenmp hello.cpp |
Microsoft* Visual C++* コンパイラーを使用する場合は、インテルの 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 |
また、インテル® oneAPI DPC++/C++ コンパイラーと Visual C++* コンパイラーの両方を使用して、アプリケーションの一部をコンパイルし、オブジェクト・ファイルを作成することができます (オブジェクト・レベルの互換性)。この例では、インテル® oneAPI DPC++/C++ コンパイラーはアプリケーション全体をコンパイルしてリンクします。
ファイルの種類 |
コマンド |
---|---|
C ソース、ダイナミック・リンク |
cl /MD /openmp /c f1.c f2.c icx /MD /Qopenmp /c f3.c f4.c icx /MD /Qopenmp f1.obj f2.obj f3.obj f4.obj /Feapp /link /nodefaultlib:vcomp |
最初のコマンドは、Visual C++* コンパイラーでコンパイルされた 2 つのオブジェクト・ファイルを生成します。2 番目のコマンドはインテル® oneAPI DPC++/C++ コンパイラーによってコンパイルされたさらに 2 つのオブジェクト・ファイルを生成します。最後のコマンドは 4 つのオブジェクト・ファイルをアプリケーションにリンクします。
また、下記の 3 行目は、Visual C++* リンカーを使用してアプリケーションをリンクし、互換ライブラリーの libiomp5md.lib を 3 番目のコマンドの終わりに指定しています。
ファイルの種類 |
コマンド |
---|---|
C ソース、ダイナミック・リンク |
cl /MD /openmp /c f1.c f2.c icx /MD /Qopenmp /c f3.c f4.c link f1.obj f2.obj f3.obj f4.obj /out:app.exe /nodefaultlib:vcomp libiomp5md.lib |
次の例は、インテル® oneAPI DPC++/C++ コンパイラーで複数のファイルのプロシージャー間の最適化を使用し、Visual C++* コンパイラーで複数のファイルをコンパイルし、Visual C++* リンカーでオブジェクト・ファイルをリンクして、実行ファイルを作成する例を示しています。
ファイルの種類 |
コマンド |
---|---|
C ソース、ダイナミック・リンク |
icx /MD /Qopenmp /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 |
最初のコマンドは、インテル® oneAPI DPC++/C++ コンパイラーを使用して、デフォルトで、ipo_out.obj という名前の最適化された複数ファイル情報を持つ単一のオブジェクト・ファイルを生成します (/Fe オプションは必要ありません)。2 番目のコマンドは、Visual C++* コンパイラーを使用してさらに 2 つのオブジェクト・ファイルを生成します。3 番目のコマンドは、インテル® oneAPI DPC++/C++ コンパイラーの OpenMP* ライブラリーを使用して、Visual C++* の cl コマンドで 3 つすべてのオブジェクト・ファイルをリンクします。
Windows* システムで、Visual Studio* の Visual C++* 開発環境を一部変更すると、インテル® oneAPI DPC++/C++ コンパイラーと Visual C++* を使用して、インテルの OpenMP* ライブラリーを使用するアプリケーションを作成することができます。
プロジェクトの [プロパティ ページ] でインテルの OpenMP* ランタイム・ライブラリーの場所を示します。
メインメニューでプロジェクトのプロパティー・ページを開きます ([プロジェクト] > [プロパティ] を選択するか、プロジェクト名を右クリックして [プロパティ] を選択します)。
[構成プロパティ] > [Linker] > [General] > [Additional Library Directories] を選択します。
インテルのコンパイラー・ライブラリーへのパスを入力します。例えば、IA-32 アーキテクチャー・システム (C++ のみ) の場合は、次のように入力します:
<Intel_compiler_installation_path>\IA32\LIB
インテルの OpenMP* ダイナミック・ランタイム・ライブラリーを実行時にアクセス可能にするには、対応するパスを指定しなければなりません。
メインメニューでプロジェクトのプロパティー・ページを開きます ([プロジェクト] > [プロパティ] を選択するか、プロジェクト名を右クリックして [プロパティ] を選択します)。
[構成プロパティ] > [デバッグ] > [環境] を選択します。
インテルのコンパイラー・ライブラリーへのパスを入力します。例えば、IA-32 アーキテクチャー・システム (C++ のみ) の場合は、次のように入力します:
PATH=%PATH%;<Intel_compiler_installation_path>\IA32\Bin
インテルの OpenMP* ランタイム・ライブラリー名をリンカーオプションに追加し、デフォルトの Microsoft* の OpenMP* ランタイム・ライブラリーを除外します。
メインメニューでプロジェクトのプロパティー・ページを開きます ([プロジェクト] > [プロパティ] を選択するか、プロジェクト名を右クリックして [プロパティ] を選択します)。
[構成プロパティ] > [Linker] > [Command Line] > [Additional Options] を選択します。
OpenMP* ライブラリー名と Visual C++* リンカーオプション /nodefaultlib を入力します。
Linux* 上でインテルの OpenMP* ライブラリーを使用して、1 つのコマンドでアプリケーション全体をコンパイルおよびリンク (ビルド) するには、次のインテル® oneAPI DPC++/C++ コンパイラー・コマンドを指定します。
ファイルの種類 |
コマンド |
---|---|
C ソース |
icx -qopenmp hello.c |
C++ ソース |
icpx -qopenmp hello.cpp |
デフォルトでは、インテル® oneAPI DPC++/C++ コンパイラーは OpenMP* ライブラリーのダイナミック・リンクを行います。スタティック・リンク (非推奨) を行うには、-qopenmp-link=static オプションを追加します。オプション -qopenmp-link は、Linux* および macOS* システムでリンカーが使用する OpenMP* ライブラリー (スタティックまたはダイナミック) を制御します (デフォルトは -qopenmp-link=dynamic)。
また、icx/icpx と gcc/g++ コンパイラーの両方を使用して、アプリケーションの一部をコンパイルし、オブジェクト・ファイルを作成することができます (オブジェクト・レベルの互換性)。
この例では、gcc コンパイラーは、C ファイルの foo.c (gcc オプション -fopenmp で OpenMP* サポートは有効) をコンパイルし、インテル® oneAPI DPC++/C++ コンパイラーは、インテルの OpenMP* ライブラリーを使用してアプリケーションをリンクしています。
ファイルの種類 |
コマンド |
---|---|
C ソース |
gcc -fopenmp -c foo.c |
C++ ソース |
g++ -fopenmp -c foo.cpp |
インテル® oneAPI DPC++/C++ コンパイラーの OpenMP* 互換ライブラリーを使用して、gcc または g++ コンパイラーでアプリケーションをリンクする場合は、-l オプションでインテルの OpenMP* ライブラリー名、-l オプションで Linux* pthread ライブラリー、-L オプションでインテル® oneAPI DPC++/C++ コンパイラーがインストールされている場所にあるインテルのライブラリーへのパスを明示的に渡す必要があります。
ファイルの種類 |
コマンド |
---|---|
C ソース |
gcc -fopenmp -c foo.c bar.c gcc foo.o bar.o -liomp5 -lpthread -L<icx_dir>/lib |
オブジェクト・ファイルを混在させることもできますが、gcc の -l オプション、-L オプション、-lpthread オプションを指定しなくても済むように、インテル® oneAPI DPC++/C++ コンパイラーでアプリケーションをリンクするほうが簡単です。
ファイルの種類 |
コマンド |
---|---|
C ソース |
gcc -fopenmp -c foo.c icx -qopenmp -c bar.c (Linux* および macOS*) icx -qopenmp foo.o bar.o (Linux* および macOS*) |
gcc コンパイラー、、またはインテル® oneAPI DPC++/C++ コンパイラーでコンパイルされた OpenMP* オブジェクト・ファイルを混在させることができます。
次の表は、インテル® Fortran コンパイラーを使用して、すべてのオブジェクトをリンクする例を示します。
ファイルの種類 |
コマンド |
---|---|
C ソースと Fortran ソースの混在 |
icx -qopenmp -c ibar.c gcc -fopenmp -c gbar.c ifort -qopenmp -c foo.f ifort -qopenmp foo.o ibar.o gbar.o |
ファイルの種類 |
コマンド |
---|---|
C ソースと GNU* Fortran ソースの混在 |
icx -qopenmp -c ibar.c gcc -fopenmp -c gbar.c gfortran -fopenmp -c foo.f gfortran foo.o ibar.o gbar.o -lirc -liomp5 -lpthread -lc -L<icx_dir>/lib |
また、インテル® oneAPI DPC++/C++ コンパイラーを使用してアプリケーションをリンクするこができますが、-l オプションを使用して、リンク行で複数の gfortran ライブラリーを渡す必要があります。
ファイルの種類 |
コマンド |
---|---|
C ソースと Fortran ソースの混在 |
gfortran -fopenmp -c foo.f icx -qopenmp -c ibar.c icx -qopenmp foo.o bar.o -lgfortranbegin -lgfortran |
macOS* 上でインテルの OpenMP* ライブラリーを使用して、1 つのコマンドでアプリケーション全体をコンパイルおよびリンク (ビルド) するには、次のインテル® oneAPI DPC++/C++ コンパイラー・コマンドを指定します。
ファイルの種類 |
コマンド |
---|---|
C ソース |
icx -qopenmp hello.c |
C++ ソース |
icpx -qopenmp hello.cpp |
デフォルトでは、インテル® oneAPI DPC++/C++ コンパイラーは OpenMP* ライブラリーのダイナミック・リンクを行います。スタティック・リンク (非推奨) を行うには、-qopenmp-link=static オプションを追加します。オプション -qopenmp-link は、Linux* および macOS* システムでリンカーが使用する OpenMP* ライブラリー (スタティックまたはダイナミック) を制御します (デフォルトは -qopenmp-link=dynamic)。
また、インテル® oneAPI DPC++/C++ コンパイラー (icx/icpx) と gcc/g++ コンパイラーの両方を使用して、アプリケーションの一部をコンパイルし、オブジェクト・ファイルを作成することができます (オブジェクト・レベルの互換性)。
古いバージョンの macOS* プラットフォームでは、インテル® oneAPI DPC++/C++ コンパイラーと GCC コンパイラーを併用してコンパイルできます。最新の macOS* 10.x プラットフォームには、GCC コンパイラーの代わりに Clang コンパイラーが含まれていますが、このコンパイラーは OpenMP* 実装をサポートしていません。Clang コンパイラーの将来のバージョンでは OpenMP* 実装がサポートされる可能性があります。
この例では、icx は C ファイルの foo.c をコンパイルし、icpx は C++ ファイルの ifoo.cpp をコンパイルします。Qopenmp (Windows*) または qopenmp (Linux* および macOS*) は OpenMP* サポートを有効にして、インテル® oneAPI DPC++/C++ コンパイラーが、インテルの OpenMP* ライブラリーを使用してアプリケーションをリンクするようにします。
ファイルの種類 |
コマンド |
---|---|
C ソース |
icx -qopenmp -c foo.c |
C++ ソース |
icpx -qopenmp -c ifoo.cpp |
macOS* 10.9 以降には GCC コンパイラーが含まれていません。ただし、インテル® oneAPI DPC++/C++ コンパイラーと一緒に GCC コンパイラーをインストールできます。
オブジェクト・ファイルを混在させることもできますが、gcc の -l オプション、-L オプション、-lpthread オプションを指定しなくても済むように、インテル® oneAPI DPC++/C++ コンパイラーでアプリケーションをリンクするほうが簡単です。
ファイルの種類 |
コマンド |
---|---|
C ソース |
icpx -qopenmp -c bar.c icpx -qopenmp foo.o bar.o |
また、インテル® oneAPI DPC++/C++ コンパイラーを使用してアプリケーションをリンクするこができますが、-l オプションを使用して、リンク行で複数の gfortran ライブラリーを渡す必要があります。
ファイルの種類 |
コマンド |
---|---|
C ソースと Fortran ソースの混在 |
icx -qopenmp -c ibar.c icx -qopenmp foo.o bar.o -lgfortranbegin -lgfortran |