随着CPU和GPU硬件的不断统一,AMD与hUMA (异构统一存储器访问)和英特尔第四代CPU的统一应该允许CPU和GPU之间的数据共享。我想知道,最近的OpenCL (或其他GPU框架)实现是否允许运行在CPU和GPU上的代码之间真正的无副本共享(不显式或隐式数据复制)大数据结构。
发布于 2014-04-30 13:26:22
在OpenCL版本1.0中,通过CL_MEM_ALLOC_HOST_PTR
标志,可以在主机和设备之间共享数据而不需要任何内存传输。此标志为设备分配缓冲区,但确保它位于主机也可访问的内存中。这些“零副本”传输的工作流通常采用以下形式:
// Allocate a device buffer using host-accessible memory
d_buffer = clCreateBuffer(context, CL_MEM_ALLOC_HOST_PTR, size, NULL, &err);
// Get a host-pointer for the buffer
h_buffer = clEnqueueMapBuffer(queue, d_buffer, CL_TRUE, CL_MAP_WRITE,
0, size, 0, NULL, &err);
// Write data into h_buffer from the host
...
// Unmap the memory buffer
clEnqueueUnmapMemObject(queue, d_buffer, h_buffer, 0, NULL, NULL);
// Do stuff with the buffer on the device
clSetKernelArg(kernel, 0, sizeof(cl_mem), &d_buffer);
clEnqueueNDRangeKernel(queue, kernel, ...);
这将创建一个设备缓冲区,从主机将一些数据写入其中,然后在设备上使用该缓冲区运行内核。由于缓冲区的分配方式,如果设备和主机具有统一的内存系统,则这不应导致内存传输。
上述方法仅限于简单、扁平的数据结构(一维数组)。如果您对使用一些更复杂的东西感兴趣,如链接列表、树或任何其他基于指针的数据结构,则需要利用共享虚拟内存( OpenCL 2.0 )中的共享虚拟内存(SVM)特性。在撰写本报告时,AMD和Intel都发布了对OpenCL 2.0功能的预览支持,但我无法为他们的实现提供担保。
支持向量机方法的工作流将与上面列出的代码有些相似。简而言之,您将使用clSVMAlloc
分配一个缓冲区,该缓冲区将返回一个在主机和设备上都有效的指针。当您希望从主机访问缓冲区时,您将使用clEnqueueSVMMap
和clEnqueueSVMUnmap
来同步数据,并使用clSetKernelArgSVMPointer
将其传递给设备。支持向量机与CL_MEM_ALLOC_HOST_PTR
的关键区别在于,支持向量机指针也可以包含在传递给设备的另一个缓冲区中(例如,在结构内部或由另一个指针指向)。这就是允许您构建复杂的基于指针的数据结构,可以在主机和设备之间共享。
https://stackoverflow.com/questions/23378707
复制相似问题