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);

我有两个问题:1)是否需要使用固定内存来发生重叠?fSourceA 不能只是一个简单的主机指针,

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

2) 内核中没有使用cmPinnedSrcA,而是使用了cmDevSrcA。设备上的缓冲区占用的空间不是还在增长吗?(cmPinnedSrcA 所需的空间添加到 cmDevSrcA 所需的空间)

谢谢

4

1 回答 1

1

如果我正确理解了您的问题:

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

但仍然如此,队列总是不同步的。并且在这种情况下,需要事件来防止复制队列复制正在运行的内核的不一致数据。

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

于 2013-08-18T22:53:35.743 回答