OpenCL重叠通信和计算

时间:2013-08-18 18:18:06

标签: opencl communication nvidia overlap computation

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所需空间所需的空间)

谢谢

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题:

1)  是的,您可以使用任何类型的内存(固定,主机指针等),并且仍然会发生重叠。至于你使用两个队列,硬件/驱动程序支持它。

但是重新确定,队列总是没有被诅咒。在这种情况下,需要事件来防止复制队列复制正在运行的内核的不一致数据。

2)如果您使用固定内存,我认为您使用的是2倍内存,一个用于固定内存,另一个用于临时复制。但我不是百分百肯定,也许它只是一个指针。