【问题标题】:which to use: zero-copy memory vs pinned memory使用哪个:零拷贝内存与固定内存
【发布时间】:2019-02-21 04:44:26
【问题描述】:

在我的设备函数中,我在主机的全局内存(固定或零拷贝)中存储了数百万次值。在我的主机函数中,循环迭代并一次从全局内存中读取一个值(s.t. 我可以看到从设备生成的值,而不是等待所有值都被生成)。

我应该在零拷贝和固定之间使用哪个以获得更好的性能?

【问题讨论】:

  • 什么会阻止您对这两种方法进行基准测试并为自己确定答案?
  • 零拷贝和固定内存是一回事。
  • @RobertCrovella 这不是真的。 stackoverflow.com/questions/5209214/…
  • 也许您应该仔细阅读您提供的链接的全部内容。 CUDA 4.0 中的统一地址空间功能将默认映射所有固定分配我知道在 64 位操作系统中没有方法可以创建未映射的固定分配。
  • 您对 64 位操作系统的理解是错误的。我已经指出了这一点。在 64 位操作系统上,固定内存和映射内存之间存在 1:1 的对应关系,无论您用于分配的 API 调用如何。此外,设备代码无法访问未映射(到设备地址空间)的主机内存。我当然承认零拷贝内存可以用于您描述的目的。但是“固定但未映射”不是一种选择。 1. 因为您无法在运行 CUDA 的 64 位操作系统上创建它 2. 因为即使您可以创建它,您也无法从设备代码访问它。

标签: cuda


【解决方案1】:

在我的设备函数中,我将一个值存储在主机的全局内存中(固定或零拷贝)

我应该在零拷贝和固定之间使用哪个以获得更好的性能?

在 CUDA UVA 生效的 64 位操作系统上,固定内存和零拷贝(即固定和映射)之间没有有意义的区别。这是因为,正如here 和其他地方所述:

“CUDA 4.0 中的统一地址空间功能将默认映射所有固定分配”

“CUDA 4.0 中的统一地址空间功能”是CUDA UVA,它将在使用 CUDA 的 64 位操作系统上自动生效(可能除了 windows 7 WDDM)。由于 32 位 CUDA 的使用已经逐渐被弃用一段时间了,64 位操作系统大概是目前大多数人使用的操作系统。

但是,即使您处于非 UVA 制度,仍然无法回答这个问题。原因是固定但未映射的主机内存不能直接访问 CUDA 设备代码读/写活动,正如您在问题中所问的那样。正是映射特性(所谓的“零拷贝”)允许 CUDA 设备代码直接读取和写入主机内存中的位置。

因此,如果您确实可以访问“固定但未映射”的主机内存,则无论如何都无法实现您想要的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2012-09-11
    • 2015-06-13
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多