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