如何减轻OpenCL/CUDA中的主机+设备内存传输瓶颈

smu*_*kes 3 memory cuda nvidia opencl

如果我的算法由主机到设备和设备的瓶颈来承载内存传输,那么唯一的解决方案是不同的还是修改过的算法?

wnb*_*ell 5

您可以尝试一些缓解PCIe瓶颈的方法:

  • 异步传输 - 允许重叠计算和批量传输
  • 映射内存 - 允许内核在执行期间向/从GPU流式传输数据

请注意,这些技术都不会使传输更快,它们只会减少GPU等待数据到达的时间.

使用cudaMemcpyAsyncAPI函数,您可以启动传输,启动一个或多个不依赖于传输结果的内核,同步主机和设备,然后启动等待传输完成的内核.如果您可以构建算法,以便在传输过程中进行高效工作,那么异步副本是一个很好的解决方案.

使用cudaHostAllocAPI函数,您可以分配可以直接从GPU读取和写入的主机内存.更快的原因是需要主机数据的块只需要等待传输一 小部分数据.相反,通常的方法是使所有块等待,直到整个传输完成.映射内存实质上将大型单片传输分解为一堆或更小的复制操作,因此延迟减少.

您可以在CUDA编程指南的第3.2.6-3.2.7 节和CUDA最佳实践指南的第3.1 节中阅读有关这些主题的更多信息." OpenCL最佳实践指南"的第3章介绍了如何在OpenCL中使用这些功能.