この記事は、インテル® デベロッパー・ゾーンに公開されている「OpenMP 5.0 TARGET with Intel Compilers」(https://software.intel.com/en-us/articles/openmp-50-target-with-intel-compilers) の日本語参考訳です。
このドキュメントは、OpenMP* 4.5/5.0 TARGET 機能を使用したインテル® インテグレーテッド・グラフィックスへの計算のオフロードに関する初期文書です。
インテル® インテグレーテッド・グラフィックス (GEN) へのオフロード要件
現在、OpenMP* 4.5/5.0 の TARGET オフロード機能には、インテル® C++ コンパイラーの次世代コード・ジェネレーターが必要です。この C++ コンパイラーは、現在ベータ版が提供されています。入手するには、インテル® oneAPI ベース・ツールキットとインテル® oneAPI HPC ツールキットをダウンロードしてインストールする必要があります。これらのベータ版パッケージはこちら (英語) からダウンロードできます。OpenMP* の TARGET 機能をサポートするインテル® C++ コンパイラーの次世代コード・ジェネレーターは、インテル® oneAPI HPC ツールキットでのみ利用できます。
インテル® Parallel Studio XE に含まれるインテル® C/C++ コンパイラーは、OpenMP* の TARGET 機能をサポートしていません。インテル® oneAPI ベース・ツールキットとインテル® oneAPI HPC ツールキットが必要です。
現時点で OpenMP* の TARGET 機能でサポートされる GPU デバイスは、インテル® インテグレーテッド・グラフィックス (Gen 9 ~ Gen 11) です。Linux* 向けの入門ガイドはこちら (英語) を参照してください。
ドライバーをインストールしたら、次に示すオプションを使用します。
-qnextgen -fiopenmp -fopenmp-targets=spir64
Fortran の対応状況: 2020 年第 2 四半期に 2021.beta03 以降でサポート予定
インテル® Fortran コンパイラーの次世代コード・ジェネレーターは、現在初期のプリアルファ版の段階です。現時点では、まだ一般的な使用またはテスト向けに利用できません。せいぜい、F77 とほとんどの F90 機能が動作する可能性があるという程度です。F90 よりも新しい Fortran 標準のコードは動作せず、コンパイラーがクラッシュして、機能しないコードが生成されます。OpenMP 4.5 のいくつかの単純なケースのみが動作しており、そのほとんどは F77 形式の配列と引数です。コードが F90 標準以前に対応しているかテストするには、次のコマンドを実行します。
ifort -qnextgen -what -stand f90 -warn errors <rest of options> <sources/objects>
-qnextgen オプションは、インテル® Fortran コンパイラーの次世代コード・ジェネレーター・コンパイラーを選択します。このオプションを指定しないと、デフォルトで既存のインテル® Fortran コンパイラー (クラシック・コンパイラー) が使用されます。
-stand f90 -warn errors オプションは、Fortran 90 よりも新しいすべての Fortran 標準言語機能に対してエラーのように扱われる警告を出力し、問題のあるソースファイルはコンパイルされません。
インテル® Fortran コンパイラーの次世代コード・ジェネレーターは、2020 年末頃に一般向けベータ版のテストを開始する予定です。最新の情報は、インテル® Fortran コンパイラーのリリースノートを参照してください。
Fortran ユーザーは、次世代の Fortran コンパイラーをテストできるようになるまで、新しいコンパイラーを起動する -qnextgen オプションは使用せずに、引き続きインテル® Parallel Studio XE の各種エディションまたはインテル® oneAPI HPC ツールキットに含まれるインテル® Fortran コンパイラー (クラシック・コンパイラー) を使用してください。現時点では、次世代 Fortran コンパイラーに関する問題の報告は受け付けていません。プリアルファ版段階であるため、動作がまだ不安定です。2020 年末頃に初期ベータ版のテストを開始する予定です。
OpenMP* 5.0 TARGET 機能のコンパイル
次のコンパイラー・オプションを指定して ICC/ICPC でコンパイルします。
icc -qnextgen -fiopenmp -fopenmp-targets=spir64 [other options] myOmpProgram.c または icpc -qnextgen -fiopenmp -fopenmp-targets=spir64 [other options] myOmpProgram.cpp
診断メッセージを取得するため、次のコマンドを実行します。
export LIBOPENMP_TARGET=1
そして、プログラムを実行します。
-fiopenmp オプションで OpenMP* を呼び出す
レガシー互換用の OpenMP* オプションである -qopenmp または -fopenmp は使用しないでください。これらのオプションは、OpenMP* プラグマと機能の新しいコンパイラー解釈 (OMP 4.5 と 5.0 のオフロード機能である TARGET、MAP など) と OpenMP* 4.5/5.0 のオフロード機能をサポートする新しい OpenMP* ランタイムを使用しません。これらの古いオプションは、クラシック・コンパイラー向けの互換オプションです。ICC 次世代コンパイラーでも使用できますが、古いオフロードに対応していない OpenMP* と古いクラシック OpenMP* ランタイムを使用します。
オフロードのデバッグ
オフロードされたかどうかテストするには、LIBOMPTARGET_PROFILE 環境変数を設定します。
export LIBOMPTARGET_PROFILE=T
この環境変数は、プログラム終了後にオフロードごとのオフロード統計を出力するように OpenMP* ランタイムに指示します。次に例を示します。
LIBOMPTARGET_PROFILE: -- DATA-READ: 45.905 msec -- DATA-WRITE: 0.020 msec -- EXEC-__omp_offloading_38_dc60d697_main_l33: 71.707 msec -- EXEC-__omp_offloading_38_dc60d697_main_l48: 15.776 msec
この出力から、GPU へのデータの送信時間 (DATA-WRITE) と GPU からのデータの受信時間 (DATA-READ) が分かります。2 つのオフロード TARGET 領域 (EXEC) ― main() の 133 行目と main() の 148 行目 ― があり、これらのカーネルで費やされた時間が示されています。
この出力が表示されない場合、OpenMP* ランタイムが GPU ドライバーデバイスを検出できなかったことを意味します。さらに詳しくデバッグするには、環境変数 LIBOMPTARGET_DEBUG=5 を設定してアプリケーションを再度実行します。OpenCL* ドライバーのインストールの問題を調査する必要があります (この記事の趣旨から外れるため、ここでは説明しません)。
export LIBOMPTARGET_DEBUG=5 ./a.out
デバイスの CPU または GPU をターゲットとする
確実に GPU にオフロードするには、次の環境変数を使用します (インテル® oneAPI beta03 以降で利用可能)。
export LIBOMPTARGET_DEVICETYPE=gpu
次の値を設定できます。
gpu
cpu
accelerator
OMP_DEFAULT_DEVICE=1 はオフロードを無効にするため、この環境変数へのすべての参照を削除または設定解除する必要があります。
別の環境変数を使用して、デフォルトのデバイスを設定することもできます。現在、ターゲットに指定できる GPU デバイスは 1 つのみで、デバイス番号は 0 です。
# GPU
export OMP_DEFAULT_DEVICE=0
ヘルプ
我々にとって皆さんの成功は重要です。サポートが必要な場合は、次のリソースをご利用ください。
OpenMP* の TARGET 機能は、現在 ICC 次世代コンパイラーでベータ版としてご利用いただけます。ベータ版は今後機能が拡張または追加される予定です。OpenMP* 機能のサポートに関する最新の情報は、リリースノートを確認してください。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。