Elosztott programozás mpi

Parallelnoe1 alkalmazása áll, több folyamat vagy feladat, hogy végeznek ugyanabban az időben. MPI könyvtár támogassa magát létrehoz egy meghatározott számú folyamatokat. Amikor a program megkapja a vezérlést, a folyamatok már létrejött. Megadhatja, hogy egy processzor kell futtatni több feladatot. Ebben az esetben a végrehajtás prallelnoe kerül emulált. A számításhoz folyamatok csoportosítva. Minden folyamat egy csoportnak egy egyedi számot. Jellemzően a folyamat száma 0 tartják a fő kezelőszerveket és mások.
MPI egyik jellemzője a koncepció a kommunikáció terén (kommunikáció domain). Ha az alkalmazás futtatásához, minden folyamat kerül az egyik a kommunikáció területén. A jövőben, akkor hozzon létre egy új területen alapuló meglévők. Minden kommunikáció egymástól független folyamatok számozási rendszert. Programozó álló kommunikátor - a fogantyú kommunikáció. A legtöbb funkciót a könyvtárban MINŐSÉG egyik paramétert figyelembe berendezés, amely nem korlátozza a hatályát az említett tartományban. A kezdeti kommunikáció területén, amely automatikusan létrejön az induláskor, használja MPI_COMM_WORLD kommunikátor.
Prototípusai legtöbb könyvtári funkciók nyilvánítják a fájlban „mpi.h”. Számos funkciók kell hívni minden elosztott programot (lásd. 1. táblázat).
Táblázat. 1. Az inicializálási és letiltás MPI könyvtár

Táblázat. 1. Az inicializálási és letiltás MPI könyvtár

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

Inicializálja a könyvtárban. Mivel a paraméterek kap mutatók
alapértelmezett beállításokkal funkció fő

Normális befejezés könyvtárban. Ezt kell hívni vége előtt a program


A könyvtár is tartalmaz egy sor információt funkciókat. Táblázat. A 2. ábra a ketten.
Táblázat. 2. Információs MPI funkciók

Táblázat. 2. Információs MPI funkciók

MPI_Comm_size (MPI_Comm Comm, int * méret)

Ír mérete érv csoport mérete, azaz a az összes futó folyamatokat az összekötő régió kom

MPI_Comm_rank (MPI_Comm kom, int * rang)

A helyezés a paraméter teszi a folyamat számát, a hívott függvény


Most levelet megosztott egyszerű program:

/ * A fájl first.c * /
#include
/ * Funkció prototípusok * az MPI /
#include "mpi.h"
int main (int argc, char ** argv)
int myRank, mérete;
/ * Inicializálása a könyvtár * /
MPI_Init (argc, argv);
/ * Határozza meg az eljárások száma * /
MPI_Comm_size (MPI_COMM_WORLD, méret);
/ * Határozza meg a folyamat száma * /
MPI_Comm_rank (MPI_COMM_WORLD, myRank);
/ * A kijelző az információk * /
printf ( "A szám mérete \ n ..", myRank, méret);
/ * Zárja be a könyvtár * /
MPI_Finalize ();
vissza 0;
>

Összeállítása és párhuzamosan futó programok

Összeállításához C-programok segítségével MPICH kell használni mpicc script. Ez fut azonos paraméterekkel, mint a C fordító és hozzáadja a szükséges paramétereket, hogy csatlakoztassa a könyvtár:

mpicc -o első first.c

A program futtatásához a script mpirun. Azt kell, hogy adja meg a számát folyamatok létre, és a nevét a futtatható fájl:

mpirun -NP 4 ./first

Elindítása után látni fogja a következő képernyő:

Száma 3 4 mérete
Száma 4 0 méretű
Száma 2 mérete 4
Száma 1 méret 4

A sorrend megfelel az alábbi folyamatok nem definiált. Ezért a vonal a képernyőn lesz hozzá bármilyen sorrendben. Ennek ellenőrzéséhez a program futtatásához többször.

Üzenetek küldésére és fogadására

Mint már említettük, az egyik módja kölcsönható folyamatok oszlik üzenetküldés. MPI (Message Passing Interface) meghatároz egy funkciót, amellyel feladatok üzeneteket küldhetünk és fogadhatunk. Minden üzenet egy attribútumok - a szám a küldő folyamat, a folyamat a címzett telefonszámát, és az üzenet azonosítóját. Üzenetazonosítók közötti egész szám 0-32.767.

A két legalapvetőbb funkciókat adás / vétel táblázat mutatja. 3.
Táblázat. 3. Az alapfunkciók MPI adás / vétel

Táblázat. 3. Az alapfunkciók MPI adás / vétel

int MPI_Send (void * buf, int count, PI_Datatype adattípus, int cél, int msgtag, MPI_Comm comm)

Blokkolást hajt végre egy üzenetet küld egy azonosítóval msgtag, amely egy szám adattípus típusú elemek cél folyamat számát. Minden üzenet elemek úgy vannak elrendezve egy sorban a pufferben buf. Count értéke lehet nulla. Az adattípus típusú erőátviteli elemeket ki kell jelezni, hogy milyen típusú előre meghatározott állandók. Ez lehetővé tette, hogy egy üzenetet küldhet magad.

int MPI_Recv (void * buf, int count, MPI_Datatype adattípus, int forrás, int msgtag, MPI_comm
kom, MPI_Status * állapot)

Elvégzi üzenet fogadását azonosítójával a folyamat msgtag forrás blokkoló. Az elemek száma a kapott üzenet nem haladhatja meg az értéke számít. Ha az elemek száma hozott kevesebb, mint a gróf, biztosítva van, hogy a puffer buf változtatni csak elemek megfelelő a kapott üzenetet.

Ezeket a funkciókat végre blokkolásával fogadása és továbbítása, azaz ispolzovnii amikor a vezérlés visszakerül a hívó folyamat csak azután adat érkezett, vagy át (vagy másolja egy ideiglenes puffer).

Adattípusok az MPI

MPI funkciókat meg kell határoznia a továbbított adatok típusát. Ez annak a ténynek köszönhető, hogy a megosztott szoftverek folyamatokat lehet egyszerre elvégezni gépek, amelyek különböző építészeti, bájtsorrendjét és az adatok bemutatása. Ezért, az összes funkciót az adás és vétel az MPI működnek nem a átvitt bájtok számát, és a sejtek számát, amelynek típusa határozza meg a függvény paraméter. Az MPI egy speciális típusa - MPI_Datatype - típus „leíró típusú,” minden egyes változó egyik típusa, MPI. Minden egyes bázis típusú adat a programozási nyelv használt MPI könyvtár 2 határozza meg a megfelelő konstansok.

Például, a táblázat. 4 állandók meghatározása a nyelv C.
Táblázat. 4. Az állandók MPI adattípusok és C

Táblázat. 4. Az állandók MPI adattípusok és C


Egy egyszerű program, amely elvégzi közötti adatátvitelt folyamatok így néz ki:

/ * A fájl mpi2.c * /
#include
#include "mpi.h"
int main (int argc, char ** argv)
int engem;
char üzenet [20];
MPI_Status állapotát;

MPI_Init (argc, argv);
MPI_Comm_rank (MPI_COMM_WORLD, én);
if (me == 0) / * ez a fő folyamat * /
strcpy (üzenet: "Helló, van");
/ * 1 folyamat küld egy karakterlánc; üzenet száma 99 * /
MPI_Send (üzenet, strlen (üzenet) + 1, MPI_CHAR, 1, 99, MPI_COMM_WORLD);
>
az else / * egy kiegészítő folyamat * /
/ * Wait folyamat 0 Message 99 tartalmazó karakterlánc * /
MPI_Recv (üzenet, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, állapot);
printf ( "proc receiveds:% s \ n", én, üzenet);
>

MPI_Finalize ();
vissza 0;
>

A program célja a két folyamat, ezért meg kell futtatni az alábbiak szerint:

mpirun -NP 2 ./mpi2

A képernyőn jeleníti meg az alábbiakat:

proc 1 receiveds: Hello, van

Ha a szkript mpirun adja meg a -l kapcsolót, mielőtt kimenet minden sora van nyomtatva eljárás számát, amely a nyomtatott ezt a sort:

mpirun -L -NP 2 ./mpi2
1: 1 proc receiveds: Hello, van

Mi alapjairól elosztott szoftveralkotás MPI könyvtár. A következő cikk foglalkozik bonyolultabb és nagyobb teljesítményű funkciók és példákat.

1Parallelnye futó programok különböző gépeken, más néven elosztott, hogy megkülönböztessék őket a program végrehajtása ugyanazon többprocesszoros rendszerben (általában megosztott memória). A cikk szempontjából a párhuzamos és elosztott szinonimaként használjuk.

Kapcsolódó cikkek