【CUDA编程】系列博客参考NVIDIA官方文档“CUDA C++ Programming Guide(v12.6)”。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.Mode Switches
具有显示输出的GPU会为所谓的primary surface分配一些DRAM内存,这个primary surface用于刷新显示设备的输出内容。当用户使用NVIDIA控制面板或Windows控制面板切换显示模式(比如更改显示分辨率或位深)时,primary surface所需的内存量就会发生变化。例如,如果用户将分辨率从$1280 \times 1024 \times 32 - bit$更改为$1600 \times 1200 \times 32 - bit$时,系统必须为primary surface分配7.68MB,而不是5.24MB。
这里简单解释下分配的内存大小是怎么计算的。对于分辨率$1280 \times 1024 \times 32 - bit$,像素总数是$1280 \times 1024$,一个像素占用32位(即4字节),因此所需内存大小为$\frac{1280 \times 1024 \times 4}{1024 \times 1024} = 5 MB$。同样的,对于分辨率$1600 \times 1200 \times 32 - bit$,所需内存大小为$\frac{1600 \times 1200 \times 4}{1024 \times 1024} \approx 7.32 MB$。此外,运行启用了抗锯齿的全屏图形应用程序可能需要更多的primary surface内存。
在Windows上,其他可能触发显示模式切换的事件包括:启动全屏DirectX应用程序、按下Alt+Tab切换离开全屏DirectX应用程序、按下Ctrl+Alt+Del锁定计算机。
如果模式切换增加了primary surface所需的内存量,系统可能需要从分配给CUDA应用程序的内存中挪用。这种情况下,模式切换会导致任何调用CUDA运行时的操作失败,并返回无效context错误。