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