Message Passing Interface (MPI, message passing interface) er en programmeringsgrænseflade ( API ) til informationsoverførsel , som giver dig mulighed for at udveksle meddelelser mellem processer, der udfører den samme opgave. Designet af William Groupe , Evin Lusk og andre.
MPI er den mest almindelige dataudvekslingsgrænsefladestandard i parallel programmering , og der er implementeringer til et stort antal computerplatforme. Anvendes til udvikling af programmer til klynger og supercomputere . Det vigtigste kommunikationsmiddel mellem processer i MPI er videregivelse af meddelelser til hinanden.
MPI er standardiseret af MPI Forum . MPI-standarden beskriver en grænseflade for meddelelsesoverførsel, der skal understøttes både på platformen og i brugerapplikationer . Der er i øjeblikket et stort antal gratis og kommercielle implementeringer af MPI. Der er implementeringer til Fortran 77/90, Java , C og C++ .
MPI er primært orienteret mod distribuerede hukommelsessystemer , dvs. når omkostningerne til dataoverførsel er høje, mens OpenMP er orienteret mod delte hukommelsessystemer (multi-core med delt cache). Begge teknologier kan bruges sammen for at udnytte multi-core systemer optimalt i en klynge.
Den første version af MPI blev udviklet i 1993-1994, og MPI 1 udkom i 1994.
De fleste moderne MPI-implementeringer understøtter version 1.1. MPI version 2.0-standarden understøttes af de fleste moderne implementeringer, men nogle funktioner er muligvis ikke fuldt implementeret.
MPI 1.1 (offentliggjort 12. juni 1995 , første gang implementeret i 2002) understøtter følgende funktioner:
I MPI 2.0 (publiceret 18. juli 1997 ) understøttes følgende funktioner yderligere:
MPI 2.1 blev udgivet i begyndelsen af september 2008.
MPI 2.2 blev udgivet den 4. september 2009.
MPI 3.0 blev udgivet den 21. september 2012.
Den grundlæggende mekanisme for kommunikation mellem MPI-processer er transmission og modtagelse af meddelelser. Meddelelsen bærer de transmitterede data og informationer, der gør det muligt for den modtagende side at selektivt modtage dem:
Send og modtag handlinger kan være blokerende eller ikke-blokerende. For ikke-blokerende operationer defineres funktionerne til at kontrollere beredskabet og vente på udførelsen af operationen.
En anden kommunikationsmetode er fjernhukommelsesadgang (RMA), som giver dig mulighed for at læse og ændre hukommelsesområdet i en fjernproces. Den lokale proces kan overføre hukommelsesområdet for fjernprocessen (inde i vinduet specificeret af processerne) til dens hukommelse og tilbage, samt kombinere de data, der overføres til fjernprocessen med de tilgængelige data i dens hukommelse (f. ved at summere). Alle fjernbetjeninger til hukommelsesadgang er ikke-blokerende, dog skal blokerende synkroniseringsfunktioner kaldes før og efter de udføres.
Det følgende er et eksempel på et C - talberegningsprogram , der bruger MPI :
// Inkluder påkrævede overskrifter #include <stdio.h> #include <math.h> // Inkluderer MPI-headerfilen #include "mpi.h" // Funktion til mellemberegninger dobbelt f ( dobbelt a ) { return ( 4,0 / ( 1,0 + a * a )); } // Hovedprogramfunktion int main ( int argc , char ** argv ) { // Deklaration af variable int done = 0 , n , myid , numprocs , i ; dobbelt PI25DT = 3,141592653589793238462643 ; dobbelt mypi , pi , h , sum , x ; double startwtime = 0,0 , endwtime ; int namelen ; tegn processornavn [ MPI_MAX_PROCESSOR_NAME ]; // Initialiser MPI-undersystemet MPI_Init ( & argc , & argv ); // Hent størrelsen på kommunikatoren MPI_COMM_WORLD // (samlet antal processer i opgaven) MPI_Comm_size ( MPI_COMM_WORLD , & numprocs ); // Hent nummeret på den aktuelle proces i // kommunikatoren MPI_COMM_WORLD MPI_Comm_rank ( MPI_COMM_WORLD , & myid ); MPI_Get_processor_name ( processor_name , & namelen ); // Udskriv trådnummeret i den delte pulje fprintf ( stdout , "Process %d af %d er på %s \n " , myid , numprocs , processor_name ); fflush ( stdout ); mens ( ! færdig ) { // antal intervaller if ( myid == 0 ) { fprintf ( stdout , "Indtast antallet af intervaller: (0 afslutter) " ); fflush ( stdout ); if ( scanf ( "%d" , & n ) != 1 ) { fprintf ( stdout , "Intet tal indtastet; afslutter \n " ); n = 0 _ } startwtime = MPI_Wtime (); } // Broadcast antallet af intervaller til alle processer (inklusive os selv) MPI_Bcast ( & n , 1 , MPI_INT , 0 , MPI_COMM_WORLD ); hvis ( n == 0 ) færdig = 1 ; andet { h = 1,0 / ( dobbelt ) n ; sum = 0,0 ; // Beregn det punkt, der er tildelt processen for ( i = myid + 1 ; ( i <= n ) ; i += numprocs ) { x = h * (( dobbelt ) i - 0,5 ); sum += f ( x ); } mypi = h * sum ; // Nulstil resultater fra alle processer og tilføj MPI_Reduce ( & mypi , & pi , 1 , MPI_DOUBLE , MPI_SUM , 0 , MPI_COMM_WORLD ); // Hvis dette er hovedprocessen, udskriv resultatet if ( myid == 0 ) { printf ( "PI er ca. %.16lf, fejl er %.16lf \n " , pi , fabs ( pi - PI25DT )); endwtime = MPI_Wtime (); printf ( "vægur tid =%lf \n " , endwtime - startwtime ); fflush ( stdout ); } } } // Frigiv MPI-undersystemet MPI_Finalize (); returnere 0 ; }distribueret og parallel computing | Software til|
---|---|
Standarder, biblioteker | |
Overvågningssoftware | |
Kontrol software |