Memory management 主机和设备均可访问CUDA内存分配

Memory management 主机和设备均可访问CUDA内存分配,memory-management,cuda,Memory Management,Cuda,我正试图找出一种方法来分配一块主机(CPU)和设备(GPU)都可以访问的内存。除了使用cudaHostAlloc()函数分配CPU和GPU都可以访问的页锁定内存外,还有其他方法分配这样的内存块吗?提前感谢您的评论。主机和设备“共享”内存的唯一方法是使用较新的零拷贝功能。这在GT200体系结构卡和一些较新的笔记本电脑卡上可用。正如您所注意到的,该内存必须使用cudaHostAlloc进行分配,以使其处于页面锁定状态。没有其他选择,甚至在支持CUDA的旧卡上也没有此功能 如果您只是在寻找一种简单(可

我正试图找出一种方法来分配一块主机(CPU)和设备(GPU)都可以访问的内存。除了使用cudaHostAlloc()函数分配CPU和GPU都可以访问的页锁定内存外,还有其他方法分配这样的内存块吗?提前感谢您的评论。

主机和设备“共享”内存的唯一方法是使用较新的零拷贝功能。这在GT200体系结构卡和一些较新的笔记本电脑卡上可用。正如您所注意到的,该内存必须使用cudaHostAlloc进行分配,以使其处于页面锁定状态。没有其他选择,甚至在支持CUDA的旧卡上也没有此功能

如果您只是在寻找一种简单(可能没有性能)的方法来管理主机到设备的传输,请查看推力库。它有一个vector类,允许您在设备上分配内存,但可以像在主机上一样从主机代码对其进行读写


另一种选择是编写自己的包装器,为您管理传输。

主机和设备“共享”内存的唯一方法是使用较新的零拷贝功能。这在GT200体系结构卡和一些较新的笔记本电脑卡上可用。正如您所注意到的,该内存必须使用cudaHostAlloc进行分配,以使其处于页面锁定状态。没有其他选择,甚至在支持CUDA的旧卡上也没有此功能

如果您只是在寻找一种简单(可能没有性能)的方法来管理主机到设备的传输,请查看推力库。它有一个vector类,允许您在设备上分配内存,但可以像在主机上一样从主机代码对其进行读写


另一种选择是编写自己的包装器,为您管理传输。

没有在GPU内存上上载缓冲区的“自动方式”。

没有“自动方式”无法在GPU内存上上载缓冲区。

除非使用
cudaHostAlloc()
,否则无法分配GPU和CPU都可以访问的缓冲区。这是因为您不仅必须在CPU上分配固定内存(您可以在CUDA之外进行),而且还必须将内存映射到GPU的(或者更具体地说,上下文的)虚拟内存


在离散的GPU上,零拷贝确实会引起总线传输。但是,如果您的访问很好地结合在一起,并且您仅在数据仍然有效时使用数据,因为替代方法是将数据传输到设备,然后分两个阶段将其读入多处理器。

除非您使用
cudaHostAlloc(),否则无法分配GPU和CPU都可以访问的缓冲区
。这是因为您不仅必须在CPU上分配固定内存(您可以在CUDA之外进行),而且还必须将内存映射到GPU的(或者更具体地说,上下文的)虚拟内存


在离散的GPU上,零拷贝确实会引起总线传输。但是,如果您的访问很好地结合在一起,并且您仅在使用数据一次之后,它仍然是有效的,因为替代方法是将数据传输到设备,然后分两个阶段将其读入多处理器。

否,但问题是主机和设备都可以访问的内存。零拷贝(固定主机内存)在较新版本的CUDA中提供了这一功能。当GPU集成到芯片组中,并且使用系统内存作为GPU内存时,它显然非常有用。对于离散GPU(即插入PCIe插槽),零拷贝会导致总线传输。不是,但问题是主机和设备都可以访问的内存。零拷贝(固定主机内存)在较新版本的CUDA中提供了这一功能。当GPU集成到芯片组中,并且使用系统内存作为GPU内存时,它显然非常有用。对于离散GPU(即插入PCIe插槽),零拷贝会导致总线传输。