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

时间:2011-10-18 16:41:28

标签: cuda stack

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

使用--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]

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

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

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

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

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:0)

堆栈帧很可能在本地内存中。

我认为本地内存使用有一些限制,但即使没有它,我认为CUDA驱动程序可能会分配更多的本地内存,而不仅仅是你的<<<<<>>>中的一个线程。启动配置。

不管怎样,即使您设法实际运行代码,我担心由于所有这些堆栈操作,它实际上可能非常慢。尽量减少函数调用的数量(例如,通过内联这些函数)。