CUDA到处都有大量的文档和指南,但是我一直找不到的任何形式的指令,就是如何诊断已编译但又得到模糊,模糊的错误消息的内核,例如“未指定的启动失败”。正常的“这些块/网格结构有意义吗?”等等
我可以以某种方式截取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
我什至不必解释该错误信息...
最佳答案
在CUDA中,“未指定的启动失败”等同于段错误。
最新的工具包版本附带一个名为cuda-memcheck的实用程序。它对执行中的内核内部的内存事务执行类似于valgrind的分析,并将报告缓冲区溢出或内核中任何非法指针的使用。您可以将其用作进一步分析的起点。如果您使用的是Fermi卡,则还提供内核内printf支持,不难生成自己的assert函数来测试和报告内核中的错误情况。
CUDA还附带了源代码级调试器,但是您需要专用的GPU才能使用它。如果您使用的是Linux,并且只有一个GPU,请退出X11,然后从控制台TTY运行它。
关于profiling - 诊断CUDA内核问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5687506/