Corso di Laurea Specialistica Ingegneria Informatica Laboratorio di
Transcript
Corso di Laurea Specialistica Ingegneria Informatica Laboratorio di
Corso di Laurea Specialistica Ingegneria Informatica Laboratorio di Calcolo Parallelo Prof. Alessandra d’Alessio GUIDA AL LABORATORIO DI CALCOLO PARALLELO Il progetto SCoPE (www.scope.unina.it) ha messo ha disposizione della Facoltà di Ingegneria per il corso di Calcolo Parallelo un cluster composto complessivamente da 8 nodi per un totale di 64 core, completamente dedicati con dotazione software adeguata. Ogni nodo è un server Dell PowerEdge M600 ciascuno dotato di: due processori quad core Intel Xeon [email protected] (Architettura a 64 bit) 8 Gb di RAM dischi SATA da 80GB in configurazione RAID1 due schede Gigabit Ethernet configurate in bonding scheda Infiniband (Mellanox Technologies MT25418 ConnectX IB DDR) per la connettività ad alta banda e bassa latenza o scheda Fibre Channel. Il software a disposizione è: Sistema operativo: Scientific Linux 5.3 Driver e software per connettività Infiniband Resource Manager e Job Scheduler: TORQUE RM e Maui JS Grid Middleware: Glite 3.2 configurato per il ruolo di Working Node (WN) Librerie e software: Compilatori: GNU e Intel C, C++, F77 e F90 MVAPICH 1.2.0: implementazione dello standard MPI1 over Infiniband OPENMPI 1.4: implementazione dello standard MPI2 over Infiniband librerie di base Intel MKL v.11 Scope Toolkit v2.0: o blacs-1.1.0 o blas-3.2.2 o espresso-4.0.5 o fftw-3.2.1 o gromacs-4.5.2 o gsl-1.13.3 o lapack-3.2.2 o metis-4.0.0 o neuron-7.1.0 o octave-2.9.15 o petsc-3.1.p7 o scalapack-1.8.0 o starccm-6.02.007 PROCEDURA PER UTILIZZARE IL CLUSTER SCOPE DAL TERMINALE L’accesso al cluster avviene tramite client SSH con l’emulatore di terminale Putty scaricabile gratuitamente all'URL http://tartarus.org/~simon/putty-snapshots/x86/putty.exe). All’avvio si apre la finestra di connessione: 1 Bisogna inserire : host name (ui-studenti.scope.unina.it) port : 22 connection type :SSH Premendo il tasto open si apre il terminale ed ogni utente digita la propria login e password: 2 A questo punto si può accedere alle proprie directory ed ai propri file . Se si vuole trasferire un file da una macchina windows al cluster si può usare il software WinSCP (http://winscp.net/download/winscp427setup.exe), che consente di collegarsi e trasferire file: Si digita login e password e si clicca su accedi. Si apre la finestra di collegamento: 3 Ci si mette nella cartella in cui c’è il file da spostare e semplicemente si trascina col mouse nella cartella di arrivo. Esecuzione di un programma parallelo La scrittura di un programma parallelo va effettuata utilizzando il protocollo di comunicazione Message Passing Interface (MPI) , in particolare il compilatore utilizzato è OPENMPI, integrato in un codice sorgente scritto in C. Si crea una directory che conterrà il progetto (file sorgente,eseguibile,..). Il file sorgente va scritto con un editor Linux(vi,nano,..). Se si edita in ambiente Windows bisogna utilizzare editor che non formattano(es.notepad). Una volta copiati in laboratorio (con WINSCP) vanno processati con il comando dos2unix: dos2unix nomefileW.c . Le applicazioni parallele sono eseguite sui nodi computazionali esclusivamente in batch tramite il sistema PBS (Portable Batch System). Per comprendere la procedura con cui compilare ed eseguire un programma in MPI tramite un job PBS, consideriamo il semplice esempio di un programma in cui ogni processo scrive un messaggio ed il suo rank. Il codice è memorizzato nel file hello.c e si trova nella directory HELLO. File hello.c: #include "mpi.h" #include <stdio.h> int main( int argc, char *argv[] ) { int myid, numprocs; int namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Get_processor_name(processor_name,&namelen); fprintf(stderr,"Ciao sono il processo %d e mi chiamo %s\n", myid, processor_name); MPI_Finalize(); return 0; } Di norma la sottomissione dei job a PBS avviene tramite il comando: qsub nomefile.pbs 4 dove nomefile.pbs è un job-script che contiene un elenco di direttive per qsub seguito dalle direttive necessarie alla compilazione ed esecuzione del programma. In seguito c’è un esempio di job-script PBS utilizzato per compilare ed eseguire il file hello.c, memorizzato nel file hello.pbs. In tale script bisogna solo modificare il numero di nodi che si vuole utilizzare, il nome della directory contenente il progetto ed il nome del file sorgente. La prima riga dello script, prima di ogni altra direttiva, deve essere #!/bin/bash Le righe che iniziano con # sono commenti, quelle che iniziano con #PBS sono direttive. #!/bin/bash ########################## # # # The PBS directives # # # ########################## #PBS -q studenti #PBS -l nodes=20 numero nodi #PBS -N hello nome job(stesso del file pbs) #PBS -o hello.out nome file che contiene l’output #PBS -e hello.err nome file che contiene l’output ########################################## # # # Output some useful job information. # # # ########################################## NCPU=`wc -l < $PBS_NODEFILE` echo -----------------------------------------------------echo ' This job is allocated on '${NCPU}' cpu(s)' echo 'Job is running on node(s): ' cat $PBS_NODEFILE PBS_O_WORKDIR=$PBS_O_HOME/HELLO echo -----------------------------------------------------echo PBS: qsub is running on $PBS_O_HOST echo PBS: originating queue is $PBS_O_QUEUE echo PBS: executing queue is $PBS_QUEUE echo PBS: working directory is $PBS_O_WORKDIR echo PBS: execution mode is $PBS_ENVIRONMENT echo PBS: job identifier is $PBS_JOBID echo PBS: job name is $PBS_JOBNAME echo PBS: node file is $PBS_NODEFILE echo PBS: current home directory is $PBS_O_HOME echo PBS: PATH = $PBS_O_PATH echo -----------------------------------------------------5 echo "Eseguo: /usr/lib64/openmpi/1.4-gcc/bin/mpicc -o $PBS_O_WORKDIR/hello $PBS_O_WORKDIR/hello.c" /usr/lib64/openmpi/1.4-gcc/bin/mpicc -o $PBS_O_WORKDIR/hello $PBS_O_WORKDIR/hello.c echo"Eseguo:/usr/lib64/openmpi/1.4-gcc/bin/mpiexec-machinefile$PBS_NODEFILE-np$NCPU $PBS_O_WORKDIR/hello" /usr/lib64/openmpi/1.4-gcc/bin/mpiexec -machinefile $PBS_NODEFILE -np $NCPU $PBS_O_WORKDIR/hello Per eseguire il programma: qsub hello.pbs Per visualizzare l’output: cat nomefile.err cat nomefile.out Per visualizzare lo stato del job: qstat il comando ritornerà una lista del tipo: JobId Name User Time Use S Queue ------------------------- ---------------- --------------- -------- - ------------------------------ ---------------- -------------198321.torque02 hello.pbs <matricola studente> 00:01:04 R studenti dove, JobId è l’id del job, name è il nome dello script pbs, User è la login dell’utente che ha sottomesso il job, Time Use è il tempo di esecuzione del job, S è lo stato del job (E=eseguito,R=in esecuzione, Q= è stato accodato), Queue è la coda su cui il job è stato sottomesso. Per eliminare il proprio job utente è sufficiente eseguire: qdel JobId In caso di problemi, inviare una email a: [email protected] specificando: il proprio nome e cognome, il corso di cui si fa parte ed una breve descrizione del problema. 6