__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 registers, 24+16 bytes 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 资源足够并发内核。
我不确定我是否正确。