インテル® コンパイラーには、2 種類の OpenMP ライブラリー・セットがあります。
OpenMP 互換ライブラリーは、Microsoft* Visual C++* コンパイラーの特定のバージョン (Windows* OS)、GNU* コンパイラーの特定のバージョン (Linux* OS および Mac OS* X)、そしてインテル® コンパイラー 10.x (以降) の OpenMP サポートとの互換性を提供します。
OpenMP レガシー・ライブラリーは、インテル® コンパイラー 10.0 よりも前のバージョンに含まれる OpenMP との互換性を提供します。
OpenMP 互換ライブラリー (デフォルト) またはレガシー・ライブラリーを選択するには、インテル® コンパイラーでアプリケーションをリンクし、インテル® コンパイラー・オプションの /Qopenmp-lib (Windows) または -openmp-lib (Linux および Mac OS X) を指定します。
「オブジェクト・レベルの相互運用性」とは、あるコンパイラーで生成されたオブジェクト・ファイルと別のコンパイラーで生成されたライブラリーで作成された実行ファイルが正常に動作することを意味します。これに対し、「ソース互換 」とはアプリケーション全体が 1 つのコンパイラーによりコンパイル、リンクされ、ソースを修正しなくても実行ファイルが正常に動作することを意味します。
コンパイラーが異なるとサポートされる OpenMP 仕様も異なります。アプリケーションが使用する OpenMP 機能に基づいて、どのバージョンの OpenMP 仕様が必要かを判断してください。すべてのコンパイラーによりサポートされている OpenMP 仕様レベルと等しいか、またはそれ以下の OpenMP 仕様をアプリケーションで採用している場合は、すべてのコンパイラーとソース互換があります。ただし、すべてのオブジェクト・ファイルとライブラリーを同じコンパイラーの OpenMP ライブラリーでリンクする必要があります。
インテル® コンパイラーの OpenMP 互換ライブラリー
互換ライブラリーは、以下の OpenMP サポートとのソース互換とオブジェクト・レベルの相互運用性を提供します。
Microsoft Visual C++ 2005 以降の OpenMP をサポートする Microsoft Visual C++ の特定のバージョン (Windows)。
GNU gcc バージョン 4.2 以降の OpenMP をサポートする GNU gcc の特定のバージョン (Linux および Mac OS X)。
インテル® コンパイラー 10.0 以降とその OpenMP ライブラリー。
Linux システムの Fortran アプリケーションの場合、インテル® Fortran コンパイラー (ifort) でコンパイルされたオブジェクトと GNU Fortran コンパイラー (gfortran) でコンパイルされたオブジェクトをリンクさせることはできません。このように、言語が混在した C++ および Fortran アプリケーションでは、次のいずれかを行ってください。
インテルの OpenMP 互換ライブラリーをリンク時に指定した場合は、gfortran で作成されたオブジェクトとインテル® C++ オブジェクトを組み合わせる。
インテルの OpenMP 互換ライブラリーまたはレガシー・ライブラリーを使用する場合は、インテル® C++ コンパイラーとインテル® Fortran コンパイラーで作成されたオブジェクトを組み合わせる。
インテル® コンパイラーの OpenMP レガシー・ライブラリー
OpenMP レガシー・ライブラリー・セットはインテル® コンパイラーの複数のリリースで提供され、現在のレガシー・ライブラリーと以前のバージョンのインテル® コンパイラー (10.0 より前のバージョンも含む) で提供されている OpenMP ライブラリーとのソース互換と相互運用性を提供しています。レガシー・ライブラリーは、Microsoft Visual C++、GNU gcc、GNU Fortran などのインテル® コンパイラー以外の OpenMP サポートとの互換性はありません。
レガシー・ライブラリーは、インテル® コンパイラー 10.0 よりも前のバージョンの OpenMP ライブラリーとのオブジェクト・レベルの相互運用性がアプリケーションで必要な場合にのみ使用します。
インテル® コンパイラーの異なるバージョンを使用する際のガイドライン
リンク時または実行時の問題を回避するため、次のガイドラインに従ってください。
インテル® コンパイラーのみを使用してアプリケーションをコンパイルする場合は、OpenMP 互換ライブラリーとレガシー・ランタイム・ライブラリーの混在は避けてください。つまり、アプリケーション全体を互換ライブラリーまたはレガシー・ライブラリーのいずれかでリンクする必要があります。
レガシー・ライブラリーを使用する際は、最新のインテル® コンパイラーを使用して、アプリケーション全体をリンクします。ただし、レガシー・ライブラリーは廃止予定のため、将来のリリースでは、アプリケーション全体を互換ライブラリーでリンクする必要があります。
OpenMP スタティック・ライブラリーではなく、ダイナミック・ライブラリーを使用して、ライブラリーの複数のコピーが 1 つのプログラムにリンクされないようにします。詳細は、「OpenMP* サポート・ライブラリー」を参照してください。
インテル® コンパイラーとその他のコンパイラーを使用する際のガイドライン
リンク時または実行時の問題を回避するため、次のガイドラインに従ってください。
常にインテル® コンパイラー OpenMP 互換ライブラリーを使用してアプリケーション全体をリンクします。これにより、異なるコンパイラーから OpenMP ランタイム・ライブラリーの複数のコピーがリンクされるのを防ぎます。インテル® コンパイラーのコマンド (ドライバー) を使用してアプリケーションをリンクする方法が最も簡単ですが、GNU または Visual C++ コンパイラー (またはリンカー) コマンドを使用してアプリケーションをリンクしている場合は、インテル® コンパイラー OpenMP 互換ライブラリーでリンクすることもできます。
可能であれば、すべての OpenMP ソースを同じコンパイラーでコンパイルします。互換ライブラリーとのオブジェクト・レベルの相互運用性を提供する Microsoft Visual C++ コンパイラーや GNU コンパイラーなどの複数のコンパイラーを使用して、コンパイル (リンクはしません) を行う場合は、「OpenMP* 互換ライブラリーの使用」を参照してください。
OpenMP スタティック・ライブラリーではなく、ダイナミック・ライブラリーを使用して、ライブラリーの複数のコピーが 1 つのプログラムにリンクされないようにします。詳細は、「OpenMP* サポート・ライブラリー」を参照してください。
OpenMP 互換ライブラリーをその他のコンパイラーで使用する際の制限
オブジェクト・レベルの相互運用性における threadprivate オブジェクトの制限は次のとおりです。
Windows システム: Microsoft Visual C++ コンパイラーは、threadprivate データを参照する際、インテル® コンパイラーとは異なる方法を用います。コードで変数を threadprivate と宣言し、当該コードをインテル® コンパイラーと Visual C++ コンパイラーの両方でコンパイルする場合、インテル® コンパイラーでコンパイルされたコードと Visual C++ コンパイラーでコンパイルされたコードでは、同じスレッドによって参照されていたとしても、異なる場所の変数が参照されます。そのため、同じコンパイラーを使用して、同じ threadprivate オブジェクトを使用するソースモジュールすべてをコンパイルしてください。
Linux OS システム: GNU コンパイラーは、threadprivate データを参照する際、インテル® コンパイラーとは異なる方法を用います。コードで変数を threadprivate と宣言し、コードをインテル® コンパイラーと GNU コンパイラーの両方でコンパイルする場合、インテル® コンパイラーでコンパイルされたコードと GNU コンパイラーでコンパイルされたコードでは、同じスレッドによって参照されていたとしても、異なる場所の変数が参照されます。そのため、同じコンパイラーを使用して、同じ threadprivate オブジェクトを使用するソースモジュールすべてをコンパイルしてください。
Mac OS X システム: threadprivate データをサポートする GNU コンパイラーにより使用される方法はオペレーティング・システムでサポートされていません。threadprivate データ・オブジェクトは、インテル® コンパイラーでコンパイルされたオブジェクト・ファイルから名前によってのみアクセス可能です。