Compiler construction 寄存器和共享内存取决于编译计算能力?

Compiler construction 寄存器和共享内存取决于编译计算能力?,compiler-construction,cuda,nvcc,Compiler Construction,Cuda,Nvcc,嘿,那里, 当我使用nvcc-arch=sm_13编译时,我得到: ptxas info : Used 29 registers, 28+16 bytes smem, 7200 bytes cmem[0], 8 bytes cmem[1] ptxas info : Used 34 registers, 60 bytes cmem[0], 7200 bytes cmem[2], 4 bytes cmem[16] 当我使用nvcc-arch=sm_20时,我得到: ptxas i

嘿,那里, 当我使用nvcc-arch=sm_13编译时,我得到:

ptxas info    : Used 29 registers, 28+16 bytes smem, 7200 bytes cmem[0], 8 bytes cmem[1] 
ptxas info    : Used 34 registers, 60 bytes cmem[0], 7200 bytes cmem[2], 4 bytes cmem[16] 
当我使用nvcc-arch=sm_20时,我得到:

ptxas info    : Used 29 registers, 28+16 bytes smem, 7200 bytes cmem[0], 8 bytes cmem[1] 
ptxas info    : Used 34 registers, 60 bytes cmem[0], 7200 bytes cmem[2], 4 bytes cmem[16] 
我以为所有的内核参数都会被传递到共享内存中,但对于sm_20来说,情况似乎并非如此。。。?! 也许它们也被传递到寄存器中?我的函数的头部如下所示:

__global__ void func(double *, double , double, int)

谢谢你

在compute capability 2.x设备中,内核的参数存储在常量内存中。寄存器的差异可能是由于版本之间为数学库函数生成的代码不同。内核中是否存在超越函数或
sqrt
之类的东西?

正如@talonmies所说,共享内存差异是由于SM 2.x设备通过常量而不是共享内存传递内核参数造成的


然而,SM 2.x设备在寄存器使用方面的一个主要区别是,尽管SM 1.x设备有专用的地址寄存器用于加载和存储指令,但SM 2.x使用通用寄存器用于地址。这会增加SM2.x上的寄存器压力。幸运的是,GF100(SM 2.0)和GT200(SM 1.3)上的寄存器文件也比GT200(SM 2.0)大2倍。

首先感谢有关参数的信息,您对此有任何来源吗?进一步:不,没有数学函数!作为参考,它可能在ptx指南中,但我只能说“一位NVIDIA开发人员告诉我这是真的”。寄存器中另一个可能的差异是指针。指针在compute 1.x设备上使用1个寄存器,在Fermi设备上使用2个寄存器,这是64位InternalyMark,虽然寄存器文件的大小确实是Fermi设备上的两倍,但每个线程的最大寄存器数量也是sm 1.x设备的一半。64寄存器限制经常在我使用的代码中发挥作用。我知道Vasily Volkov也指出了寄存器压力对代码在Fermi卡上实现高水平指令级并行能力的影响。是的,Fermi将每个SM的最大线程数增加50%(1536/1024),删除地址寄存器,将每个线程的最大寄存器数减半,将每个SM的寄存器文件大小增加一倍,并略微增加共享内存访问延迟。这些都增加了对资源使用的敏感性。将寄存器文件加倍会有所帮助,但您是对的,它仍然很紧。但这是大规模并行处理器的现实。当我们设计一个新的GPU时,总会有这样的权衡。但总体而言,费米在架构上比特斯拉架构更高效。