インテル® C++ コンパイラー 17.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);