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