【问题标题】:Pinned memory in CUDA and cudamemcpy()CUDA 和 cudamemcpy() 中的固定内存
【发布时间】:2013-10-16 14:23:11
【问题描述】:

我了解当主机和设备之间的复制操作开始使用 cudaMemcpy 时,主机指针会自动固定。那么有一个单独的 API cudAHostAlloc() 来分配固定的主机内存的意义和必要性是什么?

【问题讨论】:

  • 我认为你的理解是错误的。复制到未固定的内存涉及中间驱动程序管理的缓冲区,这就是它较慢的原因。
  • 所以你的意思是从主机,数据首先放入驱动管理(固定)缓冲区,然后从那里传输到设备?
  • @gpuguy:是的。您可以使用 cudaMallocHost() 分配您自己的暂存缓冲区并使用 CUDA 事件来编写您自己的可分页 memcpy 例程 - 参见例如cudahandbook.to/GH9evr
  • @ArchaeaSoftware 但驱动程序如何访问 MMU 以在主机上分配暂存缓冲区?这不是操作系统的工作吗?
  • 必须为 CPU 和 GPU 映射固定内存。为 CPU 映射它由操作系统完成,但为 GPU 映射它由驱动程序完成。

标签: cuda gpu gpgpu nvidia


【解决方案1】:

这两个操作不一样,你传递给cudaMemcpy的主机指针不是“自动固定”的。

对于从可分页内存到设备的传输,host memory is copied to a staging buffer。然后,暂存缓冲区是任何传输的目标。

这使得可分页内存传输(通常)比从固定内存缓冲区传输更慢。还使用固定内存allows for other possibilities,例如具有设备可直接访问的映射内存,无需显式(API 级别)传输。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多