诊断 CUDA 内核问题

Posted

技术标签:

【中文标题】诊断 CUDA 内核问题【英文标题】:Diagnosing CUDA Kernel problems 【发布时间】:2011-04-16 15:26:40 【问题描述】:

CUDA 到处都有大量文档和指南,但我一直找不到任何形式的说明,说明如何诊断可编译但得到神秘、模糊错误消息的内核,例如“未指定的启动”超出正常范围的失败“这些块/网格结构有意义吗?”等等。

我能否以某种方式截取 cubin 文件并对内存结构等进行一些静态分析?原谅我的菜鸟,但我在任何地方都找不到任何权威的白痴指南。

祝大家周末愉快。

我在寻找什么

如何分离出cubin中间文件 之后如何处理它以了解发生了什么,特别是寄存器和内存配置,以查看我的代码是否违反任何硬件要求,或者我是否只是在某处遗漏了一个错误。李>

对于以后遇到此问题的任何人(我似乎有创建 SO 问题的习惯,这些问题几个月后会继续出现在我自己的查询中......)CUDA-Memcheck 提供了比“检查错误”处理程序更有趣的响应。例如

========= Error: process didn't terminate successfully
========= Invalid __global__ write of size 4
=========     at 0x00000040 in decomp
=========     by thread (1,0,0) in block (0,0,0)
=========     Address 0x00101024 is out of bounds
=========
========= ERROR SUMMARY: 1 error

我什至不必解释那个错误信息...

【问题讨论】:

所以我想我们回答了第 1 部分,即 CUBIN 文件。第 2 部分可能取决于您正在做什么。你能举一个具体的例子来说明你遇到这些错误的场景吗? 【参考方案1】:

在 CUDA 中,“未指定的启动失败”相当于段错误。

最近的工具包版本附带了一个名为 cuda-memcheck 的实用程序。它对执行内核中的内存事务执行类似 valgrind 的分析,并将报告缓冲区溢出或内核中的任何非法指针使用。您可以将其用作进一步分析的起点。如果您使用的是 Fermi 卡,内核中也有 printf 支持,生成您自己的断言函数来测试和报告内核中的错误情况并不难。

CUDA 还附带源代码级调试器,但您需要专用 GPU 才能使用它。如果您使用的是 linux 并且只有一个 GPU,请退出 X11 并从控制台 TTY 运行它。

【讨论】:

我将此称为“答案”,因为它很容易指出我的问题的根源,但是每个人的答案和 cmets 都非常有帮助。【参考方案2】:

如果您设置 Keep Preprocessed Files 标志 --keep 这将留下 CUBIN 文件和许多其他文件供您查看。但我不确定这会有多大帮助。

【讨论】:

谢谢,但我想我想知道我能用它们做什么(如上所述,我不是这方面的专家......) @Andrew Bolster:您可以反汇编 CUBIN 文件以查看卡上运行的最终机器代码,但在这种情况下,这不是您想要的。【参考方案3】:

你在使用 cudaGetLastError() 吗?如果它尚未用于给出“未指定的启动失败”,这可能有助于提供更多信息。

【讨论】:

感谢您的回答;但是,是的,这就是我从中获取当前信息的地方:)

以上是关于诊断 CUDA 内核问题的主要内容,如果未能解决你的问题,请参考以下文章

在 CUDA 内核中访问 2D 数据

cuda内核for循环中的Break语句给出了问题

同一 GPU 上的 OpenCL 和 CUDA 内核

cuda cpu 函数 - gpu 内核重叠

多个进程并行启动 CUDA 内核

CUDA 内核中的中值选择