Как отладить программу MPI? - PullRequest
116 голосов
/ 30 ноября 2008

У меня есть программа MPI, которая компилируется и запускается, но я хотел бы пройтись по ней, чтобы убедиться, что ничего странного не происходит. В идеале я хотел бы простой способ присоединить GDB к любому конкретному процессу, но я не совсем уверен, возможно ли это или как это сделать. Альтернативой может быть вывод каждого процесса отладочной записи в отдельный файл журнала, но на самом деле это не дает той же свободы, что и отладчик.

Есть ли лучшие подходы? Как вы отлаживаете программы MPI?

Ответы [ 16 ]

74 голосов
/ 02 марта 2010

Я нашел GDB весьма полезным. Я использую это как

mpirun -np <NP> xterm -e gdb ./program 

Это запускает xterm окна, в которых я могу сделать

run <arg1> <arg2> ... <argN>

обычно отлично работает

Вы также можете упаковать эти команды вместе, используя:

mpirun -n <NP> xterm -hold -e gdb -ex run --args ./program [arg1] [arg2] [...]
58 голосов
/ 12 декабря 2008

Как кто-то сказал, TotalView является стандартом для этого. Но это будет стоить вам руку и ногу.

На сайте OpenMPI есть замечательный FAQ по отладке MPI . Пункт № 6 в FAQ описывает, как подключить GDB к процессам MPI. Прочитайте все это, есть несколько замечательных советов.

Если вы обнаружите, что у вас слишком много процессов для отслеживания, проверьте Инструмент анализа трассировки стека (STAT) . Мы используем это в Ливерморе для сбора следов стека от потенциально сотен тысяч запущенных процессов и интеллектуального представления их пользователям. Это не полнофункциональный отладчик (полнофункциональный отладчик никогда не масштабируется до 208 тыс. Ядер), но он скажет вам, какие группы процессов делают одно и то же. Затем вы можете пройти по представителю от каждой группы в стандартном отладчике.

23 голосов
/ 26 июля 2013

Многие из постов здесь о GDB, но не упоминают, как присоединить к процессу при запуске. Очевидно, что вы можете присоединиться ко всем процессам:

mpiexec -n X gdb ./a.out

Но это крайне неэффективно, так как вам придется прыгать, чтобы запустить все ваши процессы. Если вы просто хотите отладить один (или небольшое количество) MPI-процесс, вы можете добавить его как отдельный исполняемый файл в командной строке, используя оператор ::

mpiexec -n 1 gdb ./a.out : -n X-1 ./a.out

Теперь только один из ваших процессов получит GDB.

17 голосов
/ 31 мая 2012

Как уже упоминалось, если вы работаете только с несколькими процессами MPI, вы можете попытаться использовать несколько сеансов GDB , грозный valgrind или сверните свое собственное решение printf / logging.

Если вы используете больше процессов, чем этот, вам действительно нужен правильный отладчик. FAQ по OpenMPI рекомендует Allinea DDT и TotalView .

Я работаю на Allinea DDT . Это полнофункциональный графический отладчик исходного кода, так что да, вы можете:

  • Отладка или присоединение (более 200 КБ) процессов MPI
  • Шаг и пауза их в группах или индивидуально
  • Добавить точки останова, часы и трассировки
  • Поймать ошибки памяти и утечки

... и так далее. Если вы использовали Eclipse или Visual Studio, то будете чувствовать себя как дома.

Мы добавили несколько интересных функций специально для отладки параллельного кода (будь то MPI, многопоточный или CUDA):

  • Скалярные переменные автоматически сравниваются по всем процессам: Sparklines showing values across processes

  • Вы также можете отслеживать и фильтровать значения переменных и выражений по процессам и времени: Tracepoints log values over time

Он широко используется среди top500 сайтов HPC, таких как ORNL , NCSA , LLNL , Jülich и др. и др.

Интерфейс довольно быстрый; мы рассчитали пошаговое объединение стеков и переменных 220 000 процессов за 0,1 с в рамках приемочного тестирования на кластере Jaguar в Оук-Ридже.

@ tgamblin упомянул превосходную STAT , которая интегрируется с Allinea DDT , как и некоторые другие популярные проекты с открытым исходным кодом.

8 голосов
/ 09 марта 2010
6 голосов
/ 09 апреля 2009

http://github.com/jimktrains/pgdb/tree/master - утилита, которую я написал для этой цели. Есть несколько документов и не стесняйтесь задавать мне вопросы.

Вы в основном вызываете Perl-программу, которая оборачивает GDB и направляет ее IO на центральный сервер. Это позволяет GDB работать на каждом хосте, и вы можете обращаться к нему на каждом хосте в терминале.

5 голосов
/ 23 июня 2017

Если вы пользователь tmux, вы будете чувствовать себя очень комфортно, используя скрипт Benedikt Morbach : tmpi

Оригинальный источник: https://github.com/moben/scripts/blob/master/tmpi

Вилка: https://github.com/Azrael3000/tmpi

С его помощью вы синхронизируете несколько панелей (количество процессов) (каждая команда копируется на все панели или процессы одновременно, поэтому вы экономите много времени по сравнению с подходом xterm -e). Более того, вы можете узнать значения переменных в процессе, который вы хотите, просто выполнив print, не переходя на другую панель, это выведет на каждую панель значения переменной для каждого процесса.

Если вы не являетесь пользователем tmux, я настоятельно рекомендую попробовать и посмотреть.

5 голосов
/ 30 июня 2014

Использование screen вместе с gdb для отладки приложений MPI прекрасно работает, особенно если xterm недоступен или вы имеете дело с несколькими процессорами. Было много подводных камней, сопровождающих поиск стекового потока, поэтому я полностью воспроизведу свое решение.

Сначала добавьте код после MPI_Init, чтобы распечатать PID, и остановите программу, чтобы дождаться, пока вы присоединитесь. Стандартным решением кажется бесконечный цикл; В конце концов я остановился на raise(SIGSTOP);, что требует дополнительного вызова continue для выхода из GDB.

}
    int i, id, nid;
    MPI_Comm_rank(MPI_COMM_WORLD,&id);
    MPI_Comm_size(MPI_COMM_WORLD,&nid);
    for (i=0; i<nid; i++) {
        MPI_Barrier(MPI_COMM_WORLD);
        if (i==id) {
            fprintf(stderr,"PID %d rank %d\n",getpid(),id);
        }
        MPI_Barrier(MPI_COMM_WORLD);
    }
    raise(SIGSTOP);
}

После компиляции запустите исполняемый файл в фоновом режиме и перехватите stderr. Затем вы можете grep файл stderr для некоторого ключевого слова (здесь буквальный PID), чтобы получить PID и ранг каждого процесса.

MDRUN_EXE=../../Your/Path/To/bin/executable
MDRUN_ARG="-a arg1 -f file1 -e etc"

mpiexec -n 1 $MDRUN_EXE $MDRUN_ARG >> output 2>> error &

sleep 2

PIDFILE=pid.dat
grep PID error > $PIDFILE
PIDs=(`awk '{print $2}' $PIDFILE`)
RANKs=(`awk '{print $4}' $PIDFILE`)

Сессия gdb может быть присоединена к каждому процессу с помощью gdb $MDRUN_EXE $PID. Выполнение этого во время сеанса экрана обеспечивает легкий доступ к любому сеансу GDB. -d -m запускает экран в отдельном режиме, -S "P$RANK" позволяет вам дать имя экрану для быстрого доступа позже, а опция -l для bash запускает его в интерактивном режиме и предотвращает немедленный выход gdb.

for i in `awk 'BEGIN {for (i=0;i<'${#PIDs[@]}';i++) {print i}}'`
do
    PID=${PIDs[$i]}
    RANK=${RANKs[$i]}
    screen -d -m -S "P$RANK" bash -l -c "gdb $MDRUN_EXE $PID"
done

Как только GDB запустился на экранах, вы можете записать ввод данных на экран (чтобы вам не приходилось вводить каждый экран и вводить одно и то же) с помощью команды -X stuff экрана. В конце команды требуется новая строка. Здесь экраны доступны по -S "P$i" с использованием ранее указанных имен. Параметр -p 0 является критическим, в противном случае команда периодически завершается ошибкой (в зависимости от того, подключены ли вы ранее к экрану или нет).

for i in `awk 'BEGIN {for (i=0;i<'${#PIDs[@]}';i++) {print i}}'`
do
    screen -S "P$i" -p 0 -X stuff "set logging file debug.$i.log
"
    screen -S "P$i" -p 0 -X stuff "set logging overwrite on
"
    screen -S "P$i" -p 0 -X stuff "set logging on
"
    screen -S "P$i" -p 0 -X stuff "source debug.init
"
done

На этом этапе вы можете подключиться к любому экрану с помощью screen -rS "P$i" и отсоединить с помощью Ctrl+A+D. Команды могут быть отправлены всем сеансам GDB по аналогии с предыдущим разделом кода.

3 голосов
/ 04 декабря 2008

«Стандартный» способ отладки программ MPI - использование отладчика, который поддерживает эту модель выполнения.

В UNIX TotalView считается хорошим средством поддержки MPI.

2 голосов
/ 03 декабря 2009

Существует также мой инструмент с открытым исходным кодом, padb, который призван помочь с параллельным программированием. Я называю его «Инструментом проверки заданий», так как он функционирует не только как отладчик, но и может функционировать, например, как программа с параллельным верхом. Запустите в режиме «Полный отчет», он покажет вам трассировки стека каждого процесса в вашем приложении вместе с локальными переменными для каждой функции для каждого ранга (при условии, что вы скомпилировали с -g). Он также покажет вам «очереди сообщений MPI», то есть список ожидающих отправки и получения для каждого ранга в задании.

Наряду с отображением полного отчета можно также указать падбу увеличить отдельные фрагменты информации в задании, существует множество опций и элементов конфигурации для управления отображаемой информацией, см. Веб-страницу для получения дополнительной информации. подробности.

PADB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...