2011-05-05 122 views
2

我总是读到它分配和传输数据到CPU的速度很慢。这是因为cudaMalloc速度慢吗?是因为cudaMemcpy速度慢吗?或者它是否因为它们都很慢?Cuda cudaMemcpy和cudaMalloc

回答

3

它主要与2件事有关,第一件事开始卡和CPU之间的PCIExpress总线的速度。另一个与这些功能的运作方式有关。现在,我认为新的CUDA 4可以更好地支持内存分配(标准或固定)以及通过总线透明访问内存的方式。

现在,让我们面对它,在某些时候,您需要从点A到点B的数据来计算一些东西。最好的处理方式是要么进行非常大的计算,要么使用CUDA流来重叠GPU上的传输和计算。

3

在大多数应用程序中,您应该在开始时执行一次cudaMalloc,然后不再调用它。因此,瓶颈真的是cudaMemcpy。

这是由于物理限制。对于一个标准的PCI-E 2.0 x16链路,你可以得到8GB/s的理论值,但实际上通常为5-6GB/s。比较这个w /甚至是一个中等范围的Fermi,就像GTX460那个设备上有80 + GB/s的带宽。实际上,内存带宽的命中率达到了一个数量级,因此您的数据传输时间也相应增加。

GPGPU应该是超级计算机,我相信Seymour Cray(超级计算机家伙)说,“一台超级计算机将计算受限的问题转化为I/O约束问题”。因此,优化数据传输就是一切。

根据我个人的经验,迭代算法是通过移植到GPGPU(2-3个数量级)显示最佳改进的算法,因为您可以通过将所有内容保持在原位来消除传输时间GPU。

+0

在我的情况下是相反的......我做一个cudaMemcpy和很多cudaMalloc .... – Lora 2011-05-05 14:18:37

+0

你能谈谈更多关于你的应用程序吗?你只是保留许多转换的副本? – peakxu 2011-05-05 15:06:21

+0

以及在我的情况下,我有一个输入...但我无法检测到我需要分配多少内存来解决这个输入。因此我做了一个输入的副本....并在需要时分配全局内存。换句话说,当前一个内存已满时,我分配新的内存。 (请注意,我将需要所有分配的内存来计算完整的结果...) – scatman 2011-05-06 07:40:05