首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在现代x86硬件上用OpenCL或其他GPU框架实现CPU与GPU之间的数据共享

在现代x86硬件上用OpenCL或其他GPU框架实现CPU与GPU之间的数据共享
EN

Stack Overflow用户
提问于 2014-04-30 02:34:16
回答 1查看 3.6K关注 0票数 5

随着CPU和GPU硬件的不断统一,AMD与hUMA (异构统一存储器访问)和英特尔第四代CPU的统一应该允许CPU和GPU之间的数据共享。我想知道,最近的OpenCL (或其他GPU框架)实现是否允许运行在CPU和GPU上的代码之间真正的无副本共享(不显式或隐式数据复制)大数据结构。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-30 13:26:22

在OpenCL版本1.0中,通过CL_MEM_ALLOC_HOST_PTR标志,可以在主机和设备之间共享数据而不需要任何内存传输。此标志为设备分配缓冲区,但确保它位于主机也可访问的内存中。这些“零副本”传输的工作流通常采用以下形式:

代码语言:javascript
运行
复制
// 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分配一个缓冲区,该缓冲区将返回一个在主机和设备上都有效的指针。当您希望从主机访问缓冲区时,您将使用clEnqueueSVMMapclEnqueueSVMUnmap来同步数据,并使用clSetKernelArgSVMPointer将其传递给设备。支持向量机与CL_MEM_ALLOC_HOST_PTR的关键区别在于,支持向量机指针也可以包含在传递给设备的另一个缓冲区中(例如,在结构内部或由另一个指针指向)。这就是允许您构建复杂的基于指针的数据结构,可以在主机和设备之间共享。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23378707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档