如果我在GPU内核中使用了很多局部变量,变量会驻留在全局内存中吗?

时间:2013-01-17 05:08:25

标签: cuda gpu nvidia

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

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

谢谢, 山姆

2 个答案:

答案 0 :(得分:4)

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

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

其次,即使您的寄存器空间不足,编译器也会尝试将这些值溢出到很少使用的全局内存中。通常,代码中的寄存器溢出很少, 耗时。此外,这些寄存器泄漏导致完全一致的全局存储器访问模式。

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

答案 1 :(得分:3)

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

cuda-5.0/tools/CUA_Occupancy_Calculator.xls

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