我有使用OpenCL C内核代码的PyOpenCL代码。我运行我的应用程序时捕获分段错误错误。如何使用某些调试器或其他一些开发工具调试此类错误?我不知道究竟要做什么来找出问题所在。我想到printf
或其他什么选项,但我想要使用更强大的东西。
我相信内核代码中的错误,所以我想先调试内核代码。
UPD。我在linux(Arch Linux,3.6.11),python 2或3,PyOpenCl 2012.1
答案 0 :(得分:4)
内核调试是依赖于实现的事务。在Linux上,我发现最好的是在CPU上使用AMD的CL实现,用-g编译内核,并使用gdb。他们在编程指南中有相关说明,在这里:
答案 1 :(得分:4)
如果你使用的是nvidia而不是ATI / AMD GPU,那么nvidia SDK中的OpenCL支持就会低于预期。
英特尔为他们最近的处理器提供了基于CPU的OpenCL SDK,请参阅http://software.intel.com/en-us/vcsource/tools/opencl-sdk-2013 - (要使用他们在Ubuntu上提供的RPM软件包,你需要在每个处理器上运行“fakeroot alien --to-deb”包,然后“dpkg -i”)。
使用该SDK,您需要将“-g”和“-s filename”标志添加到build()中的编译器选项中。 (如果您的内核仅作为程序中的字符串存在,您可以在运行之前添加代码将其保存到文件中。)然后尝试“gdb --args python-cmd”,您可以通过键入“break”来开始调试mykernel“,当被问到是否要等待”mykernel“符号动态加载时,回答Y,然后输入”run“。
一旦你手动输入调试器输入命令,我建议制作一个可执行的shell脚本,用调试器启动你最喜欢的.py文件(这也是一个方便的地方,为你的应用程序的启动添加hackery,例如python - m unittest,PYTHONPATH,virtualenv,LD_LIBRARY_PATH,LD_PRELOAD等。)
答案 2 :(得分:1)
如果不对软件套件进行全面测试,我就不会得出结论。您正在运行PyOpenCl的最新发布版本。您可能正在将某些内容传递给未正确填充的模块,并且后端模块在使用未正确填充的内容之前未执行必要的错误检查(无法在没有任何代码的情况下真正帮助您进行调试提供)
您是否尝试使用python debugger在不同的pyopencl调用之前设置不同的断点(import pdb; pdb.set_trace()
),甚至可以看到代码中的哪些是seg faulting?这绝对是你的第一个任务。当你发现它是seg faulting的位置时,你需要仔细查看pyopencl examples / api,看看为什么你出错了。