programozási keretet mpi szabvány

3.2 Programozás alapjai belül MPI szabvány

Minden folyamat a párhuzamos programok alapján hozzuk létre a másolatot az ugyanazon programkód (SPMP modell - Single Program Multiple folyamatok). Ez a kód formájában jelenik meg egy végrehajtható program rendelkezésre kell állniuk idején a dob egy párhuzamos program összes processzort használt. A forráskód a futtatható program kidolgozása az algoritmikus C vagy Fortran nyelven, egy adott végrehajtását MPI könyvtár.

Az eljárások száma, és a processzorok számát használt definíció a futási időben végzett párhuzamos program végrehajtását környezet és MPI-programok a számítások során nem lehet megváltoztatni (normál MPI-2 lehetővé teszi, hogy dinamikusan változtatni az eljárások száma). Minden folyamatot a program egymás után számozzuk 0 és p-1, ahol p az folyamatok számát. folyamatot számot hívják a rangot a folyamatot.

Ebben az esetben annak érdekében, hogy elkerüljék a személyazonosság számítások a különböző processzorok, lehetséges, egyrészt, hogy helyettesítse a különböző adatok különböző processzorok, szoftverek, másrészt révén azonosítására a folyamat, hogy fut a program, és ezzel lehetőséget adott szervezi a különbségek a számítás függően a processzor által használt programot.

Ez lehetővé teszi, hogy feltölt egy adott részfeladat, attól függően, hogy a „számok” a processzor. Ebben a kezdeti probléma bontották részfeladatok (bomlik). Egy szokásos eljárás szerint a következő: az egyes részfeladatok kerül kiadásra formájában egy külön szerkezeti egység (funkció modul) az összes processzorról futtatni ugyanazt a programot „betöltő”, amely szerint a „számok” a processzor betölt egy adott részfeladat.

Itt vannak a minimálisan szükséges készlet MPI feladatok, az elegendő, hogy dolgozzon ki egy viszonylag egyszerű párhuzamos programok.

Egy egyszerű MPI program.

Tekintsük a példát egy párhuzamos változata a széles körben használt demo „Helló világ” program. Amellett, hogy a szokásos üzenet minden folyamat kiírja a számát, és a folyamatok számát.

# include
# Include "mpi. H"
int main (int argc. char * argv [])
<
int procs_rank. procs_count;
MPI_Init ( argc. argv);
// inicializálja MPI-könyvtár
MPI_Comm_size (MPI_COMM_WORLD. procs_count);
// meghatározza az eljárások száma
MPI_Comm_rank (MPI_COMM_WORLD. procs_rank);
// megtalálni a folyamat helyezés
printf ( "\ n Hello World a folyamat% 3 3 d% d." procs_rank procs_count ..);
MPI_Finalize ();
// bezár MPI-könyvtár
vissza 0;
>

Nézzük meg részletesen egy példa:

Először csatlakoztassa a header file könyvtár "mpi. H". meghatározását tartalmazza funkciók, típusok és konstansok MPI. Ezt a fájlt be kell vonni az összes modult használó MPI.

Először minden MPI program kell hívni MPI_Init. amelynek jelen kell lennie az egyes programokban MPI és megelőz minden más MPI hívásokat. Azt állítja a „környezet” (környezet) MPI. Csak egy hívás MPI_Init által engedélyezett programot. Ő érvek számos érv, hogy feldolgozza a parancssor és a tényleges parancssori folyamat.

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

  • argc - egy mutatót a száma parancssori opciók;
  • argv - parancssori paramétereket.

MPI_Comm_size procs_count függvény futó folyamatok számának erre a programra. Merre a felhasználó lefuttatja ezeket a folyamatokat - a végrehajtás függ, de minden program meg tudja határozni a futó folyamatok számának felhasználásával ezt a hívást. Jelentése procs_count - van, sőt, a méret a csoport kapcsolatban a kommunikátor MPI_COMM_WORLD. Feldolgozza az egyes csoportok számozása egész számokkal kezdődő 0. nevezett soraiban (rangsor). Mindegyik folyamat határozza annak számát a csoport társított kommunikátor segítségével MPI_Comm_rank. Így minden folyamat kap ugyanazt a számot procs_count. de egy másik számot a rangsorban. Minden folyamatot kiírja a rang és az összes futó folyamatok, akkor az összes végrehajtott folyamatok MPI_Finalize. Ezt a funkciót kell elvégezni minden egyes MPI folyamat megszűnéséhez vezet „közepes” MPI. Nem MPI hívások után nem végezhető eljárás MPI_Finalize hívás (újra MPI_Init is lehetetlen).

A függvény meghatározásának eljárások száma a kommunikáció területén MPI_Comm_size.

int MPI_Comm_size (MPI_Comm Comm. int * méret)

ahol kom - a kommunikátor, méret - az eljárások száma a kommunikáció területén kommunikátor Comm.

Detection különtermek MPI_Comm_rank folyamatot.

int MPI_Comm_rank (MPI_Comm Comm. int * rang)

ahol kom - a kommunikátor, rang - eljárás száma vyzvavschego funkciót.

MPI programok MPI_Finalize befejezése függvénynek nincsenek paraméterei.

int MPI_Finalize (void)

Tekintsük az eredményeket a program a két folyamat.

2 változat abból a tényből, hogy a sorrendben jelennek meg a szöveges üzeneteket határozza meg, amely a folyamatok végrehajtásához használt a print, hogy általánosságban elmondható, hogy nehéz előre megjósolni. Az egyik lehetséges megoldás erre a problémára, ami lesz szó később, hogy adatokat gyűjtsön az egyik folyamat, majd elő a kimenetet.

A végrehajtási idő MPI programot

Szinte azonnal, miután az első fejlődése párhuzamos programok meghatározásához szükséges idő számítások elvégzése, hogy értékelje az elérhető folyamatok gyorsítása problémamegoldás segítségével a párhuzamosság. Általánosan használt a mérésére szolgáló eszköz üzemideje a programok rendszerint függ a hardver platform, az operációs rendszer, az algoritmikus nyelv, stb MPI szabvány tartalmazza annak meghatározását specifikus funkciókat idő mérésére, amelyek használata kiküszöböli a függőség a programok párhuzamos végrehajtását környezetben. Előállítása A által szolgáltatott aktuális idő függvényében:

kettős MPI_Wtime (void);

Az eredmény az ő hívást, akkor a másodpercek számát eltelt egy bizonyos időpontban a múltban. Ebben az időpontban, ahonnan a számlálás másodperc függhet végrehajtásáról MPI könyvtári környezetben, és így menekülni az ilyen függőség MPI_Wtime funkció csak akkor használható, időtartamának meghatározása a végrehajtás egyes kódrészletek párhuzamos programok. Lehetséges funkciók MPI_Wtime pályázati rendszerben a következők lehetnek:

<
A kezdési kettős. Befejezési;
kezdési = MPI_Wtime ();
// Néhány művelet
Befejezési = MPI_Wtime ();
printf ( "Work idő% f másodperc \ n" Befejezési - kezdési.);
>

Időmérés pontosságát is függ a közeg párhuzamos program végrehajtását. funkcióval lehet meghatározni a pontosságát az aktuális érték:

kettős MPI_Wtick (void);

amely lehetővé teszi, hogy meghatározza az időt másodpercben egymást követő időindexek hardver időzítő alkalmazása a számítógépes rendszerek.