【问题标题】:Is cudamallocmanaged smart enough to not copy data which is not needed?cudamallocmanaged 是否足够聪明,不会复制不需要的数据?
【发布时间】:2015-05-21 22:48:01
【问题描述】:

我对 cudamallocmanaged 的​​疑问是,如果我 malloc N 个数字,在 GPU 完成对这些数字的操作(比如说扫描操作)之后,我只需要数组中的最后一个数字,并且只访问主机中的这个数字. cudamallocmanaged 只会复制这个数字吗?

我做了一个测试,我的答案是否定的。所以我认为在这种情况下 cudamalloc/free/copy 比 cudamallocmanaged 更快。如果我错了,请纠正我。

那么接下来的问题是:如何知道来回复制的时间和数量?

【问题讨论】:

    标签: c++ c cuda gpu gpgpu


    【解决方案1】:

    您的问题的答案通常是“是”,以页面(通常为 4K)为基础。对于 CPU->GPU 副本,驱动程序通过跟踪脏位来懒惰地复制 CPU 页面。内核启动后,托管内存被标记为非驻留内存,因此 CPU 访问将出错。然后在 CPU/GPU 同步操作之后,它处于非驻留状态,驱动程序通过将访问的页面从设备内存复制回来来解决页面错误。

    这是基于我去年某个时候所做的一项研究,因此从那时起它可能已经发生了变化。鉴于托管内存的语义,NVIDIA 有许多不同的实现选项,您可以期望它们会随着 NVIDIA 优化其代码而改变。

    我以 500MB/s 的速度测量了托管内存的块 GPU->CPU 副本,比固定的 memcpy 慢 25 倍,因此随着 NVIDIA 弄清楚如何优化这些代码路径,预计会发生变化。例如,如果他们在 GPU 端进行脏位跟踪,他们可以推测性地将 GPU 写入的页面复制回 CPU 内存。这将提供更高的带宽,但可能会导致永远不会访问的多余数据副本。

    【讨论】:

    • 所以到目前为止的粒度是基于页面(4k)对吗?如果我只想复制4个字节,它仍然会复制冗余数据?
    • 是的,有两个问题在起作用。一是硬件确实不支持跟踪比页面更细粒度的内存访问。另一个是即使对于 4K 页面(而不是 4 字节),系统复制数据的时间也很少,而不是其他开销操作。例如,对于小型副本,驱动程序编写硬件命令来执行复制所花费的时间通常比硬件复制数据所花费的时间要长。
    • 感谢分享您的知识
    猜你喜欢
    • 2011-11-09
    • 2020-08-06
    • 2023-02-09
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多