У меня есть программа MPI, которая компилируется и запускается, но я хотел бы пройти через нее, чтобы убедиться, что ничего странного не происходит. В идеале мне нужен простой способ присоединить GDB к какому-либо конкретному процессу, но я не совсем уверен, возможно ли это и как это сделать. Альтернативой может быть запись отладочного вывода каждого процесса в отдельный файл журнала, но на самом деле это не дает такой же свободы, как отладчик.
Есть ли подходы лучше? Как вы отлаживаете программы MPI?
Я нашел gdb весьма полезным. Я использую это как
Это запускает окна xterm, в которых я могу делать
обычно работает нормально
Вы также можете упаковать эти команды вместе, используя:
источник
<file>
и передав их-x <file>
в gdb.Многие из публикаций здесь посвящены GDB, но не упоминают, как подключиться к процессу из запуска. Очевидно, ко всем процессам можно прикрепить:
Но это крайне неэффективно, так как вам придется подскакивать, чтобы запустить все ваши процессы. Если вы просто хотите отладить один (или небольшое количество) MPI-процесса, вы можете добавить его как отдельный исполняемый файл в командной строке с помощью
:
оператора:Теперь только один из ваших процессов получит GDB.
источник
Как уже упоминалось, если вы работаете только с несколькими процессами MPI, вы можете попробовать использовать несколько сеансов gdb , грозный valgrind или создать собственное решение printf / logging.
Если вы используете больше процессов, чем это, вам действительно понадобится правильный отладчик. В разделе часто задаваемых вопросов OpenMPI рекомендуются как Allinea DDT, так и TotalView .
Я работаю на ДДТ Аллинея . Это полнофункциональный графический отладчик исходного кода, так что да, вы можете:
...и так далее. Если вы использовали Eclipse или Visual Studio, вы будете как дома.
Мы добавили несколько интересных функций специально для отладки параллельного кода (будь то MPI, многопоточный или CUDA):
Скалярные переменные автоматически сравниваются во всех процессах: (источник: allinea.com )
Вы также можете отслеживать и фильтровать значения переменных и выражений по процессам и времени:
Он широко используется среди 500 лучших сайтов HPC, таких как ORNL , NCSA , LLNL , Jülich et. и др.
Интерфейс довольно шустрый; мы рассчитали пошаговое выполнение и объединение стеков и переменных 220 000 процессов за 0,1 с в рамках приемочного тестирования кластера Jaguar в Ок-Ридже.
@tgamblin упомянул превосходный STAT , который интегрируется с Allinea DDT , как и несколько других популярных проектов с открытым исходным кодом.
источник
http://valgrind.org/ nuf сказал
Более конкретная ссылка: Отладка параллельных программ MPI с помощью Valgrind
источник
Если вы
tmux
пользователь, вам будет очень комфортно пользоваться скриптом Бенедикта Морбаха :tmpi
Первоисточник:
https://github.com/moben/scripts/blob/master/tmpiФорк: https://github.com/Azrael3000/tmpi
С его помощью у вас есть несколько панелей (количество процессов), все синхронизированные (каждая команда копируется на все панели или процессы одновременно, поэтому вы экономите много времени по сравнению с
xterm -e
подходом). Более того, вы можете знать значения переменных в процессе, который вы хотите, просто выполняяprint
без перехода на другую панель, это будет печатать на каждой панели значения переменной для каждого процесса.Если вы не являетесь
tmux
пользователем, я настоятельно рекомендую попробовать и посмотреть.источник
http://github.com/jimktrains/pgdb/tree/master - это утилита, которую я написал для этого. Есть несколько документов, и не стесняйтесь писать мне в личку, если у вас возникнут вопросы.
Вы в основном вызываете Perl-программу, которая обертывает GDB и направляет его ввод-вывод на центральный сервер. Это позволяет GDB работать на каждом хосте, а вам получать к нему доступ на каждом хосте с терминала.
источник
Использование
screen
вместе сgdb
для отладки приложений MPI прекрасно работает, особенно еслиxterm
он недоступен или вы имеете дело с несколькими процессорами. При сопутствующем поиске stackoverflow было много подводных камней, поэтому я воспроизведу свое решение полностью.Во-первых, добавьте код после MPI_Init, чтобы распечатать PID и остановить программу, чтобы ждать, пока вы присоединитесь. Стандартное решение кажется бесконечным циклом; В конце концов я остановился на том
raise(SIGSTOP);
, чтоcontinue
для выхода из gdb требуется дополнительный вызов .После компиляции запустите исполняемый файл в фоновом режиме и перехватите stderr. Затем вы можете
grep
использовать файл stderr для некоторого ключевого слова (здесь буквальный PID), чтобы получить PID и рейтинг каждого процесса.Сессия gdb может быть присоединена к каждому процессу с помощью
gdb $MDRUN_EXE $PID
. Выполнение этого в рамках сеанса экрана обеспечивает легкий доступ к любому сеансу gdb.-d -m
запускает экран в отсоединенном режиме,-S "P$RANK"
позволяет вам присвоить экрану имя для облегчения доступа позже, а-l
опция bash запускает его в интерактивном режиме и предотвращает немедленный выход из gdb.После того, как gdb запустился на экранах, вы можете выполнить ввод сценария для экранов (чтобы вам не приходилось вводить каждый экран и вводить одно и то же) с помощью команды screen
-X stuff
. В конце команды требуется перевод строки. Здесь к экранам можно получить доступ,-S "P$i"
используя ранее указанные имена. Параметр-p 0
важен, иначе команда периодически завершается ошибкой (в зависимости от того, подключены ли вы ранее к экрану).На этом этапе вы можете присоединиться к любому экрану с помощью
screen -rS "P$i"
и отсоединить с помощьюCtrl+A+D
. Команды можно отправлять во все сеансы gdb по аналогии с предыдущим разделом кода.источник
Также есть мой инструмент с открытым исходным кодом, padb, который помогает в параллельном программировании. Я называю это «Инструмент проверки работы», поскольку он работает не только как отладчик, но также может функционировать, например, как параллельная программа, подобная верхней. Запустите в режиме «Полный отчет», он покажет вам стек трассировки каждого процесса в вашем приложении вместе с локальными переменными для каждой функции по каждому рангу (при условии, что вы скомпилированы с -g). Он также покажет вам «очереди сообщений MPI», то есть список ожидающих отправки и получения для каждого ранга в задании.
Помимо отображения полного отчета, также можно указать padb увеличивать отдельные фрагменты информации в задании. Существует множество опций и элементов конфигурации для управления отображаемой информацией. Подробности см. На веб-странице.
PADB
источник
«Стандартный» способ отладки программ MPI - использование отладчика, который поддерживает эту модель выполнения.
Говорят, что в UNIX TotalView хорошо поддерживает MPI.
источник
Я использую этот небольшой доморощенный метод для присоединения отладчика к процессам MPI - вызовите следующую функцию DebugWait () сразу после MPI_Init () в вашем коде. Теперь, когда процессы ждут ввода с клавиатуры, у вас есть время подключить к ним отладчик и добавить точки останова. Когда вы закончите, введите один символ, и вы готовы к работе.
Конечно, вы захотите скомпилировать эту функцию только для отладочных сборок.
источник
gethostname(hostname, sizeof(hostname)); printf("PID %d on host %s ready for attach\n", getpid(), hostname);
. Затем вы присоединяетесь к процессу, набираяrsh <hostname_from_print_statement>
, и, наконецgdb --pid=<PID_from_print_statement>
.Команда для присоединения gdb к процессу mpi неполная, она должна быть
Краткое обсуждение mpi и gdb можно найти здесь
источник
Довольно простой способ отладки программы MPI.
В функции main () добавьте сон (some_seconds)
Запустите программу как обычно
Программа запустится и перейдет в режим сна.
Таким образом, у вас будет несколько секунд, чтобы найти ваши процессы с помощью ps, запустить gdb и присоединиться к ним.
Если вы используете какой-либо редактор, например QtCreator, вы можете использовать
Отладка-> Начать отладку-> Присоединить к запущенному приложению
и найди там свои процессы.
источник
Я выполняю некоторую отладку, связанную с MPI, с трассировкой журнала, но вы также можете запустить gdb, если используете mpich2: MPICH2 и gdb . Этот метод является хорошей практикой, когда вы имеете дело с процессом, который сложно запустить из отладчика.
источник
mpirun -gdb
Благодаря http://www.ncsa.illinois.edu/UserInfo/Resources/Hardware/CommonDoc/mpich2_gdb.html ( ссылка на архив )
источник
Другое решение - запустить ваш код в SMPI, смоделированном MPI. Это проект с открытым исходным кодом, в котором я участвую. Каждый ранг MPI будет преобразован в потоки одного и того же процесса UNIX. Затем вы можете легко использовать gdb для пошагового ранжирования MPI.
SMPI предлагает другие преимущества для изучения приложений MPI: ясность (вы можете наблюдать за всеми частями системы), воспроизводимость (несколько прогонов приводят к одному и тому же поведению, если вы не укажете это), отсутствие heisenbugs (поскольку моделируемая платформа остается разной). от хоста) и т. д.
Для получения дополнительной информации см. Эту презентацию или соответствующий ответ .
источник