2

内核使用: ( --ptxas-options=-v)
0 字节堆栈帧,0 字节溢出 sotes,0 字节溢出加载
ptxas 信息:使用 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 个线程,comp 能力 2.1 (sm_21)

我正在使用我所有的共享内存空间。我将用完大约 700 个线程/块的块寄存器空间。如果我要求超过一半的 MAX_threads/block 数,内核将不会启动。这可能只是巧合,但我对此表示怀疑。

  1. 为什么我不能使用完整的线程块 (1024)?
  2. 猜猜我用完了哪个资源?
  3. 我经常想知道停滞的线程数据/状态在扭曲之间去哪里。什么资源拥有这些?
4

1 回答 1

2

当我进行注册计数时,我注释掉了 printf 的。Reg count= 45
当它运行时,它已经对 printf 进行了编码。注册数 = 63 w/大量溢出“注册”。
我怀疑每个线程确实有 64 个 reg,程序只有 63 个可用。
64 reg * 512 个线程 = 32K - 单个块可用的最大值。

因此,我建议将可用“代码” reg 的数量设置为 block = cudaDeviceProp::regsPerBlock - blockDim,即内核无法访问所有 32K 寄存器。编译器当前将每个线程的 reg 数限制为 63,(或者它们溢出到 lmem)。我怀疑这 63 是硬件寻址限制。

所以看起来我的寄存器空间用完了。

于 2012-09-07T21:26:30.607 回答