User:Szha/Notes/CMSC714/note0906
< User:Szha | Notes/CMSC714
- notes
- first assignment MPI next week
- accounts emailed next week for UMIACS bug cluster and for SMP
- check readings page to see question sending assignment:w
- 2-4 questions
- 6PM day before lecture
PVM
provide a simple, free, portable parallel environment
run on everything
- parallel hardware: SMP, MPPs, Vector machines
- network of workstations: ATM, ethernet,
- UNIX machines and PCs running win32 API
- works on a heterogenous collection of machines
- handles type conversion as needed
provides two things
- message pasing library
- point-to-point messages
- synchronization: barriers, reductions
- OS support
- process creation (pvm_spawn)
PVM environment (UNIX)
one PVMD (daemon) per machine
- all processes communicate through pvmd (by default)
any number of application processes per node
PVM message passing
all messages have tags
- an integer to identify the message
- defined by the user
messages are constructed, then sent
- pvm_pk{int,char,float}(*var, count, stride)
- pvm_unpk{int,char,float} to unpack
all processes are named based on task ids (tids)
- local/remote processes are the same
primary message passing functions
- pvm_send(tid,tag)
- pvm_recv(tid,tag) # tid to receive from, could be anywhere
PVM process control
creating a process
- pvm_spawn(task,argv,flag,where,ntask,tids)
- task is name of program to start
- flag and where provide control of where tasks are started
- ntask determines how many copies are started
- program must be installed on each target machine
- returns number of tasks actually started
ending a task
- pvm_exit
- does not exit the process, just the PVM machine
info functions
- pvm_mytid() get the process task id
PVM group operations
group is the unit of communication
- a collection of one or more processes
- processes join group with pvm_joingroup("<group name>")
- each process in the group has a unique id
- pvm_gettid("<group name>")
barrier
- can involve a subset of the processes in the group
- pvm_barrier("<group name>"), count)
reduction operations
- pvm_reduce( void (*func)(), void *data, int count, int datatype, int msgtag, char *group, int rootinst)
- result is returned to rootinst node
- does not block (does not wait until root has the return value, just indicate valid buffer value)
- pre-defined funcs: PvmMin, PvmMax, PvmSum, PvmProduct
PVM performance issues
messages have to go through PVMD
- can use direct route option to prevent this problem
packing messages
- semantics imply a copy (at least)
- extra function call to pack messages
heterogenous support
- information is sent in machine independent format
- has a short circuit option for known homogenous comm.
- passes data in native format then
sample PVM program
fragment from main
myGroupNum = pvm_joingroup("ping-pong"); mytid = pvm_mytid(); if (myGroupNum == 0) { pvm_catchout(stdout); okSpawn = pvm_spawn(MYNAME, argv, 0, "", 1, &friendTid); if (okSpawn != 1) { printf("can't spawn"); pvm_exit(); exit(1); } } else { friendTid = pvm_parent(); tids[0] = friendTid; tids[1] = mytid; } pvm_barrier("ping-pong", 2); if (myGroupNum == 0) { for (i = 0; i < MESSAGESIZE; i++) { messsage[i] = '1'l } } for (i = 0; i<ITERATIONS; i++) { if( myGroupNum == 0) { pvm_initsend(PvmDataDefault); pvm_pkint(message,MESSAGESIZE, 1); // stride 1 indicates no gap pvm_send(friendTid, msgid); pvm_recv(friendTid, msgid); pvm_upkint(message,MESSAGESIZE,1); } else { pvm_recv(friendTid,msgid); pvm_upkint(message,MESSAGESIZE, 1); pvm_initsend(PvmDataDefault); pvm_pkint(message, MESSAGESIZE, 1); pvm_send(friendTid,msgid); } } pvm_exit(); exit(0);