インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
このトピックは、インテル® グラフィックス・テクノロジーをターゲットとする IA-32 およびインテル® 64 アーキテクチャーにのみ適用されます。
インテル® グラフィックス・テクノロジー対応のインテル® プロセッサーの多くのモデルでは、並列化可能なかなりの作業をオフロードできます。 コンパイルする場合、インテル® C++ コンパイラーを利用すると、CPU 向けに記述されている既存のスカラーまたは並列 C/C++ コードを、容易にプロセッサー・グラフィックスへオフロードできます。 多くの場合、このオフロードはわずかなコードを追加するだけで済みます。
次の表に、プロセッサー・グラフィックスへのオフロードをサポートしているアーキテクチャーと OS の組み合わせを示します。
ビルド |
インテル® グラフィックス・テクノロジー対応プロセッサーでの実行 |
---|---|
インテル® 64、Linux* |
インテル® 64、Linux* |
インテル® 64、Windows® |
インテル® 64、Windows® IA-32、Windows® |
プロセッサー・グラフィックスに計算をオフロードするアプリケーションを実行する場合、インテル® グラフィックス・テクノロジー対応のインテル® プロセッサーに加えて、必要なランタイムサポートを提供するインテル® HD グラフィックス・ドライバーがインストールされていなければなりません。
インテル® コンパイラーでは、インテル® グラフィックス・テクノロジーで実行するターゲットコードを個別にコンパイルおよびリンクできます。 また、オープンソースの binutils パッケージにより、ターゲットカーネルのリンクをサポートするリンカーが提供されています。 詳細は、リリースノートを参照してください。
コンパイラーは、CPU (ホスト) でネイティブ実行するコード領域と、プロセッサー・グラフィックス (ターゲット) へオフロードするコード領域を生成します。 オフロードランタイムは、ターゲットへのオフロード処理に使用されるランタイム・ライブラリーを参照します。
コンパイラーとオフロードランタイムは、次の操作を可能にします。
オフロードプロセスおよび CPU とターゲット間のデータ交換
ターゲットの動的検出と、ターゲットが利用できない場合にホストによるバックアップ実行
さらに、次の操作を簡単に行えるようにします。
オフロードされたヘテロジニアス・ソースコードのホストによるデバッグ
同じソースコードをインテル® プロセッサーまたはインテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャー・ベースのコプロセッサーで効率良く実行できるように移植
インテル® グラフィックス・テクノロジー向けのオフロード拡張を含むソースファイルをコンパイルする場合、生成されるオブジェクト・ファイルにターゲット・オブジェクトが組込まれます。 このオブジェクト・ファイルは fat オブジェクトと呼ばれます。 ターゲット・オブジェクトのセクション名は .gfxobj です。 FAT オブジェクトをリンクする場合、ターゲット実行ファイルは次のようになります。
.gfx bin (Windows®) という名前のセクションがホスト実行ファイルに組込まれます。
__gfx_offload_target_image (Linux*) という名前のオブジェクトが読み取り専用データセクションに配置されます。
ターゲット・オブジェクトまたはターゲット実行ファイルは、offload_extract ツールを使用して FAT オブジェクトまたは FAT 実行ファイルから抽出できます。
コンパイラーは、プロセッサー・グラフィックスへのオフロードで、次のプログラミング・モデルをサポートします。
OpenMP* オフロードモデル: OpenMP* 仕様で定義されている多くのオフロード構造がサポートされます。 利用可能なオフロード構造の一覧は、OpenMP* ベースのオフロードに関するセクションにあります。 各オフロード構造の説明は、openmp.org (英語) を参照してください。
コンパイラーは、「OpenMP* プラグマの概要」に記載されている OpenMP* オフロード構造の多くのをサポートします。 各オフロード構造の詳細は、openmp.org (英語) にある OpenMP* 仕様を参照してください。
要約すると、distribute 構造と parallel for 以外の並列構造を除く、OpenMP* オフロードプラグマの多くはサポートされます。 例えば、nowait 節と depend 節を使用する非同期オフロードとタスクの依存性はサポートされます。
プロセッサー・グラフィックス向けの OpenMP* ベースのオフロードを有効にするには、コンパイラーに次のオプションを渡します。
-qopenmp -qopenmp-offload=gfx (Linux*)
/Qopenmp /Qopenmp-offload=gfx (Windows®)
インテル® Cilk™ Plus 言語拡張のサブセット: コンパイラーは、オフロードコードとスレッドグループのローカルデータで、_Cilk_for、_Thread_group、__thread_group_local キーワードによる並列処理の指定をサポートします。また、#pragma offload 構文によるオフロードの指定もサポートします。
API ベースのオフロード: このモデルでは、オフロードするために #pragma offload や #pragma omp target のような特別な構文は使用しません。 代わりに、インテル® グラフィックス・テクノロジーのオフロードランタイムで実装されている API 関数を使用して、データ設定とオフロードを表現します。
プログラミング・モデルが同期オフロード、非同期オフロード、または両方をサポートするかどうかは重要です。 同期オフロードでは、オフロードを開始する CPU スレッドは常にオフロードが完了するまで待機します。 オフロード処理は、データの共有/非共有を伴います。 多くの場合、同期オフロードは非効率的です。例えば、オフロードを開始した CPU スレッドは、オフロードが完了するまで待機する代わりに有用な作業を行うことができます。また、1 回共有することで、同じデータを複数のオフロードで使用できることもあります。 そのような場合は、非同期オフロードを使用すべきです。 3 つのプログラミング・モデルのうち、OpenMP* ベースのモデルとインテル® Cilk™ Plus ベースのモデルは同期モードと非同期モードをサポートしますが、API ベースのモデルは非同期モードのみサポートします。
コンパイラーは、インテル® グラフィックス・テクノロジー・向けのプログラミングを支援するため、次の言語拡張を提供しています。
offload プラグマと offload_attribute プラグマ。並列領域は _Cilk_for ループまたは配列表記文で表現。
インテル® グラフィックス・テクノロジー向けのプログラミングで利用できる事前定義済みマクロ。
変数と関数をターゲット上に配置する属性。
インテル® グラフィックス・テクノロジー向けヘテロジニアス・プログラミング用のビルトイン関数および多数の既存の CPU 用の組込み関数。
同期/非同期オフロード API は、カーネル関数のオフロードキューの管理と CPU とプロセッサー・グラフィックス間のデータ共有を容易にします。
CPU とプロセッサーグラフィック間でメモリーを共有するモードは 2 つあります。
デフォルトのプログラミング・モデル: CPU とプロセッサー・グラフィック間で物理メモリーを共有できます。仮想メモリーは共有できません。
共有仮想メモリー (SVM): CPU とプロセッサー・ブラフィックス間で仮想アドレス空間を共有できます。
共有仮想メモリーに関するセクションに、SVM モードを使用する場合のプログラミングの相違点の説明があります。
コンパイラーには、インテル® グラフィックス・テクノロジー用のバイナリーをビルドする際に使用できる、次のコンパイラー・オプションと環境変数が用意されています。
コンパイラー・オプション |
説明 |
---|---|
qoffload、Qoffload |
オフロードのモードを指定します。このオプションの否定形は、オフロード言語構造を無視します。 |
qoffload-attribute-target、Qoffload-attribute-target |
ソースファイル中のすべてのグローバルルーチンとグローバル・データ・オブジェクトにオフロード属性 target(gfx) のフラグを付けます。 |
qoffload-option、Qoffload-option |
指定したターゲットとツールで使うオプションを指定します。 |
qoffload-arch、Qoffload-arch |
オフロードコードのターゲット・アーキテクチャーを指定します。 |
mgpu-asm-dump、Qgpu-asm-dump |
オフロードするプロセッサー・グラフィックス用コードのネイティブ・アセンブリー・リストを生成します。 |
mgpu-arch、Qgpu-arch |
特定のグラフィックス・プロセッサーで実行するグラフィックス用のオフロードコードをビルドします。 |
qopenmp、Qopenmp |
並列化機能が OpenMP* ディレクティブに基づいてマルチスレッド・コードを生成できるようにします。 |
qopenmp-offload、Qopenmp-offload |
target プラグマの OpenMP* オフロードコンパイルを有効/無効にします。 |
インテル® グラフィックス・テクノロジーで利用可能な環境変数の一部を以下に示します。
環境変数 |
説明 |
---|---|
GFX_CPU_BACKUP |
ターゲットが利用できない場合、ホスト上でヘテロジニアス・コードを実行するかどうかを制御します。 |
GFX_MAX_THREAD_COUNT |
ループの入れ子を並列化する際のターゲットスレッドの最大数を制御します。 |
GFX_OFFLOAD_TIMEOUT |
オフロードタスクの実行時間を制御します。 |
GFX_SHOW_TIME |
実行の最後にタイミング情報を出力するかどうかを制御します。 |