我对cudamallocmanaged的疑问是,如果我使用malloc N数字,在GPU完成对这些数字的操作后(假设是扫描操作),我只需要数组中的最后一个数字并且只访问主机中的这个数字。 cudamallocmanaged只会复制这个号码吗?
我做了一个测试,我的答案是否定的。所以我认为在这种情况下cudamalloc / free / copy比cudamallocmanaged更快。如果我错了,请纠正我。
接下来的问题是:如何知道来回复制的时间和数量?
答案 0 :(得分:1)
您的问题的答案通常是,在页面(通常为4K)的基础上。对于CPU-> GPU副本,驱动程序通过跟踪脏位来懒惰地复制CPU页面。内核启动后,托管内存标记为非常驻,因此CPU访问将出错。然后在CPU / GPU同步操作之后,它将保持非常驻状态,并且驱动程序通过将访问的页面从设备内存复制回来来解决页面错误。
这是基于我去年某个时候做过的一项研究,所以从那时起它可能已经改变了。鉴于托管内存的语义,NVIDIA有许多不同的实现选项,你可以期望它们随着NVIDIA优化代码而改变。
我测量了块GPU->托管内存的CPU副本速度为500MB / s,比固定memcpy慢25倍,所以预计会有变化,因为NVIDIA会计算出如何优化这些代码路径。例如,如果他们在GPU端进行脏位跟踪,他们可以推测性地将GPU写入的页面复制回CPU内存。这将带来更高的带宽,但可能会导致从未访问的多余数据副本。