1

OpenCL NVIDIA SDK の oclCopyComputeOverlap には、2 つのキューを使用してバッファーの転送とカーネルの実行を交互に行う例があります。この例では、マップされたメモリが使用されています。

**//pinned memory** 
cmPinnedSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, szBuffBytes, NULL, &ciErrNum);
**//host pointer for pinned memory**
fSourceA = (cl_float*)clEnqueueMapBuffer(cqCommandQueue[0], cmPinnedSrcA, CL_TRUE,    CL_MAP_WRITE, 0, szBuffBytes, 0, NULL, NULL, &ciErrNum);
...
**//normal device buffer**
cmDevSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, szBuffBytes, NULL, &ciErrNum);
**//write half the data from host pointer to device buffer**
ciErrNum = clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcA, CL_FALSE, 0, szHalfBuffer, (void*)&fSourceA[0], 0, NULL, NULL);

2 つの質問があります。1) オーバーラップを発生させるために固定メモリを使用する必要はありますか? fSourceA を単純なホスト ポインタにすることはできませんでした。

fSourceA = (cl_float *)malloc(szBuffBytes);
...
//write random data in fSourceA

2) カーネルでは cmPinnedSrcA が使用されず、代わりに cmDevSrcA が使用されます。デバイスのバッファが占有するスペースはまだ増えていませんか? (cmPinnedSrcA に必要なスペースが cmDevSrcA に必要なスペースに追加されます)

ありがとうございました

4

1 に答える 1

1

あなたの質問を正しく理解していれば:

1) はい、任意の種類のメモリ (固定、ホスト ポインターなど) を使用できますが、オーバーラップは引き続き発生します。2 つのキューを使用し、HW/ドライバーがそれをサポートしている限り。

ただし、キューは常に同期されていません。この場合、コピー キューが実行中のカーネルの一貫性のないデータをコピーするのを防ぐために、イベントが必要です。

2)固定メモリを使用する場合、2 倍のメモリを使用していると思います。1 つは固定メモリ用、もう 1 つは一時コピー用です。しかし、私は 100% 確実ではありません。

于 2013-08-18T22:53:35.743 に答える