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 に必要なスペースに追加されます)
ありがとうございました