Cuda:追逐资源不足的问题

时间:2012-09-07 17:19:31

标签: cuda

内核使用:(--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的数量超过一半,内核将不会启动。这可能只是巧合,但我对此表示怀疑。

  1. 为什么我不能使用完整的线程块(1024)?
  2. 我猜测哪个资源用完了?
  3. 我经常想知道在warp之间陷入停滞的线程数据/状态的位置。这些资源有哪些?

1 个答案:

答案 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,是硬件寻址限制。

所以看起来我的寄存器空间不足了。