Message Passing Interface (MPI, message passing interface) on ohjelmointirajapinta ( API ) tiedonsiirtoon , jonka avulla voit vaihtaa viestejä samaa tehtävää suorittavien prosessien välillä. Suunnittelija William Groupe , Evin Lusk ja muut.
MPI on yleisin tiedonvaihtorajapintastandardi rinnakkaisohjelmoinnissa , ja toteutuksia on lukuisille tietokonealustoille. Käytetään klustereiden ja supertietokoneiden ohjelmien kehittämisessä . Pääasiallinen viestintäkeino prosessien välillä MPI:ssä on viestien välittäminen toisilleen.
MPI on MPI Forumin standardoima . MPI-standardi kuvaa viestinvälitysrajapintaa, jota tulee tukea sekä alustalla että käyttäjäsovelluksissa . Tällä hetkellä on olemassa suuri määrä ilmaisia ja kaupallisia MPI-toteutuksia. Toteutuksia on Fortran 77/90:lle, Javalle , C :lle ja C++ :lle .
MPI on ensisijaisesti suunnattu hajautettuihin muistijärjestelmiin , eli kun tiedonsiirtokustannukset ovat korkeat, kun taas OpenMP on jaettuihin muistijärjestelmiin (moniytiminen jaettu välimuisti). Molempia tekniikoita voidaan käyttää yhdessä klusterin moniytimisjärjestelmien optimaaliseen käyttöön.
MPI:n ensimmäinen versio kehitettiin vuosina 1993-1994, ja MPI 1 julkaistiin vuonna 1994.
Useimmat nykyaikaiset MPI-toteutukset tukevat versiota 1.1. MPI versio 2.0 -standardia tukevat useimmat nykyaikaiset toteutukset, mutta joitain ominaisuuksia ei ehkä ole toteutettu täysin.
MPI 1.1 (julkaistu 12. kesäkuuta 1995 , otettu käyttöön ensimmäisen kerran vuonna 2002) tukee seuraavia ominaisuuksia:
MPI 2.0:ssa (julkaistu 18. heinäkuuta 1997 ) tuetaan lisäksi seuraavia ominaisuuksia:
MPI 2.1 julkaistiin syyskuun alussa 2008.
MPI 2.2 julkaistiin 4. syyskuuta 2009.
MPI 3.0 julkaistiin 21. syyskuuta 2012.
MPI-prosessien välisen viestinnän perusmekanismi on viestien lähetys ja vastaanotto. Viesti sisältää lähetetyt tiedot ja tiedot, joiden avulla vastaanottava osapuoli voi vastaanottaa ne valikoivasti:
Lähetys- ja vastaanottotoiminnot voivat olla estäviä tai estäviä. Ei-estotoiminnoille määritellään valmiuden tarkistamisen ja toimenpiteen suorittamisen odottamisen toiminnot.
Toinen viestintätapa on etämuistin käyttö (RMA), jonka avulla voit lukea ja muokata etäprosessin muistialuetta. Paikallinen prosessi voi siirtää etäprosessin muistialueen (prosessien määrittämän ikkunan sisällä) muistiinsa ja takaisin sekä yhdistää etäprosessiin siirretyt tiedot sen muistissa oleviin tietoihin (esim. , summaamalla). Kaikki etämuistin käyttötoiminnot eivät ole estäviä, mutta estävät synkronointitoiminnot on kutsuttava ennen ja jälkeen niiden suorittamisen.
Seuraavassa on esimerkki MPI :tä käyttävästä C - luvun laskentaohjelmasta :
// Sisällytä pakolliset otsikot #include <stdio.h> #include <math.h> // Sisältää MPI-otsikkotiedoston #include "mpi.h" // Funktio välilaskutoimiin double f ( double a ) { paluu ( 4,0 / ( 1,0 + a * a )); } // Pääohjelman toiminto int main ( int argc , char ** argv ) { // Muuttujien ilmoitus int done = 0 , n , myid , numprocs , i ; kaksinkertainen PI25DT = 3,141592653589793238462643 ; kaksinkertainen mypi , pi , h , summa , x ; kaksinkertainen aloitusaika = 0,0 , lopetusaika ; int namelen ; char prosessorin_nimi [ MPI_MAX_PROCESSOR_NAME ]; // Alusta MPI-alijärjestelmä MPI_Init ( & argc , & argv ); // Hanki kommunikaattorin koko MPI_COMM_WORLD // (tehtävän sisällä olevien prosessien kokonaismäärä) MPI_Comm_size ( MPI_COMM_WORLD , & numprocs ); // Hanki nykyisen prosessin numero // kommunikaattorissa MPI_COMM_WORLD MPI_Comm_rank ( MPI_COMM_WORLD , & myid ); MPI_Hanki_prosessorin_nimi ( prosessorin_nimi , & namelen ); // Tulosta säikeen numero jaetussa poolissa fprintf ( stdout , "Prosessi %d / %d on %s \n " , myid , numprocs , prosessorin_nimi ); fflush ( stdout ); kun ( ! valmis ) { // välien lukumäärä if ( myid == 0 ) { fprintf ( stdout , "Anna välien määrä: (0 lopettaa) " ); fflush ( stdout ); if ( scanf ( " %d " , & n ) != 1 ) { fprintf ( stdout , "Ei numeroa syötetty; lopetetaan \n " ); n = 0_ _ } aloitusaika = MPI_Wtime (); } // Lähetä välien määrä kaikille prosesseille (mukaan lukien itsellemme) MPI_Bcast ( & n , 1 , MPI_INT , 0 , MPI_COMM_WORLD ); jos ( n == 0 ) tehty = 1 ; muu { h = 1,0 / ( kaksinkertainen ) n ; summa = 0,0 ; // Laske prosessille annettu piste ( i = myid + 1 ; ( i < = n ) ; i += numprocs ) { x = h * (( kaksinkertainen ) i - 0,5 ); summa += f ( x ); } mypi = h * summa ; // Nollaa kaikkien prosessien tulokset ja lisää MPI_Reduce ( & mypi , & pi , 1 , MPI_DOUBLE , MPI_SUM , 0 , MPI_COMM_WORLD ); // Jos tämä on pääprosessi, tulosta tulos if ( myid == 0 ) { printf ( "PI on noin %.16lf, Virhe on %.16lf \n " , pi , fabs ( pi - PI25DT )); endwtime = MPI_Wtime (); printf ( "seinäkellon aika =%lf \n " , endwtime - alkamisaika ); fflush ( stdout ); } } } // Vapauta MPI-alijärjestelmä MPI_Finalize (); paluu 0 ; }hajautettuun ja rinnakkaislaskentaan _ _ | Ohjelmisto|
---|---|
Standardit, kirjastot | |
Valvontaohjelmisto | |
Ohjausohjelmisto |