Jak debugować program MPI?

Mam program MPI, który kompiluje i uruchamia, ale chciałbym przejść przez niego, aby upewnić się, że nic dziwnego się nie dzieje. Idealnie, chciałbym prosty sposób, aby dołączyć GDB do każdego konkretnego procesu, ale nie jestem naprawdę pewien, czy to możliwe lub jak to zrobić. Alternatywą byłoby zapisanie przez każdy proces wyjścia debugowania do osobnego pliku dziennika, ale tak naprawdę nie daje to takiej samej swobody jak debugger.

Czy są lepsze podejścia? Jak debugować MPI programy?

 106
Author: Jay Conrod, 2008-11-30

16 answers

Jak ktoś inny powiedział, TotalView jest standardem dla tego. Ale będzie cię to kosztować rękę i nogę.

Strona OpenMPI ma świetne FAQ na temat debugowania MPI. Punkt # 6 w FAQ opisuje jak dołączyć GDB do procesów MPI. Przeczytaj całość, jest kilka świetnych wskazówek.

Jeśli jednak okaże się, że masz zbyt wiele procesów, aby śledzić, sprawdź Stack Trace Analysis Tool (STAT). Używamy tego w Livermore do zbierania śladów stosu z potencjalnie setki tysięcy uruchomionych procesów i inteligentne przedstawianie ich użytkownikom. Nie jest to w pełni funkcjonalny debugger (w pełni funkcjonalny debugger nigdy nie skalowałby się do rdzeni 208k), ale powie Ci, które grupy procesów robią to samo. Następnie można przejść przez przedstawiciela z każdej grupy w standardowym debuggerze.

 52
Author: tgamblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-30 18:19:14

Uznałem gdb za całkiem przydatne. Używam go jako

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

To uruchamia xterm windows w którym mogę zrobić

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

Zwykle działa dobrze

Możesz również spakować te polecenia razem używając:

mpirun -n <NP> xterm -hold -e gdb -ex run --args ./program [arg1] [arg2] [...]
 65
Author: messenjah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 03:24:25

Wiele postów tutaj dotyczy GDB, ale nie wspominaj, jak dołączyć do procesu od startu. Oczywiście, można dołączyć do wszystkich procesów:

mpiexec -n X gdb ./a.out

Ale jest to szalenie nieskuteczne, ponieważ będziesz musiał skakać, aby uruchomić wszystkie procesy. Jeśli chcesz debugować tylko jeden (lub niewielką liczbę) proces MPI, możesz dodać go jako osobny plik wykonywalny w wierszu poleceń za pomocą operatora ::

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

Teraz tylko jeden z Twoich procesów otrzyma GDB.

 21
Author: Wesley Bland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-03 13:42:13

Jak już wspomnieli inni, jeśli pracujesz tylko z garstką procesów MPI, możesz spróbować użyć wielu sesji gdb, reduktowalnego valgrind lub stworzyć własne rozwiązanie printf / logging.

Jeśli używasz więcej procesów niż to, naprawdę zaczynasz potrzebować odpowiedniego debuggera. Openmpi FAQpoleca zarówno Allinea DDT jak i TotalView.

Pracuję nad Allinea DDT . Jest to w pełni funkcjonalny, graficzny debugger kodu źródłowego więc tak, możesz:

  • debugowanie lub dołączanie do (ponad 200k) procesów MPI
  • krok i Pauza w grupach lub pojedynczo
  • dodawanie punktów przerwania, zegarków i tracepointów
  • Przechwytywanie błędów pamięci i wycieków

...i tak dalej. Jeśli korzystałeś z Eclipse lub Visual Studio, będziesz w domu.

Dodaliśmy kilka ciekawych funkcji specjalnie do debugowania parallel kodu (czy to MPI, wielowątkowy czy CUDA): {]}

  • Zmienne skalarne są automatycznie porównywane we wszystkich procesach: Sparklines pokazujące wartości w różnych procesach

  • Można również śledzić i filtrować wartości zmiennych i wyrażeń w procesach i czasie: Tracepoints log wartości w czasie

Jest szeroko stosowany wśród TOP500 HPC stron, takich jak ORNL, NCSA, LLNL, Jülich et. al.

Interfejs jest dość zgryźliwy; mierzyliśmy czas i łączyliśmy stosy i zmienne Z 220 000 procesy w 0,1 s W ramach testów akceptacyjnych na klastrze Jaguara Oak Ridge.

@tgamblin wspomniał o doskonałejSTAT , która integruje się zAllinea DDT , podobnie jak kilka innych popularnych projektów open source.

 16
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 14:35:46
 8
Author: Chad Brewbaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-09 15:56:40

Http://github.com/jimktrains/pgdb/tree/master to narzędzie, które napisałem, aby zrobić to dokładnie. Jest kilka dokumentów i zapraszam do mnie w razie pytań.

W zasadzie wywołasz program Perla, który zawija GDB i przekazuje jego IO do centralnego serwera. Dzięki temu GDB może być uruchomiony na każdym hoście, a Ty możesz uzyskać do niego dostęp na każdym hoście na terminalu.

 5
Author: Jim Keener,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-08 23:40:41

Używanie screen razem z gdb do debugowania aplikacji MPI działa dobrze, zwłaszcza jeśli xterm jest niedostępna lub masz do czynienia z więcej niż kilkoma procesorami. Było wiele pułapek po drodze z towarzyszącymi wyszukiwaniami stackoverflow, więc odtworzę moje rozwiązanie w całości.

Najpierw dodaj kod po MPI_Init, aby wydrukować PID i zatrzymaj program, aby czekał na dołączenie. Standardowym rozwiązaniem wydaje się być nieskończona pętla; ostatecznie zdecydowałem się na raise(SIGSTOP);, która wymaga dodatkowe wezwanie continue do ucieczki w 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);
}

Po skompilowaniu uruchom plik wykonywalny w tle i złap stderr. Następnie możesz grep plik stderr dla jakiegoś słowa kluczowego (tutaj literalny PID), aby uzyskać PID i rangę każdego procesu.

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`)

Sesja gdb może być dołączona do każdego procesu za pomocą gdb $MDRUN_EXE $PID. Robi to w ramach sesji ekranowej umożliwia łatwy dostęp do dowolnej sesji gdb. -d -m uruchamia ekran w trybie odłączonym, -S "P$RANK" pozwala na łatwe nazwanie ekranu dostęp później, a -l opcja bash uruchamia go w trybie interaktywnym i zapobiega natychmiastowemu wyjściu 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

Po uruchomieniu gdb na ekranach, możesz skryptować wprowadzanie na ekrany (tak, że nie musisz wchodzić na każdy ekran i wpisywać tego samego) za pomocą polecenia screen -X stuff. Na końcu polecenia wymagany jest znak nowej linii. Tutaj ekrany są dostępne przez -S "P$i" używając wcześniej podanych nazw. Opcja -p 0 jest krytyczna, w przeciwnym razie polecenie przerywana awaria (w zależności od tego, czy wcześniej podłączyłeś się do ekranu).

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
W tym momencie możesz dołączyć do dowolnego ekranu za pomocą screen -rS "P$i" i odłączyć za pomocą Ctrl+A+D. Polecenia mogą być wysyłane do wszystkich sesji gdb, analogicznie do poprzedniej sekcji kodu.
 4
Author: user3788566,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-04 16:43:06

"standardowym" sposobem debugowania programów MPI jest użycie debuggera, który obsługuje ten model wykonania.

Na Unixie, TotalView mówi się, że ma dobre wsparcie dla MPI.

 3
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-19 16:16:17

Używam tej małej metody homebrewn do dołączania debuggera do procesów MPI - wywołuję następującą funkcję DebugWait () zaraz po MPI_Init () w Twoim kodzie. Teraz, gdy procesy czekają na wejście klawiatury, masz cały czas, aby dołączyć do nich debugger i dodać punkty przerwania. Gdy skończysz, wprowadź jeden znak i jesteś gotowy do pracy.

static void DebugWait(int rank) {
    char    a;

    if(rank == 0) {
        scanf("%c", &a);
        printf("%d: Starting now\n", rank);
    } 

    MPI_Bcast(&a, 1, MPI_BYTE, 0, MPI_COMM_WORLD);
    printf("%d: Starting now\n", rank);
}

Oczywiście chciałbyś skompilować tę funkcję tylko dla debugowania kompilacji.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-09 14:44:39

Jest też moje narzędzie open-source, padb, które ma na celu pomoc w programowaniu równoległym. Nazywam to "narzędziem kontroli pracy", ponieważ działa nie tylko jako debugger może również działać na przykład jako równoległy program podobny do góry. Uruchom w trybie "pełny raport" pokaże Ci stos śladów każdego procesu w Twojej aplikacji wraz z lokalnymi zmiennymi dla każdej funkcji nad każdą rangą (zakładając, że skompilowałeś z-g). Pokaże Ci także "kolejki wiadomości MPI" , czyli listę zaległe wysyłanie i odbieranie za każdą rangę w ramach pracy.

Oprócz pokazania pełnego raportu można również powiedzieć padbowi, aby powiększył poszczególne bity informacji w zadaniu, istnieje mnóstwo opcji i pozycji konfiguracyjnych do kontrolowania, jakie informacje są wyświetlane, zobacz stronę internetową po więcej szczegółów.

Padb

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-03 20:58:25

Jeśli jesteś użytkownikiem tmux będziesz czuł się bardzo komfortowo korzystając ze skryptu Benedikt Morbach: tmpi

Oryginalne źródło: https://github.com/moben/scripts/blob/master/tmpi

Widelec: https://github.com/Azrael3000/tmpi

Z nim masz wiele paneli (liczba procesów) wszystkie zsynchronizowane (każde polecenie jest kopiowane na wszystkich panelach lub procesach w tym samym czasie, więc oszczędzasz dużo czasu w porównaniu z podejściem xterm -e). Co więcej, możesz znać wartości zmiennych w procesie, który chcesz wykonać print bez konieczności przechodzenia do innego panelu, to wydrukuje na każdym panelu wartości zmiennej dla każdego procesu.

Jeśli nie jesteś użytkownikiem tmux polecam gorąco spróbować i zobaczyć.

 2
Author: GG1991,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 14:56:03
 1
Author: RSFalcon7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-01 13:11:05

Polecenie dołączania gdb do procesu mpi jest niekompletne, powinno być

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

Krótkie omówienie mpi i gdb można znaleźć tutaj

 1
Author: akintayo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-12 23:40:11

Robię debugowanie związane z MPI z logami, ale możesz również uruchomić gdb, jeśli używasz mpich2: MPICH2 i gdb. Ta technika jest dobrą praktyką w ogóle, gdy masz do czynienia z procesem, który jest trudny do uruchomienia z debuggera.

 1
Author: Jim Hunziker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-23 14:13:43

Innym rozwiązaniem jest uruchomienie kodu w SMPI, symulowanym MPI. To projekt open source, w który jestem zaangażowany. Każda ranga MPI zostanie przekonwertowana na wątki tego samego procesu uniksowego. Następnie możesz łatwo użyć gdb, aby zwiększyć rangę MPI.

SMPI proponuje inne zalety badania aplikacji MPI: clairevoyance (można obserwować każdą część systemu), odtwarzalność (kilka przebiegów prowadzi do dokładnie tego samego zachowania, chyba że tak określisz), brak heisenbugs (jako symulowana Platforma różni się od hosta), itp.

Aby uzyskać więcej informacji, zobacz tę prezentację lub tę związaną z odpowiedzią.

 0
Author: Martin Quinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:05

Dość prosty sposób debugowania programu MPI.

W funkcji main () dodaj sleep (some_seconds)

Uruchom program jak zwykle

$ mpirun -np <num_of_proc> <prog> <prog_args>

Program uruchomi się i przejdzie do snu.

Więc będziesz miał kilka sekund, aby znaleźć procesy przez ps, uruchomić gdb i dołączyć do nich.

Jeśli używasz jakiegoś edytora, takiego jak QtCreator, możesz użyć

Debug->Start debug - > Dołącz do uruchomionej aplikacji

I znajdziesz tam procesy.

 0
Author: stranger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 19:57:50