Meddelelsesoverførsel grænseflade

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 29. september 2020; checks kræver 2 redigeringer .

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.

MPI-standarder

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.

Interface operation

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.

Programeksempel

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 ; }

MPI implementeringer

  • MPICH  er en af ​​de tidligste gratis MPI-implementeringer, der kører på UNIX -systemer og Windows NT
  • Open MPI  er en anden gratis implementering af MPI. Baseret på tidligere FT-MPI, LA-MPI, LAM/MPI og PACX-MPI projekter. Forskellige kommunikationssystemer understøttes (inklusive Myrinet ).
  • MPI/PRO til Windows NT - kommerciel implementering til Windows NT
  • Intel MPI  - kommerciel implementering til Windows / Linux
  • Microsoft MPI er en del af Compute Cluster Pack SDK . Baseret på MPICH2, men inkluderer yderligere jobkontroller. MPI-2-specifikationen understøttes.
  • HP-MPI  er en kommerciel implementering fra HP
  • SGI MPT  - betalt MPI-bibliotek fra SGI
  • Mvapich  er en gratis implementering af MPI til Infiniband
  • Oracle HPC ClusterTools  - gratis implementering til Solaris SPARC / x86 og Linux baseret på Open MPI
  • MPJ  - MPI til Java
  • MPJ Express  - MPI i Java

Se også

Links

Se også