4. Open MPI

Open Message Passing Interface

Minimális MPI program

A legegyszerűbb MPI programnak is tartalmaznia kell az MPI_Init és MPI_Finalize hívásokat, így például az alábbi formában képzelhető el (hello.c):

A program fordítása:

gcc hello.c -o hello -l mpi

A program futtatása:

mpirun hello

Master-slave

Az MPI környezet a programból elérhető teszi, hogy az éppen hogy lett elindítva. A következő példában azt láthatjuk, hogy hogyan tudjuk megállapítani, hogy több folyamat közül melyik-melyik (master_slave.c).

A programot fordítani a következő parancs kiadásával tudjuk:

gcc master_slave.c -o master_slave -l mpi

Futtatáshoz adjuk meg, hogy a processzek száma 2 legyen:

mpirun -np 2 master_slave

A program kimenetének az elvártak szerint a következő sorokat kell tartalmaznia:

[0] I am the master!
[1] I am just a slave.

Érdemes azt észrevenni/kipróbálni, hogy futtatástól függően a kiíratások sorrendje változhat.

Blokkoló üzenet küldése

Az üzenet küldésénél a blokkolás azt jelenti, hogy a program csak az üzenet elküldése után folytatja a futását (send_message.c).

Néhány észrevétel:

  • Az MPI_Send és MPI_Recv függvény visszatérési értéke ebben a rövid példában nincs ellenőrízve. A függvény egy hibakódot ad vissza, amellyel ellenőrízni lehet, hogy sikeres volt-e a küldés, vagy ha nem, akkor miért (http://web.mit.edu/22.00J/www/www3/MPI_Send.html).

  • Futtatásonként a kiírt üzenetek sorrendje eltérhet.

  • A program feltételezi, hogy legalább 2 process van.

  • Szintén feltételezés, hogy a címzett rangja 1.

  • A message változó kétféle módon kerül felhasználásra a küldő és fogadó oldalon.

Átlagolós példa

Tegyük fel, hogy készíteni szeretnénk egy olyan programot, amelyben van egy megkülönböztetett (master) folyamat, amelyik a többi folyamattól vár egy-egy lebegőpontos értékeket, majd ezek átlagát számítja ki a többi által összességében becsült értékként.

Ahhoz, hogy a master folyamat tudja, hogy mikor érkezik be számára az utolsó érték, az egyszerűbb megoldás az, hogy ha kiszámítja a rajta kívül lévő folyamatok számát. Ez az MPI_Comm_Size függvénnyel lekérdezhető.

Az egyszerűség kedvéért most feltételezzük azt, hogy minden folyamat a saját rangját küldi át a master-nek (így az eredmény a rangok átlaga lesz majd).

Blokkoló hívás segítségével a következőképpen oldható meg a probléma (guess.c):

A probléma megoldható az MPI_Reduce függvényének a segítségével is. Ehhez itt található egy részletes leírás: https://mpitutorial.com/tutorials/mpi-reduce-and-allreduce/

Ezzel a következő formában képzelhető el (guess_reduced.c):

Figyelem

Az MPI_Reduce függvény esetében figyelni kell a függvény paramétereinek az inicializálása! A függvény a szinkronizációt ugyan elvégzi, de a kezdeti értékek beállítása esetleges.

A program a következő tömörebb formába is átírható (guess_red.c):