如果我的算法受到主机到设备和设备到主机内存传输的瓶颈,唯一的解决方案是不同的还是修改后的算法?
问问题
2446 次
2 回答
5
您可以尝试以下几件事来缓解 PCIe 瓶颈:
- 异步传输 - 允许重叠计算和批量传输
- 映射内存 - 允许内核在执行期间向/从 GPU 流式传输数据
请注意,这些技术都没有使传输速度更快,它们只是减少了 GPU 等待数据到达的时间。
使用cudaMemcpyAsync
API 功能,您可以启动传输,启动一个或多个不依赖于传输结果的内核,同步主机和设备,然后启动等待传输完成的内核。如果您可以构建您的算法,以便在传输发生时进行生产性工作,那么异步副本是一个很好的解决方案。
使用cudaHostAlloc
API 函数,您可以分配可以直接从 GPU 读取和写入的主机内存。这更快的原因是需要主机数据的块只需要等待一 小部分数据被传输。相反,通常的方法是让所有块等待直到整个传输完成。映射内存本质上将大的单片传输分解为一堆或更小的复制操作,因此延迟减少了。
您可以在CUDA 编程指南的第 3.2.6-3.2.7 节和CUDA 最佳实践指南的第 3.1节中阅读有关这些主题的更多信息。OpenCL 最佳实践指南的第 3 章解释了如何在 OpenCL 中使用这些功能。
于 2010-10-19T20:41:13.363 回答
3
您确实需要进行数学计算,以确保您将在 GPU 上进行足够的处理,以使其值得在主机和 GPU 之间传输数据。理想情况下,您可以在设计阶段执行此操作,然后再进行任何编码,因为这可能会破坏交易。
于 2010-10-19T20:15:34.670 回答