我正试图想出一种方法来分配主机(CPU)和设备(GPU)都可以访问的内存块。除了使用cudaHostAlloc()函数来分配CPU和GPU都可访问的页面锁定内存之外,还有其他方法来分配这样的内存块吗?提前感谢您的意见。
答案 0 :(得分:2)
主机和设备“共享”内存的唯一方法是使用较新的零拷贝功能。这可以在GT200架构卡和一些较新的笔记本电脑卡上使用。正如您所注意的那样,此内存必须与cudaHostAlloc一起分配,以便它被页面锁定。没有其他选择,即使是这种功能也不适用于旧的支持CUDA的卡。
如果您只是想要一种简单(可能是非高效)的方式来管理主机到设备的传输,请查看Thrust库。它有一个vector类,可以让你在设备上分配内存,但是可以从主机代码读取和写入内存,就好像它在主机上一样。
另一种选择是编写自己的包装器来管理传输。
答案 1 :(得分:1)
除非使用cudaHostAlloc()
,否则无法分配GPU和CPU均可访问的缓冲区。这是因为您不仅必须在CPU上分配固定内存(您可以在CUDA之外进行分配),而且还必须将内存映射到GPU(或更具体地说,上下文)的虚拟内存中。
确实,在离散GPU上,零拷贝确实会导致总线传输。但是,如果您的访问很好地合并,并且只有在数据仍然有效时才使用数据,因为替代方法是将数据传输到设备,然后分两个阶段将其读入多处理器。
答案 2 :(得分:0)
没有“自动方式”在GPU内存上传缓冲区。