__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];
}
在上面的示例中,我猜想x
、y
和offset
被保存在寄存器中,而nvcc -Xptxas -v显示有4个寄存器,24+16字节的smem
,profiler也显示了4个寄存器,ptx文件的开头是:.reg .u16 %rh<4>;
.reg .u32 %r<9>;
.reg .u64 %rd<10>;
.loc 15 21 0
$LDWbegin__Z3addPiPKiS1_:
.loc 15 26 0
能否有人澄清寄存器的使用?在Fermi中,每个线程的最大寄存器数量为63。在我的程序中,我想测试当内核消耗过多寄存器时的情况(因此变量可能必须自动存储在本地内存中,从而导致性能降低)。然后在这一点上,我可以将一个内核拆分成两个,使每个线程都有足够的寄存器。假设SM资源足以支持并发内核。我不确定我是否正确。
a[offset]
和b[offset]
相加,必须获取这两个值。在获取另一个值时,必须将其先获取的值存储在某个地方。因此需要一个额外的寄存器。 - David Schwartz