什么样的变量使用CUDA中的寄存器?
在上面的例子中,我猜什么样的变量使用CUDA中的寄存器?,cuda,Cuda,在上面的例子中,我猜x,y,偏移量在 nvcc-Xptxas-v提供4个寄存器,24+16字节smem 探查器显示4个寄存器 以及ptx文件的头部: __global__ void add( int *c, const int* a, const int* b ) { int x = blockIdx.x; int y = blockIdx.y; int offset = x + y * gridDim.x; c[offset] = a[offset] + b[
x
,y
,偏移量
在
- nvcc-Xptxas-v提供
4个寄存器,24+16字节smem
- 探查器显示4个寄存器
- 以及ptx文件的头部:
__global__ void add( int *c, const int* a, const int* b ) { int x = blockIdx.x; int y = blockIdx.y; int offset = x + y * gridDim.x; c[offset] = a[offset] + b[offset]; }
.reg.u16%相对湿度; .reg.u32%r; .reg.u64%rd; loc 15 21 0 $LDWbegin_uuZ3ADDPIpkis1_uu: loc 15 26 0
我不确定我是否正确。PTX中的寄存器分配与内核的最终寄存器消耗完全无关。PTX只是最终机器代码的中间表示形式,并且使用,这意味着PTX中的每个寄存器只使用一次。一块有数百个寄存器的PTX可以编译成一个只有几个寄存器的内核 寄存器分配由
ptxas
完成,作为一个完全独立的编译过程(静态或由驱动程序实时,或两者兼而有之),它可以对输入PTX执行大量代码重新排序和优化,以提高吞吐量和保存寄存器,这意味着原始C中的变量或PTX中的寄存器与汇编内核的最终寄存器计数之间几乎没有关系
nvcc
确实提供了一些方法来影响汇编程序的寄存器分配行为。您可以使用\uuuu launch\u bounds\uuuu
向编译器提供启发性提示,这可能会影响寄存器分配,并且编译器/汇编程序采用-maxrregcount
参数(以寄存器溢出到本地内存的潜在代价为代价,这可能会降低性能)。volatile关键字用于改变基于nvopen64的编译器的旧版本,并可能影响本地内存溢出行为。但是您不能在原始C代码或PTX汇编语言代码中任意控制或控制寄存器分配。PTX中的寄存器分配与内核的最终寄存器消耗完全无关。PTX只是最终机器代码的中间表示形式,并且使用,这意味着PTX中的每个寄存器只使用一次。一块有数百个寄存器的PTX可以编译成一个只有几个寄存器的内核
寄存器分配由ptxas
完成,作为一个完全独立的编译过程(静态或由驱动程序实时,或两者兼而有之),它可以对输入PTX执行大量代码重新排序和优化,以提高吞吐量和保存寄存器,这意味着原始C中的变量或PTX中的寄存器与汇编内核的最终寄存器计数之间几乎没有关系
nvcc
确实提供了一些方法来影响汇编程序的寄存器分配行为。您可以使用\uuuu launch\u bounds\uuuu
向编译器提供启发性提示,这可能会影响寄存器分配,并且编译器/汇编程序采用-maxrregcount
参数(以寄存器溢出到本地内存的潜在代价为代价,这可能会降低性能)。volatile关键字用于改变基于nvopen64的编译器的旧版本,并可能影响本地内存溢出行为。但是您不能在原始C代码或PTX汇编语言代码中任意控制或控制寄存器分配。您的问题是“为什么此代码使用4个寄存器而不是3个?”如果是这样,答案是:为了添加a[offset]
和b[offset]
,必须获取这两个值。它必须在获取另一个时,将首先获取的任何一个存储到某个位置。所以还需要一个寄存器。谢谢你的回答,那么我们可以说中间变量将保存在寄存器中吗?必要时,可以。要知道什么时候需要它并不总是容易的,而且它甚至可以根据硬件目标的不同而变化。明白了吗:-P因为寄存器的使用是复杂的,有没有办法找到内核的寄存器使用边界,因为我想测试寄存器溢出的情况,但是当我试图声明更多的变量时,寄存器的用法保持不变。您的问题是“为什么此代码使用4个寄存器而不是3个?”如果是,答案是:为了添加a[offset]
和b[offset]
,必须获取这两个值。它必须在获取另一个时,将首先获取的任何一个存储到某个位置。所以还需要一个寄存器。谢谢你的回答,那么我们可以说中间变量将保存在寄存器中吗?必要时,可以。要知道什么时候需要它并不总是容易的,而且它甚至可以根据硬件目标的不同而变化。明白了吗:-P因为寄存器的使用是复杂的,有没有办法找到内核的寄存器使用边界,因为我想测试寄存器溢出的情况,但是当我试图声明更多的变量时,寄存器的用法保持不变。非常感谢,Talonmes。所以我想我们对内核中的寄存器使用控制无能为力?编译器总是做很多事情。您可以使用\uuu启动\u边界\uu
向编译器提供启发性提示,这可能会影响寄存器分配,并且编译器/汇编器使用-maxrregcount
参数。volatile
关键字用于改变旧版本的nvopen64编译器,并可能影响本地内存
.reg .u16 %rh<4>;
.reg .u32 %r<9>;
.reg .u64 %rd<10>;
.loc 15 21 0
$LDWbegin__Z3addPiPKiS1_:
.loc 15 26 0