Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lecture 5: Parallel Virtual Machine (PVM). Parallel Programming Models Message Passing Model Used on Distributed memory MIMD architectures Multiple processes.

Similar presentations


Presentation on theme: "Lecture 5: Parallel Virtual Machine (PVM). Parallel Programming Models Message Passing Model Used on Distributed memory MIMD architectures Multiple processes."— Presentation transcript:

1 Lecture 5: Parallel Virtual Machine (PVM)

2 Parallel Programming Models Message Passing Model Used on Distributed memory MIMD architectures Multiple processes execute in parallel asynchronously Process creation may be static or dynamic Processes communicate by using send and receive primitives

3 Parallel Programming Models Example: Pi calculation   f 0 1 f(x) dx = f 0 1 4/(1+x 2 ) dx = w ∑ f(x i ) f(x) = 4/(1+x 2 ) n = 10 w = 1/n x i = w(i-0.5) x f(x) 0 0.1 0.2 x i 1

4 Parallel Programming Models Sequential Code #define f(x) 4.0/(1.0+x*x); main(){ intn,i; float w,x,sum,pi; printf(“n?\n”); scanf(“%d”, &n); w=1.0/n; sum=0.0; for (i=1; i<=n; i++){ x=w*(i-0.5); sum += f(x); } pi=w*sum; printf(“%f\n”, pi); }  = w ∑ f(x i ) f(x) = 4/(1+x 2 ) n = 10 w = 1/n x i = w(i-0.5) x f(x) 0 0.1 0.2 x i 1

5 www.netlib.org/pvm3 Parallel Virtual Machine (PVM)

6 Parallel PVM Code /* master */ #include #define WORKER “/home/esin/worker” main(){ intmytid, nproc, nt, msgtype, tids[10]; intn,i; floatw,sum,pi; mytid = pvm_mytid(); nproc = 4; nt = pvm_spawn(WORKER, NULL, PvmTaskDefault, “”, nproc, tids); printf(“%d - spawned %d tasks\n”, mytid, nt); n = 10; msgtype=1; for (i=0; i<nproc; i++){ pvm_initsend(PvmTaskDefault); pvm_pkint(&i, 1, 1); pvm_pkint(&nproc, 1, 1); pvm_pkint(tids, nproc, 1); pvm_pkint(&n, 1, 1); pvm_send(tids[i], msgtype); } w=1.0/n; sum=0.0; msgtype=2; for (i=0; i<nproc; i++){ pvm_recv(-1, msgtype); pvm_upkfloat(&result, 1, 1); sum += result; } pi=w*sum; printf(“%f\n”, pi); pvm_exit(); } /* worker */ #include #define f(x) 4.0/(1.0+x*x); main(){ intmytid, nproc, nt, msgtype, tids[10]; intn,I, start, end; float w,x,sum; msgtype=1; pvm_recv(pvm_parent(), msgtype); pvm_upkint(&myid, 1, 1); pvm_upkint(&nproc, 1, 1); pvm_upkint(tids, nproc, 1); pvm_upkint(&n, 1, 1); w=1.0/n; sum=0.0; start = myid*(n/nproc); end = (myid+1)*(n/nproc); for (i=start; i<end; i++){ x = w*(i-0.5); sum += f(x); } msgtype=2; pvm_initsend(PvmTaskDefault); pvm_pkfloat(&sum, 1, 1); pvm_send(pvm_parent(), msgtype); pvm_exit(); }

7 Parallel Programming Models Parallel PVM program Master: Creates workers Sends initial values to workers Receives local “sum”s from workers Calculates and prints “pi” Workers: Receive initial values from master Calculate local “sum”s Send local “sum”s to Master Master W0W1W2W3

8 Parallel Virtual Machine (PVM) Data Distribution x f(x) 0 0.1 0.2 x i 1 x f(x) 0 0.1 0.2 x i 1

9 SPMD Parallel PVM Code /* master */ #include #define WORKER “/home/esin/worker” main(){ intmytid, nproc, nt, msgtype, tids[10]; intn,i; floatw,sum,pi; mytid = pvm_mytid(); nproc = 4; nt = pvm_spawn(WORKER, NULL, PvmTaskDefault, “”, nproc, tids); printf(“%d - spawned %d tasks\n”, mytid, nt); n = 10; msgtype=1; for (i=0; i<nproc; i++){ pvm_initsend(PvmTaskDefault); pvm_pkint(&i, 1, 1); pvm_pkint(&nproc, 1, 1); pvm_pkint(tids, nproc, 1); pvm_pkint(&n, 1, 1); pvm_send(tids[i], msgtype); } msgtype=3; pvm_recv(tids[0], msgtype); pvm_upkfloat(&pi, 1, 1); printf(“%f\n”, pi); pvm_exit(); } /* worker */ #include #define f(x) 4.0/(1.0+x*x); main(){ intmytid,nproc, nt, msgtype,tids[10]; intn,i, start, end; float w,x,sum, result; msgtype=1; pvm_recv(pvm_parent(), msgtype); pvm_upkint(&myid, 1, 1); pvm_upkint(&nproc, 1, 1); pvm_upkint(tids, nproc, 1); pvm_upkint(&n, 1, 1); w=1.0/n; sum=0.0; start = myid*(n/nproc); end = (myid+1)*(n/nproc); for (i=start; i<end; i++){ x = w*(i-0.5); sum += f(x); } if (myid==0) { msgtype=2; for (i=1; i<nproc; i++){ pvm_recv(tids[i], msgtype); pvm_upkfloat(&result, 1, 1); sum += result; } pi=w*sum; msgtype=3; pvm_initsend(PvmTaskDefault); pvm_pkfloat(&sum, 1, 1); pvm_send(pvm_parent(), msgtype); } else { msgtype=2; pvm_initsend(PvmTaskDefault); pvm_pkfloat(&sum, 1, 1); pvm_send(tids[0], msgtype); } pvm_exit(); }

10 Parallel Programming Models SPMD Parallel PVM program Master: Creates workers Sends initial values to workers Receives “pi” from W0 and prints Workers: Receive initial values from master Calculate local “sum”s Workers other than W0: Send local “sum”s to W0 W0: Receives local “sum”s from other workers Calculates “pi” Sends “pi” to Master Master W0W1W2W3

11 Parallel Virtual Machine (PVM)

12 C Interface #include “pvm3.h” Process Control int tid = pvm_mytid(void) int info = pvm_exit(void) int info = pvm_kill(int tid) int info = pvm_addhosts(char **hosts, int nhost, int *infos) int info = pvm_delhosts(char **hosts, int nhost, int *infos) int numt = pvm_spawn(char *task, char **argv, int flag, char *where, int ntask, int *tids) Information int tid = pvm_parent(void) int dtid = pvm_tidtohost(int tid) int info = pvm_perror(char *msg) int info = pvm_config(int *nhost, int *narch, struct hostinfo **hostp) int info = pvm_tasks(int which, int *ntask, struct taskinfo **taskp) int val = pvm_getopt(int what) int oldval = pvm_setopt(int what, int val) Parallel Virtual Machine (PVM)

13 C Interface Signalling int info = pvm_sendsig(int tid, int signum) int info = pvm_notify(int about, int msgtag, int ntask, int *tids) Message Buffers int bufid = pvm_mkbuf(int encoding) int info = pvm_freebuf(int bufid) int bufid = pvm_getsbuf(void) int bufid = pvm_getrbuf(void) int oldbuf = pvm_setsbuf(int bufid) int oldbuf = pvm_setrbuf(int bufid) int bufid = pvm_initsend(int encoding) int info = pvm_upklong(long *np, int cnt, int std ) int info = pvm_upkshort(short *np, int cnt, int std ) int info = pvm_upkstr(char *cp )

14 Parallel Virtual Machine (PVM) C Interface Sending int info = pvm_packf( printflike format... ) int info = pvm_pkbyte( char *cp, int cnt, int std ) int info = pvm_pkcplx( float *xp, int cnt, int std ) int info = pvm_pkdcplx( double *zp, int cnt, int std ) int info = pvm_pkdouble(double *dp, int cnt, int std ) int info = pvm_pkfloat( float *fp, int cnt, int std ) int info = pvm_pkint( int *np, int cnt, int std ) int info = pvm_pklong( long *np, int cnt, int std ) int info = pvm_pkshort( short *np, int cnt, int std ) int info = pvm_pkstr( char *cp ) int info = pvm_send( int tid, int msgtag ) int info = pvm_mcast( int *tids, int ntask, int msgtag ) int info = pvm_psend( int tid, int msgtag, void *vp, int cnt, int type ) Receiving int bufid = pvm_recv( int tid, int msgtag ) int bufid = pvm_probe( int tid, int msgtag ) int bufid = pvm_nrecv( int tid, int msgtag ) int bufid = pvm_precv( int tid, int msgtag, void *vp, int cnt, int type int *rtid, int *rtag, int *rlen ) int bufid = pvm_trecv( int tid, int msgtag, struct timeval *tmout ) int info = pvm_bufinfo( int bufid, int *bytes, int *msgtag, int *tid) int info = pvm_unpackf( printflike format... ) int info = pvm_upkbyte( char *cp, int cnt, int std ) int info = pvm_upkcplx( float *xp, int cnt, int std ) int info = pvm_upkdcplx( double *zp, int cnt, int std ) int info = pvm_upkdouble(double *dp, int cnt, int std ) int info = pvm_upkfloat( float *fp, int cnt, int std ) int info = pvm_upkint( int *np, int cnt, int std ) int info = pvm_upklong( long *np, int cnt, int std ) int info = pvm_upkshort( short *np, int cnt, int std ) int info = pvm_upkstr( char *cp )

15 Parallel Virtual Machine (PVM) C Interface Group Operations int inum = pvm_joingroup(char *group) int info = pvm_lvgroup(char *group) int size = pvm_gsize(char *group) int tid = pvm_gettid(char *group, int inum) int inum = pvm_getinst(char *group, int tid) int info = pvm_barrier(char *group, int count) int info = pvm_bcast(char *group, int msgtag) int info = pvm_reduce(void *op, void *vp, int cnt, int type, int msgtag, char *group, int root) op options vp type options PvmMax PVM—BYTE PVM—FLOAT PvmMin PVM—SHORT PVM—DOUBLE PvmSum PVM—INT PVM—CPLX PvmProduct PVM—LONG PVM—DCPLX

16 Parallel Virtual Machine (PVM) C Interface Starting PVM pvmd [nhostname] [d!debugmask?] [hostfile] pvm [hostfile] (starts console) Compiling PVM Applications cc o task myprog.c libpvm3.a For groups add libgpvm3.a before libpvm3.a 1 PVM Console Commands help [command] -- get information about commands conf -- lists hosts in virtual machine add host(s) -- add host(s) to virtual machine delete host(s) -- delete host(s) spawn [opt] file -- spawn process !count? -- number of tasks to spawn !host? -- host to spawn on ? -- redirect task output to console ?file -- redirect task output to file ??file -- append task output to file ps [a] -- lists processes on virtual machine alias -- define/list command aliases unalias -- undefine command alias setenv -- set/show environment variables echo -- echo arguments version -- print libpvm version id -- print console tid sig num tid -- send signal num to process kill tid -- terminate a process reset -- kill all processes and reset PVM quit -- exit console (PVM continues) halt -- kill all pvmds and console


Download ppt "Lecture 5: Parallel Virtual Machine (PVM). Parallel Programming Models Message Passing Model Used on Distributed memory MIMD architectures Multiple processes."

Similar presentations


Ads by Google