零拷贝内存使用条件

我在程序中使用了零拷贝内存,程序反而变得更慢了,看书上说
“当输入内存和输出内存都只能使用一次时,那么在独立GPU上使用零拷贝内存将带来性能提升”。
请问 “当输入内存和输出内存都只能使用一次时” 具体是什么意思?我下面的做法有什么问题?

================================================
程序情况是这样的:
在主机申请了3个 零拷贝内存 buf1,buf2,buf3,然后通过cudaHostGetDevicePointer() 获得这块内存在GPU上的有效指针dev1,dev2,dev3。
其中 buf1,buf2,buf3 是从影像中读取的数据,然后在核函数中对dev1,dev2,dev3进行处理,值依然存放在dev1,dev2,dev3中,然后调用GDAL将buf1,buf2,buf3 写出。

LZ您好:

zero copy和普通的cudaMemcpy一样也是要走pci-e总线的,只不过cudaMemcpy是一次性全部copy过去,而zero copy是用的时候自动在后台通过pci-e总线传输。

zero copy这样的机制多少可以利用计算来掩盖一些copy的时间,而如果使用cudaMemcpy要实现类似的计算和传输互相掩盖的话,需要使用异步版本的cudaMemcpy函数,并使用页锁定内存以及多个stream。

zero copy的读入信息是不在device端缓冲的,也就是说device端使用几次就需要从host端走较慢的pci-e 总线读入几次。所以,一般建议只使用一次的数据以及少量的返回数据可以使用zero copy,其他情况建议copy到显存使用,显存DRAM的带宽要比pci-e的带宽高出一个量级。

以上是对zero copy的简要介绍。

至于您的程序,您并未提供进一步的详细信息,就先不做出建议了。
您可以根据上述zero copy的叙述,自行考虑下;或者提供您的代码,让各位网友/斑竹/NV原厂支持一同为您提出建议。

大致如此,祝您编码顺利~