Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

PVM programok írása Kozsik Tamás 2001-2004.

Hasonló előadás


Az előadások a következő témára: "PVM programok írása Kozsik Tamás 2001-2004."— Előadás másolata:

1 PVM programok írása Kozsik Tamás kto@elte.hu http://kto.web.elte.hu/ 2001-2004.

2 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.

3 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.

4 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.

5 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

6 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

7 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

8 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ó…)

9 Nyelvi labor Programozási nyelvek labor (00-803) nyl01.nylab.inf.elte.hu nyl02.nylab.inf.elte.hu … nyl40.nylab.inf.elte.hu Hálózaton keresztül használható: master.nylab.inf.elte.hu

10 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

11

12 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ő

13 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

14 hello.c #include #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; }

15 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; }

16 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>

17 Ú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

18 Ú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>

19 Egy példaprogram megszerzése Bárki hozzájuthat a hello példaprogramhoz a 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...

20 hello.c #include #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); }

21 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); }

22 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

23 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

24 Mit, hol Programírás, fordítás master.nylab.inf.elte.hu Programok futtatása, tesztelése nyl??.nylab.inf.elte.hu

25 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

26 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

27 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:~$

28 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$

29 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$

30 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

31 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

32 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

33 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

34 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

35 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

36 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

37 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:~$

38 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

39 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. /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:~$

40 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:~$

41 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:~$

42 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:~$

43 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:~$

44 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()

45 Ü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

46 Ü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

47 Ü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 );

48 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

49 Multicast Ha ugyanazt az üzenetet több folyamatnak is el szeretnénk küldeni pvm_mcast

50 Hasznos parancsok a PVM konzolban spawnprogram indítása addprocesszorok megfogása confmegfogott processzorok psfutó folyamatok haltleállítás quitideiglenes kilépés

51 add, conf (1) kto@nyl01:~$ pvm pvm> conf conf 1 host, 1 data format HOST DTID ARCH SPEED DSIG nyl01 40000 LINUX 1000 0x00408841 pvm>

52 add, conf (2) pvm> add nyl02 add nyl02 1 successful HOST DTID nyl02 80000 pvm> conf conf 2 hosts, 1 data format HOST DTID ARCH SPEED DSIG nyl01 40000 LINUX 1000 0x00408841 nyl02 80000 LINUX 1000 0x00408841 pvm>

53 add, conf (3) pvm> add nyl03 nyl04 nyl05 add nyl03 nyl04 nyl05 3 successful HOST DTID nyl03 c0000 nyl04 100000 nyl05 140000 pvm>

54 add, conf (4) pvm> add nyl12 add nyl12 0 successful HOST DTID nyl12 Can't start pvmd pvm> Nem felejtetted el a kauth-ot?

55 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

56 hosts példa kto@nyl01:~$ cat hosts nyl01 nyl02 nyl03 kto@nyl01:~$ pvm hosts pvm> conf conf 3 hosts, 1 data format HOST DTID ARCH SPEED DSIG nyl01 40000 LINUX 1000 0x00408841 nyl02 80000 LINUX 1000 0x00408841 nyl03 c0000 LINUX 1000 0x00408841

57 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” Példadokumentáció és példaprogramok a gyakorlat honlapján (nem ugyanaz, mint a beadandó feladat!) Zárthelyi!!!

58 Doksik man pvm_spawn (stb.) http://people.inf.elte.hu/hz/parh/parhprg.html http://kto.web.elte.hu/oktatas/parhgyak/ http://lovei.web.elte.hu/pp/pvm/


Letölteni ppt "PVM programok írása Kozsik Tamás 2001-2004."

Hasonló előadás


Google Hirdetések