__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
被保存在寄存器中而什么样的变量消耗CUDA中的寄存器?
NVCC -Xptxas -v给出
4 registers, 24+16 bytes smem
分析器显示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资源足够用于并发内核。
我不知道我是否正确。
是你的问题“为什么这个代码使用4个寄存器而不是3个?”如果是这样,答案是这样的:为了添加'a [offset]'和'b [offset]',必须获取这两个值。它必须存储它在第一次获取到的第一个地方,而它正在获取另一个地方。所以还需要一个寄存器。 – 2012-07-14 12:20:43
谢谢您的回答,那么我们可以说中间变量将被保存在寄存器中吗? – user1525320 2012-07-14 12:37:46
必要时,是的。在需要的时候并不总是很容易辨别,甚至可能因硬件目标而异。 – 2012-07-14 12:38:15