繁体   English   中英

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

[英]How to mitigate host + device memory tranfer bottlenecks in OpenCL/CUDA

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM