Mezu Trukaketarako Interfazea

**Mezu Trukaketarako Interfazea** edo **MPI** (ingelesez, *Message Passing Interface*) estandar bat da, prozesagailu kopuru handiko sistemetan prozesagailuen arteko elkarrekintza bideratzeko diseinaturik dagoena. Sistema mota horietan, prozesagailuen arteko komunikazioa ahalbidetuko duten funtzioak sintaktikoki eta semantikoki nola definitu arautzen du MPI estandarrak. C, C++, Fortran eta Ada lengoaiak erabiliz nagusiki. Zehazki, MPI "adostutako estandar" bat da, jatorriz hardware hornitzaileak, ikertzaileak, akademikoak, software-liburutegien garatzaileak eta erabiltzaileak biltzen dituen foro ireki batean diseinatutako estandar bat da. Garapen horretan izandako parte hartze zabala dela eta, MPI berehala erabilera zabaleko estandarra bilakatu zen. Argi izan behar da MPI ez dela benetako estandar bat, ISO edo IEEEk emana ez delako izan, hala ere, erabilera zabalekoa da kode irekikoa delako.

MPIren abantaila beste mezu bidalketa liburutegi batzuekin alderatuz, erabilitako programak eramangarriak (MPI ia edozein memoria banatuko arkitekturarako inplementatu baita), eta azkarrak dira (biblioteka bakoitzaren inplementazioa exekutatzen den hardwarerako optimizatu baita).

## Historia 
Mezu Trukaketarako Interfazea sortzeko lehenengo saiakerak 1991eko udan hasi ziren, ikertzaile talde txiki batek Austriako mendietan egonaldi bat egin zuenean. Egonaldi hartan izandako elkarrizketetan erabaki zen Memoria Banatuko Inguruneetan mezuak trukatzeko estandarrak sortzeko tailer bat antolatzea eta 1992ko apirilaren 29 eta 30 artean egin zen, Williamsburg hirian, Virginian. Tailer horietara bertaratu zirenek Mezu Trukaketarako Interfazea estandarraren oinarriak finkatu zituzten eta lan-batzorde bat sortu, estandarizazio prozesuan jarraitzeko. Jack Dongorra, Tony Hey eta David W. Walker ikertzaileek lehen zirriborroa proposatu zuten 1992ko azaroan: MPI1. 1992ko azaroan MPI lan-batzordeak bilera bat egin zuen Minneapolisen eta adostu estandarizazio prozesua gehiago formalizatzea. Hori lortzeko, adostu zuten lan-batzordea sei astetan behin elkartzea 1993ko lehen bederatzi hilabeteetan. Ekarpen publikoetarako tartea utzi ostean, zeintzuek aldaketa batzuek eragin zituzten MPIn, lehen bertsioa 1994ko ekainean kaleratu zen. Bilera hauek eta posta elektroniko bidezko komunikazioek MPI Foroa sortu zuten eta hura irekita dago eraginkortasun handiko konputazioaren komunitateko edozein kiderentzat.  

MPI ahaleginak 80 pertsona batu zituen, 40 erakunde desberdinetakoak, gehienak Ameriketako Estatu Batuetakoak eta Europakoak. Konputagailu konkurrenteen saltzaile nagusiek MPI sortzeko ahaleginean parte hartu zuten eta industriako, gobernuaren laborategietako eta unibertsitateko hainbat ikertzaileek ere bai. 

Mezu trukaketarako estandar unibertsal bat sortzeko ahaleginean, ikertzaileak ez ziren sistema bakar batean oinarritu, hainbat sistema garaikideren ezaugarriak elkartu zituzten, horien artean, IBM, Intel, nCUBE, PVM, Express, P4 eta PARMACSenak. Mezu trukaketarako paradigma bere eramangarritasunak egiten du erakargarri eta gainera, memoria banatuko eta memoria partekatuko prozesagailuen komunikazioan eta lan-estazioen sareetan erabilia izan daiteke. Paradigma, gainera, konfigurazio desberdin askotan aplikatua izan daiteke, haien sare-bizkortasuna eta memoriaren arkitektura edozein izanda ere.

MPI bilerek DARPAren, AEBren Zientzia Fundazio Nazionalaren (NSF) eta Europako Batzordearen babesa jaso zuten, azken horrena Esprit Proiektuaren (P6643) bitartez. Tennesseeko Unibertsitateak ere diru-ekarpenak egin zizkion MPI Foroari.
## MPIren oinarriak 
MPIn beharko den prozesu kopurua programaren exekuzioa baino lehen esleituko da, eta ez dira prozesu gehigarriak sortuko aplikazioa exekuzioan dagoen bitartean. Prozesu bakoitzari hein izeneko aldagai bat esleituko zaio, identifikatzaile gisa 0 eta p-1 zenbakien artean, non p prozesuen kopuru totala den. Programaren exekuzioaren kontrola hein aldagaiaren bidez egiten da. Honek ahalbidetzen digu zehaztea zein prozesuk exekutatzen duen kodearen zati bakoitza. MPIn komunikatzaileak prozesu-multzo gisa definitzen dira, non elkarren artean mezuak bidal ditzaketen; oinarrizko komunikatzailea MPI_COMM_WORLD deitzen da eta C lengoaiaren makro moduan definitzen da. MPI_COMM_WORLD-ek aplikazio baten exekuzioan aktibo dauden prozesu guztiak barneratzen ditu. MPI deiak lau motatan banatzen dira:

# Komunikazioak hasi, administratu eta bukatzeko deiak.
# Bi prozesuen artean datuak garraiatzeko deiak.
# Hainbat prozesuren artean datuak garraiatzeko deiak.
# Erabiltzaileak definituriko datu motak sortzeko deiak.

Lehenengo motako deiek ahalbidetzen dute mezuen trukaketarako liburutegiak hasieratzea, prozesu kopurua eta prozesuen heinak identifikatzea. Bigarren motak bi puntuen arteko komunikazio operazioak barne hartzen ditu. Hirugarren dei-motak talde operazioak moduan dira ezagunak, prozesu taldeen artean komunikazio operazioak eskaintzen baititu. Azken motak datu-egitura konplexuak sortzeko malgutasuna ematen du.

MPIn, mezu bat osatuta dago bere gorputzaz, non bidaltzeko datuak gordetzen diren, eta bere goiburua, prozesu iturria eta helmuga adierazten dituena. Gorputz hori hiru informazio ataletan dago banaturik: buffer, datu-mota eta kontagailua. Bufferra, sarrera-irteera datuak gordetzen diren memoriako kokapena da. Datu-motak mezuan bidaltzen diren datuen mota adierazten du. Kasu sinpleenetan, datu-mota primitiboa izaten da, adibidez, zenbaki oso bat, eta aplikazio aurreratuenetan datu-mota primitiboez osaturiko datu-mota konplexu bat izan daiteke. Datu-mota deribatu hauek C-ko egituren analogoak dira. Kontagailua sekuentzia zenbaki bat da, eta datu-motarekin batera erabiltzaileari ahalbidetzen dio mota bereko datuak mezu bakar batean biltzea. MPIk datu-mota primitiboak estandarizatzen ditu, ondorioz programatzailea ez da larritu behar plataformen arteko desberdintasunez.

Mezu baten goiburuak MPIn, tipikoki, helbidea, iturburua eta mezua transmititzeko beharrezkoa den informazio osoa du. Goiburuak lau atal dauzka: iturburua, helmuga, komunikatzailea eta etiketa. Iturburuak prozesu igorlea identifikatzen du. Helmugak aldiz hartzailea. Komunikatzaileak zehazten du iturburua eta helmuga parte diren prozesuen taldea. Etiketak mezua klasifikatzea ahalbidetzen du.

Etiketa eremua erabiltzaileak definituriko zenbaki oso bat da, prozesu batek jasotzen dituen mezuak bereizteko erabili daitekeena. Adibidez, A eta B prozesuak dauzkagu. A prozesuak bi mezu bidaltzen dizkio B prozesuari, bakoitza datu bakarrarekin. Datuetako bat kalkulu bat egiteko erabiltzen da, bestea pantailan inprimatzeko. A-k etiketa desberdinak erabiliko ditu mezu bakoitzerako. B-k mezuen etiketen balioak erabiliko ditu identifikatzeko zer egin beharko duen datu bakoitzarekin.

### Komunikazioak hasi, administratu eta bukatzeko deiak 
MPIk oinarrizko lau funtzio ditu MPI duten edozein programetan erabili behar direnak: *MPI_Init*, *MPI_Finalize*, *MPI_Comm_size* eta *MPI_Comm_rank*.

#### MPI_Init 
Funtzio honek MPI mezu trukaketa posible egiten duten datu-egitura guztiak hasieratzen ditu eta beste edozein MPI funtzio erabili baino lehen deitu behar da. Komunikazio-kanala erreserbatzeaz gain, MPI_COMM_WORLD konstanteari balio bat esleitzen dio. Soilik behin deitu behar zaio, errore bat jauziko da bestela. Hortaz, MPI programa ohiko batek horrelako itxura eduki beharko luke:
```c
int main(int argc, char* argv[]){

   /* Aldagaien adierazpena */

   MPI_Init(&argc, &argv);

   /* Eduki banaketa */

   /* Programaren oinarrizko begizta */

   MPI_Finalize();

}
```
MPI programa guztiek eduki behar dute dei bat funtzio honi. Jasotako argumentuak ez dira eraldatzen, ez interpretatzen, ez zabaltzen.

#### MPI_Init-en sintaxia 
**C-n**
```c
#include "mpi.h"

int MPI_Init (int *argc, char ***argv)
```

**C++-n**
```c++
#include 

void MPI::Init(int& argc, char**& argv)

void MPI::Init()
```

#### MPI_Init-en sarrera parametroak: 
*argc:* argumentu kopururako erakuslea 

*argv:* argumentu bektorerako erakuslea

**MPI_Finalize**

MPI saio bat bukatzea ahalbidetzen du. Funtzio hau programa batek egin behar duen azken MPI deia izan behar du. MPI-k erabilitako memoria askatzea ahalbidetzen du.

**MPI_Comm_size**

Komunikatzaile baten parte diren prozesu kopurua zehaztea ahalbidetzen du.

**MPI_Comm_rank**

Uneko prozesuaren identifikatzailea edo heina zehaztea ahalbidetzen du.

### Bi prozesuen artean datuak garraiatzeko deiak 
Bi prozesuen arteko datuen garraioa MPI_Send eta MPI_Recv deien bidez lortzen da. Dei hauek haien arrakasta edo porrota adierazten duten kodea itzultzen dute.

**MPI_Send**

Prozesu batetik bestera informazioa bidaltzea ahalbidetzen du.

**MPI_Recv**

Beste prozesu batetik informazioa jasotzea ahalbidetzen du.

Bi funtzioak blokeatzaileak dira, hau da deiaren prozesua blokeatzen da komunikazio operazioa betetzen den arte.

Funtzio hauen bertsio ez blokeatzaileak MPI_Isend eta MPI_Irecv dira, hurrenez hurren. Dei hauek garraio operazioa hasten dute, baina hauen amaiera esplizituki adierazi behar da MPI_Test eta MPI_Wait gisako deiekin.

**MPI_Wait**

Dei blokeatzailea da eta itzultzen da bidaltze edo jasotzen operazioa betetzen denean.

**MPI_Test**

Bidaltze edo jasotze operazioa bete den ala ez egiaztatzea ahalbidetzen du, funtzio honek lehenengo operazioaren egoera aztertzen du eta ondoren itzultzen da.

### Hainbat prozesuren artean datuak garraiatzeko deiak 
MPIk talde komunikaziorako deiak ditu barreiatze (*broadcast*), biltze (*gather*), banatze (*scatter*) eta erredukzioak gisako operazioak barneratuz. Hona hemen hainbat prozesuren arteko garraioa ahalbidetzen duten funtzio batzuk.

* MPI_Barrier-ek sinkronizazio operazioak betetzea ahalbidetzen du. Ez da inolako informazio trukaketarik betetzen. Programa baten etapa bukatutzat emateko erabiltzen da, ziurtatuz prozesu guztiak amaitu direla hurrengo etapari hasiera eman baino lehen.

* MPI_Bcast-ek ahalbidetzen du prozesu batek bere komunikatzailean dauden beste prozesu guztiei datuen kopia bat bidaltzea.

* MPI_Scatter banatze operazio bat ezartzen du, non datu bat (datuen bektore bat) prozesu desberdinen artean banatuko den.

* MPI_Gather biltze operazio bat ezartzen du, non aurretik banaturiko datu-bektorea prozesu bakar batean jasotzen den.

* MPI_Reduce-k ahalbidetzen du prozesu erro batek komunikatzaile bereko prozesuetatik datuak biltzea, eta ondoren hauek datu aldagai bakar batean konbinatzea. Esaterako, erredukzio operazio bat erabili zitekeen prozesuen artean banaturiko bektore baten elementuen batura kalkulatzeko.

### Erabiltzaileak definituriko datu motak sortzeko deiak. 
Datu-mota berriak definitzerakoan MPI_Type_struct deia erabili daiteke mota berri bat sortzeko edo MPI_Pack erabili daiteke datuak paketatzeko.

## Inplementazioak 
MPIrako lengoaiaren inplementazioa, oro har, gauzatze-denbora optimizatzen saiatzen diren lengoaien bidez egiten da.

MPIren ezarpen gehienak C, C + + eta mihiztadura-lengoaiaren, C ++, Fortran, konbinazioan egiten dira. Hala ere, hizkuntza eta azken erabiltzailearen aplikazioa bereiziak daude.

MPI 1.x estandarraren hasierako aplikazio-etapa MPICH izan zen, Argonne National Laboratoryn eta Misisipiko Estatuko Unibertsitatean sortua.

IBM izan zen MPI estandarra ezartzen lehenengoetako bat, eta 90eko hamarkadaren hasieran superordenagailuko enpresa gehienak MPICH merkaturatzen edo MPI 1.x estandarraren aplikazio propioa inplementatzen hasi ziren.

Ohioko Superkonputazio Zentroko LAM/MPI da hura ezartzen lehenengoetako bat.

Argonne National Laboratoryk MPICH garatzen jarraitu zuen hamarkada bat baino gehiagoan, eta orain MPICH2 eskaintzen du, MPI-2.1 estandarraren ezarpenari dagokiona.

LAM/MPI eta MPIren azken esfortzu batzuk bateratu dituzte mundu mailako proiektu berri bat sortzeko, OpenMPI izenekoa, baina izen horrek ez du estandarrarekin inolako loturarik.

Microsoftek MPI bat gehitu dio bere Cluster Computing Kitari (2005), MPICH2n oinarritua. MPI ezinbesteko elementua bihurtu zen horrela eta oraindik ere bada gaurko programazio-interfazerako.

Linux-en banaketa askok MPI dute (MPICH bat edo biak eta LAM, adibide berezi gisa), baina hobe da garapen-guneetatik garatzaileen MPIaren azken bertsioak lortzea.

Gaur egungo software librearen ezarpenen ari diren banatzaile pertsonalizatuen saltzaile asko errendimendu eta egonkortasun hobea lortzen zentratzen dira.

Errendimendu handiko programaziorako MPI korronte nagusiaz gain, MPI asko erabili da Python, Perl eta Javarekin. Komunitate horiek hazten ari dira.

MATLAB MPIn oinarritzen da, baina ez dago adostasunik MPI MATLABekin erabiltzeko modu bakar bati buruz.

Hurrengo ataletan, esfortzu horietako batzuk zehazten dira.

### Python 
Gutxienez bost aplikazio modu ezagutzen dira MPI Python-en: mpi4py, PyPar, PyMPI, MYMPI eta ScientificPython MPI submodulua.

PyMPI oso nabarmena da, interprete beraren aplikazioaren nodo anitzeko python interpretearen aldaera bat delako. MPI-ren zehaztapen gehiena inplementatzen du eta MPI deiak egiteko behar duen kode konpilatuarekin lan egiten du automatikoki.

PyPar, MYMPI eta ScientificPython modulua diseinaturik daude modulu arrunt bat bezala lan egiteko inportazio-deklarazio bat eginez.

Kodetzailearen lana egiten dute MPI_Init deia noiz eta non den erabakitzeko.

### Java 
Javak MPIrekin batasun ofizialik ez badu ere, talde batzuk biak batzen saiatu dira. Lehenengo saiakeretako bat Bryan Carpenterren mpiJava izan zen, funtsean, C-n dagoen MPI liburutegiko JNI bilgarrien bilduma bat. 

Hala ere, jatorrizko proiektu horrek API mpiJava ere definitu zuen (Javarako de facto API MPI bat, C+++ baliokideak diren bindingak hurbiletik jarraitu zituena), beste MPI proiektu batzuek erabili zutena. 

Gutxien erabiltzen den API bat MPJ API da, objektuetan oinarritzeko eta Sun Microsystemsen kodetze-hitzarmenetatik gertuago egoteko diseinatu zena. 

Java MPI liburutegien APIa erabiltzen duten beste batzuk tokiko liburutegiaren mendekoak izan daitezke, edo Javan mezuak pasatzeko funtzioak bete ditzakete; aldiz, P2P-MPI moduko batzuek plataforma mistoen funtzionaltasuna eta eragiketa ere ahalbidetzen dute.

Java MPIrako edozein aplikazioren zatirik zailenetako batzuk programazio-lengoaiaren mugetatik eta bere berezitasunetatik sortzen dira, hala nola, punta-puntako esplizituen falta eta bere objektuetarako memoria-norabide linealen espazioa, matrize edo array multidimentsionalen eta objektu konplexu ez-eraginkorren transferentzia egiten dutenak.

Erabilitako metodoek, oro har, lerro bat aldi berean transferitzea edo serializazio-errealizazio esplizitua eskatzen dute, eta bidalketan eta azken harreran, C edo FORTRAN simulatuz, matrizeak bezala array dimentsiobakarra erabiliz igortzen dituzte, eta hasierako moten puntakoak bektoreetako elementu bakar bat erabiliz; horrek Java konbentzioetako programazio-estilo nahiko arraroak sorrarazten ditu. 

Hobekuntza nagusietako bat MPJ Express da, Aamir Shafik egina eta Bryan Carpenterrek eta Mark Bakerrek gainbegiratua. Hobekuntza horretan, oinarrizko plataforma gisa Fast Ethernet erabiltzen da.

Bestalde, sareko hardware espezializatuaren hobekuntzek aurrera jarraitu zuten, eta komunikazio-kostuak mikrosegundo pare batera jaitsi ziren.

Gaur egun gakoa ez da eztabaidatzea JNI Java baino hobeagoa den, baizik eta komunikazio-protokoloak trukatzeko programen mekanismo malgu bat eskaintzea lortzea.

Proiektu honen helburua MPI estandarrean oinarritutako Javaren erreferentziazko mezularitza-sistema bat eskaintzea da. Aplikazioak gailu-kontrolatzaileen ideia batean oinarritutako arkitektura jarraitzen du.

### **OCaml** 
OCamlMPI moduluak MPI funtzioen azpimultzo handi bat inplementatzen du, eta konputazio zientifikoan aktiboki erabiltzen du.

Bere heldutasunaren ideia bat izateko: Ocaml zerrendari buruz informatu zen hamaika mila OCaml programaren lerro bat "MPI-fitxatuak" izanda, 500 kode lerro gehigarri eta berregituraketa arin batekin. Emaitza bikainak lortu zituen 170 nodoraino superordenagailu batean.

### .NET 
Windows Compute Cluster Server-ek Microsoft Messaging Passing Interface v2 (MPI-MS) erabiltzen du sareko klusterrari buruzko prozesatze-nodoen arteko komunikazioak egiteko.

Aplikazioak programatzeko interfazeak 160 funtzio baino gehiago ditu. MS-MPI diseinatu zen, salbuespen batzuekin, segurtasun-kontsiderazioen ondorioz, MPICH2n aplikatutako MPI2 funtzioen multzo osoa barne hartzeko.

Badago MPI - Pure Mpi.NET-en .NET aplikazio bat. Apikazio horretan, objektuetara bideratutako APIa indartsu bat dago, programazio paraleloan erabiltzeko erraza dena.

Windows Communiation Foundation (WCF) delakoaren barruan dagoen azken .NET teknologian garatu zen.

Horri esker, deiaren konfigurazioa eta amaierako ingurunearen konfigurazioa eta errendimendu-beharrak zehatz daitezke.

MPI interfazeak, aldi berean, ahalik eta gehien aprobetxatzen ditu .NETen ezaugarri generikoak, delegatuak, emaitza asinkronoak, salbuespenak eta hedagarritasunak.

### Hardware inplementazioak 
Ez zen ikerketarik egon MPIa zuzenean sistemaren hardwarean ezartzeko, adibidez, memoriako prozesadorearen bidez, non MPI eragiketak nodo bakoitzeko RAM txipetan integratuta dauden.

Inplizituki, aplikazio mota hori independentea izango litzateke sistema lengoaiarekiko, sistema eragilearekiko edo PUZekiko, baina ez litzateke erraz eguneratuko.

Beste hurbilketa bat eragiketaren zati bati edo gehiagori hardware azelerazioa gehitzea izan zen.

Horrek barne har dezake MPIren ilarak prozesatzeko hardwarea edo RDMA zuzenean erabiltzea memoriaren eta sareko interfazearen arteko datu-transferentziarako, PUZren beharrik gabe edo nukleoaren esku-hartzerik gabe.

## Etorkizuna 
MPIren funtzionalitate batzuek etorkizun ziurra dutela dirudi; beste batzuek ez. MPI Foroa 2007an MPI-2ak zituen zenbait arazori konponbidea emateko bildu zen eta gainera, MPI-3 posible baten garapena esploratzeari ere ekin zioten. Lehen esplorazio horretatik abiatuta, MPI-3.0 (2012ko iraila) eta MPI-3.1 (2015eko ekaina) bertsioak jaio ziren. 

Arkitekturak aldatzen dabiltza, gero eta barne-konkurrentzia (nukleo anitzekoa) handiagoa, konkurrentzia kontrol zehatzagoa dute eta memoria-hierarkia maila gehiago dituzte. Hari anitzeko programak garapen hauek ekarritako abantailez errazago aprobetxatu daitezke hari bakarreko aplikazioak baino. Honek jada ekoitzi ditu multiprozesamendu simetrikorako estandar banatu eta osagarriak, OpenMP zehazki. MPI-2k definitzen du estandarrarekin bat datozen inplementazioek nola egin behar dieten aurre hari anitzeko erronkei, baina ez du eskatzen inplementazio horiek hari anitzekoak izatea, ezta harientzako seguruak ere. MPI-3k nodo baten barnean memoria partekatuko paralelismoa erabiltzeko aukera ematen du. Badira zenbait inplementazio MPI estandarra hedatzen dutenak, hala nola Adaptative MPI, Hybrid MPI, Fine-Grained MPI eta MPC. 

Jonathan Dursi astrofisikariak uste du MPI zaharkituta dagoela eta Chapel lengoaia, Unified Parallel C, Hadoop, Spark edo Flink moduko teknologia berriek hartuko diotela lekukoa. Alabaina, Exascale Konputazio Proiektuko (exaFLOPSetan neurtzen den abiaduran jarduten duten ordenagailuak) ia proiektu guztiek MPI erabiltzen dute eta 2020aren hasieran, makina handienetan sistema erabiliena izaten jarraitzen du. Horregatik, ziur asko denbora luzez jarraituko du MPIk erabilia izaten. 

## Erreferentziak 
## Kanpo estekak