【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是否使用了统一地址空间。