内核使用:(--ptxas-options=-v
)
0字节堆栈帧,0字节溢出sotes,0字节溢出负载
ptxas info:使用45个寄存器,49152 + 0字节smem,64字节cmem [0],12字节cmem [16]
使用:kernelA<<<20,512>>>(float parmA, int paramB);
启动,运行正常
使用:kernelA<<<20,513>>>(float parmA, int paramB);
启动,它会导致资源不足错误。 (要求启动的资源太多)。
Fermi器件属性:每个SM共享内存48KB,常量内存64KB,每个SM 32K寄存器,每块1024个最大线程,兼容2.1(sm_21)
我正在使用我所有的共享内存空间。 我将耗尽大约700个线程/块的块寄存器空间。如果我要求MAX_threads / block的数量超过一半,内核将不会启动。这可能只是巧合,但我对此表示怀疑。
答案 0 :(得分:2)
当我进行reg计数时,我注释掉了printf。 Reg count = 45
当它运行时,它有printf的编码。 Reg count = 63 w /大量泄漏“reg's”
我怀疑每个帖子确实有64个reg,只有63个可用于该程序
64 reg * 512个线程= 32K - 单个块可用的最大值。
所以我建议将一个可用的“代码”注册到块= cudaDeviceProp :: regsPerBlock - blockDim,即内核无法访问所有32K寄存器。 编译器目前将每个线程的reg的数量限制为63,(或者它们溢出到lmem)。我怀疑这63,是硬件寻址限制。
所以看起来我的寄存器空间不足了。