1

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

4

3 回答 3

2

主机和设备“共享”内存的唯一方法是使用更新的零拷贝功能。这在 GT200 架构卡和一些较新的笔记本电脑卡上可用。正如您所注意到的,此内存必须使用 cudaHostAlloc 分配,以便它被页面锁定。没有其他选择,即使是旧的支持 CUDA 的卡也没有此功能。

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

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

于 2009-11-16T10:27:17.130 回答
1

除非您使用cudaHostAlloc(). 这是因为您不仅必须在 CPU 上分配固定内存(您可以在 CUDA 之外执行此操作),而且还必须将内存映射到 GPU(或更具体地说,上下文的)虚拟内存。

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

于 2009-11-21T16:28:50.637 回答
0

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

于 2009-11-16T12:28:34.813 回答