如果我在 GPU 内核中使用许多变量,这些变量会驻留在全局内存中吗?那么读写局部变量需要访问全局内存吗?
GPU内核中变量数量的典型限制是什么,以便变量驻留在寄存器中?
谢谢,山姆
快速回答:是的。典型限制?如果您想达到 0.5 左右的占用率,则每个线程大约需要 32-64 个寄存器,具体取决于架构。
更长一点的答案: 请记住,寄存器的数量与“局部变量的数量”并不完全相同。这是因为,在给定时间,您通常不需要所有局部变量,编译器会尝试重用寄存器。您最终可能会将多个变量映射到同一个寄存器。
其次,即使您用完了寄存器空间,编译器也会尝试将这些值溢出到很少使用的全局内存中。通常在您的代码中很少有寄存器溢出并不是那么耗时。此外,这些寄存器溢出会导致完全对齐的全局内存访问模式。
如果您想知道每个内核正在使用多少寄存器和(溢出的)本地内存,请添加--ptxas-options=-v
到您的编译参数中。
在 CUDA 安装目录中有一个 CUDA GPU 占用计算器。
cuda-5.0/tools/CUA_Occupancy_Calculator.xls
它可以显示硬件资源(线程/块、寄存器、共享内存)和 warp 占用率之间的关系,以及不同 GPU 计算能力的物理限制。