私はOpenACCデータと計算領域内でGSLを使用することについて直接話すことはできませんが、ダイナミックデータメンバーを使用して集約タイプに関する一般的な回答を得ることができます。
PGIコンパイラと新しいNVIDIAデバイスを使用していると仮定すると、まずCUDA Unified Memory(UVM)が必要です。フラグ "-ta = tesla:managed"でコンパイルすると、動的に割り当てられたすべてのデータがCUDAランタイムによって管理されるため、データの移動を自分で管理する必要はありません。オーバーヘッドがあり、警告がありますが、作業を開始しやすくなります。 PGI 16.9以降に同梱されているCUDA 8.0は、UVMの性能を向上させることに注意してください。
UVMを使用しない場合、データの手動ディープコピーを実行する必要があります。以下は、最初にデバイス上に親構造を作成し、浅いコピーを実行する基本的な考え方です。次に、デバイス上の "data"という動的配列を作成し、初期値を配列にコピーしてから、デバイス構造のデータポインタにデータのデバイスポインタを付加します。 「ブロック」自体は動的データメンバーを持つ構造体の配列なので、配列をループしてデバイス上にデータ配列を作成する必要があります。
matrix * mat = (matrix*) malloc(sizeof(matrix));
#pragma acc enter data copyin(mat)
// Change this to the correct size of "data" and blocks
#pragma acc enter data copyin(mat.data[0:dataSize]);
#pragma acc enter data copyin(mat.block[0:blockSize]);
for (i=0; i < blockSize; ++i) {
#pragma acc enter data copyin(mat.block[i].data[0:mat.block[i].size])
}
は、削除ボトムアップ
for (i=0; i < blockSize; ++i) {
#pragma acc exit data delete(mat.block[i].data)
}
#pragma acc exit data delete(mat.block);
#pragma acc exit data delete(mat.data);
#pragma acc exit data delete(mat);
アップデート
から削除、再構造を歩く、スカラーのみまたは基本的なデータ型の配列を必ず更新してください。すなわち、「データ」を更新するが「ブロック」は更新しない。 Updateは浅いコピーを行い、 "ブロック"を更新することで不正なアドレスにつながるホストまたはデバイスのポインタが更新されます。
最後に、行列変数を計算領域で使用する場合は、必ず「present」節に入れてください。
#pragma acc parallel loop present(mat)
マット、ありがとうございます!私はNVIDIA GTX 560 TIを持っています。 CUDA UVMはこれで動作しますか? – navmendoza
私はフェルミ(cc2.x)がUVMを使用できると信じています。私は特にGTX 560でそれを使用していないので、確かではありませんが、どうしてそうは見えません。 –
こんにちはマット、もう一度、ありがとう。フラグ "-ta = tesla:managed"を使用すると、コードがコンパイルされます。しかし、実行しようとすると、「Accelerator Fatal Error:CUDAデバイスコードがありません」というエラーが表示されます。これは、NVIDIA GTX 560 TIでUVMを使用できないことを意味しますか? – navmendoza