Libreria MPI (Message Passing Interface)
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
Libreria MPI (Message Passing Interface) Standard Message Passing Interface (MPI) Il primo standard de jure per i linguaggi paralleli a scambio di messaggi (definisce le specifiche sintattiche e semantiche, e non l’implementazione) Messo a punto in una serie di riunioni tenutesi tra novembre 1992 e gennaio 1994. Commissione MPI Costituita da membri provenienti da 40 istituti diversi (Univers ità, Istituti di cerca, Industrie, Enti governativi) SCOPI - Rendere portabile il software parallelo - Fornire agli sviluppatori di software un unico standard ben definito per lo codifica di software parallelo - Fornire ai costruttori di architetture un unico insieme di prim itive da implementare, possibilmente nel modo più efficiente per ciascuna architettura Michele Colajanni – Libreria MPI 2/36 1
Standard Message Passing Interface (MPI) Non si è voluto creare un sovra-insieme di tutte le primitive esistenti nei diversi ambienti di programmazione già implementati, anche se… Sono stati creati dei comitati per ciascuna categoria di primitive in cui le scelte venivano effettuate a maggioranza Alcune peculiarità • Possibilità di definire Gruppi di processi • Possibilità di effettuare comunicazioni tra Gruppi di processi • Possibilità di definire un insieme di contesti per le comunicazioni • Elevata flessibilità nella selettività della ricezione di un messaggio • Vasto insieme di routine per effettuare comunicazioni ed operazioni globali (scatter, gather, reduce, scan) • Supporti per la realizzazione di librerie modulari Michele Colajanni – Libreria MPI 3/36 La libreria MPI è grande o piccola? MPI è grande - 125 funzioni! - E’ il PL/1 o l’Ada dello scambio di messaggi? No: 1) Il numero elevato di funzioni deriva dalla combinazione di un numero ridotto di concetti ortogonali 2) Molte delle funzionalità possono essere ignorate fino a che non servono esplicitamente Michele Colajanni – Libreria MPI 4/36 2
La libreria MPI è grande o piccola? • MPI è piccola 6 funzioni fondamentali possono essere utilizzate per scrivere molti programmi paralleli: MPI_INT Inizializza l’ambiente MPI MPI_COMM_SIZE Determina quanti processi vi sono MPI_COMM_RANK Determina il numero (rank) di processo MPI_SEND Invia un messaggio MPI_RECV Ricevi un messaggio MPI_FINALIZE Termina l‘ambiente MPI § MPI è della dimensione che serve Oltre alle 6 funzioni,le altre funzioni possono aggiungere: Flessibilità (tipi di dati) Efficienza (comunicazioni non bloccanti) Modularità (gruppi, comunicatori) Convenienza (operazioni/comunicazioni collettive, topologie virtuali) Michele Colajanni – Libreria MPI 5/36 Elementi caratterizzanti di MPI • Modello programmativo • Funzioni per l’individuazione dell’identificativo del processo e del numero di processi • Comunicazioni punto-punto (one-to-one) • Comunicazioni collettive (one-to-many, many-to-one) • Operazioni collettive (one-to-many, many-to-one) Michele Colajanni – Libreria MPI 6/36 3
Struttura programma MPI #include main (int argc, char**argv) { MPI_init (&argc, &argv); … … … /* Corpo del programma */ … MPI_finalize(); exit (0); } Michele Colajanni – Libreria MPI 7/36 MPI consente il modello SPMD ESEMPIO Programma SPMD Nodo 0 Nodo 1 Nodo 2 Nodo 3 ….. begin A( ) < esegui A( )>; if (nodo==0) ; else ; if (nodo==0) ; B( ) C( ) C( ) C( ) end HOST D( ) I 2 costrutti fondamentali del modello SPMD: • identificativo del processo • costrutto condizionale Michele Colajanni – Libreria MPI 8/36 4
I costrutti MPI di base per la programmazione • Communicator (COMM) 1. Gruppo di processi che può comunicare 2. I comunicatori non sono partizioni dell’insieme dei processi (pertanto un processo può appartenere a più comunicatori) 3. Comunicatore predefinito: MPI_COMM_WORLD (=tutti i processi) • Rank 1. Identificatore numerico (da 0 a N) di un processo all’interno di un comunicatore 2. Un processo può avere un diverso rank per ogni comunicatore cui appartiene 3. Uso: MPI_COMM_RANK(comm, &rank) • Size Risultati delle rispettive funzioni 1. Numero di processi all’interno di un comunicatore 2. Uso: MPI_COMM_SIZE( comm, &size) Michele Colajanni – Libreria MPI 9/36 Esempio programma MPI di tipo SPMD Stampare una volta il numero di processi attivi ed il numero di rank dei processi pari. Altrimenti stampare “rank di processi dispari”. #include main (int argc, char **argv) { int numproc, myid; MPI_init (&argc, &argv) ; MPI_comm_size (MPI_COMM_WORLD, &numproc) ; MPI_comm_rank (MPI_COMM_WORLD, &myid) ; if (myid == 0) printf (“numero processi = %d \n”, numproc); if (( myid%2) == 0 ) printf ( “rank processo = %d\n”, myid); else printf (“rank processo dispari \n“); MPI_Finalize ( ); exit (0 ); } Michele Colajanni – Libreria MPI 10/36 5
Elementi caratterizzanti di MPI • Modello programmativo • Funzioni per l’individuazione dell’identificativo del processo e del numero di processi • Comunicazioni punto-punto (one-to-one) • Comunicazioni collettive (one-to-many, many-to-one) • Operazioni collettive (one-to-many, many-to-one) Michele Colajanni – Libreria MPI 11/36 Informazione del messaggio MESSAGGIO = DATI TRASMESSI + INFORMAZIONI PER LA TRASMISSIONE SEND • Processo mittente • Processi/o destinatari/o • Locazione/i di memoria dei dati da trasmettere • Tipo di dato da trasmettere • Quantità di dati da trasmettere RECEIVE • Locazione di memoria dei dati da ricevere • Quantità di dati che possono essere ricevuti SEND/RECEIVE • Identificatore (tag) del messaggio • Modalità di comunicazione Michele Colajanni – Libreria MPI 12/36 6
Comunicazioni MPI Librerie precedenti SEND (tag, buffer, lenght, dest) Novità MPI • Buffer del messaggio descritto indipendentemente dalla rappresentazione [Eterogeneità] à Superamento del (Buffer, lenght) • Separazione delle famiglie di messaggi [Contestualizzazione ] à superamento del tag semplice Utili per applicazioni tipo: programmi complessi (reali), librerie, ecc. • Separazione dei processi [Raggruppamento] à Superamento del dest semplice Utili per applicazioni: librerie, topologie virtuali, ecc. Michele Colajanni – Libreria MPI 13/36 SEND in MPI MPI_Send (buf, count, datatype, dest , tag, comm) Buf = buffer (nome della variabile o del vettore) Count = numero elementi di tipo datatype Datatype = tipo di dato del linguaggio (A,300,MPI_REAL) = vettore di 300 numeri reali, [indipendentemente dalla lunghezza o dal formato della rappresentazione floating point] Dest= numero del processo destinatario, relativo al gruppo/contesto identificato da comm Tag= identificativo del messaggio Comm= identifica un gruppo di processi e un contesto di comunicazione (Le nozioni di gruppo e contesto sono combinati in un unico oggetto chiamato COMUNICATORE, che risulta essere un argomento della maggior parte di comunicazioni point-to-point e collettive) Michele Colajanni – Libreria MPI 14/36 7
Datatype fondamentali di MPI (linguaggio C) MPI Datatype C datatype MPI_CHAR Signed char MPI_SHORT Signed short int MPI_INT Signed int MPI_LONG Signed long int MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED_SHORT unsigned short int MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long int MPI_FLOAT Float MPI_ DOUBLE Double MPI_LONG_DOUBLE Long double MPI_BYTE MPI_PACKED Necessari per il calcolo parallelo su “piattaforme eterogenee” Michele Colajanni – Libreria MPI 15/36 Modalità di comunicazione Ottica globale • Sincrona (il mittente sa se il messaggio è arrivato o meno, es. fax) • Asincrona (il mittente non sa se il messaggio è arrivato o meno, es. lettera) Ottica locale (buffer di trasmissione) • Bloccante Restituisce il controllo al processo che ha invocato la primitiva di comunicazione solo quando la primitiva di comunicazione è stata completata (=il buffer di uscita è stato svuotato). ATTENZIONE: BLOCCANTE≠ SINCRONA! • Non Bloccante Restituisce il controllo al processo che ha invocato la primitiva di comunicazione quando la primitiva di comunicazione è stata eseguita (senza controllo sull’effettivo completamento, da poter effettuare in seguito). Il processo invocante può nel frattempo passare ad eseguire altre operazioni. In MPI vi sono diverse combinazioni possibili tra SEND/RECEIVE sincrone e asincrone, bloccanti e non bloccanti Michele Colajanni – Libreria MPI 16/36 8
Completamento delle comunicazioni • Una comunicazione è completata localmente su di un processo se il processo ha completato tutta la sua parte di operazioni relative alla comunicazione (fino allo svuotamento del buffer di uscita) • Dal punto di vista dell’esecuzione del programma, completare localmente una comunicazione significa che il processo può eseguire l’istruzione successiva alla SEND o RECEIVE (possibilmente un’altra SEND) • Una comunicazione è completata globalmente se tutti i processi coinvolti hanno completato tutte le rispettive operazioni relative alla comunicazione • Una comunicazione è completata globalmente se e solo se è completata localmente su tutti i processi coinvolti Michele Colajanni – Libreria MPI 17/36 Tipica esecuzione di una comunicazione Processo Processo … … SEND RECEIVE F1() F2() … … Sistema operativo Sistema operativo buffer di uscita buffer di ingresso Hardware Hardware Nodo MITTENTE Nodo DESTINATARIO Rete di Interconnessione Michele Colajanni – Libreria MPI 18/36 9
Modalità di blocking SEND Non-Blocking • Ritorna “immediatamente”. • Il buffer del messaggio non deve essere sovrascritto subito dopo il ritorno al processo chiamante, ma si deve controllare che la SEND sia completata loc almente. SEND Blocking • Ritorna quando la SEND è completata localmente. • Il buffer del messaggio può essere sovrascritto subito dopo il ritorno al processo chiamante. RECEIVE Non-Blocking • Ritorna “immediatamente”. • Il buffer del messaggio non deve essere letto subito dopo il ritorno al processo chiamante, ma si deve controllare che la RECEIVE sia completata localmente. RECEIVE Blocking • Ritorna quando la RECEIVE è completata localmente. • Il buffer del messaggio può essere letto subito dopo il ritorno. Michele Colajanni – Libreria MPI 19/36 Modalità di comunicazione punto-punto La modalità di una comunicazione punto-punto specifica quanto un’operazione di SEND può iniziare a trasmettere e quando può ritenersi completata. MPI prevede 4 modalità: Modalità SINCRONA La SEND può iniziare (a trasmettere) anche se la RECEIVE corrispondente non è iniziata. Tuttavia, la SEND è completata solo quando si ha garanzia che il processo destinatario ha eseguito e completato la RECEIVE. Modalità BUFFERED Simile alla modalità sincrona per l’inizio della SEND. Tuttavia, il completamento è sempre indipendente dall’esecuzione della RECEIVE. (Il messaggio può essere bufferizzato per garantire il funzionamento) Modalità STANDARD La SEND può iniziare (a trasmettere) anche se la RECEIVE corrispondente non è iniziata. La semantica del completamento è sincrona o buffered. Modalità READY La SEND può iniziare (a trasmettere) assumendo che la corrispondente RECEIVE è iniziata. Tuttavia, il completamento è sempre indipendente dall’esecuzione della RECEIVE. Michele Colajanni – Libreria MPI 20/36 10
Sintesi dei tipi di comunicazione Operazione di SEND • 4 modalità di comunicazione (sincrona, standard, buffered, ready) • 2 modalità di blocking (blocking, non blocking) Blocking significa che la SEND può ritenersi completata localmente à 8 tipi di SEND (=buffer di uscita è libero) mpi_[ - , i ] [ - , r , s , b ] send [ - , i ] = modalità di blocking [ - , r , s , b ] = modalità di comunicazione Operazione di RECEIVE • 1 modalità di comunicazione Una qualsiasi operazione di receive può essere utilizzata per ricevere • 2 modalità di blocking messaggi da una qualsiasi SEND à 2 tipi di RECEIVE mpi_[ - , i ] recv [ - , i ] = modalità di blocking Michele Colajanni – Libreria MPI 21/36 Modalità di Comunicazione/Blocking Problema: Cosa fare quando il processo destinatario non è in grado di ricevere subito il messaggio? • Modalità STANDARD [il messaggio vene copiato in un buffer interno; il processo mittente continua dopo il completamento della copia] MPI_SEND (…) • Modalità BUFFERED [il messaggio viene copiato in un buffer esterno ed il processo mittente si blocca finché il buffer non può essere riutilizzato] MPI_BSEND (…) MPI_BUFFER_ATTACH (…) MPI_BUFFER_DETACH (…) • Modalità SINCRONA [il processo mittente si blocca finché il messaggio non è stato ricevuto dal processo destinatario] MPI_SSEND (…) • Modalità READY [si assume che il processo destinatario abbia già eseguito una RECEIVE] MPI_RSEND (…) Da usare con attenzione, possibilmente in combinazione con MPI_WAIT oppure MPI_TEST Michele Colajanni – Libreria MPI 22/36 11
Receive Blocking REC (buffer, lenght, tag) MPI_Recv (buf, count , datatype, source, tag , comm, status) buf= buffer dove inserire il messaggio ricevuto count= numero di elementi del buffer di tipo datatype datatype= tipo di dato del messaggio source = numero del processo mittente, relativo al gruppo/contesto comm (MPI_ANY_SOURCEàricevi il primo msg in arrivo da source ) tag=identificativo del messaggio comm= identifica un gruppo di processi e un contesto di comunicazione (default: MPI_COMM_WORLDà un contesto costituito da tutti i processi) status= in C è una variabile di tipo struct dove: status.MPI_SOURCE contiene il rank del mittente status.MPI_TAG contiene il tag del messaggio status.MPI_GET_COUNT contiene il numero di item ricevuti Michele Colajanni – Libreria MPI 23/36 Sincronizzazione tra processi Due possibilità per la sincronizzazione dei processi: • Uso di comunicazioni sincrone (es., MPI_ssend) • Uso di primitive esplicite della libreria MPI (es., MPI_barrier) Michele Colajanni – Libreria MPI 24/36 12
Completamenti multipli MPI_waitall • Si blocca finché tutti i processi in una determinata lista non sono stati completati MPI_waitany • Si blocca finché un processo di una determinata lista è stato completato MPI_waitsome • Si blocca finché almeno un processo di una determinata lista è s tato completato Michele Colajanni – Libreria MPI 25/36 Elementi caratterizzanti di MPI • Modello programmativo • Funzioni per l’individuazione dell’identificativo del processo e del numero di processi • Comunicazioni punto-punto (one-to-one) • Comunicazioni collettive (one-to-many, many-to-one) • Operazioni collettive (one-to-many, many-to-one) Michele Colajanni – Libreria MPI 26/36 13
Tipi di comunicazione collettive in MPI • One-to-Many (multicast) • One-to-All (broadcast) • Many(All)-to-One (gather) • Many-to-Many • All-to-All Michele Colajanni – Libreria MPI 27/36 Comunicazioni Collettive in MPI P0 A P0 A P1 Broadcast P1 A P2 P2 A P3 P3 A P0 A B C D Scatter P0 A P1 P1 B P2 Gather P2 C P3 P3 D P0 A P0 A B C D P1 B All gather P1 A B C D P2 C P2 A B C D P3 D P3 A B C D P0 A0 A1 A2 A3 P0 A0 B0 C0 D0 P1 B0 B1 B2 B3 All to All P1 A1 B1 C1 D1 P2 C0 C1 C2 C3 P2 A2 B2 C2 D2 P3 D0 D1 D2 D3 P3 A3 B3 C3 D3 Michele Colajanni – Libreria MPI 28/36 14
MPI_REDUCE RANK A B C D A B C D 0 root E F GH A B C D 1 MPI_REDUCE I J K L A B C D 2 MNO P A B C D 3 AoEoIoMoQ QR S T A B C D 4 Michele Colajanni – Libreria MPI 29/36 MPI_ALLREDUCE RANK A B C D A B C D 0 E F GH Nota: non c’è ROOT nelle operazioni A B C D MPI_ALLXXX 1 MPI_ALLREDUCE I J K L A B C D 2 MNO P A B C D 3 QR S T A B C D 4 AoEoIoMoQ Michele Colajanni – Libreria MPI 30/36 15
Elementi caratterizzanti di MPI • Modello programmativo • Funzioni per l’individuazione dell’identificativo del processo e del numero di processi • Comunicazioni punto-punto (one-to-one) • Comunicazioni collettive (one-to-many, many-to-one) • Operazioni collettive (one-to-many, many-to-one) Michele Colajanni – Libreria MPI 31/36 Operazioni collettive • Barrier (sincronizzazione) • Data Movement (comunicazioni collettive) Broadcast Scatter Gather • Collective Computations ≈ Reduce (computazioni collettive) Minimum, Maximum Sum Logical OR, AND, etc. User -defined NOTA A differenza di altre librerie message-passing, in MPI le comunicazioni collettive non hanno bisogno di esplicitare la receive. Tutti i processi eseguono: MPI_BCAST (buf, count, datatype, source, comm) Es., MPI_BCAST (&n, 1, MPI_INT, 0, MPI_COMM_WORLD) Michele Colajanni – Libreria MPI 32/36 16
Topologie Virtuali Possibilità di concettualizzare l’organizzazione fisica della rete di interconessione (topology) dei processi secondo un determinato pattern di comunicazione (application topology) Diverse topologie possibili: • Griglia logica MPI_CART_CREATE(…) • Grafi regolari • Topologie definite dall’utente Le topologie virtuali forniscono una metodologia ad alto livello per gestire gruppi di processi senza trattare con essi direttamente. Michele Colajanni – Libreria MPI 33/36 Topologie Virtuali: Esempio Definire una topologia virtuale mesh bi-dimensionale 4x3. 0 1 2 3 0,0 0,1 0,2 0,3 4 5 6 7 0,1 1,1 2,1 3,1 ndims=2; 8 9 10 11 0,0 1,0 2,0 3,0 dims[1]=4; dims[2]=3; periods [1]=0; /*FALSE=non ciclica*/ periods [2]=0; /*TRUE=ciclica*/ reorder =1; /*FALSE= dati già distribuiti*/ /*Il process rank non cambia*/ /*TRUE= dati non distribuiti*/ /*MPI può modificare il process rank per /*tener conto della topologia virtuale*/ Comunicatore di Nuovo comunicatore partenza MPI_CART_CREATE(MPI_COMM_WORLD. ndims, dims, periods , reorder , Communicator2D) Michele Colajanni – Libreria MPI 34/36 17
Altre informazioni su MPI Alcune home page su MPI: n http://www.mcs.anl.gov/Projects/mpi n ftp://unix.hensa.ac.uk/parallel/standards/mpi MPI Standard Document: n http://www.mcs.anl.gov/mpi/mpi-report/mpi-report.html MPI Frequently Asked Questions: n http://www.cs.msstate.edu/dist_computing/mpi-faq.html Implementazione EPCC di MPI: n http://www.epcc.ed.ac.uk/t3dmpi/Product MPI: The Complete Reference n http://www.netlib.org/utk/papers/mpi-book/mpi-book.html Michele Colajanni – Libreria MPI 35/36 Oltre MPI-1 … • Generalizzare la nozione di processo - gestione dell’attivazione/disattivazione dinamica di processi - processi lightweight (threads) • Generalizzare la nozione di message-passing - remote signal (interrupt -driven receive) - active message (remote memory copying) • Parallel I/O - operazioni di I/O asincrone - nuovi datatype - gestire la non uniformità nell’accesso a dispositivi esterni à MPI-2: Extensions to the Message Passing Interface, July 1997 Michele Colajanni – Libreria MPI 36/36 18
Puoi anche leggere