PyOpenCl: как отладить ошибку сегментации?
У меня есть код PyOpenCL с кодом ядра OpenCL C. Когда я запускаю свое приложение, я обнаруживаю ошибку сбоя сегментации. Как отлаживать такую ошибку с помощью некоторого отладчика или какого-либо другого средства разработки? Я не знаю, что именно нужно сделать, чтобы выяснить проблему. Я имею в виду вариант с printf
или что-то, но я хочу использовать более мощный материал.
Я считаю, что ошибка в коде ядра, поэтому я хочу сначала отлаживать код ядра.
UPD. Я на Linux (Arch Linux, 3.6.11), python 2 или 3, PyOpenCl 2012.1
Ответы
Ответ 1
Отладка ядра - дело, зависящее от реализации. В Linux лучшее, что я нашел, это использовать реализацию AMD CL на процессоре, скомпилировать ядро с -g и использовать gdb. У них есть инструкции по этому поводу в руководстве по программированию:
Страница документации AMD CL
Ответ 2
Если вы используете nvidia вместо ATI/AMD GPU, поддержка OpenCL в SDK nvidia... меньше желаемого.
Intel предоставляет OpenCL SDK на базе процессоров для своих последних процессоров, см. http://software.intel.com/en-us/vcsource/tools/opencl-sdk-2013 - (для использования пакетов RPM, которые они предоставляют на Ubuntu, вам нужно запустить "fakeroot alien -to-deb" на каждом пакете, затем "dpkg -i" ).
С помощью этого SDK вам нужно добавить флаги "-g" и "-s filename" в параметры компилятора в build(). (Если ваше ядро существует только как строка в вашей программе, вы можете добавить код, чтобы сохранить его в файле непосредственно перед его запуском.) Затем попробуйте "gdb -args python-cmd", вы можете начать отладку, набрав "break" mykernel ", ответьте Y, когда вас спросят, хотите ли вы ожидать динамического загрузки символа" mykernel ", затем введите" run ".
Как только у вас будет отладчик, выполняющий ручную ввод команды, я предлагаю сделать исполняемую оболочку script для запуска вашего любимого файла .py с помощью отладчика (что также будет удобным местом для добавления хакера в ваш запуск приложения, например python -m unittest, PYTHONPATH, virtualenv, LD_LIBRARY_PATH, LD_PRELOAD и т.д.).
Ответ 3
Я бы не стал делать выводы без полной проверки вашего программного пакета. Вы используете последнюю выпущенную версию PyOpenCl. Скорее всего, вы передаете что-то в модуль, который не заполняется правильно, и модуль backend не выполняет необходимую проверку ошибок перед тем, как использовать что-то, что неправильно заполнено (невозможно действительно помочь вам отлаживать без какого-либо кода доступный)
Вы пытались использовать отладчик python, чтобы установить разные точки останова (import pdb; pdb.set_trace()
) прямо перед разными вызовами pyopencl, чтобы даже увидеть, где в вашем коде он неисправен? Это определенно будет вашей первой задачей. Когда вы узнаете, где это происходит, вам нужно внимательно посмотреть на примеры pyopencl/api, чтобы понять, почему вы ошибались.
Ответ 4
Ошибка сегментации, как правило, из-за плохого доступа к памяти в вашем ядре. Существует отличный инструмент для обнаружения неудачных обращений к памяти, аналогичный valgrind: https://github.com/jrprice/Oclgrind. В сочетании с некоторыми printfs в коде ядра это немного упрощает локализацию проблемы.