インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
共有仮想メモリー (SVM) は、CPU とプロセッサー・グラフィックス間で仮想アドレス空間を共有するプログラミング・モデルです。SVM を使用することで、プロセッサー・グラフィックスを利用して、さまざまなアルゴリズムを簡単に実行できます。
GFX オフロード領域内でのポインターの使用に制限はありません。
データ構造にポインターを格納して逆参照できます。
グローバルまたはスタティック・ポインター型のデータを使用できます。
ポインターや参照オブジェクトのアドレスを取得できます。
ポインターの二重の間接参照が可能です。
GFX オフロード領域のデータ共有節でポインターを指定する必要がありません。
コンパイラーは細粒度のバッファー SVM をサポートします: プロセッサー・グラフィックスで処理されるポインターを割り当て/解放する必要があります。_GFX_svm_alloc はメモリーにバッファーを割り当て、_GFX_svm_free は _GFX_svm_alloc によって割り当てられたバッファーを解放します。どちらの API も gfx_rt.h で宣言されています。SVM 向けのコンパイル時に、GFX オフロードコードで SVM メモリー以外を使用すると、結果が不正になったり、プログラムがハングアップする可能性があります。
SVM を有効にするには、Qoffload-svm (Windows*) または qoffload-svm (Linux*) コンパイラー・オプションを使用します。
混在メモリーモードは許可されません: すべてのプログラムユニットを SVM が有効または無効な状態でコンパイルする必要があります。すべてのプログラムユニットで一貫したメモリーモードが使用されるように、プログラマーの責任において管理してください。
この例は、次の処理を示します。
SVM バッファーの割り当て
offload プラグマでのポインターの使用。in、inout、out、pin などのデータ共有節でポインター・オブジェクトをリストする必要がありません。
offload ブロックでのポインター配列の使用 (SVM を使用する場合のみ許可されます)
SVM バッファーの解放
...
int** out = (int**)_GFX_svm_alloc(sizeof(int*) * N);
int* in = (int*)_GFX_svm_alloc(sizeof(int) * N);
...
__pragma(offload target(gfx))
_Cilk_for(int i = 0; i < N; i++) {
out[i] = &in[i];
}
...
_GFX_svm_free(in);
_GFX_svm_free(out);
インテル® Cilk™ Plus は、インテル® C++ コンパイラー 18.0 では非推奨の古い機能です。プロセッサー・グラフィックスへオフロードする代替手段は、将来のリリースで提供される予定です。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」を参照してください。