【发布时间】:2012-07-14 11:18:11
【问题描述】:
__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 smemprofiler 显示 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],必须获取这两个值。它必须将它首先获取的任何一个存储在某个地方,同时它正在获取另一个。所以还需要一个寄存器。 -
感谢您的回答,那么我们可以说中间变量将保存在寄存器中吗?
-
必要时可以。判断何时需要这样做并不总是那么容易,甚至会因硬件目标而异。
-
知道了:-P 因为寄存器的使用很复杂,有没有办法找到内核寄存器使用的边界,因为我想测试寄存器溢出的情况,但是当我尝试声明更多变量,寄存器用法保持不变。
标签: cuda