Rozhraní pro předávání zpráv - Message Passing Interface

Rozhraní pro předávání zpráv ( MPI ) je standardizovaný a přenosný standard pro předávání zpráv navržený tak, aby fungoval na paralelních počítačových architekturách . MPI standard definuje syntaxe a sémantiky z knihovních rutin , které jsou užitečné pro široký okruh uživatelů psaní přenosné programy předávání zpráv v C , C ++ a Fortran . Existuje několik open-source implementací MPI , které podpořily vývoj paralelního softwarového průmyslu a podpořily vývoj přenosných a škálovatelných paralelních aplikací ve velkém měřítku.

Dějiny

Snaha o předávání rozhraní začala v létě 1991, kdy malá skupina výzkumníků zahájila diskuse na ústupu hor v Rakousku. Z této diskuse vzešel workshop o standardech pro předávání zpráv v prostředí distribuované paměti, který se konal 29. – 30. Dubna 1992 ve Williamsburgu ve Virginii . Účastníci Williamsburgu diskutovali o základních funkcích nezbytných pro standardní rozhraní pro předávání zpráv a vytvořili pracovní skupinu pro pokračování procesu normalizace. Jack Dongarra , Tony Hey a David W. Walker předložili v listopadu 1992. předběžný návrh návrhu „MPI1“. V listopadu 1992 se v Minneapolisu konalo zasedání pracovní skupiny MPI, které rozhodlo, že proces standardizace bude zaměřen na další formální základ. Pracovní skupina MPI se scházela každých 6 týdnů během prvních 9 měsíců roku 1993. Návrh standardu MPI byl představen na konferenci Supercomputing '93 v listopadu 1993. Po období veřejných komentářů, které vedly k určitým změnám v MPI, verze 1.0 MPI byl vydán v červnu 1994. Tato setkání a e-mailová diskuse společně vytvořily MPI fórum, jehož členství bylo otevřeno všem členům komunity vysoce výkonných počítačů .

Úsilí MPI zahrnovalo asi 80 lidí ze 40 organizací, hlavně ve Spojených státech a Evropě. Většina hlavních prodejců souběžných počítačů byla zapojena do úsilí MPI a spolupracovala s výzkumníky z univerzit, vládních laboratoří a průmyslu .

MPI poskytuje paralelním prodejcům hardwaru jasně definovanou základní sadu rutin, které lze efektivně implementovat. V důsledku toho mohou prodejci hardwaru stavět na této kolekci standardních rutin nízké úrovně a vytvářet rutiny vyšší úrovně pro komunikační prostředí distribuované paměti dodávané s jejich paralelními počítači . MPI poskytuje snadno použitelné přenosné rozhraní pro základní uživatele, přesto dostatečně výkonné, aby programátorům umožnilo používat vysoce výkonné operace předávání zpráv dostupné na pokročilých počítačích.

Ve snaze vytvořit univerzální standard pro předávání zpráv vědci nevycházeli z jediného systému, ale začlenili nejužitečnější funkce několika systémů, včetně systémů navržených společnostmi IBM, Intel , nCUBE , PVM, Express, P4 a PARMACS. . Paradigma předávání zpráv je atraktivní díky široké přenositelnosti a lze ji použít v komunikaci pro multiprocesory s distribuovanou a sdílenou pamětí, sítě pracovních stanic a kombinaci těchto prvků. Paradigma lze použít ve více nastaveních, nezávisle na rychlosti sítě nebo architektuře paměti.

Podpora pro setkání MPI přišla částečně z DARPA a od US National Science Foundation (NSF) v rámci grantu ASC-9310330, NSF Science and Technology Center Cooperative agreement number CCR-8809615, and from the European Commission through Esprit Project P6643. University of Tennessee také finanční příspěvky do MPI fóra.

Přehled

MPI je komunikační protokol pro programování paralelních počítačů . Podporována je jak komunikace point-to-point, tak kolektivní komunikace. MPI "je rozhraní aplikačního programátoru pro předávání zpráv spolu s protokolem a sémantickými specifikacemi, jak se jeho funkce musí chovat v jakékoli implementaci." Cílem MPI je vysoký výkon, škálovatelnost a přenositelnost. MPI zůstává dominantním modelem používaným v dnešních vysoce výkonných počítačích .

MPI není sankcionováno žádným významným normalizačním orgánem; přesto se stal de facto standardem pro komunikaci mezi procesy, které modelují paralelní program běžící na distribuovaném paměťovém systému. Skutečné superpočítače s distribuovanou pamětí, jako jsou počítačové klastry, často takové programy spouští.

Hlavní model MPI-1 nemá koncept sdílené paměti a MPI-2 má pouze omezený koncept distribuované sdílené paměti . Programy MPI jsou však pravidelně spuštěny na počítačích se sdílenou pamětí a MPICH i Open MPI mohou používat sdílenou paměť pro přenos zpráv, pokud je k dispozici. Navrhování programů kolem modelu MPI (na rozdíl od explicitních modelů sdílené paměti ) má výhody oproti architekturám NUMA, protože MPI podporuje umístění paměti . V MPI-3 bylo zavedeno explicitní programování sdílené paměti.

Přestože MPI patří do vrstev 5 a vyšších referenčního modelu OSI , implementace mohou pokrývat většinu vrstev, přičemž v transportní vrstvě jsou použity sokety a protokol TCP ( Transmission Control Protocol ).

Většina implementací MPI se skládá ze specifické sady rutin přímo volatelných z C , C ++ , Fortran (tj. API) a jakéhokoli jazyka schopného komunikovat s takovými knihovnami, včetně C# , Java nebo Pythonu . Výhodou MPI oproti starším knihovnám pro předávání zpráv je přenositelnost (protože MPI bylo implementováno téměř pro každou architekturu distribuované paměti) a rychlost (protože každá implementace je v zásadě optimalizována pro hardware, na kterém běží).

MPI používá pro hovory a jazykové vazby jazykově nezávislé specifikace (LIS). První standard MPI specifikoval vazby ANSI C a Fortran-77 společně s LIS. Předloha byla představena na Supercomputing 1994 (listopad 1994) a dokončena brzy poté. Asi 128 funkcí tvoří standard MPI-1.3, který byl vydán jako konečný konec řady MPI-1 v roce 2008.

V současné době má standard několik verzí: verze 1.3 (běžně zkráceně MPI-1 ), která klade důraz na předávání zpráv a má statické běhové prostředí, MPI-2.2 (MPI-2), která obsahuje nové funkce, jako je paralelní I/O, dynamická správa procesů a operace vzdálené paměti a MPI-3.1 (MPI-3), který zahrnuje rozšíření kolektivních operací s neblokujícími verzemi a rozšíření jednostranných operací. MPI-2 LIS specifikuje více než 500 funkcí a poskytuje jazykové vazby pro ISO C , ISO C ++ a Fortran 90 . Byla také přidána interoperabilita objektů, aby bylo umožněno snadnější programování předávání zpráv ve smíšeném jazyce. Vedlejším efektem standardizace MPI-2, dokončeného v roce 1996, bylo vyjasnění standardu MPI-1 a vytvoření MPI-1.2.

MPI-2 je většinou nadmnožinou MPI-1, i když některé funkce byly zastaralé. Programy MPI-1.3 stále fungují podle implementací MPI kompatibilních se standardem MPI-2.

MPI-3 obsahuje nové vazby Fortran 2008, přičemž odstraňuje zastaralé vazby C ++ a také mnoho zastaralých rutin a objektů MPI.

MPI je často srovnáváno s Parallel Virtual Machine (PVM), což je populární distribuované prostředí a systém pro předávání zpráv vyvinutý v roce 1989 a který byl jedním ze systémů, které motivovaly potřebu standardního paralelního předávání zpráv. Modely programování se sdílenou pamětí se závitem (jako jsou Pthreads a OpenMP ) a programování předávání zpráv (MPI/PVM) lze považovat za doplňkové a příležitostně byly použity společně například na serverech s více uzly velké sdílené paměti.

Funkčnost

Rozhraní MPI má poskytovat základní virtuální topologii, synchronizaci a komunikační funkce mezi sadou procesů (které byly namapovány na uzly/servery/počítačové instance) způsobem nezávislým na jazyce, se syntaxí specifickou pro jazyk (vazby), plus několik funkcí specifických pro jazyk. Programy MPI vždy pracují s procesy, ale programátoři je běžně označují jako procesory. Pro maximální výkon bude každému procesoru (nebo jádru ve vícejádrovém počítači) přiřazen pouze jeden proces. Toto přiřazení se děje za běhu prostřednictvím agenta, který spouští program MPI, běžně nazývaný mpirun nebo mpiexec.

Mezi funkce knihovny MPI patří, ale nejsou omezeny na operace odesílání/přijímání typu point-to-point rendezvous, výběr mezi kartézskou nebo grafickou topologií logického procesu, výměna dat mezi páry procesů (operace odesílání/přijímání), kombinování částečných výsledky výpočtů (operace shromažďování a snižování), synchronizační uzly (operace s bariérou) a také získávání informací souvisejících se sítí, jako je počet procesů ve výpočetní relaci, aktuální identita procesoru, na kterou je proces mapován, sousední procesy přístupné v logická topologie atd. Operace typu point-to-point přicházejí v synchronních , asynchronních , vyrovnávacích a připravených formách, což umožňuje relativně silnější i slabší sémantiku pro synchronizační aspekty rendezvous-send. V asynchronním režimu je ve většině implementací možné mnoho vynikajících operací.

MPI-1 a MPI-2 umožňují implementace, které překrývají komunikaci a výpočet, ale praxe a teorie se liší. MPI také specifikuje rozhraní bezpečná pro vlákna , která mají strategie soudržnosti a spojování, které pomáhají vyhnout se skrytému stavu v rozhraní. Je relativně snadné psát vícevláknový MPI kód ​​point-to-point a některé implementace takový kód podporují. Vícevláknová kolektivní komunikace se nejlépe provádí s více kopiemi komunikátorů, jak je popsáno níže.

Pojmy

MPI poskytuje několik funkcí. Následující koncepty poskytují kontext pro všechny tyto schopnosti a pomáhají programátorovi rozhodnout, jaké funkce použít ve svých aplikačních programech. Čtyři z osmi základních konceptů MPI jsou jedinečné pro MPI-2.

Komunikátor

Objekty komunikátoru spojují skupiny procesů v relaci MPI. Každý komunikátor dává každému obsaženému procesu nezávislý identifikátor a uspořádá jeho obsažené procesy do uspořádané topologie . MPI má také explicitní skupiny, ale ty jsou dobré hlavně pro organizaci a reorganizaci skupin procesů před vytvořením dalšího komunikátoru. MPI rozumí operacím s jednou skupinou intrakomunikátorů a dvoustranné komunikaci mezi komunikátory. V MPI-1 jsou operace s jednou skupinou nejrozšířenější. Bilaterální operace se většinou objevují v MPI-2, kde zahrnují kolektivní komunikaci a dynamické řízení procesů.

Komunikátory lze rozdělit na několik příkazů MPI. Tyto příkazy zahrnují MPI_COMM_SPLIT, kde se každý proces připojí k jednomu z několika barevných subkomunikátorů tím, že se prohlásí za barvu.

Základy point-to-point

Řada důležitých funkcí MPI zahrnuje komunikaci mezi dvěma konkrétními procesy. Oblíbeným příkladem je MPI_Send, který umožňuje jednomu zadanému procesu odeslat zprávu druhému zadanému procesu. Operace typu point-to-point, jak se jim říká, jsou zvláště užitečné ve vzorované nebo nepravidelné komunikaci, například v datové paralelní architektuře, ve které každý procesor rutinně přepíná oblasti dat s konkrétními jinými procesory mezi kroky výpočtu nebo master- architektura slave, ve které master odesílá data nových úkolů slave, kdykoli je dokončen předchozí úkol.

MPI-1 specifikuje mechanismy pro blokovací i neblokující komunikační mechanismy point-to-point a také takzvaný mechanismus „ready-send“, pomocí kterého lze odeslat žádost o odeslání pouze tehdy, když již byla zadána žádost o odpovídající příjem .

Kolektivní základy

Kolektivní funkce zahrnují komunikaci mezi všemi procesy ve skupině procesů (což může znamenat celý fond procesů nebo programem definovanou podmnožinu). Typickou funkcí je MPI_Bcastvolání (zkratka pro „ broadcast “). Tato funkce přebírá data z jednoho uzlu a odesílá je všem procesům ve skupině procesů. Reverzní operace je MPI_Reducevolání, které bere data ze všech procesů ve skupině, provádí operaci (například sčítání) a ukládá výsledky do jednoho uzlu. MPI_Reduceje často užitečné na začátku nebo na konci velkého distribuovaného výpočtu, kdy každý procesor pracuje s částí dat a poté je spojí do výsledku.

Ostatní operace provádějí sofistikovanější úkoly, jako je například MPI_Alltoallzměna uspořádání n položek dat tak, aby n -tý uzel získal n -tu položku dat od každého.

Odvozené datové typy

Mnoho funkcí MPI vyžaduje, abyste zadali typ dat odesílaných mezi procesy. Důvodem je, že MPI má za cíl podporovat heterogenní prostředí, kde mohou být typy na různých uzlech zastoupeny odlišně (například mohou používat různé architektury CPU s různou endianitou ), v takovém případě mohou implementace MPI provádět převod dat . Vzhledem k tomu, jazyk C neumožňuje typ samotný má být předán jako parametr, MPI předdefinuje konstanty MPI_INT, MPI_CHAR, MPI_DOUBLEaby odpovídala int, char, doubleatd

Zde je příklad v jazyce C, který předává pole ints ze všech procesů do jednoho. Jeden přijímací proces se nazývá proces „root“ a může to být libovolný určený proces, ale obvykle to bude proces 0. Všechny procesy požadují odeslání svých polí do kořenového adresáře pomocí příkazu MPI_Gather, což je ekvivalentní tomu, aby každý proces (včetně samotný root) zavolejte MPI_Senda root provede odpovídající počet uspořádaných MPI_Recvhovorů, aby všechna tato pole shromáždil do většího:

int send_array[100];
int root = 0; /* or whatever */
int num_procs, *recv_array;
MPI_Comm_size(comm, &num_procs);
recv_array = malloc(num_procs * sizeof(send_array));
MPI_Gather(send_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
           recv_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
           root, comm);

Místo toho můžete místo 100 ints chtít odesílat data jako jeden blok . Za tímto účelem definujte datový typ odvozený od „souvislého bloku“:

MPI_Datatype newtype;
MPI_Type_contiguous(100, MPI_INT, &newtype);
MPI_Type_commit(&newtype);
MPI_Gather(array, 1, newtype, receive_array, 1, newtype, root, comm);

Pro předání třídy nebo datové struktury MPI_Type_create_structvytvoří datový typ odvozený z MPI z MPI_predefineddatových typů následujícím způsobem:

int MPI_Type_create_struct(int count,
                           int *blocklen,
                           MPI_Aint *disp,
                           MPI_Datatype *type,
                           MPI_Datatype *newtype)

kde:

  • countje počet bloků, a určuje délku (ve prvků) ze soustav blocklen, dispa type.
  • blocklen obsahuje počet prvků v každém bloku,
  • disp obsahuje posunutí bajtů každého bloku,
  • type obsahuje typy prvků v každém bloku.
  • newtype (výstup) obsahuje nový odvozený typ vytvořený touto funkcí

Pole disp(posunutí) je potřebné pro zarovnání datové struktury , protože kompilátor může pad proměnné ve třídě nebo datové struktuře. Nejbezpečnějším způsobem, jak zjistit vzdálenost mezi různými poli, je získání jejich adres do paměti. To se provádí pomocí MPI_Get_address, což je obvykle stejné jako u &operátoru C, ale to nemusí být pravda při řešení segmentace paměti .

Předání datové struktury jako jednoho bloku je výrazně rychlejší než procházení jedné položky najednou, zvláště pokud se má operace opakovat. Důvodem je, že bloky pevné velikosti nevyžadují během přenosu serializaci .

Vzhledem k následujícím strukturám dat:

struct A {
    int f;
    short p;
};

struct B {
    struct A a;
    int pp, vp;
};

Zde je kód C pro vytváření datového typu odvozeného z MPI:

static const int blocklen[] = {1, 1, 1, 1};
static const MPI_Aint disp[] = {
    offsetof(struct B, a) + offsetof(struct A, f),
    offsetof(struct B, a) + offsetof(struct A, p),
    offsetof(struct B, pp),
    offsetof(struct B, vp)
};
static MPI_Datatype type[] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT};
MPI_Datatype newtype;
MPI_Type_create_struct(sizeof(type) / sizeof(*type), blocklen, disp, type, &newtype);
MPI_Type_commit(&newtype);

MPI-2 koncepty

Jednostranná komunikace

MPI-2 definuje tři jednostranné komunikační operace, MPI_Put, MPI_Get, a MPI_Accumulate, je zápisu do vzdálené paměti, čtení ze vzdáleného paměti a operaci redukce ve stejné paměti, v celé řadě úkolů, v daném pořadí. Rovněž jsou definovány tři různé metody synchronizace této komunikace (globální, párové a vzdálené zámky), protože specifikace nezaručuje, že tyto operace proběhly až do synchronizačního bodu.

Tyto typy volání mohou být často užitečné pro algoritmy, ve kterých by synchronizace byla nepohodlná (např. Násobení distribuované matice ), nebo tam, kde je žádoucí, aby úkoly dokázaly vyvážit své zatížení, zatímco ostatní procesory pracují s daty.

Dynamické řízení procesů

Klíčovým aspektem je „schopnost procesu MPI podílet se na vytváření nových procesů MPI nebo navázat komunikaci s procesy MPI, které byly spuštěny samostatně“. Specifikace MPI-2 popisuje tři hlavní rozhraní, pomocí kterých mohou procesy MPI dynamicky navazovat komunikaci MPI_Comm_spawn, MPI_Comm_accept/ MPI_Comm_connecta MPI_Comm_join. MPI_Comm_spawnRozhraní umožňuje proces MPI plodit několik instancí názvem MPI procesu. Nově vytvořená sada procesů MPI tvoří nový MPI_COMM_WORLDintrakomunikátor, ale může komunikovat s rodičem a interkomunikátorem, který funkce vrací. MPI_Comm_spawn_multipleje alternativní rozhraní, které umožňuje, aby různé instance vytvořily různé binární soubory s různými argumenty.

I/O

Funkce paralelních I/O se někdy nazývá MPI-IO a odkazuje na sadu funkcí navržených k abstraktnímu řízení I/O v distribuovaných systémech do MPI a umožňuje snadný přístup k souborům vzorovaným způsobem pomocí stávající funkce odvozeného datového typu. .

Malý průzkum, který byl na této funkci proveden, naznačuje, že nemusí být triviální dosáhnout vysokého výkonu pomocí MPI-IO. Například implementace řídkých multiplikací matice-vektor pomocí knihovny I/O MPI ukazuje obecné chování menšího výkonu, ale tyto výsledky jsou neprůkazné. Až myšlenka kolektivních I/O implementovaných do MPI-IO začala MPI-IO dosáhnout širokého přijetí. Kolektivní I/O podstatně zvyšuje šířku pásma I/O aplikací tím, že procesy společně transformují malé a nesouvislé I/O operace na velké a souvislé, čímž se snižuje režie zamykání a hledání disku. Díky svým obrovským výkonnostním výhodám se MPI-IO také stal základní I/O vrstvou pro mnoho nejmodernějších I/O knihoven, jako je HDF5 a Parallel NetCDF . Jeho popularita také spustila výzkum kolektivních optimalizací I/O, jako jsou I/O s vědomím rozložení a agregace mezi soubory.

Oficiální implementace

Mnoho dalších snah je odvozeno od MPICH, LAM a dalších děl, mimo jiné včetně komerčních implementací od společností HP , Intel , Microsoft a NEC .

Zatímco specifikace vyžadují rozhraní C a Fortran, jazyk používaný k implementaci MPI není omezen tak, aby odpovídal jazyku nebo jazykům, které se snaží podporovat za běhu. Většina implementací kombinuje C, C ++ a assembler a cílové C, C ++ a Fortran programátory. Vazby jsou k dispozici pro mnoho dalších jazyků, včetně Perlu, Pythonu, R, Ruby, Javy a CL (viz vazby #Jazyk ).

K ABI MPI implementace jsou zhruba rozděleny mezi mpich a OpenMP derivátů tak, že se knihovna z jedné rodiny, pracuje jako přímá náhrada jednoho ze stejné rodiny, ale přímá náhrada celé rodiny je nemožné. Francouzská CEA udržuje rozhraní wrapper, aby takové přepínače usnadnila.

Hardware

Hardwarový výzkum MPI se zaměřuje na implementaci MPI přímo v hardwaru, například prostřednictvím procesoru v paměti , budování operací MPI do mikroobvodu čipů RAM v každém uzlu. Tento přístup je implicitně nezávislý na jazyce, operačním systému a procesoru, ale nelze jej snadno aktualizovat ani odebrat.

Dalším přístupem bylo přidání hardwarové akcelerace do jedné nebo více částí operace, včetně hardwarového zpracování front MPI a použití RDMA k přímému přenosu dat mezi pamětí a síťovým rozhraním bez zásahu jádra CPU nebo OS.

Obálky kompilátoru

mpicc (a podobně mpic ++ , mpif90 atd.) je program, který obtéká existující kompilátor a nastavuje potřebné příznaky příkazového řádku při kompilaci kódu, který používá MPI. Obvykle přidává několik příznaků, které umožňují kompilaci kódu a propojení s knihovnou MPI.

Jazykové vazby

Vazby jsou knihovny, které rozšiřují podporu MPI do jiných jazyků zabalením stávající implementace MPI, jako je MPICH nebo Open MPI.

Společná jazyková infrastruktura

Dvě spravované implementace .NET Common Language Infrastructure .NET jsou Pure Mpi.NET a MPI.NET, výzkumné úsilí na Indiana University licencované pod licencí ve stylu BSD . Je kompatibilní s Mono a může plně využívat podkladové síťové textilie MPI s nízkou latencí.

Jáva

Ačkoli Java nemá oficiální MPI vazbu, několik skupin se pokouší tyto dva překlenout s různým stupněm úspěchu a kompatibility. Jedním z prvních pokusů byl mpiJava Bryana Carpentera, v podstatě sada obalů Java Native Interface (JNI) do místní C MPI knihovny, což vedlo k hybridní implementaci s omezenou přenositelností, která musí být také kompilována proti konkrétní používané knihovně MPI .

Tento původní projekt však také definoval API mpiJava ( de facto MPI API pro Javu, které těsně následovalo ekvivalentní vazby C ++), které přijaly další následné projekty Java MPI. Jedním méně používaným API je MPJ API, které bylo navrženo tak, aby bylo více objektově orientované a blíže konvencím kódování Sun Microsystems . Kromě API mohou být knihovny Java MPI buď závislé na místní knihovně MPI, nebo implementovat funkce předávání zpráv v Javě, zatímco některé jako P2P-MPI také poskytují funkce peer-to-peer a umožňují provoz na smíšené platformě.

Některé z nejnáročnějších částí Javy/MPI vycházejí z vlastností Javy, jako je nedostatek explicitních ukazatelů a adresní prostor lineární paměti pro její objekty, což činí přenos vícerozměrných polí a složitých objektů neefektivním. Alternativní řešení obvykle zahrnují přenos po jednom řádku a/nebo provedení explicitní serializace a odesílání na vysílacím i přijímacím konci, simulace polí typu C nebo Fortran pomocí jednorozměrného pole a ukazatele na primitivní typy pomocí použití jednoprvkových polí, což má za následek programovací styly dost vzdálené konvencím Javy.

Dalším systémem pro předávání zpráv Java je MPJ Express. Nedávné verze lze spouštět v clusterových a vícejádrových konfiguracích. V konfiguraci klastru může spouštět paralelní aplikace Java na klastrech a cloudech. Zde mohou sokety Java nebo specializovaná propojení I/O jako Myrinet podporovat zasílání zpráv mezi procesy MPJ Express. Může také využívat nativní C implementaci MPI pomocí svého nativního zařízení. V konfiguraci s více jádry je spuštěna paralelní aplikace Java na vícejádrových procesorech. V tomto režimu jsou procesy MPJ Express reprezentovány vlákny Java.

Julie

Julia jazyka wrapper pro MPI, byl používán a bylo zjištěno, že rychlejší než C nebo Fortran.

MATLAB

Existuje několik akademických implementací MPI pomocí MATLABu . MATLAB má vlastní knihovnu paralelních rozšíření implementovanou pomocí MPI a PVM .

OCaml

Modul OCamlMPI implementuje velkou podmnožinu funkcí MPI a aktivně se používá ve vědeckých počítačích. Program OCaml s 11 000 řádky byl pomocí modulu „MPI-ified“ s dalšími 500 řádky kódu a mírnou restrukturalizací a běžel s vynikajícími výsledky až na 170 uzlech v superpočítači.

Krajta

Mezi implementace MPI v Pythonu patří: pyMPI , mpi4py, pypar, MYMPI a submodul MPI ve ScientificPython . pyMPI je pozoruhodný, protože je variantním interpretem pythonu, zatímco moduly pypar, MYMPI a ScientificPython jsou moduly importu. Úkolem kodéra je rozhodnout, kam volání MPI_Initpatří.

Knihovny Boost C ++ nedávno získaly Boost: MPI, který zahrnoval vazby MPI Python. To je zvláště nápomocné při míchání C ++ a Pythonu. Od října 2016 Boost: Vazby Python od MPI mají v CentOS stále neopravené chyby v balení .

R.

Vazby R MPI zahrnují Rmpi a pbdMPI , kde se Rmpi ​​zaměřuje na paralelismus manažer-pracovník, zatímco pbdMPI se zaměřuje na paralelismus SPMD . Obě implementace plně podporují Open MPI nebo MPICH2 .

Příklad programu

Zde je „Hello, World!“ program v MPI napsaný v C. V tomto příkladu pošleme každému procesoru zprávu „ahoj“, triviálně s ní manipulujeme, vrátíme výsledky do hlavního procesu a zprávy vytiskneme.

/*
  "Hello World" MPI Test Program
*/
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <mpi.h>

int main(int argc, char **argv)
{
    char buf[256];
    int my_rank, num_procs;

    /* Initialize the infrastructure necessary for communication */
    MPI_Init(&argc, &argv);

    /* Identify this process */
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    /* Find out how many total processes are active */
    MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

    /* Until this point, all programs have been doing exactly the same.
       Here, we check the rank to distinguish the roles of the programs */
    if (my_rank == 0) {
        int other_rank;
        printf("We have %i processes.\n", num_procs);

        /* Send messages to all other processes */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            sprintf(buf, "Hello %i!", other_rank);
            MPI_Send(buf, sizeof(buf), MPI_CHAR, other_rank,
                     0, MPI_COMM_WORLD);
        }

        /* Receive messages from all other process */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            MPI_Recv(buf, sizeof(buf), MPI_CHAR, other_rank,
                     0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            printf("%s\n", buf);
        }

    } else {

        /* Receive message from process #0 */
        MPI_Recv(buf, sizeof(buf), MPI_CHAR, 0,
                 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        assert(memcmp(buf, "Hello ", 6) == 0);

        /* Send message to process #0 */
        sprintf(buf, "Process %i reporting for duty.", my_rank);
        MPI_Send(buf, sizeof(buf), MPI_CHAR, 0,
                 0, MPI_COMM_WORLD);

    }

    /* Tear down the communication infrastructure */
    MPI_Finalize();
    return 0;
}

Při spuštění se 4 procesy by měl produkovat následující výstup:

$ mpicc example.c && mpiexec -n 4 ./a.out
We have 4 processes.
Process 1 reporting for duty.
Process 2 reporting for duty.
Process 3 reporting for duty.

Zde mpiexecje příkaz použitý ke spuštění ukázkového programu se 4 procesy , z nichž každý je nezávislou instancí programu za běhu a má přiřazené pozice (tj. Číselné ID) 0, 1, 2 a 3. Název mpiexecje doporučen standard MPI, ačkoli některé implementace poskytují podobný příkaz pod názvem mpirun. MPI_COMM_WORLDJe komunikátor, který se skládá ze všech procesů.

Modul programování jednoho programu, více dat ( SPMD ) je tím usnadněn, ale není vyžadován; mnoho implementací MPI umožňuje spuštění více, různých spustitelných souborů ve stejné úloze MPI. Každý proces má svou vlastní hodnost, celkový počet procesů na světě a schopnost komunikovat mezi nimi buď komunikací point-to-point (odesílání/přijímání), nebo kolektivní komunikací mezi skupinou. Stačí, když MPI poskytne program ve stylu SPMD s MPI_COMM_WORLDvlastní hodností a velikostí světa, aby algoritmy mohly rozhodnout, co dělat. V realističtějších situacích je I/O spravováno opatrněji než v tomto příkladu. MPI nestanovuje, jak mají standardní I/O (stdin, stdout, stderr) v daném systému fungovat. Obecně to funguje podle očekávání v procesu rank-0 a některé implementace také zachycují a trychtýřují výstup z jiných procesů.

MPI používá spíše pojem proces než procesor. Kopie programu jsou mapovány na procesory za běhu MPI . V tomto smyslu může paralelní počítač mapovat jeden fyzický procesor nebo N procesorů, kde N je počet dostupných procesorů, nebo dokonce něco mezi nimi. Pro maximální paralelní zrychlení se používá více fyzických procesorů. Tento příklad upravuje své chování na velikost světa N , takže se také snaží škálovat na konfiguraci runtime bez kompilace pro každou velikostní variantu, i když rozhodnutí za běhu se mohou lišit v závislosti na tom, jaké absolutní množství souběžnosti je k dispozici.

Přijetí MPI-2

Přijetí MPI-1.2 bylo univerzální, zejména v clusterových počítačích, ale přijetí MPI-2.1 bylo omezenější. Problémy zahrnují:

  1. Implementace MPI-2 zahrnují I/O a dynamickou správu procesů a velikost middlewaru je podstatně větší. Většina webů, které používají systémy dávkového plánování, nemůže podporovat dynamickou správu procesů. Paralelní I/O MPI-2 je dobře přijímáno.
  2. Před MPI-2 bylo vyvinuto mnoho programů MPI-1.2. Problémy s přenositelností zpočátku zpomalovaly adopci, i když širší podpora to zmenšila.
  3. Mnoho aplikací MPI-1.2 používá pouze podmnožinu tohoto standardu (16-25 funkcí) bez skutečné potřeby funkcí MPI-2.

Budoucnost

Některé aspekty budoucnosti MPI se zdají být solidní; ostatní méně. MPI Forum reconvened v roce 2007 vyjasnit některé otázky MPI-2 a zkoumat vývoj na možnou MPI-3, který vyústil ve verzích MPI-3.0 (září 2012) a MPI-3.1 (červen 2015).

Architektury se mění s větší vnitřní souběžností ( vícejádrovou ), lepší jemnozrnnou kontrolou souběžnosti (vlákno, afinita) a více úrovní hierarchie paměti . Vícevláknové programy mohou využívat výhod tohoto vývoje snadněji než aplikace s jedním vláknem. To již přineslo samostatné, komplementární standardy pro symetrické multiprocesing , konkrétně OpenMP . MPI-2 definuje, jak by se standardně vyhovující implementace měly zabývat problémy s více vlákny, ale nevyžaduje, aby implementace byly vícevláknové nebo dokonce bezpečné pro vlákna. MPI-3 přidává možnost používat paralelismus sdílené paměti v rámci uzlu. Implementace MPI jako Adaptive MPI, Hybrid MPI, Fine-Grained MPI, MPC a další nabízejí rozšíření standardu MPI, které řeší různé výzvy v MPI.

Astrofyzik Jonathan Dursi napsal názorový článek označující MPI za zastaralý a poukázal na novější technologie, jako je jazyk Chapel , Unified Parallel C , Hadoop , Spark a Flink .

Viz také

Reference

Další čtení

externí odkazy