关于ZERO-COPY的疑问

在CUDA C BEST PRECTICE GUIDE手册中P35讲到ZERO-COPY时,有这样一句话"But since any repeated access to such memory areas causes repeated PCIe transfers, consider creating a second area in device memory to manually cache the previously read host memory data." 我的理解是:既然对这些内存区域任何重复的访问引起重复的PCIe传输,可以考虑在设备内存中产生一块儿区域来手动的存放之前读到的主机内存数据。

我的问题是:既然是ZERO-COPY,为什么还要在设备内存中再分配一块儿区域呢?

手册的确这么说,如果按手册的说法,你手工分配的一块global memory(或者shared memory), 是用来手工cache你的从host mapped memory通过PCI-E BUS传输来的数据的。

楼主的问题的确问的好,既然如此,何苦不直接cudaMemcpy完事呢。用zero copy + 手工缓冲岂不是自我折腾么。

我考虑了这几个情况供楼主参考:
(1)原始数据很大,而频繁访问的地方很小。例如你有512MB显存的卡,却需要工作于1GB的数据集上,此时可以考虑使用mapped pinned memory. 如果进一步,分散在1GB里只有100MB是被频繁使用的,而剩下的900多M只用一两次,那么楼主手工缓存这100MB还是可以考虑的。

(2)原始数据量虽然很小,但传统的方式会引入复制的延迟:用传统的复制-执行, 或者传统的多个流的(流1):复制1,kernel1和(流2):复制2和kernel2, 用2个流试图掩盖复制延迟只能在不同的kernel间,马上要用到数据的kernel不能这样.
而zero copy可以实现一个kernel在一边执行一边传输,这个kernel执行中的计算指令和随时的对mapped pinned memory的访问在彼此交错、掩盖,同时进行,不需要额外的一次复制了。这样就规避了复制的延迟。而此时如果楼主再手工cache一下,也许可以锦上添花。

这2条供楼主多少参考。

感谢您莅临CUDAZONE China.
欢迎您有问题继续发帖咨询。
祝您开发愉快!

非常感谢!