Libreria MPI (Message Passing Interface)

Pagina creata da Giovanni Quaranta
 
CONTINUA A LEGGERE
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