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 в коде ядра это немного упрощает локализацию проблемы.