Üzenetátadási felület

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. szeptember 29-én felülvizsgált verziótól ; az ellenőrzések 2 szerkesztést igényelnek .

A Message Passing Interface (MPI, üzenetátadási interfész) egy információátviteli programozási felület ( API ) , amely lehetővé teszi az üzenetek cseréjét az azonos feladatot ellátó folyamatok között. Tervezték : William Groupe , Evin Lusk és mások.

Az MPI a párhuzamos programozás leggyakoribb adatcsere-interfész szabványa , és számos számítógépes platformhoz létezik implementáció. A fürtök és szuperszámítógépek programjainak fejlesztésében használják . Az MPI-ben a folyamatok közötti kommunikáció fő eszköze az üzenetek egymásnak továbbítása.

Az MPI-t az MPI Forum szabványosította . Az MPI szabvány egy üzenettovábbítási felületet ír le, amelyet a platformon és a felhasználói alkalmazásokban is támogatni kell . Jelenleg az MPI-nek számos ingyenes és kereskedelmi célú megvalósítása létezik. Vannak implementációk a Fortran 77/90, Java , C és C++ számára .

Az MPI elsősorban az elosztott memóriarendszerekre orientálódik , azaz amikor az adatátviteli költségek magasak, míg az OpenMP a megosztott memóriarendszerekre (többmagos megosztott gyorsítótárral) irányul. Mindkét technológia együtt használható a többmagos rendszerek optimális kihasználására egy klaszterben.

MPI szabványok

Az MPI első verzióját 1993-1994-ben fejlesztették ki, az MPI 1 pedig 1994-ben jelent meg.

A legtöbb modern MPI implementáció támogatja az 1.1-es verziót. Az MPI 2.0-s verziójú szabványt a legtöbb modern implementáció támogatja, azonban előfordulhat, hogy néhány szolgáltatás nem teljesen implementálható.

Az MPI 1.1 (közzétéve : 1995. június 12., először 2002-ben került bevezetésre) a következő szolgáltatásokat támogatja:

Az MPI 2.0 (közzétéve : 1997. július 18. ) a következő funkciókat támogatja még:

Az MPI 2.1 2008. szeptember elején jelent meg.

Az MPI 2.2 2009. szeptember 4-én jelent meg.

Az MPI 3.0 2012. szeptember 21-én jelent meg.

Interfész működés

Az MPI folyamatok közötti kommunikáció alapvető mechanizmusa az üzenetek továbbítása és fogadása. Az üzenet tartalmazza a továbbított adatokat és információkat, amelyek lehetővé teszik a fogadó fél számára, hogy azokat szelektíven fogadja:

A küldési és fogadási műveletek lehetnek blokkolók vagy nem blokkolók. A nem blokkoló műveleteknél a készenlét ellenőrzésének és a művelet végrehajtására való várakozásnak a funkciói vannak meghatározva.

Egy másik kommunikációs módszer a távoli memóriahozzáférés (RMA), amely lehetővé teszi egy távoli folyamat memóriaterületének olvasását és módosítását. A helyi folyamat át tudja vinni a távoli folyamat memóriaterületét (a folyamatok által meghatározott ablakon belül) a memóriájába és vissza, valamint kombinálni tudja a távoli folyamatba átvitt adatokat a memóriájában elérhető adatokkal (pl. , összegzéssel). Minden távoli memóriaelérési művelet nem blokkoló, azonban a blokkoló szinkronizálási funkciókat végrehajtásuk előtt és után is meg kell hívni.

Programpélda

A következő példa egy MPI -t használó C-szám számítási programra :

// Szükséges fejlécek szerepeltetése #include <stdio.h> #include <math.h> // Az MPI fejlécfájllal együtt #include "mpi.h" // Függvény köztes számításokhoz double f ( double a ) { return ( 4,0 / ( 1,0 + a * a )); } // Fő program függvény int main ( int argc , char ** argv ) { // Változók deklarálása int done = 0 , n , myid , numprocs , i ; dupla PI25DT = 3,141592653589793238462643 ; dupla mypi , pi , h , összeg , x ; dupla kezdési idő = 0,0 , befejezési idő ; int namelen ; char processzor_neve [ MPI_MAX_PROCESSOR_NAME ]; // Az MPI alrendszer inicializálása MPI_Init ( & argc , & argv ); // A kommunikátor méretének lekérése MPI_COMM_WORLD // (a folyamatok teljes száma a feladaton belül) MPI_Comm_size ( MPI_COMM_WORLD , & numprocs ); // Az aktuális folyamat számának lekérése // a kommunikátoron belül MPI_COMM_WORLD MPI_Comm_rank ( MPI_COMM_WORLD , & myid ); MPI_Get_processor_name ( processzor_neve , & namelen ); // A szál számának kinyomtatása a megosztott készletben fprintf ( stdout , "A %d %d folyamata %s \n " , myid , numprocs , processor_name ); fflush ( stdout ); közben ( ! kész ) { // intervallumok száma if ( myid == 0 ) { fprintf ( stdout , "Adja meg az intervallumok számát: (0 kilépés) " ); fflush ( stdout ); if ( scanf ( " %d " , & n ) != 1 ) { fprintf ( stdout , "Nincs megadva szám; kilépés \n " ); n = 0_ _ } startwtime = MPI_Wtime (); } // Az intervallumok számának sugárzása az összes folyamatnak (beleértve magunkat is) MPI_Bcast ( & n , 1 , MPI_INT , 0 , MPI_COMM_WORLD ); ha ( n == 0 ) kész = 1 ; más { h = 1,0 / ( kettős ) n ; összeg = 0,0 ; // Számítsa ki a folyamathoz rendelt pontot az ( i = myid + 1 ; ( i <= n ) ; i += numprocs ) { x = h * (( kétszer ) i - 0,5 ); összeg += f ( x ); } mypi = h * összeg ; // Az összes folyamat eredményének visszaállítása és az MPI_Reduce hozzáadása ( & mypi , & pi , 1 , MPI_DOUBLE , MPI_SUM , 0 , MPI_COMM_WORLD ); // Ha ez a fő folyamat, nyomtassa ki az eredményt if ( myid == 0 ) { printf ( "PI körülbelül %.16lf, hiba %.16lf \n " , pi , fabs ( pi - PI25DT )); endwtime = MPI_Wtime (); printf ( "falióra ideje =%lf \n " , endwtime - startwtime ); fflush ( stdout ); } } } // Az MPI alrendszer felszabadítása MPI_Finalize (); return 0 ; }

MPI implementációk

Lásd még

Linkek

Lásd még