
[英]How to allocate one half of an OpenCL buffer on host memory and the other half on device memory?
[英]How to mitigate host + device memory tranfer bottlenecks in OpenCL/CUDA
如果我的算法由主机到设备和设备的瓶颈来承载内存传输,那么唯一的解决方案是不同的还是修改过的算法?
您可以尝试一些缓解PCIe瓶颈的方法:
请注意,这些技术都不会使传输更快,它们只会减少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.