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);
我有两个问题:1)是否需要使用固定内存来发生重叠?fSourceA 不能只是一个简单的主机指针,
fSourceA = (cl_float *)malloc(szBuffBytes);
...
//write random data in fSourceA
2) 内核中没有使用cmPinnedSrcA,而是使用了cmDevSrcA。设备上的缓冲区占用的空间不是还在增长吗?(cmPinnedSrcA 所需的空间添加到 cmDevSrcA 所需的空间)
谢谢