3.6_设备内存

3.6 设备内存

设备内存(或线性设备内存)驻留在CUDA地址空间上,可以被CUDA内核通过标准C/C++指针和数组解引用操作访问。大多数的GPU拥有一个专用的设备内存池,直接附加在GPU上,通过集成内存控制器进行访问。

CUDA硬件并不支持请求式换页,所以,所有的内存分配都被真实的物理内存支持着。不同于CPU应用程序,可以分配超过实际内存容量的虚拟内存。CUDA内存分配在物理内存耗尽时会失败。关于内存怎样分配、释放和访问内存的细节会在5.2节给出。

1. CUDA运行时

CUDA运行时应用程序可以通过调用CUDAGetDeviceProperties()函数得到设备信息并检查CUDADeviceProp::totalGlobalMem查询给定设备的可用内存总量。使用CUDAAlloc()和CUDAFree()分配和释放设备内存。CUDAAllocPitch()分配等宽内存,CUDAFree()可以用来释放等宽内存,CUDAAlloc3D()用来执行一次等宽内存的3D分配。

2. 驱动程序API

驱动程序API应用程序可以通过调用cuDeviceTotalMem()函数查询给定设备的可用内存总量。作为选择,cuMemGetInfo()函数除了可以查询总内存,也可以查询空闲的内存。cuMemGetInfo()只有在CUDA上下文对给定CPU线程是当前状态时才能被调用。cuMemAlloc()和cuMemFree()分配和释放设备内存。cuMemAllocPitch()分配等宽内存,cuMemFree()可以用来释放它。

3.6_设备内存 - The CUDA Handbook | OpenTech