我有带有 OpenCL C 内核代码的 PyOpenCL 代码。当我运行我的应用程序时,我发现了分段错误错误。如何使用调试器或其他开发工具调试此类错误?我不知道该怎么做才能找出问题所在。我想到了选项printf
或其他东西,但我想使用更强大的东西。
我相信内核代码中的错误,所以我想先调试内核代码。
UPD。我在 linux(Arch Linux,3.6.11),python 2 或 3,PyOpenCl 2012.1
我有带有 OpenCL C 内核代码的 PyOpenCL 代码。当我运行我的应用程序时,我发现了分段错误错误。如何使用调试器或其他开发工具调试此类错误?我不知道该怎么做才能找出问题所在。我想到了选项printf
或其他东西,但我想使用更强大的东西。
我相信内核代码中的错误,所以我想先调试内核代码。
UPD。我在 linux(Arch Linux,3.6.11),python 2 或 3,PyOpenCl 2012.1
内核调试是一个依赖于实现的事情。在 Linux 上,我发现最好的方法是在 CPU 上使用 AMD 的 CL 实现,使用 -g 编译内核,然后使用 gdb。他们的编程指南中对此进行了说明,如下:
如果您使用的是 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 文件名”标志添加到 build() 中的编译器选项。(如果你的内核在你的程序中只作为一个字符串存在,你可以在运行之前添加代码将它保存到一个文件中。)然后尝试“gdb --args python-cmd”,你可以通过输入“break”开始调试mykernel”,当被问及是否要等待“mykernel”符号被动态加载时回答 Y,然后键入“run”。
一旦你运行调试器手动输入命令,我建议制作一个可执行的 shell 脚本来使用调试器启动你最喜欢的 .py 文件(这也是一个方便的地方,可以在你的应用程序的启动中添加hackery,例如 python -m unittest, PYTHONPATH、virtualenv、LD_LIBRARY_PATH、LD_PRELOAD 等)。
如果不完全测试您的软件套件,我不会贸然下结论。您正在运行PyOpenCl的最新发布版本。有可能您将某些内容传递给未正确填充的模块,并且后端模块在使用未正确填充的内容之前没有进行必要的错误检查(如果没有任何代码,不可能真正帮助您进行调试)提供)
您是否尝试过使用python 调试器import pdb; pdb.set_trace()
在不同的 pyopencl 调用之前设置不同的断点 ( ),甚至查看代码中的段错误?这绝对应该是你的首要任务。当您发现它在哪里出现段错误时,您需要仔细查看 pyopencl 示例/api 以了解您出错的原因。
分段错误通常是因为内核中的内存访问错误。有一个很酷的工具可以检测错误的内存访问,类似于 valgrind:https ://github.com/jrprice/Oclgrind 。结合内核代码中的一些 printfs,它可以更容易地定位问题。