PyOpenCl:如何调试分段错误?
我有一段使用PyOpenCL的代码,还有OpenCL C的内核代码。当我运行我的应用程序时,出现了段错误(segmentation fault)。我想知道怎么用调试工具来找出这个错误。我不太清楚该怎么做才能找到问题所在。我在想用printf
这种方法,但我想用更强大的工具。
我觉得问题出在内核代码上,所以我想先调试内核代码。
更新:我在使用Linux(Arch Linux,3.6.11),Python 2或3,PyOpenCL 2012.1。
4 个回答
在没有完全测试你的软件之前,我不会轻易下结论。你正在使用的是最新发布的 PyOpenCl 版本。很可能你传给这个模块的数据没有正确填充,而后台模块在使用这些数据之前没有进行必要的错误检查(如果没有代码可供查看,实际上很难帮助你调试)。
你有没有尝试过使用 python 调试器 来设置不同的断点(import pdb; pdb.set_trace()
),在不同的 pyopencl 调用之前,看看你的代码到底在哪个地方出现了段错误?这绝对应该是你首先要做的事情。当你找到出错的地方后,需要仔细查看 pyopencl 的示例和 API,看看为什么会出错。
如果你在用nvidia的显卡,而不是ATI/AMD的显卡,那么nvidia的OpenCL支持就没那么好。
英特尔为他们的新处理器提供了一个基于CPU的OpenCL开发工具包,你可以在这个链接找到它:http://software.intel.com/en-us/vcsource/tools/opencl-sdk-2013。如果你想在Ubuntu上使用他们提供的RPM包,你需要对每个包运行“fakeroot alien --to-deb”,然后再用“dpkg -i”来安装。
使用这个开发工具包时,你需要在build()的编译选项中加上“-g”和“-s filename”这两个参数。(如果你的内核只是在程序中作为字符串存在,你可以在运行之前加一些代码把它保存到文件里。)然后试试“gdb --args python-cmd”,你可以通过输入“break mykernel”来开始调试,当系统问你是否要等待“mykernel”符号动态加载时,输入Y,然后再输入“run”。
一旦你手动输入命令让调试器运行,我建议你做一个可执行的shell脚本来启动你喜欢的.py文件,这样也方便你在启动应用时加一些额外的设置,比如python -m unittest、PYTHONPATH、virtualenv、LD_LIBRARY_PATH、LD_PRELOAD等。
内核调试是一件跟具体实现有关的事情。在Linux系统上,我发现最好的方法是使用AMD的CL实现,先在CPU上编译内核时加上-g这个选项,然后用gdb工具进行调试。他们在编程指南里有详细的说明,链接在这里: