Next: Utilizzo del programa
Up: Comunicazioni nel Cluster
Previous: Software per il calcolo
Indice
Le comunicazioni tra i vari nodi del cluster vengono implemetate grazie ad una collezione di routines implementate nelle librerie MPI. Le routines MPI oltre agli strumenti per la comunicazione, offrono anche sistemi di sincronizzazione delle varie procedure.
Ogni routines, adibita alla comunicazione implementata nelle MPI differisce nel tipo di connessione che attua infatti si possono creare canali di comunicazioni sincroni o asincroni verso uno o piú host riceventi. Questo permette di ottimizzare le performances dell'applicazione MPI scritta in modo da sfruttare la tipologia di connessione che i nodo hanno. Successivamente verranno descritte nel particolare le routines utilizzate nell'implementazione dei programmi per il test delle performances della connettivitá del cluster.
- int MPI_Init(int *argc, char ***argv)
Questa funzione serve ad inizializzare l'esecuzione del codice in ambiente MPI, rappresenta la funzione main nella programmazione C e permette l'utilizzo di particolari opzioni passate al comando mpirun al momento del lancio della applicazione. Questa funzione deve essere richiamata abbligatoriamente prima di qualsiasi funzione MPI per poter utilizzare succesivamente le routines per il calcolo parallelo. In pratica dall'invocazione della funzione MPI_Init vi é la replicazione del codice su tutti i nodi coinvolti nel calcolo e da quel momento ogni nodo esegue in modo indipentente le istruzioni successive.
- int MPI_Get_processor_name(char *name, int *resultlen)
Queta routine restituisce all'interno della stringa puntata dal puntatore char *name il nome dell'host su cui viene seguita questa funzione e nel puntatore ad intero int *resultlen viene scritta la lunghezza in caratteri del nome. Questa informazione é utile in programmi applicativi in cui nodi diversi devono eseguire operazioni diverse.
- int MPI_Comm_rank ( MPI_Comm comm, int *rank )
Come per la routines fork() in C, nelle MPI viene differenziato il codice da eseguire per ogni nodo coinvolto al calcolo usando un identificativo di processo. Questa funzione serve appunto per ricavare l'identificativo del nodo su cui viene invocata tale routines in modo da poter differenziare le istruzioni. L'identificativo viene scritto all'interno dell'intero puntato dal puntatore int *rank. L'identificativo puó essere attribuito in modo automatico al momento del lancio del programma dal comando mpirun, ma anche prefissato usando particolati opzioni sempre del mpirun.
- int MPI_Comm_size ( MPI_Comm comm, int *size )
Per poter sapere in quanti processi é stato suddiviso il programma si utilizza questa funzione che restituisce all'interno dell'intero puntato dal puntatore int *size il numero di processi in esecuzione del programma MPI.
- int MPI_Barrier ( MPI_Comm comm )
Questa routines crea una barriera virtuale per tutti i processi che la invocano in modo da arrestare tutte le procedure in un deterninato punto del codice in modo da far aspettare ai processi piú veloci i processi piú lenti per poi ripartire insieme. Questo meccanismo fa si che procedure parallele che verrebbero svolte in tempi diversi raggiungano un punto comune in modo da poter eseguire l'istruzione successiva alla MPI_Barrier in modo parallelo.
- int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm )
La comunicazione sincrona punto a punto tra due processi é implementata da questa funzione. In questa routine bisogna specificare oltre al buffer di dati da dover comunicare ( textitvoid *buf) e alla sua lunghezza in byte ( int count), anche l'identificativo del processo che deve ricevere il messaggio ( int dest) ed una flag che identifica il buffer da mandare ( int tag).
- int MPI_Recv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status )
Questa routine serve per poter riceve il buffer mandato dalla routine MPI_Send, infatti presenta lo stesso set di parametri da impostare, naturalmente dal punto di vista del receiver. Quindi bisogna passare alla funzione l'identificativo del processo che manda i dati ( int source) e predisporre un buffer suofficientemente capiente per ospitare i dati in arrivo.
- int MPI_Finalize()
Per poter uscire dall'ambiente MPI bisogna invocare questa routine. Nel caso si volesse ottenere valori di ritorno dalle funzioni MPI senza l'invocazione di questa routine questi valori andrebbero persi.
Tutte le routines MPI sono accedibili tramite un file di include:
#include "mpi.h"
Per la compilazione é comodo utilizzare uno script chiamato mpicc, in modo da rendere trasparente all'utente l'utilizzo di particolari variabili da passare al compilatore per poter fare il link delle librerie MPI.
Next: Utilizzo del programa
Up: Comunicazioni nel Cluster
Previous: Software per il calcolo
Indice
Mario Cavicchi
2004-07-22