Rozhraní pro předávání zpráv

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 29. září 2020; kontroly vyžadují 2 úpravy .

Message Passing Interface (MPI, message passing interface) je programovací rozhraní ( API ) pro přenos informací , které vám umožňuje vyměňovat si zprávy mezi procesy, které provádějí stejný úkol. Navrhli William Groupe , Evin Lusk a další.

MPI je nejběžnějším standardem rozhraní pro výměnu dat v paralelním programování a existují implementace pro velké množství počítačových platforem. Používá se při vývoji programů pro clustery a superpočítače . Hlavním prostředkem komunikace mezi procesy v MPI je předávání zpráv mezi sebou.

MPI je standardizováno MPI Forum . Standard MPI popisuje rozhraní pro předávání zpráv, které musí být podporováno na platformě i v uživatelských aplikacích . V současné době existuje velké množství bezplatných a komerčních implementací MPI. Existují implementace pro Fortran 77/90, Java , C a C++ .

MPI se primárně orientuje na systémy s distribuovanou pamětí , tedy tam, kde jsou náklady na přenos dat vysoké, zatímco OpenMP se orientuje na systémy se sdílenou pamětí (multi-core se sdílenou cache). Obě technologie lze použít společně pro optimální využití vícejádrových systémů v clusteru.

Standardy MPI

První verze MPI byla vyvinuta v letech 1993-1994 a MPI 1 vyšla v roce 1994.

Většina moderních implementací MPI podporuje verzi 1.1. Standard MPI verze 2.0 je podporován většinou moderních implementací, avšak některé funkce nemusí být plně implementovány.

MPI 1.1 (publikováno 12. června 1995 , poprvé implementováno v roce 2002) podporuje následující funkce:

V MPI 2.0 (publikováno 18. července 1997 ) jsou navíc podporovány následující funkce:

MPI 2.1 byla vydána na začátku září 2008.

MPI 2.2 byla vydána 4. září 2009.

MPI 3.0 byla vydána 21. září 2012.

Ovládání rozhraní

Základním mechanismem komunikace mezi procesy MPI je přenos a příjem zpráv. Zpráva nese přenášená data a informace, které umožňují přijímající straně je selektivně přijímat:

Operace odesílání a přijímání mohou být blokující nebo neblokující. Pro neblokující operace jsou definovány funkce kontroly připravenosti a čekání na provedení operace.

Dalším způsobem komunikace je vzdálený přístup do paměti (RMA), který umožňuje číst a upravovat paměťovou oblast vzdáleného procesu. Lokální proces může přenést paměťovou oblast vzdáleného procesu (uvnitř okna určeného procesy) do své paměti a zpět, stejně jako kombinovat data přenesená do vzdáleného procesu s daty dostupnými v jeho paměti (např. , sečtením). Všechny operace vzdáleného přístupu do paměti jsou neblokující, nicméně funkce blokování synchronizace musí být volány před a po jejich provedení.

Příklad programu

Následuje příklad programu pro výpočet čísla C pomocí MPI :

// Zahrňte povinná záhlaví #include <stdio.h> #include <math.h> // Včetně souboru záhlaví MPI #include "mpi.h" // Funkce pro mezivýpočty double f ( double a ) { návrat ( 4,0 / ( 1,0 + a * a )); } // Hlavní funkce programu int main ( int argc , char ** argv ) { // Deklarace proměnných int done = 0 , n , myid , numprocs , i ; dvojitá PI25DT = 3,141592653589793238462643 ; double mypi , pi , h , sum , x ; double startwtime = 0,0 , endwtime ; int namelen ; char název_procesoru [ MPI_MAX_PROCESSOR_NAME ]; // Inicializace MPI subsystému MPI_Init ( & argc , & argv ); // Získání velikosti komunikátoru MPI_COMM_WORLD // (celkový počet procesů v rámci úlohy) MPI_Comm_size ( MPI_COMM_WORLD , & numprocs ); // Získání čísla aktuálního procesu v // komunikátoru MPI_COMM_WORLD MPI_Comm_rank ( MPI_COMM_WORLD , & myid ); MPI_Get_processor_name ( procesor_name , & namelen ); // Vytiskne číslo vlákna ve sdíleném fondu fprintf ( stdout , "Proces %d z %d je na %s \ n " , moje ID , numprocs , název_procesoru ); fflush ( stdout ); zatímco ( ! hotovo ) { // počet intervalů if ( mojeid == 0 ) { fprintf ( stdout , "Zadejte počet intervalů: (0 ukončení) " ); fflush ( stdout ); if ( scanf ( "%d" , & n ) != 1 ) { fprintf ( stdout , "Nezadáno žádné číslo; ukončuji \n " ); n = 0 _ } startwtime = MPI_Wtime (); } // Vysílání počtu intervalů všem procesům (včetně nás samotných) MPI_Bcast ( & n , 1 , MPI_INT , 0 , MPI_COMM_WORLD ); if ( n == 0 ) hotovo = 1 ; jiný { h = 1,0 / ( double ) n ; součet = 0,0 ; // Vypočítejte bod přiřazený procesu pro ( i = mojeid + 1 ; ( i <= n ) ; i += numprocs ) { x = h * (( double ) i - 0,5 ); součet += f ( x ); } mypi = h * součet ; // Resetuje výsledky ze všech procesů a přidá MPI_Reduce ( & mypi , & pi , 1 , MPI_DOUBLE , MPI_SUM , 0 , MPI_COMM_WORLD ); // Pokud je toto hlavní proces, vytiskněte výsledek if ( myid == 0 ) { printf ( "PI je přibližně %.16lf, Chyba je %.16lf \n " , pi , fabs ( pi - PI25DT )); endwtime = MPI_Wtime (); printf ( "čas nástěnných hodin =%lf \n " , endwtime - startwtime ); fflush ( stdout ); } } } // Uvolnění MPI subsystému MPI_Finalize (); návrat 0 ; }

Implementace MPI

  • MPICH  je jednou z prvních bezplatných implementací MPI, která běží na systémech UNIX a Windows NT
  • Open MPI  je další bezplatná implementace MPI. Na základě dřívějších projektů FT-MPI, LA-MPI, LAM/MPI a PACX-MPI. Podporovány jsou různé komunikační systémy (včetně Myrinet ).
  • MPI/PRO pro Windows NT - komerční implementace pro Windows NT
  • Intel MPI  - komerční implementace pro Windows / Linux
  • Microsoft MPI je součástí Compute Cluster Pack SDK . Založeno na MPICH2, ale obsahuje další ovládací prvky úlohy. Je podporována specifikace MPI-2.
  • HP-MPI  je komerční implementace od společnosti HP
  • SGI MPT  - placená knihovna MPI od SGI
  • Mvapich  je bezplatná implementace MPI pro Infiniband
  • Oracle HPC ClusterTools  – bezplatná implementace pro Solaris SPARC / x86 a Linux založená na Open MPI
  • MPJ  - MPI pro Javu
  • MPJ Express  - MPI v Javě

Viz také

Odkazy

Viz také