【问题标题】:cudaMemcpy transfer kinds: Default vs HostToDevice/DeviceToHostcudaMemcpy 传输类型:默认 vs HostToDevice/DeviceToHost
【发布时间】:2019-08-23 19:55:21
【问题描述】:

cudaMemcpy 允许程序员明确指定内存传输的方向。

手动指定内存传输方向(cudaMemcpyDeviceToHost/cudaMemcpyHostToDevice/cudaMemcpyDeviceToDevice)而不是让 cuda 从指针值自动推断(cudaMemcpyDefault)有什么好处吗?

【问题讨论】:

  • 手动指定方向允许 cuda 运行时进行一些额外的错误检查。例如,如果您指定 HostToDevice,cuda 运行时可以检查您传递的目标指针是否可以在设备上使用。如果您通过了默认值,并且错误地使用了两个主机指针,您将只获得一个主机->主机数据副本,而没有任何迹象表明有任何问题。
  • 好点。我认为如果有静态类型检查来防止主机和设备指针的混合会更好。我有设备指针和内存 API 的包装器。这些确保在编译时不会发生这种无效的混合。文档建议使用 cudaMemcpyDefault 而不是手动指定,但没有解释原因。
  • 这给我的印象与您在问题中提出的问题不同。在您的问题中,您询问手动规范是否有优势,我对此做出了回应。我无法透露无证信息。如果您希望看到 CUDA 的改进,您可以在 developer.nvidia.com 提交错误报告(在这种情况下针对文档)

标签: memory cuda nvidia


【解决方案1】:

tl;dr:几乎可以肯定没有优势。

cudaMemcpyDefault 是在 GPU 开始能够通过检查地址(“统一虚拟寻址”)轻松识别内存空间时添加的。在此之前,您必须指定方向。例如,请参阅 CUDA 3 文档,可访问 here。在 API 参考中查找 cudaMemcpyKind - 没有默认值,只有 H2H、H2D、D2H 和 H2H。

当这种情况发生变化时,我想对于 nVIDIA 来说,不要重载函数或以不同的方式命名它是有意义的,而只是为新功能添加一个不同的常量值。

我不是 100% 确定没有区别,只是非常合理;从轶事的个人经验来看,我没有看到任何优势/差异。复制当然不会更快。

【讨论】:

    【解决方案2】:

    来自cudaMemcpy()的文档:

    [...] 建议传递cudaMemcpyDefault,在这种情况下,传输类型是从指针值推断出来的。但是,cudaMemcpyDefault 仅允许在支持统一虚拟寻址的系统上使用。 [...]

    因此,如果您有一个允许统一虚拟寻址的 GPU,请使用 cudaMemcpyDefault,否则您别无选择,只能显式。

    你可以查询你的系统是否支持

    cudaGetDeviceProperties() 与设备属性 cudaDeviceProp::unifiedAddressing

    【讨论】:

    • 是的,但是两者有什么优势吗?
    • @talonmies 好吧,如您所知,那里没有记录,因为 CUDA 的许多其他内容似乎没有记录。如果文档推荐它,我认为它更好是有原因的(否则我会认为它们写得不好)。我不知道。如果你这样做,请回答问题,这样我们更多的人可以学习;)
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多