580 likes | 683 Vues
PVM programok írása. Kozsik Tamás kto @elte.hu http://kto.web.elte.hu/ 2001-200 4. 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
E N D
PVM programok írása Kozsik Tamás kto@elte.hu http://kto.web.elte.hu/ 2001-2004.
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ényeivel 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
Ada taszk vs. PVM • Ada task (vagy Java thread): végrehajtási szál • egy programon (processzen) belül • szimulált párhuzamosság, időosztásos ütemezés • light-weight • közös memórián keresztüli kommunikáció,illetve randevú • PVM: processz • akár valódi párhuzamosság is, több processzoron • heavy-weight • nincs közös memória, kommunikációs csatornát használunk
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
Lehetőségeink • Saját gépünk, akár Linux, akár Windows alatt: elfajuló eset, de fejlesztéshez jó • Egyetemi hálózat: nem javasolt • túl sok erőforrást kötne le • Siva - 16 processzoros „igazi” párhuzamos számítógép: beteges • Nyelvi labor: 40 (28) db Linux-os PC hálózatba szervezve: ezen teszteljünk, ezen kell bemutatni (pandorás jelszó…)
Nyelvi labor • Programozási nyelvek labor (00-803) nyl01.nylab.inf.elte.hunyl02.nylab.inf.elte.hu…nyl40.nylab.inf.elte.hu • Hálózaton keresztül használható: master.nylab.inf.elte.hu
Siva • PowerXplorer, a Parsytech cégtől • 16 db Motorola 601-es PowerPC processzor, plussz 16 db T400-as transputer • Minden node-on 8+1 mega RAM • Az augusta géphez van kötve, onnan használható • 4 dobozból áll, amik közül időnként néhány bekrepál (most 2 doboz megy) • Érdemes kipróbálni... • vlsoft@heureka.inf.elte.hu
Saját gép • Viszonylag egyszerűen hazavihető és feltelepíthető • Linux - triviális, Windows picit macerásabb • Fejlesztéshez ez is jó • Egy 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ás kto@nyl02:~/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 nyl14 add nyl14 1 successful HOST DTID nyl14 80000 pvm> conf conf 2 hosts, 1 data format HOST DTID ARCH SPEED DSIG nyl02 40000 LINUX 1000 0x00408841 nyl14 80000 LINUX 1000 0x00408841 pvm> spawn -> hello
Újabb futtatás conf 2 hosts, 1 data format HOST DTID ARCH SPEED DSIG nyl02 40000 LINUX 1000 0x00408841 nyl14 80000 LINUX 1000 0x00408841 pvm> spawn -> hello spawn -> hello [1] 1 successful t80001 pvm> [1:t40002] EOF [1:t80001] i'm t80001 [1:t80001] from t40002: 262146 [1:t80001] EOF [1] finished pvm>
Egy példaprogram megszerzése • Bárki hozzájuthat a hello példaprogramhoza gyakorlat honlapjáról: http://kto.web.elte.hu/oktatas/parhgyak/ • Innen letölthető a forrás és a Makefile.aimk, aminek segítségével le lehet fordítani • Van ott egy másik, ettől picit eltérő hello program is...
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 # Makefile for PVM targets […] VPATH = $(SDIR) # it could be modified .... BINS = hello hello_other FILES = *.c *.h Makefile.aimk NAME = hello default: $(BINS) % : %.c $(CC) $(CFLAGS) -o $@ $< […] # user's targets hello: hello.c hello_other: hello_other.c
Ez egy jó kis Makefile.aimk • http://lovei.web.elte.hu/pp/pvm/ # Makefile.aimk - PVM programok fordításához # # Használat: # Ezt a Makefile-t egy tetszőleges ... # ... BINS= hello hello_other
Mit, hol • Programírás, fordítás master.nylab.inf.elte.hu • Programok futtatása, tesztelése nyl??.nylab.inf.elte.hu
Fordítás • Az aimk parancs a Makefile.aimk fájl alapján hívogatja a fordítót • Az aimk parancsnak többféle argumentum adható aimk aimk links
A pvm első használata előtt • … létre kell hozni egy könyvtárszerkezetet • A felhasználó „home”-könyvtárában: pvm3 pvm3/bin pvm3/bin/LINUX • Itt keresi a pvm rendszer a futtatható állományokat
Egyszer kell megcsinálni: master:~$ ssh nyl02.nylab.inf.elte.hu kto@nyl02:~$ mkdir pvm3 kto@nyl02:~$ mkdir pvm3/bin kto@nyl02:~$ mkdir pvm3/bin/LINUX kto@nyl02:~$
Utána mindig ezt kell csinálni kto@master:~$ cd pvm3/src/hello kto@master:~/pvm3/src/hello$ ls Makefile.aimk hello.c hello_other.c kto@master:~/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 kto@master:~/pvm3/src/hello$
Ezt projektenként egyszer kell kto@master:~/pvm3/src/hello$ ls LINUX Makefile.aimk hello.c hello_other.c kto@master:~/pvm3/src/hello$ ls LINUX hello hello_other kto@nyl01:~/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 kto@master:~/pvm3/src/hello$ ls ~/pvm3/bin/LINUX/ hello hello_other kto@master:~/pvm3/src/hello$
Mi mire való • Az „aimk” parancs • lefordítja a forrásokat, • elkészíti a futtatható állományokat, és • lepakolja az aktuális könyvtár LINUX alkönyvtárában • Az „aimk links” parancs szimbolikus linkeket definiál • a „BINS” alapján (Makefile.aimk) • a futtatható állományok eléréséhez • a ~/pvm3/bin/LINUX könyvtárból
aimk links • Ha beállítom a Makefile.aimk-ban a BINS-t, akkor • utána fordítok „aimk”-val, és • ezután hívom az „aimk links” parancsot • Ha nem nyúlok a BINS-hez, akkor ezek után csak az „aimk” parancs kell
Még egy megjegyzés • Az „aimk links” parancs legelső meghívása során létrejön a szükséges könyvtárstruktúra is... pvm3 pvm3/bin pvm3/bin/LINUX
Futtatás • Az nyl??.nylab.inf.elte.hu gépekről • Be kell jelentkezni ssh-val valamelyikre • Ott lehet elindítani a pvm konzolt, és azon belül a programot… • Az azonosítás Kerberos segítségével történik • Kerberos ticket-et kapunk a bejelentkezéskor
Kerberos • Amikor a master-re belépünk, kapunk egy Kerberos ticket-et • Ez segít bennünket bejelentkezni jelszó megadása nélkül az nyl?? gépekre • A pvm rendszernek is szüksége van a ticket-re ahhoz, hogy felépítse a virtuális gépet • bejelentkezik minden host-ra ssh-val, és elindítja ott a pvm démont
Ha lejár a ticket… • Elveszti az érvényességét (3 óra elteltével) • Utána nem lehet már bejelentkezni vele • Meg lehet hosszabbítani a ticket-et • Manapság ez a „kinit –f” paranccsal megy • ami jelszót kér (pandorás jelszót) • régebben ehhez a „kauth –f” kellett
Jó tudni • A pandáról is elérhető az a home-könyvtár, ami a nyelvi labor gépeiről látszik. /mnt/cluster/teacher/kto • Ha diák lennék:/mnt/cluster/k/kto
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 kto@nyl01:~$
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) • Különösen a Siván, mert ott a gépet tartjuk lekötve, más egyáltalán nem tud dolgozni rajta • 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 kto@nyl01:~$ ls /tmp/pvm.11700/ log sock kto@nyl01:~$ id uid=11700(kto) gid=10713(aszt) groups=10713(aszt) kto@nyl01:~$
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. kto@nyl01:~$
Virtuális gép magában • A démon is elindítható magában, konzol nélkül kto@nyl01:~$ pvmd & [1] 627 kto@nyl01:~$ /tmp/filejgp9rM kto@nyl01:~$
Ilyenkor leállítás • Visszalépni/belépni a konzolba és onnan halt paranccsal ki. kto@nyl01:~$ pvm pvmd already running. pvm> halt halt Terminated kto@nyl01:~$
Legfontosabb PVM függvények pvm_mytid() pvm_parent() pvm_spawn() pvm_exit() pvm_initsend() pvm_pkint() pvm_send() pvm_upkint() pvm_recv() pvm_nrecv() pvm_mcast()
Ü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 • Blokkoló • pvm_recv • a fogadó folyamat blokkolódik az üzenet megérkezéséig • Nem blokkoló • 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