cuda-gdb和cuda-memcheck的手册提到了上面的CUDA_EXCEPTION_9:“Warp Hardware Stack Overflow”但是我还没有找到进一步的细节;两本手册中唯一的评论是
“当warp中的任何线程触发硬件堆栈溢出时会发生这种情况。这应该是罕见的。”
在我的情况下,当我尝试通过malloc()在设备上动态分配内存(处理同一组数据!)时,有时(!?)会发生。尝试malloc()0字节(已修复错误)反复导致相同的异常。
在什么情况下,究竟是什么造成了这种例外;它表明了什么,如何解决/规避它?
非常感谢
答案 0 :(得分:1)
Fermi GPU上的堆栈溢出与任何其他设备上的堆栈溢出没有什么不同。每个线程在启动时从全局内存中获取静态堆栈和堆分配。如果通过过度递归耗尽堆栈,分配更多可用堆内存,或尝试在存储在堆内存中的任何变量上运行超出范围,则会生成保护错误,并且您将收到报告的堆栈溢出错误。从你的问题,我猜你通过设备端malloc调用耗尽了可用的每线程堆空间。
CUDA运行时API包括用于管理堆栈和堆内存cudaDeviceSetLimit和cudaDeviceGetLimit的函数。通过这些,您可以检查运行时给出的每个线程的堆栈,堆和printf
FIFO,并尝试增加堆和堆栈大小以查看问题是否消失。