cuda-gdb:“CUDA_EXCEPTION_9:Warp Hardware Stack Overflow”的含义/出现

Posted

技术标签:

【中文标题】cuda-gdb:“CUDA_EXCEPTION_9:Warp Hardware Stack Overflow”的含义/出现【英文标题】:cuda-gdb: Meaning/occurence of "CUDA_EXCEPTION_9: Warp Hardware Stack Overflow" 【发布时间】:2011-08-30 19:44:10 【问题描述】:

cuda-gdb 和 cuda-memcheck 的手册提到了上述 CUDA_EXCEPTION_9: "Warp Hardware Stack Overflow" 但我无法找到更多详细信息;两本手册中唯一的注释是

“当扭曲中的任何线程触发硬件堆栈溢出时会发生这种情况。这应该很少发生。”

在我的情况下,当我尝试通过 malloc() 动态分配设备上的内存(处理同一组数据!)时,有时会发生(!?)。尝试 malloc() 0 字节(错误已修复)反复导致相同的异常。

在什么情况下究竟是什么导致了这个异常;它表示什么,如何解决/规避它?

非常感谢

【问题讨论】:

【参考方案1】:

Fermi GPU 上的堆栈溢出与任何其他设备上的堆栈溢出没有什么不同。每个线程在启动时从全局内存中获取静态堆栈和堆分配。如果您通过过度递归耗尽堆栈,分配更多可用堆内存,或尝试对存储在堆内存中的任何变量进行越界操作,则会生成保护错误,并且您将报告堆栈溢出错误。根据您的问题,我猜您正在通过设备端 malloc 调用耗尽可用的每线程堆空间。

CUDA 运行时 API 包括用于管理堆栈和堆内存的函数 cudaDeviceSetLimit 和 cudaDeviceGetLimit。使用这些,您可以检查运行时为每个线程提供了多少堆栈、堆和printf FIFO,并尝试增加堆和堆栈大小以查看您的问题是否消失。

【讨论】:

以上是关于cuda-gdb:“CUDA_EXCEPTION_9:Warp Hardware Stack Overflow”的含义/出现的主要内容,如果未能解决你的问题,请参考以下文章

cuda-gdb 在 Linux 上的 nsight 中不起作用

如何将 cuda-gdb 与使用 nvcc 编译的静态库的 g++ 链接程序一起使用?

CUDA 核函数调试:cuda-gdb,cuda printf, cuda assert 读书笔记

CUDA 中大小为 4 的非法写入

“CudaLaunch返回(0x9)”,以及程序计时问题