pvm programok írása

48
PVM programok írása Kozsik Tamás [email protected] http://kto.web.elte.hu/ 2001-2003.

Upload: verna

Post on 22-Jan-2016

39 views

Category:

Documents


0 download

DESCRIPTION

PVM programok írása. Kozsik Tamás kto @elte.hu http://kto.web.elte.hu/ 2001-2003. 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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: PVM programok írása

PVM programok írása

Kozsik Tamás

[email protected]

http://kto.web.elte.hu/

2001-2003.

Page 2: PVM programok írása

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.

Page 3: PVM programok írása

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.

Page 4: PVM programok írása

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.

Page 5: PVM programok írása

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

Page 6: PVM programok írása

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

Page 7: PVM programok írása

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

• Grid (-: 40 (28) Linux-os PC hálózatba szervezve: ezen teszteljünk, ezen kell bemutatni

Page 8: PVM programok írása

Grid

• 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ó– pandora.inf.elte.hu– jelenleg panda.inf.elte.hu

Page 9: PVM programok írása

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...• [email protected]

Page 10: PVM programok írása
Page 11: PVM programok írása

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ő

Page 12: PVM programok írása

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

Page 13: PVM programok írása

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;

}

Page 14: PVM programok írása

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;

}

Page 15: PVM programok írása

Futtatáskto@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>

Page 16: PVM programok írása

Ú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

Page 17: PVM programok írása

Újabb futtatásconf

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>

Page 18: PVM programok írása

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

Page 19: PVM programok írása

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

}

Page 20: PVM programok írása

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

}

Page 21: PVM programok írása

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

Page 22: PVM programok írása

Egyszer kell megcsinálni:

pandora:~$ ssh nyl02.nylab

kto@nyl02:~$ mkdir pvm3

kto@nyl02:~$ mkdir pvm3/bin

kto@nyl02:~$ mkdir pvm3/bin/LINUX

kto@nyl02:~$

Page 23: PVM programok írása

Utána mindig ezt kell csinálni

pandora:~$ kauth [email protected]'s Password:

pandora:~$ ssh nyl02.nylab

kto@nyl02:~$ kauth [email protected]'s Password:

kto@nyl02:~$ cd pvm3/src/hello

kto@nyl02:~/pvm3/src/hello$ ls

Makefile.aimk hello.c hello_other.c

kto@nyl02:~/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@nyl01:~/pvm3/src/hello$

Page 24: PVM programok írása

Utána mindig ezt kell csinálni (2):

kto@nyl01:~/pvm3/src/hello$ ls

LINUX Makefile.aimk hello.c hello_other.c

kto@nyl01:~/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@nyl01:~/pvm3/src/hello$ ls ~/pvm3/bin/LINUX/

hello hello_other

kto@nyl01:~/pvm3/src/hello$ pvm

pvm> spawn -> hello

Page 25: PVM programok írása

Jó tudni

• A pandoráról is elérhető az a home-könyvtár, ami a nyelvi labor gépeiről látszik. (A pandáról ez nem feltétlenül működik.)

/h/mnt/lovarda/teacher/kto

• Ha diák lennék:

/h/mnt/lovarda/k/kto

Page 26: PVM programok írása

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

Page 27: PVM programok írása

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

Page 28: PVM programok írása

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

Page 29: PVM programok írása

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

Page 30: PVM programok írása

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

Page 31: PVM programok írása

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

Page 32: PVM programok írása

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

Page 33: PVM programok írása

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

Page 34: PVM programok írása

Ü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

Page 35: PVM programok írása

Ü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

Page 36: PVM programok írása

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

Page 37: PVM programok írása

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

Page 38: PVM programok írása

Multicast

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

• pvm_mcast

Page 39: PVM programok írása

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

Page 40: PVM programok írása

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>

Page 41: PVM programok írása

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>

Page 42: PVM programok írása

add, conf (3)

pvm> add nyl03 nyl04 nyl05

add nyl03 nyl04 nyl05

3 successful

HOST DTID

nyl03 c0000

nyl04 100000

nyl05 140000

pvm>

Page 43: PVM programok írása

add, conf (4)

pvm> add nyl12

add nyl12

0 successful

HOST DTID

nyl12 Can't start pvmd

pvm>

• Nem felejtetted el a kauth-ot?

Page 44: PVM programok írása

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

Page 45: PVM programok írása

hosts példakto@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

Page 46: PVM programok írása

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

Page 47: PVM programok írása

Várható változások

• A Grid-es infrastruktúra fejlesztése

• Ütemező telepítése

Page 48: PVM programok írása

Doksik• man pvm_spawn (stb.)

• http://www.elte.hu/~szamcsi/work/pvm/pvm_2_ToC.html

• http://www.inf.elte.hu/valerie/doc/pvm

• http://www.inf.elte.hu/valerie/shiva

• http://people.inf.elte.hu/hz/parh/parhprg.html

• http://kto.web.elte.hu/oktatas/parhgyak/