pvm programok írása
DESCRIPTION
PVM programok írása. Hasznos információk. http://kto.web.elte.hu/ http://lovei.web.elte.hu/. PVM - Parallel Virtual Machine. Szoftver rendszer, mellyel hálózatba kapcsolt számítógépeket egyetlen nagy párhuzamos számítógépként lehet látni és kezelni. - PowerPoint PPT PresentationTRANSCRIPT
PVM programok írása
Hasznos információk
• http://kto.web.elte.hu/
• http://lovei.web.elte.hu/
PVM - Parallel Virtual Machine• Szoftver rendszer, mellyel hálózatba kapcsolt
számítógépeket egyetlen nagy párhuzamos számítógépként lehet látni és kezelni.
• Kezdet: 1989 - Oak Ridge National Laboratory
• A párhuzamos programok írásának egyik szabványává vált.
• A publikus változata ingyen elérhető.
• Sok hardver gyártó biztosítja a saját gépére optimalizált, gyorsabb változatát is.
Felépítése
• A rendszerben vannak programok, amelyek a felhasználó által írt párhuzamos program futtatását biztosítják.– PVM démon– PVM konzol
• Vannak C, illetve Fortran77 könyvtárak a párhuzamos programok megírásához.
Használata• PVM rendszerbe kapcsolhatunk több - akár
különböző típusú - számítógépet.
• A rendszer a rajta futó programok szempontjából ezek után egy nagy, elosztott memóriájú virtuális számítógépnek látszik.
• Különböző processzorokon, különböző programokat indíthatunk el.
• A szinkronizációt és a kommunikációt a PVM könyvtári függvényekkel oldhatjuk meg.
A párhuzamos programok
• Taszkokból (folyamatokból) épülnek fel
• Taszk = UNIX/Windows/… program
• A taszkok a pvm könyvtárat használják– C, C++, Fortran77
• A kommunikáció a pvm démonon keresztül történik
Működés
• Számítógépek hálózatba szervezve
• A felhasználó jogosult bármelyik gépre bejelentkezni
• Minden gépen futtat egy pvm démont
• És futtatja a taszkokat, melyek a démonokon keresztül lépnek egymással kapcsolatba– Egy gépen több taszk is futhat
Hálózat
• Programozási nyelvek labor (00-803)• nyl01.nylab.inf.elte.hunyl02.nylab.inf.elte.hu…nyl40.nylab.inf.elte.hu …
Hálózat
• ATLASZ • Egyetemi gépre belépve →
ATLASZ.ELTE.HU• blade01...blade14
Saját gép• Viszonylag egyszerűen hazavihető és
feltelepíthető
• Linux – triviális(pvm, pvm-dev), Windows picit macerásabb
• Fejlesztéshez ez is jó
• Egy (több) processzoron/gépen fut minden taszk
• Teszteléshez nem elég!– A tesztelés egy része itt is végezhető
Az első program
• „hello” alkalmazás
• Két taszk: hello és hello_other
• Két különálló C program, külön-külön lefordítva
• A főprogram a hello
• Elindítja a hello_other-t a PVM-en keresztül
hello.c#include <stdio.h>
#include "pvm3.h"
int main() {
int tid;
int num;
printf("i'm t%x\n", pvm_mytid());
pvm_spawn( "hello_other", (char**)0, 0, "", 1, &tid);
pvm_recv(-1, -1);
pvm_upkint(&num,1,1);
printf("from t%x: %d\n", tid, num);
pvm_exit();
return 0;
}
hello_other.c#include "pvm3.h"
int main() {
int tid = pvm_mytid();
int ptid = pvm_parent();
pvm_initsend(PvmDataDefault);
pvm_pkint(&tid,1,1);
pvm_send(ptid, 1);
pvm_exit();
return 0;
}
Futtatástothmelinda@atlasz:~/pvm3/src/hello0$ pvm
pvm> spawn -> hello
spawn -> hello
[1]
1 successful
t40002
pvm> [1:t40002] i'm t40002
[1:t40002] from t40003: 262147
[1:t40003] EOF
[1:t40002] EOF
[1] finished
pvm>
Újabb host felvétele a virtuális gépbe
pvm> add blade01
add nyl14
1 successful
HOST DTID
blade01 80000
pvm> conf
conf
2 hosts, 1 data format
HOST DTID ARCH SPEED DSIG
atlasz 40000 LINUX64 1 0x00408c41
blade01 80000 LINUX64 1000000 0x00408c41
Újabb futtatás2 hosts, 1 data format
HOST DTID ARCH SPEED DSIG
atlasz 40000 LINUX64 1 0x00408c41
blade01 80000 LINUX64 1000000 0x00408c41
pvm> spawn -> hello
spawn -> hello
[1]
1 successful
t80001
pvm> [1:t40002] EOF
[1:t80001] i'm t40001
[1:t80001] from t80002: 262146
[1:t80001] EOF
[1] finished
hello.c#include <stdio.h>
#include "pvm3.h"
int main() {
int cc, tid;
char buf[100];
printf("i'm t%x\n", pvm_mytid());
cc = pvm_spawn( "hello_other", (char**)0, 0, "", 1, &tid);
if (cc == 1) {
cc = pvm_recv(-1, -1);
pvm_bufinfo(cc, (int*)0, (int*)0, &tid);
pvm_upkstr(buf);
printf("from t%x: %s\n", tid, buf);
} else printf("can't start hello_other\n");
pvm_exit();
exit(0);
}
hello_other.c#include "pvm3.h"
int main(){
int ptid;
char buf[100];
pvm_mytid();
ptid = pvm_parent();
strcpy(buf, "hello, world from other");
pvm_initsend(PvmDataDefault);
pvm_pkstr(buf);
pvm_send(ptid, 1);
pvm_exit();
exit(0);
}
Makefile.aimk
# A lefordítandó programok nevei (szóközzel elválasztott felsorolás)
BINS = hello hello_other
Egyszer kell megcsinálni:
melinda@m:~$ ssh [email protected]
tothmelinda@login03:~$ ssh atlasz.elte.hu
tothmelinda@atlasz:~$ mkdir pvm3
tothmelinda@atlasz:~$ mkdir pvm3/bin
tothmelinda@atlasz:~$ mkdir pvm3/bin/LINUX64
tothmelinda@atlasz:~$
Utána mindig ezt kell csinálni
tothmelinda@atlasz:~$ cd pvm3/src/hello
tothmelinda@atlasz:~/pvm3/src/hello$ ls
Makefile.aimk hello.c hello_other.c
tothmelinda@atlasz:~/pvm3/src/hello$ aimk
making in LINUX/ for LINUX
cc -I/usr/lib/pvm3/include -Ddebug -o hello ../hello.c -L/usr/lib/pvm3/lib/LINUX -lpvm3
cc -I/usr/lib/pvm3/include -Ddebug -o hello_other ../hello_other.c -L/usr/lib/pvm3/lib/LINUX -lpvm3
tothmelinda@atlasz:~/pvm3/src/hello$
Utána mindig ezt kell csinálni (2):
tothmelinda@atlasz:~/pvm3/src/hello$ ls
LINUX Makefile.aimk hello.c hello_other.c
tothmelinda@atlasz:~/pvm3/src/hello$ ls LINUX
hello hello_other
tothmelinda@atlasz:~/pvm3/src/hello$ aimk links
making in LINUX/ for LINUX
cd /h/teacher/kto/pvm3/bin/LINUX
ln -s /h/teacher/kto/pvm3/src/hello/LINUX/hello hello
ln -s /h/teacher/kto/pvm3/src/hello/LINUX/hello_other
hello_other
tothmelinda@atlasz:~/pvm3/src/hello$ ls ~/pvm3/bin/LINUX/
hello hello_other
tothmelinda@atlasz:~/pvm3/src/hello$ pvm
pvm> spawn -> hello
PVM indítása
• Legegyszerűbb, ha belépünk a PVM-konzol programba, és onnan futtatunk.
• Ez automatikusan elindítja a virtuális gépet is, azaz a PVM démont.
• Kilépés és a virtuális gép leállítása: halt
pvm> halt
halt
Terminated
tothmelinda@atlasz:~$
PVM démon• A virtuális gép (démon) független a
konzoltól, anélkül is elindítható
• Könnyű megfelejtkezni róla, és akkor csak eszi az erőforrásokat
• Még nagyobb a baj, ha bent ragad a programunk (pl. mert elszállt)
• Legközelebb el sem indul a pvm démon, leáll hibával
Bentragadt PVM program• Figyeljük, hogy minden taszkunk rendesen
leállt-e
• Ha nem, lőjük ki a bent ragadtakat
• Ha a pvm démont nem tudjuk leállítani, lőjük ki azt is
• Töröljük le a /tmp/pvm.<id>/sock fájlt
kto@nyl01:~$ ls /tmp/pvm.11700/
log sock
kto@nyl01:~$ id
uid=11700(kto) gid=10713(aszt) groups=10713(aszt)
kto@nyl01:~$
Bentragadt PVM program• Figyeljük, hogy minden taszkunk rendesen
leállt-e
• Ha nem, lőjük ki a bent ragadtakat
• Ha a pvm démont nem tudjuk leállítani, lőjük ki azt is
• Töröljük le a /tmp/pvm.11700/sock fájlt
tothmelinda@atlasz:~$ ls /tmp/pvmd.11700
tothmelinda@atlasz:~$ iduid=11700(tothmelinda) gid=100(users) groups=100(users),8291(pvm)
tothmelinda@atlasz:~$
Ideiglenes kilépés a konzolból
• A quit paranccsal: a démon, azaz a virtuális gép fut tovább
pvm> quit
quit
Console: exit handler called
pvmd still running.
tothmelinda@atlasz:~$
Ilyenkor leállítás
• Visszalépni/belépni a konzolba és onnan halt paranccsal ki.
tothmelinda@atlasz:~$ pvm
pvmd already running.
pvm> halt
halt
Terminated
tothmelinda@atlasz:~$
tothmelinda@atlasz:~/pvm3/proba/hello$ cd LINUX/
tothmelinda@atlasz:~/pvm3/proba/hello/LINUX$ ls
hello hello_other
tothmelinda@atlasz:~/pvm3/proba/hello/LINUX$ pvm
pvm> quit
quit
Console: exit handler called
pvmd still running.
tothmelinda@atlasz:~/pvm3/proba/hello/LINUX$./hello
i'm t40002
from t40003: 262147
tothmelinda@atlasz:~/pvm3/proba/hello/LINUX$
tothmelinda@atlasz:~/pvm3/proba/hello/LINUX$ pvm
pvmd already running.
pvm> halt
halt
Terminated
tothmelinda@atlasz:~/pvm3/proba/hello/LINUX$
Legfontosabb PVM függvények
pvm_mytid() pvm_parent()
pvm_spawn() pvm_exit()
pvm_initsend() pvm_pk*() pvm_send()
pvm_upk*() pvm_recv()
Üzenetküldés
• initsend, pk*, send– pkint, pkdouble…
• Egy üzenetben sok adat is elküldhető– Több pk* hívás lehetséges– Egy pk hívással egy sorozat adatot lehet
becsomagolni az üzenetbe (tömb, mátrix egy oszlopa)
• Tipikus hiba: egy üzenetet szétdarabolsz
Üzenet fejléce
• Minden üzenet tartalmaz az adatok mellett egy fejlécet is
• Üzenettípusok definiálása• pvm_send(címzett,fejléc);• A fogadásnál kereshetsz az üzenetsorban a
küldő és a fejléc alapján
Üzenetfogadás
• Üzenetsor (postaláda)
• Minden folyamatnak van egy üzenetsora• pvm_recv(küldő,fejléc);• A -1 azt jelenti, hogy „bármi”
pvm_recv(-1,-1);
Az üzenetfogadás fajtái
• „Szinkron”– pvm_recv– a fogadó folyamat blokkolódik az üzenet
megérkezéséig
• „Aszinkron”– pvm_nrecv– non-blocking receive– ha van üzenet, beolvassuk, egyébként skip
Multicast
• Ha ugyanazt az üzenetet több folyamatnak is el szeretnénk küldeni
• pvm_mcast
Hasznos parancsok a PVM konzolban
• spawn program indítása
• add processzorok megfogása
• conf megfogott processzorok
• ps futó folyamatok
• halt leállítás
• quit ideiglenes kilépés
add, conf (1)
tothmelinda@atlasz:~$ pvm
pvm> conf
conf
1 host, 1 data format
HOST DTID ARCH SPEED DSIG
Atlasz 40000 LINUX64 1 0x00408c41
pvm>
add, conf (2)pvm> add blade02
add blade02
1 successful
HOST DTID
blade02 80000
pvm> conf
conf
2 hosts, 1 data format
HOST DTID ARCH SPEED DSIG
atlasz 40000 LINUX64 1 0x00408c41
blade02 80000 LINUX64 1000000 0x00408c41
pvm>
add, conf (3)
pvm> add blade03 blade04 blade05
add blade03 blade04 blade05
3 successful
HOST DTID
blade03 c0000
blade04 100000
blade05 140000
pvm>
add, conf (4)
pvm> add blade16
add blade16
0 successful
HOST DTID
blade16 No such host
pvm>
hosts
• Készíthetsz egy fájlt, amiben felsorolod azokat a gépeket, amelyeket meg akarsz fogni
• Ezt a fájlt a konzol indításakor kell átadni paraméterként
• Nem kell add-dal fogdosni össze a processzorokat
hosts példatothmelinda@atlasz:~$ cat hosts
blade01
…
blade14
tothmelinda@atlasz:~$ pvm hostspvm> conf
conf
15 hosts, 1 data format
HOST DTID ARCH SPEED DSIG
atlasz 40000 LINUX64 1000 0x00408c41
blade01 80000 LINUX64 1000 0x00408c41
...
blade14 1c0000 LINUX64 1000 0x00408c41
A beadandó programokról...
• Sok gépen futtatva kell bemutatni
• Sok gépen végzett tesztelést kell dokumentálni
• A tesztelésnek az algoritmus műveletigényéről kell szólnia– pl. “n adat n processzoron O(log n) időben”
• Géptermi zárthelyi!!!