cudamallocmanaged 是否足够聪明,不会复制不需要的数据?

Is cudamallocmanaged smart enough to not copy data which is not needed?

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

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

那么接下来的问题是:知道何时以及来回复制多少是如何工作的?

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

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

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