Cuda:解决资源不足问题

标签 cuda

内核使用:( --ptxas-options=-v )
0 字节堆栈帧、0 字节溢出内存、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 寄存器、每个 block 最多 1024 个线程、comp 能力 2.1 (sm_21)

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

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

最佳答案

当我进行 reg 计数时,我注释掉了 printf。注册数= 45
当它运行时,它有 printf 的编码。寄存器计数 = 63,有大量溢出“寄存器”。
我怀疑每个线程确实有 64 个寄存器,但只有 63 个可供程序使用。
64 个寄存器 * 512 个线程 = 32K - 单个 block 可用的最大值。

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

看起来我的寄存器空间已经用完了。

关于Cuda:解决资源不足问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12322648/

相关文章:

cuda - CUDA 使用解释器还是编译器?

cuda - 在关于warp同步线程执行工作原理的直觉上挣扎

c++ - 如何将 "linearize"变成树形结构?

c++ - CUDA 5.5启动内核函数报错

c++ - 常量内存符号作为类的静态属性

从全局函数调用设备函数

ubuntu - 尝试从全新安装运行 CUDA 示例只会打印 "make: Nothing to be done for ` all'"

CUDA:CPU 代码与 GPU 代码并行

linux - nvcc 从命令行而不是从 shell 运行

cuda - PTX - 什么是 CTA?