Guide / tutorials
Total View debugger su Cresco
SOMMARIO:
- Introduzione
- Compilazione
- Debug tramite LSF
- Esempio 1: codici seriali
- Esempio 2: codici paralleli
- Links utili
1. Introduzione
Il debugger Total View, installato su Cresco, permette il debug e l'analisi
di codici sia seriali che paralleli. Scopo di questa guida non è quello di mostrarne
le potenzialità, le caratteristiche o le modalità di debugging. A tale scopo si
vedano guide e tutorials specifici (si veda il seguente tutorial: TV_tut per esempio).
Invece qui si vogliono fornire i principali
comandi e setting necessari per avviare il software sulla piattaforma CRESCO.
NOTA: Attualmente (Novembre 2018) Totalview e' alla versione 2018.1.12; e' stato installato sui nodi di Cresco4, Cresco5 e Cresco6;
e' stato testato per Cresco6 e compilatori Intel17 con mpi_flavour/openmpi_intel17-3.1.2
NOTA: Per utilizzare Totalview occorre caricare il modulo 'totalview' con il comando module load totalview
NOTA: Licenze disponibili: Attualmente (Novembre 2018) Totalview dispone di 5 licenze disponibili quindi e' possibile utilizzare non piu' di 5 processi MPI o task
(indipendentemente dal numero di core per task) in relazione all'utilizzo di tutti gli utenti contemporaneamente.
[sommario]
2. Compilazione
La compilazione per il debug necessita del flag -g, in modo da abilitare la
generazione di informazioni simboliche che permettono di vedere il codice sorgente anzicchè
il codice assembly. Inoltre devono essere disabilitate le flag di ottimizzazione per evitare
che il compilatore "riscriva" certe sezioni di codice che potrebbero non coincidere con il sorgente
(in questo caso usare l'opzione -O0).
Esempi:
Seriale:
gfortran -g -O0 -o prova.exe prova.c
Paralello MPI:
mpicc -g -O0 -o prova_MPI.exe prova_MPI.c
[sommario]
3. Debug tramite LSF
In generale, la stringa di sottomissione non differisce di molto rispetto alla sottomissione di
qualunque Job interattivo, eccetto che per l'uso delle opzioni -XF e -a tv.
La coda da utilizzare per il debug e' la cresco6_h4 che permette di
lanciare totalview su 3 nodi di cresco6 (003-004-005).
Occorre considerare che questi nodi appartengono al gruppo di nodi di CRESCO6 dedicati ai job seriali con un massimo di 40 core per nodo;
quindi al debug sono dedicati al massimo 8 core/nodo e quindi, per evitare di restare in pending, occorre usare l'opzione -R "span[ptile=8]".
Come esempio si consideri il seguente comando di sottomissione:
bsub -n 16 -R "span[ptile=8]" -q cresco6_h4 -I -XF -a tv totalview ./hybrid-hello
Questo comando sottomette un job parallelo ibrido su 2 nodi con 8 core per
nodo se si imposta OMP_NUM_THREADS=8
SERIALE
Dopo avere compilato opportunamente il codice seriale, si sottomette con:
bsub -I -XF -q cresco6_h4 <altre_bsub_options> -a tv totalview <nome_programma>
A questo punto salterà fuori la GUI di TotalView (vedi esempi sotto).
Esempio 1: codici seriali
Il codice seriale "tvEx1.c" esegue un prodotto tra matrici. Di seguito alcuni screenshot di
una sessione Totalview.
A- Compilazione:
gcc -g -O0 -o tvEx1.x tvEx1.c
B- Sottomissione:
bsub -I -XF -q cresco6_h4 -a tv totalview ./tvEx1.x
C- Debug:
Una volta visualizzata la GUI, si possono per esempio settare i breakpoints e avviare (tasto "Go") il
debug. Fig. 1 mostra la GUI con il sorgente visibile nel pannello principale, in questo caso
ho settato un breakpoint alla line 26 ed eseguito alcuni steps (tasto "Next") del ciclo "for", per
vedere ("dive in to...") il contenuto dell'array "a". Fig. 2 mostra il contenuto dell'array "a", che puó
esserre visualizzato con un doppio click sulla variabile.
Fig. 1: Esempio di Breakpoint per codice seriale.
Fig. 2: Esempio di visualizzazione di una variabile per codice seriale.
[sommario]
Parallelo MPI
Questo caso è del tutto analogo al precedente, eccetto il fatto che occorre dire ad LSF
quanti slots allocare per il Job parallelo, ovverro va specificato il numero di task paralleli
con l'opzione -n <n_procs>:
bsub -n <n_procs> -I _XF -a tv -q cresco6_h4 <altre_bsub_options> totalview
<nome_programma>
Esempio 2: codici MPI parallelo
Il codice parallelo MPI d'esempio è HPL (High Performance Linpack) che risolve un sistema di equazioni lineari. Il
nome dell'eseguibile è "xhpl".
A- Compilazione: come per il caso seriale aggiungere "-g -O0" ai wrapper "mpicc".
B- Sottomissione:
bsub -n 16 -R "span[ptile=8]" -q cresco6_h4 -I -XF -a tv totalview ./xhpl
C- Debug:
IMPORTANTE: adesso occorre dire a TotalView su quali hosts lanciare i processi allocati da LSF e l'agente da usare
per il lancio dei tasks (sotto LSF, per Cresco è "blaunch").
Una volta comparsa la GUI, verrà visualizzata la finestra di dialogo "StartUp Parameters". Nella TAB "parallel"
occorre specificare (vedi Fig. 3):
- La libreria per MPI (OpenMPI)
- Numero di tasks (processi MPI) e su quanti nodi distribuirli: Tasks <= 5 e Nodes <= 3
- l'hostfile creato da LSF (-machinefile $LSB_DJOB_HOSTFILE)
- l'agente per il lancio dei tasks MPI (-pernode --mca pls_rsh_agent "blaunch.sh")
Fig. 3: StartUp parameters per codice parallelo: job parallelo ibrido su 2 nodi con 2 processi MPI per
nodo
Le Fig. 4 e 5, rappresentano un esempio di setting di un breakpoint e di visualizzazione
di una struttura dati, rispettivamente. Fig. 4 mostra anche lo stack. Si noti, come mostra Fig. 5, come sia possibile
selezionare anche il processo da monitorare e nel caso di programmi OpenMP i threads.
Fig. 4: Breakpoint su una chiamata di "xhpl"
Fig. 5: visualizzazione dei valori di una struttura dati per "xhpl".
[sommario]
4. Links utili
- Debug (Wikipedia) [ link ]
- Tutorial sintetico [ link ]
- Tutorial video del 2014 tenuto in ENEA [ link ]
[sommario]
[top]
ultimo aggiornamento: 22/11/2018 | Fiorenzo Ambrosino, Salvatore Raia