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

时间:2010-10-19 20:04:37

标签: memory cuda opencl nvidia

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

2 个答案:

答案 0 :(得分:5)

您可以尝试一些缓解PCIe瓶颈的事情:

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

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

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

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

您可以在CUDA Programming Guide的第3.2.6-3.2.7节和CUDA Best Practices Guide的第3.1节中详细了解这些主题。 OpenCL Best Practices Guide的第3章介绍了如何在OpenCL中使用这些功能。

答案 1 :(得分:3)

你真的需要做数学运算来确定你将在GPU上做足够的处理,以便在主机和GPU之间传输数据是值得的。理想情况下,在进行任何编码之前,您可以在设计阶段执行此操作,因为它可能是一个交易破坏者。