减少 CPU 到 GPU 数据传输延迟的技术

Posted

技术标签:

【中文标题】减少 CPU 到 GPU 数据传输延迟的技术【英文标题】:Techniques to Reduce CPU to GPU Data Transfer Latency 【发布时间】:2011-09-23 23:03:43 【问题描述】:

我一直在寻找减少 CPU 和 GPU 来回传输数据所导致的延迟的方法。当我第一次开始使用 CUDA 时,我确实注意到 CPU 和 GPU 之间的数据传输确实需要几秒钟,但我并不在意,因为这对于我正在编写的小程序来说并不是一个真正的问题。事实上,对于绝大多数使用 GPU 的程序(包括视频游戏)来说,延迟可能不是什么大问题,因为它们仍然比在 CPU 上运行要快得多。

但是,我是一个 HPC 爱好者,当我看到 Tianhe-I 的理论峰值 FLOPS 与实际 LINPACK 测量的性能之间存在巨大差异时,我开始关注我的研究方向。这引起了我对自己是否走在正确的职业道路上的担忧。

通过使用 cudaHostAlloc() 函数使用固定内存(页面锁定)内存是减少延迟的一种方法(非常有效),但是还有其他我不知道的技术吗?需要明确的是,我说的是优化代码,而不是硬件本身(这是 NVIDIA 和 AMD 的工作)。

作为一个附带问题,我知道戴尔和惠普销售特斯拉服务器。我很好奇 GPU 如何很好地利用数据库应用程序,您需要从硬盘驱动器(HDD 或 SSD)进行持续读取,这是只有 CPU 才能执行的操作,

【问题讨论】:

你可能会觉得这很有趣:cs.virginia.edu/~skadron/Papers/bakkum_sqlite_gpgpu10.pdf @Misha 你说得对,这篇文章描述了我心目中的挑战。谢谢... 关于天河-IA的低翻牌效率:虽然GPU具有强大的算术能力(通常难以充分利用),但不要忘记GPU内存架构也起着重要作用甚至计算密集型内核的性能也可以大大优于 CPU 实现。 【参考方案1】:

有几种方法可以解决 CPU-GPU 通信开销 - 我希望这就是您所说的延迟,而不是传输本身的延迟。请注意,我故意使用术语 address 而不是 reduce,因为如果可以隐藏它,您不一定需要减少延迟。另请注意,我对 CUDA 比较熟悉,所以下面我只提到 CUDA,但 OpenCL 中也提供了一些功能。

正如您所提到的,页面锁定内存具有增加的目的。此外,可以将页面锁定的主机内存映射到 GPU,这种机制可以直接访问从 GPU 内核分配的数据,而无需额外的数据传输。这种机制称为零拷贝传输,如果数据仅被读取/写入一次并伴随大量计算并且对于没有单独内存(移动)的GPU,它是有用的。但是,如果访问零拷贝数据的内核不是强计算绑定的,因此无法隐藏数据访问的延迟,则页锁定但未映射的内存将更有效。此外,如果数据不适合 GPU 内存,零拷贝仍然有效。 请注意,过多的页面锁定内存会导致 CPU 端严重减速。

从不同的角度解决问题,正如 tkerwin 所提到的,异步传输(CPU 线程与 GPU 通信)是通过在 CPU 上重叠计算来隐藏 CPU-GPU 传输延迟的关键与转移。这可以通过cudaMemcpyAsync() 以及使用零拷贝和异步内核执行来实现。 通过使用多个流与内核执行重叠传输,可以更进一步。请注意,流调度可能需要特别注意以获得良好的重叠; Tesla 和 Quadro 卡具有双 DMA 引擎,可同时与 GPU 进行数据传输。 此外,借助 CUDA 4.0,从多个 CPU 线程使用 GPU 变得更加容易,因此在多线程 CPU 代码中,每个线程都可以将自己的数据发送到 GPU 并更轻松地启动内核。

最后,GMAC 为 CUDA 实现了一个非对称共享内存模型。它的一个非常有趣的特性是它提供的一致性模型,特别是惰性和滚动更新,它能够以阻塞的方式仅传输在 CPU 上修改的数据。 更多详情请参阅以下论文:Gelado et al. - An Asymmetric Distributed Shared Memory Model for Heterogeneous Parallel Systems。

【讨论】:

【参考方案2】:

您可以使用cudaMemcpyAsync() 将您在CPU 上执行的工作与内存传输重叠。这不会降低数据传输的延迟,但可以提高算法的整体性能。在CUDA C Best Practices 指南中有一些关于它的信息。

【讨论】:

【参考方案3】:

如果延迟是一个问题,那么可能值得研究一下您可以使用 AMD 融合架构做出的权衡。您获得的延迟大大减少,并且在某些情况下可能比 CPU 从 RAM 传输的速度更快。但是,使用精简的非离散 GPU 确实会影响性能。

【讨论】:

以上是关于减少 CPU 到 GPU 数据传输延迟的技术的主要内容,如果未能解决你的问题,请参考以下文章

CPU和内存之间是怎么进行数据传输的?

GPU特征处理技术

Unity渲染工作原理--和instantOC插(减少CPU 和 GPU的工作量)

从 GPU 到 RAM 的大量传输后渲染缓慢?

CPU/GPU 设备之间的 Torch 分布式广播和减少

最大限度减少实时连接延迟的技术