我总是读到从cpu分配和传输数据到gpu的速度很慢。这是因为cudaMalloc很慢吗?是因为cudaMemcpy很慢吗?还是因为它们都很慢?
答案 0 :(得分:3)
它主要与2件事相关,第一件事就是在卡与cpu之间启动PCIExpress总线的速度。另一个与这些功能的运作方式有关。现在,我认为新的CUDA 4更好地支持内存分配(标准或固定)以及在总线上透明地访问内存的方法。
现在,让我们面对它,在某些时候,你需要从A点到B点获取数据来计算某些东西。处理的最佳方法是要么进行非常大的计算,要么使用CUDA流来重叠GPU上的传输和计算。
答案 1 :(得分:3)
在大多数应用程序中,您应该在开始时执行一次cudaMalloc,然后再不再调用它。因此,瓶颈实际上是cudaMemcpy。
这是由于物理限制。对于标准的PCI-E 2.0 x16链路,理论上可以达到8GB / s,但实际上通常为5-6GB / s。比较这个甚至是中档Fermi,比如GTX460,它在设备上有80 + GB / s的带宽。实际上,您在内存带宽中占据了一个数量级,相应地增加了数据传输时间。
GPGPU应该是超级计算机,我相信Seymour Cray(超级计算机人)说,“超级计算机将计算限制问题转化为I / O限制问题”。因此,优化数据传输就是一切。
根据我的个人经验,迭代算法是迄今为止通过移植到GPGPU(2-3个数量级)显示最佳改进的算法,因为您可以通过将所有内容保持在原位来消除传输时间。 GPU。