2012-09-07 40 views
2

内核使用:(--ptxas-options=-v
0字节堆栈帧,0字节溢出索特斯,0字节溢出负载
ptxas信息:用于45个寄存器,49152 + 0字节SMEM,64个字节cmem [0],12字节cmem [16]Cuda的:追逐不足资源问题

发射:kernelA<<<20,512>>>(float parmA, int paramB);它会运行良好。
推出:kernelA<<<20,513>>>(float parmA, int paramB);它会消除资源错误。 (请求发射的资源太多)。

费米设备属性:48KB每SM共享MEM,MEM恒定64KB的,32K每SM寄存器,每块1024个最大线程,能够补偿2.1(sm_21)

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

  1. 为什么我不能使用完整的线程块(1024)?
  2. 任何猜测我将用尽哪些资源?
  3. 我经常想知道在经线之间停顿的线程数据/状态在哪里。什么资源持有这些?
+0

这是在运行什么硬件?什么CUDA工具包版本? – talonmies

+0

HW:properties.name = Quadro 20000M工具包:nvcc -version = Cuda编译工具,版本4.1,V0.2.1221 – Doug

+0

似乎没有多少块,或多少共享我使用的内存。 – Doug

回答

2

当我做了注册计数,我注释了printf的。 Reg count = 45
当它运行时,它有printf的编码。注册计数= 63瓦特/大量溢出“注册”。
我怀疑每个线程真的有64个reg,只有63个程序可用。
64个寄存器* 512个线程= 32K - 单个块可用的最大值。

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

所以看起来我已经没有空间了。

+0

您对Fermi上每个线程63个寄存器的硬件限制是正确的。 –