【CUDA编程】【13】【3.Programming Interface】【3.2.CUDA Runtime】【3.2.10.Unified Virtual Address Space】

Unified Virtual Address Space

Posted by x-jeff on December 1, 2024

【CUDA编程】系列博客参考NVIDIA官方文档“CUDA C++ Programming Guide(v12.6)”
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.Unified Virtual Address Space

当应用程序以64位进程运行时,host和所有device(计算能力2.0以上)将共享一个单一的地址空间。通过CUDA API调用在该虚拟地址范围内的所有host内存和device内存。因此:

  • 对于通过CUDA分配的host内存,或者任何使用统一地址空间的device上的内存,可以调用cudaPointerGetAttributes()来获取内存的位置(在host上或具体哪个device上)。
  • 在对使用统一地址空间的device进行内存拷贝时,cudaMemcpy*()cudaMemcpyKind参数可以设置为cudaMemcpyDefault(即无需指定拷贝方向,比如从host到device或从device到host),其会通过指针自动确定内存的源位置和目标位置。这种方式同样适用于未通过CUDA分配的host指针,只要当前device支持统一地址空间。
  • 通过cudaHostAlloc()分配的内存在所有使用统一地址空间的device之间是自动可移植的(见:Portable Memory)。由cudaHostAlloc()返回的指针可以直接在这些device上运行的kernel中使用(也就是说,无需像Mapped Memory中描述的那样,通过cudaHostGetDevicePointer()获取device指针)。

应用程序可以通过检查device属性unifiedAddressing(见:Device Enumeration)是否等于1,来查询特定device是否使用了统一地址空间。