我有一个三维模具计算运行在开普勒cc3.0。我使用的CUDA块大小为32x4x4,这是512个线程。
不过,有些事很奇怪。只有当我将问题的大小增加到L=128或更高的时候,我才会从内核中的第一行代码中读取错误的值,并且总是以2的幂进行正确填充。在cc3.0开普勒上,每个线程的最大寄存器数量是63,我想。Ptxas输出告诉
ptxas info : Compiling entry function '_Z17kernel_metropolisiiPiS_PfffS_i' for 'sm_30'
ptxas info : Function properties for _Z17kernel_metropolisiiPiS_PfffS_i
16 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 48 registers, 8160 bytes smem, 372 bytes cmem[0], 8 bytes cmem[2]它显示48个寄存器,这是很好的。但是,如果我在内核前面添加了一些代码行,程序将内核编译成45个寄存器,那么内存读取就可以了。
如果选择L=32或L=64,则不会出现此问题,在这些情况下,结果是完美的。我真的不确定这是寄存器问题还是其他问题,因为据我所知,每个线程的寄存器问题不应该通过更改问题大小出现/取消,因为它取决于块配置,当然,内核代码也是这样吗?
一个方向,从哪里开始寻找是好的,足以让我自己去我自己的细节。提前谢谢。
发布于 2014-06-01 06:34:22
内核的问题不是每个线程注册问题,而是下面的行:
int tid = z*L*L/2 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;这应该是:
int tid = z*L*L/4 + (blockIdx.y * BY/2 + threadIdx.y)*L + x;这个错误超出了随机数生成器向量的访问权限,并导致发生了一系列不幸事件。
这是非常棘手的,因为库达-模查没有检测到错误。
https://stackoverflow.com/questions/23967346
复制相似问题