CUDA在哪里为内核分配堆栈帧?

rit*_*ter 6 stack cuda

我的内核调用因"内存不足"而失败.它大量使用了堆栈框架,我想知道这是否是它失败的原因.

使用--ptxas-options = -v调用nvcc时,它会打印以下配置文件信息:

    150352 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info    : Used 59 registers, 40 bytes cmem[0]
Run Code Online (Sandbox Code Playgroud)

硬件:GTX480,sm20,1.5GB设备内存,48KB共享内存/多处理器.

我的问题是分配的堆栈帧在哪里:在共享,全局内存,常量内存,......?

我尝试了每个块1个线程,以及每个块32个线程.同样"内存不足".

另一个问题:如果寄存器的总数不超过多处理器上的可用寄存器数(我的卡为32k),则只能扩大驻留在一个多处理器上的线程数.类似的东西是否适用于堆栈帧大小?

Gre*_*ith 8

堆栈在本地内存中分配.分配是每个物理线程(GTX480:15个SM*1536线程/ SM = 23040个线程).您正在请求150,352字节/线程=> ~3.4 GB的堆栈空间.如果大小很高,CUDA可能会减少每次启动时的最大物理线程数.CUDA语言的设计并不是每个线程堆栈都很大.

就寄存器而言,GTX480每个线程限制为63个寄存器,每个SM限制为32K寄存器.

  • 堆栈帧在本地存储器中分配是正确的.本地存储器驻留在片外设备存储器中,这使得对它的访问(如果没有缓存)变慢.但是,在这种情况下引用1536个线程/ SM是不正确的并且具有误导性.内核启动所需的本地内存总量取决于网格中的线程总数,而不是每个SM允许的最大线程数,因此取决于运行时. (3认同)