【问题标题】:Cuda cudaMemcpy and cudaMalloccuda cudaMemcpy 和 cudaMalloc
【发布时间】:2011-05-05 13:17:51
【问题描述】:

我总是读到将数据从 cpu 分配和传输到 gpu 的速度很慢。这是因为 cudaMalloc 很慢吗?是因为 cudaMemcpy 很慢吗?还是因为他们两个都很慢?

【问题讨论】:

    标签: c++ c cuda


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      这是由于物理限制。对于标准的 PCI-E 2.0 x16 链接,理论上您将获得 8GB/s,但实际上通常为 5-6GB/s。将其与设备上具有 80+GB/s 带宽的 GTX460 等中档费米进行比较。实际上,您的内存带宽受到了一个数量级的影响,从而相应地增加了数据传输时间。

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

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

      【讨论】:

      • 在我的情况下恰恰相反......我做了一个 cudaMemcpy 和很多 cudaMalloc......
      • 你能多谈谈你的申请吗?您只是保留许多转换后的副本吗?
      • 好吧,在我的情况下,我有一个输入......但我无法检测到我需要为这个输入的解决方案分配多少内存。因此,我对输入进行了单个副本....并在需要时分配全局内存。换句话说,我在前一个内存已满时分配新内存。 (请注意,我将需要所有分配的内存来计算完整的结果......)
      猜你喜欢
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 2011-09-24
      • 2016-06-03
      • 2016-04-26
      • 2018-05-10
      • 2020-12-25
      • 2013-10-16
      相关资源
      最近更新 更多