2

如果我在 GPU 内核中使用许多变量,这些变量会驻留在全局内存中吗?那么读写局部变量需要访问全局内存吗?

GPU内核中变量数量的典型限制是什么,以便变量驻留在寄存器中?

谢谢,山姆

4

2 回答 2

4

快速回答:是的。典型限制?如果您想达到 0.5 左右的占用率,则每个线程大约需要 32-64 个寄存器,具体取决于架构。

更长一点的答案: 请记住,寄存器的数量与“局部变量的数量”并不完全相同。这是因为,在给定时间,您通常不需要所有局部变量,编译器会尝试重用寄存器。您最终可能会将多个变量映射到同一个寄存器。

其次,即使您用完了寄存器空间,编译器也会尝试将这些值溢出到很少使用的全局内存中。通常在您的代码中很少有寄存器溢出并不是那么耗时。此外,这些寄存器溢出会导致完全对齐的全局内存访问模式。

如果您想知道每个内核正在使用多少寄存器和(溢出的)本地内存,请添加--ptxas-options=-v到您的编译参数中。

于 2013-01-17T07:15:32.740 回答
3

在 CUDA 安装目录中有一个 CUDA GPU 占用计算器。

cuda-5.0/tools/CUA_Occupancy_Calculator.xls

它可以显示硬件资源(线程/块、寄存器、共享内存)和 warp 占用率之间的关系,以及不同 GPU 计算能力的物理限制。

于 2013-01-17T05:45:50.120 回答