Sunteți pe pagina 1din 15

1

Parallel Virtual Machine, UTCN, C. Ivan

PVM : Parallel Virtual Machine


1. Obiective

Familarizarea cu mediul de dezvoltare PVM


Studiul bibliotecilor de programare PVM
Rezolvarea unor aplicaii ce utilizeaz funciile de bibliotec.

2. Introducere
Mediul PVM (Paralel Virtual Machine) integreaz o bibliotec pentru programarea sistemelor
paralele i distribuite bazat pe transfer de mesaje. Prin facilitile pe care le ofer permite integrarea
n maina virtual a unor sisteme variate: de la sisteme masiv paralele (MPP), respectiv sisteme
simetrice multiprocesor (SMP) i pn la structuri de staii de procesare (NOW) interconectate folosind
reele diferite (LAN, WAN). Mediul PVM ofer integrarea coleciei heterogene de computere ce
determin astfel crearea unei maini virtuale cu performane crescute. PVM permite unei colecii de
calculatoare eterogene s fie utilizate ca o resurs de calcul coerent i flexibil, astfel colecia de
calculatoare individuale poate fi vzut ca o main paralel, cu o evoluie dinamic, n orice moment,
mainii paralele i se pot asocia noduri noi sau noduri existente pot fi ndeprtate.
Link-uri:

Mediul PVM http://www.netlib.org/pvm3/index.html


Daemon pentru comunicaie rsh intre hosturile masinii virtuale: http://www.denicomp.com/

3. Fundamentare teoretic
Modele de calcul paralel prin transfer de mesaje. Abordarea bazat pe transferul de mesaje
permite exploatarea paralelismului distribuit folosind programarea paralel. Transferul mesajelor ntre
sisteme necesit cooperarea ntre emitor i receptor, avnd la baz o modaliti specifice de descriere a
datelor ct i de identificare a proceselor i a mesajelor.
n sistemele cu transmitere de mesaje, exist mai multe tipuri de interaciuni i anume comunicarea,
sincronizarea i agregarea. Modurile de interaciune sunt direct corelate cu modurile de comunicare, iar
comunicaia apare de obicei ntre procese ce aparin aceluiai grup (exist ns biblioteci software pentru
care este permis i comunicarea ntre grupuri diferite de procese cum ar fi MPI). n general, trei aspecte
de baz sunt necesare nelegerii diverselor moduri de comunicaie i anume: numrul de procese
implicate, modul de sincronizare a proceselor i managementul bufferelor de comunicaie.
Dou metodologii de proiectare a aplicaiilor sunt utilizate n calculul paralel bazat pe memorie
distribuit i anume: decompoziia datelor ce presupune aplicarea operaiilor computaionale asupra
uneia sau mai multor structuri de date, respectiv decompoziia funcional ce mparte procesarea n
funcie de diverse operaii sau funcii, modelul mainii virtuale PVM permind ambele abordri. Pentru
fiecare din cele dou abordri fiind posibile diferite strategii pe maina virtual, astfel: modelul
mulime grupeaz o colecie de procese strns legate logic, executnd acelai cod i realiznd n mod
periodic schimb de rezultate intermediare. Paradigma cunoate dou categorii:

modelul master- slave - programul master este responsabil cu crearea, iniializarea proceselor,
colectarea i afiarea rezultatelor, iar procesele sclav realizeaz procesarea corespunztor

Parallel Virtual Machine, UTCN, C. Ivan

ncrcrii alocate de master sau n mod individual, respectiv nod - unic, caz n care instane
multiple ale aceluiai program se execut, un singur proces are responsabilitatea
necomputaional a distribuirii taskurilor, dar poate contribui i la procesare.
modelul arbore procesele sunt generate dinamic ca urmare a evoluiei procesrii, cu
stabilirea unei relaii printe-copil (n opoziie relaiei de tip stea specifice modelului anterior).
Aceast paradigm, mai rar utilizat este folositoare problemelor pentru care ncrcarea total nu
este cunoscut a priori (cutri alfa-beta, algoritmi branch and bound, divide and conquer
recursiv, etc)

Dei aceste modele sunt bazate pe relaiile ntre procese, ele corespund de multe ori i topologiei de
comunicaie, fr ndoial acestea ofer posibilitatea fiecrui proces s comunice i s se sincronizeze cu
orice alt proces. Alegerea modelului este dependent de aplicaie i trebuie s reflecte structura natural a
programului. Biblioteca software PVM ofer un mediu de dezvoltare a aplicaiilor paralele i distribuite
bazat pe o interfa de programare relativ simpl, puternic i flexibil permind astfel implementarea ntrun mod intuitiv a diverselor categorii de aplicaii. Utilizatorul i concepe aplicaia ca o colecie de taskuri
cooperante, rutinele bibliotecii permind iniierea i terminarea taskurilor, comunicarea i sincronizarea
acestora. Taskurile sunt dinamice (pot fi generate sau distruse pe toat durata execuiei programului), astfel
ntreaga configuraie a mainii virtuale poate fi schimbat n orice moment.
Primitivele de comunicare includ mecanisme simple pentru transmiterea de mesaje, precum i
primitive complexe, pentru comunicaii colective cum ar fi transmiterea broadcast, sincronizare la barier
sau operaii de reducie. Taskurile PVM pot genera structuri arbitrare de control i dependen, fiecare task
n structur poate genera alte taskuri sau chiar terge maini incluse n maina virtual, orice procese pot
comunica i se pot sincroniza, bazat pe construciile specifice de control.

4. Mediul PVM
Dezvoltarea de aplicaii pentru sistemul PVM are la baz paradigma tradiional pentru programarea
sistemelor multiprocesor cu memorie distribuit. Diferene semnificative exist att n ceea ce privete
alegerea unei granulariti optime a paralelismului, managementul taskurilor prin crearea dinamic a
proceselor, numirea i adresarea lor, modelul PVM garantnd meninerea ordonrii mesajelor i alocarea
dinamic a buferelor de mesaje.
Caracteristicile bibliotecii PVM sunt:
maina virtual configurabil integreaz dinamic un set de hosturi
acces transparent la hardware i suport pentru heterogemeitate (procesoarele din sistem
reprezint o colecie de elemente virtuale de procesare)
implementarea programelor aplicaie este specific sistemelor cu transmitere de mesaje
model de programare structurat n jurul proceselor avnd la baz transmiterea de mesaje.
Unitatea de paralelism este taskul ce definete astfel un thread independent de control ce
alterneaz intre procesare i comunicare. Mediul nu ofer funcii pentru maparea proceselor la
procesoare, astfel n funcie de structura mainii fizice, taskuri multiple pot fi executate pe
acelai procesor, sau pe orice procesor liber.
Descrierea mediului PVM.
La lansare, mediul PVM examineaz maina virtual n care trebuie s opereze, creeaz un daemon
PVM - pvmd (executabil lansat n background) - pe fiecare nod disponibil al mainii, un singur daemon este
de tipul master (primul lansat) iar ceilali sunt de tipul slave.

Parallel Virtual Machine, UTCN, C. Ivan

Funciile bibliotecii PVM realizeaz o anumit sarcin, cele mai multe fiind folosite pentru a cere demonului
PVM s realizeze diferite operaii. Aceti demoni realizeaz ntreaga comunicaie i sunt responsabili pentru
tratarea sistemului de calculatoare ca o main paralel. Responsabilitile acestora sunt: asigurarea
mecanismelor de comunicaie ntre staii, execuia proceselor pe maina virtual, transmisia mesajelor de la
surs la destinaie i ruteaz mesajele, detectarea erorilor, asigurarea mecanismelor de securitate: multiplii
utilizatori ai mediului nu trebuie s interfereze.
Instalarea mediului PVM
Pentru nceput e nevoie de o main virtual (sistemul de operare pe care ruleaz -Windows XP). Se
prefer o versiune de Visual Studio mai veche (2006). Kit-ul PVM se poate ob ine de la link-ul de mai sus.
Prin consola pus la dispoziie de PVM se vor rula executabilele aplica ilor implementate n Visual Studio.
Construirea mainii virtuale
Biblioteca PVM este compus din dou pri:

daemonul pvmd3 necesar n toate computerele mainii virtuale


biblioteca ce conine rutinele de interfa ce ofer funcionalitatea necesar cooperrii intre
taskurile aplicaiei.

Lansarea demonului PVM fr a porni i consola este posibil prin rularea programului
$PVM_ROOT/lib/pvmd. Mainii virtuale i se pot aduga mai multe calculatoare prin furnizarea unui fiier
hostfile ca argument al demonului, fiecare linie a fiierului hostfile descrie un calculator gazd care se
dorete a fi adugat mainii virtuale (referirea poate fi o adresa IP sau un nume de host).
Urmtoarele moduri pot fi utilizate pentru lansarea mainii virtuale PVM.
pvm [-nhostname] [hostfile]
consola PVM prompterul: pvm>
lanseaz PVM sau ataeaz maina unei maini virtuale deja lansate, este modul recomandat de
lucru
xpvm
folosirea interfeei grafice, include diverse funcii consola, permite att lansarea PVM cat i ataarea
la o main deja creat.
Pvmd [-nhostname] [hostfile]
lansare direct a mainii virtuale folosind daemonul, este rar utilizat, de obicei pentru depanare,
opiunea N este pentru hosturi cu mai multe plci de reea.
Comenzi consola:
add hostname
alias
conf
delete hostname
halt
help [command]
kill tid
ps -a
quit

Adaug host(uri) mainii virtuale


Definete/listeaz comenzile alias
Listeaz hosturile mainii virtuale
terge hosturi din maina virtual
oprete PVM i taskurile din maina virtual
elimin un task din maina virtual
Listeaz taskurile ce ruleaz
ieire consol las PVM i taskurile rulnd

Parallel Virtual Machine, UTCN, C. Ivan


reset
spawn
trace
version

kill all tasks and reset PVM


creare i lansare task
setare/afiare evenimente de trasare
afiare versiune PVM

La iniializarea consolei se va ncerca crearea mainii virtuale specificate prin fiier prin lansarea
cate unui demon pe fiecare maina din fiierul hostfile, fiind posibil folosirea mtilor i a unor argumente
suplimentare. Cteva din opiunile posibile a fi utilizate n fiierul de configurare sunt descrise n fiierul de
mai jos.

Opiunea i descrierea sa

Opiunea implicit

lo = <> (utilizarea unui nume


de login diferit)

acelai nume cu cel de pe maina care iniializeaz

pw (demonul pvmd va cere


parola)

nu se cere, se utilizeaz rsh

dx = <> (o cale special a


demonului pvmd)

$PVM_ROOT/lib/pvmd

ep = <> (cale de cutare


speciala a executabilelor)

$PVM_ROOT/bin

ms (se dorete lansarea manual


a demonului pvmd)
(so=ms)

demonul este lansat automat. Aceast opiune se


folosete atunci cnd serviciile rsh i rexec nu sunt
disponibile.

Tabelul 1. Opiuni specifice fiierului de configurare


Primul daemon PVM lansat manual este daemonul master, ceilali daemoni sunt sclavi, orice main
virtual are un singur daemon master la un moment dat. Cererile de adugare/tergere de daemoni sclavi
sunt transferate masterului care va lansa sclavul pe un host specific ( bazat pe rsh, rexec()). Tabela hosturilor
se gsete n fiecare host coninnd informaia de configurare i va fi completat la adugarea de noi maini.
Informaia actualizat va fi transferat broadcast n ntreaga maina virtual, inclusiv hosturilor sclav
adugate recent i se va realiza actualizarea tabelelor de configurare, astfel dup ce masterul decide c toate
tabelele hosturilor sunt actualizate, transmite broadcast un mesaj de comitere a actualizrii tabelelor proprii,
informnd succesul operaiei de reconfigurare dinamic a mainii virtuale. ////?/?

5. Biblioteca de funcii PVM


Setul de API- uri integreaz biblioteca de funcii C++/ FORTRAN i cea pentru grupuri de procese.
Aplicaiile apeleaz funciile PVM, funcii care apeleaz daemonul pvmd pentru a rezolva sarcina solicitat.
Funciile bibliotecii pot fi clasificate n urmtoarele grupe:
Funcii pentru controlul mainii virtuale:
PVM_ADDHOSTS,
PVM_CONFIG,
PVM_DELHOSTS,
PVM_HALT
PVM_REG_HOSTER, PVM_REG_RM, PVM_REG_TASKER, PVM_START_PVMD

PVM_MSTA,

Parallel Virtual Machine, UTCN, C. Ivan

Funcii pentru controlul taskurilor:


PVM_EXIT, PVM_KILL, PVM_MYTID, PVM_PARENT, PVM_PSTAT, PVM_SPAWN, PVM_TASKS
Funcii de transmitere a mesajelor:
PVM_BUFINFO, PVM_FREEBUF, PVM_GETRBUF, PVM_GETSBUF, PVM_INITSEND,
PVM_MCAST, PVM_MKBUF, PVM_NRECV, PVM_PACK, PVM_PRECV, PVM_PROBE, PVM_SEND,
PVM_RECV, PVM_RECVF, PVM_SEND, PVM_SENDSIG, PVM_SETMWID, PVM_SETRBUF,
PVM_SETSBUF, PVM_TRECV PVM_UNPACK
Funcii pentru grupuri de procese:
PVM_BARRIER, PVM_BCAST, PVM_GATHER, PVM_GETINST, PVM_GETTID, PVM_GSIZE,
PVM_JOINGROUP, PVM_LVGROUP, PVM_REDUCE, PVM_SCATTER
Funcii avansate:
PVM_ARCHCODE, PVM_GETOPT, PVM_HOSTSYNC, PVM_NOTIFY, PVM_PERROR,
PVM_SETOPT, PVM_SETTMASK, PVM_TIDTOHOST
Majoritatea funciilor returneaz constanta PvmOk n caz de succes.

6. Crearea proceselor i comunicarea prin mesaje


6.1. Fiecare program care ruleaz pe maina virtual este identificat unic printr-un ntreg furnizat de
biblioteca PVM, ntreg numit identificator de task. Un program i poate afla identificatorul de task prin
intermediul funciei pvm_mytid:
int tid=PVM_MYTID(void);
PVM folosete un ntreg ( 32 biti) pentru a adresa orice task, grup sau daemon PVM din maina
virtual, ntregul este numit identificator de task.
Diverse combinaii ale acestor bii determin identificarea unui task a unui daemon sau cod de
eroare.
int info=PVM_EXIT(void)
permite prsirea mainii virtuale. Programul este ndeprtat de pe maina virtual, dar este pstrat n
execuie pe maina fizic. Pentru a realiza terminarea complet a programului se apeleaz funcia exit().
6.2 Una din cele mai importante sarcini pe care le poate ndeplini un program este s creeze alte programe,
prin intermediul funciei:
int numt=PVM_SPAWN(char *task, char **argv, int flag, char *where, int ntasks, int *tids);
Parametri funciei pvm_spawn au urmtoarea semnificaie:
1. task: numele programului ale crui instane dorim s le lansm n execuie
1. argv: lista de parametri pe care dorim s-i pasm noului program
2. where: numele gazdei sau irul vid
3. ntasks: numrul instanelor programului care se doresc create
4. tids:
un
tablou
de
ntregi
care
va
fi
completat
cu
identificatorii
task-urilor nou create dup execuia funciei;
5. flag: ofer o modalitate de a spune mainii virtuale cum s trateze noile procese; flag poate lua
urmtoarele valori:
PvmTaskDefault: PVM alege unde s creeze procesele
PvmTaskHost: argumentul where precizeaz numele gazdei pe care se vor crea procesele
PvmTaskArch: argumentul where specific arhitectura pe care procesele se execut, numele
mainilor gazd neinteresnd
PvmTaskDebug: lanseaz un depanator i ruleaz procesele

Parallel Virtual Machine, UTCN, C. Ivan

PvmTaskTrace: se genereaz date de trasare pentru o depanare post-mortem


PvmMppFront: lanseaz procesele pe un front end MPP
PvmHostCompl: complementeaz gazda specificat n where

Noi capabiliti includ abilitatea de a nregistra anumite taskuri PVM speciale pentru a realiza adugarea de
noi hosturi, maparea taskurilor la hosturi i lansarea de noi taskuri. Aceste funcionaliti creeaz o interfa
pentru ca planificatoare batch avansate (Condor, Lsf, Dqs) s fie conectate bibliotecii PVM i s poat rula
diverse joburi.
Pentru aplicaii paralele complexe dup crearea de procese pe maina virtual este necesar coordonarea lor,
coordonare realizat prin transferul de mesaje, proces care are urmtoarele etape la transmisie i recepie:
procesul surs- destinaie creeaz un buffer unde va pstra datele care vor fi trimise
destinaiei n mesajele urmtoare
datele de transmis-recepionat sunt plasate-preluate din buffer
se iniiaz transmisia recepia ctre un grup de procese sau ctre un singur proces
6.3. Procesul efectiv de transfer al datelor ntre procese bazat pe mesaje este un proces complex, datele sunt
plasate n buffere, iar daemonul pvmd transfer aceste buffere peste reea. Fiecare proces are la un
moment dat un singur buffer de emisie activ i un singur buffer de recepie activ dar sistemul ofer
posibilitatea de a exista mai multe buffere, permind utilizatorului s comute ntre acestea. Programul poate
solicita API-ului PVM s creeze i s gestioneze buffere pe care
UDP
programul le folosete bazat pe descriptorii lor.
PVMd1
PVMd2
Pentru a crea un buffer, programul apeleaz funcia:
int bufid = PVM_MKBUF (int encoding);
PVM trateaz problema codificrii datelor permind
TCP
TCP
utilizatorului s aleag dac o reprezentare intermediar va fi
necesar ntr-un transfer de mesaje particular, astfel va fi utilizat
biblioteca XDR pentru a crea un format al datelor independent de
Task 1
Task2 2222
main. Valorile pe care funcia pvm_mkbuf le poate lua sunt:
PvmDataDefault: implicit se utilizeaz XDR
TCP
deoarece biblioteca local nu poate tii n avans unde
urmeaz s se trimit datele
Figura 1. Protocoale de comunicatie generice
PvmDataRaw: nu se face codificare (se presupune
c datele sunt transmise unei maini similare)
PvmDataInPlace: nu doar c nu se face codificare, dar datele nici nu urmeaz s fie copiate
fizic n buffer
Dup crearea unui buffer, demonului PVM trebuie s i se semnalizeze utilizarea (activarea) lui. Aceast
funcie seteaz bufferul al crui descriptor este specificat ca buffer activ pentru emisie i returneaz ca
rezultat identificatorul vechiului buffer activ.
int oldbuf = PVM_SETSUF (int bufid);
Cnd dorim eliberarea resurselor utilizate de ctre un buffer apelm funcia:
int info = PVM_FREEBUF (int bufid);
La pornire, PVM creeaz automat un buffer de emisie implicit, iar dac vrem s utilizm acest buffer trebuie
s-l iniializm prin apelul funciei:
int bufid = PVM_INITSEND (int encoding);
Odat ce am creat un nou buffer i l-am activat sau odat ce am iniializat bufferul implicit pot fi trimise
mesaje. Trimiterea unui mesaj necesit doar transferul datelor din bufferul de emisie curent, iar plasarea
datelor aplicaiei n buffer, este realizat prin intermediul funciilor de mpachetare. Pentru a plasa n buffer
o valoare singular, programul apeleaz o funcie de mpachetare care ntoarce o informaie de stare a
execuiei operaiei.

Parallel Virtual Machine, UTCN, C. Ivan


Numele funciei de mpachetare

Tipul datei

pvm_pkbyte (char *cp, );

Byte

pvm_pkcplx (float *xp, );

Float

pvm_packdcplx (double *zp, );

Double

pvm_pkdouble (double *dp, );

Double

pvm_pkfloat (float *fp, );

Float

pvm_pkint (int *np, );

Integer

pvm_pklong (long *np, );

long int

pvm_pkshort (short *np, );

short

pvm_pkstr (char *cp);

Text

pvm_packf (const char *fmt, <>);

Arbitrar

Tabelul 2. Lista funciilor de mpachetare

Argumentele acestor rutine sunt pointerul ctre primul articol de mpachetat respectiv int nitem, int
stride). Pentru a permite mpachetarea a mai multe articole de acelai tip se folosete argumentul nitems,
indicnd numrul de articole, parametrul stride precizeaz cate valori de un anumit tip reprezint o dat.
Funciile de mpachetare pot fi apelate de mai multe ori pentru a mpacheta datele ntr-un singur mesaj, astfel
un mesaj poate conine cteva tablouri fiecare cu un tip de date diferit. Structurile sunt transferate prin
mpachetarea elementelor individuale. Pentru a evita operaia costisitoare de mpachetare a datelor cu
copierea fizic a valorilor n memorie, se poate utiliza opiunea PvmDataInPlace la crearea unui buffer
astfel, cnd o dat este mpachetat n buffer se plaseaz un pointer care indic unde se afl data efectiv.
6.4. Comunicarea ntre procese n mediul PVM.
Un program PVM ce ruleaz pe maina virtual implic taskuri i daemoni, respectiv cteva tipuri
de comunicaii sunt posibile incluznd comunicaia ntre un daemon i task, ntre doi daemoni respectiv ntre
dou taskuri. n afara transferului de date ntre taskuri, comunicaia este necesar transferului de semnale de
control ntre daemoni.
PVM presupune ca fiecare host n maina virtual este conectat direct folosind protocoalele TCP/UDP,
driverele de protocoale PVM ruleaz n spaiul utilizator. Comunicaia ntre demoni folosete UDP motivat
de faptul c permite comunicarea cu un numr mare de socketuri UDP remote, respectiv pentru fiecare nod
comunicarea punct la punct cu daemonii vecini necesit meninerea costisitoare a unui numr mare de
conexiuni.
Comunicarea ntre daemoni i taskuri este meninut bazat pe protocolul TCP deoarece ofer livrare sigur
de mesaje.
Comunicaia ntre taskuri poate fi realizata fie cu implicarea daemonilor fie n mod direct folosind
protocolul TCP, reducnd astfel ncrcarea n sistem.
Funcii de comunicaie. Utilizatorii PVM nu necesit cunoaterea mecanismelor interne de comunicaie ci
doar utilizarea funciilor interfeei de nivel nalt. Dup crearea bufferului i plasarea datelor n el, datele pot
fi trimise unui alt proces, preciznd:

Parallel Virtual Machine, UTCN, C. Ivan

destinaie, ca identificator de task al procesului cruia i este trimis mesajul


un msgtag, care este o etichet plasat pe mesaj i care se presupune c poart semnificaie n
cadrul aplicaiei. Eticheta de mesaj permite identificarea tipurilor de mesaje, de exemplu,
mesajele de atenionare pot avea o etichet diferit de cele de prelucrare.

Programul trimite un mesaj (cel din bufferul de emisie activ n momentul curent) unui anumit proces cu
ajutorul funciei pvm_send, specificnd descriptorul de task al procesului int i o etichet de mesaj:
int info = PVM_SEND (int tid, int msgtag);
Dac n program se intenioneaz trimiterea mesajului unei colecii de procesoare, se va apela o versiune
multicast a funciei de transmitere a mesajelor:
int info = PVM_MCAST (int *tids, int ntasks, int msgtag);
Funcia folosete un tablou de ntregi, tids, de lungime ntask, pentru a trimite mesaje tuturor procesoarelor
ale cror identificatori de task sunt plasai n tabloul tids.
Bufferele de recepie sunt alocate cu pvm_mkbuf(), iar apoi selectate cu:
int oldbuf = PVM_SETRBUF (int bufid);
Dup selecia bufferului ca buffer activ, toate mesajele primite vor fi plasate n acel buffer. n funcie de
caracterul blocant/neblocant al recepiei unui mesaj, n PVM exist trei metode de tratare a recepiei
mesajelor:
programul ateapt pan cnd sosete un mesaj care se potrivete descrierii mesajului ateptat
(comunicaie sincron, blocant). Exist i o funcie util pentru interogarea sosirii unui mesaj
cu o anumit etichet
programul preia mesajul dac este posibil, altfel continu prelucrarea, dar semnaleaz printr-un
flag succesul operaiei; aceasta se numete recepia neblocant (asincron)
ateapt un anumit mesaj, dar dac el nu sosete ntr-un interval de timp specificat, programul
opereaz ca i cum ar fi apelat o recepie neblocant
Toate aceste funcii se bazeaz pe diferena dintre atingerea de ctre un mesaj a unui procesor i
plasarea mesajului n bufferul de recepie, fapt posibil deoarece toate mesajele sunt de fapt direcionate ctre
demonul pvmd corespunztor. Demonul este ntotdeauna capabil s primeasc mesaje i memoreaz aceste
mesaje pentru a permite ntrzieri ntre sosirea mesajului i cererea sa de ctre aplicaie.
Recepia blocant este utilizat atunci cnd un program este decis s i opreasc activitatea pn la
primirea unui anumit mesaj:
int bufid = PVM_RECV (int tid, int msgtag);
Este posibil ateptarea sosirii unui anumit mesaj de la un anumit proces emitor. Astfel parametrii tid
(identificatorul procesului de la care se ateapt mesaje) i msgtag (tipul mesajului ateptat) acioneaz ca un
filtru, pentru a permite sosirea unui mesaj de la oricare proces sau cu orice etichet se folosete valoarea -1
ca wildcard. Cnd funcia pvm_recv se ncheie, mesajul relevant este deja plasat n bufferul de primire
activ.
Dac se dorete primirea unui mesaj dac el este deja primit de demonul local, fr a bloca execuia n cazul
n care mesajul nu este acolo, se poate folosi:
int bufid = PVM_NRECV(int tid, int msgtag);
Dac mesajul exist, atunci dup execuia funciei, mesajul va fi n bufferul de primire activ i bufid va fi
setat la identificatorul acelui buffer n caz contrar bufid va fi setat la 0 i mesajul nu se va afla n buffer.

Parallel Virtual Machine, UTCN, C. Ivan

O abordare intermediar ar fi cea oferit de funcia de ateptare temporar a unui mesaj, funcie ce permite
ateptarea un interval de timp sosirea unui mesaj care s se potriveasc tipului specificat:
int bufid = PVM_TRECV (int tid, int msgtag, struct timeval *tmout);
Dac recepia nu a avut succes (s-a consumat timpul de ateptare) atunci bufid va fi setat la 0, altfel se
procedeaz ca la apelul funciei pvm_recv().
O trstur adiional foarte util a mediului PVM este furnizarea unei funcii care permite aplicaiei s
ntrebe demonul pvmd local dac a sosit vreun mesaj:
int bufid = PVM_PROBE (int tid, int msgtag);
Dac mesajul n-a sosit, funcia ntoarce valoarea 0, altfel funcia ntoarce descriptorul bufferului care va
primi mesajul. Este de remarcat faptul c mesajul nu este transferat n bufferul de primire activ.
De ndat ce mesajele au fost recepionate, programul trebuie s despacheteze coninutul n variabile locale,
apelnd la rutinele de despachetare, care trateaz orice decodificare necesar care poate aprea:
Numele funciei de despachetare

Tipul datei

Pvm_upkbyte (char *cp, );

byte

Pvm_upkcplx (float *xp, );

float

Pvm_upackdcplx (double *zp, );

double

Pvm_upkdouble (double *dp, );

double

Pvm_upkfloat (float *fp, );

float

Pvm_upkint (int *np, );

integer

Pvm_upklong (long *np, );

long int

Pvm_upkshort (short *np, );

short

Pvm_upkstr (char *cp);

text

pvm_upackf (const char *fmt, <>);

arbitrar

Tabelul 2. Lista funciilor de despachetare


Pentru a diminua efortul de codificare necesar aplicaiilor PVM pentru transmiterea de structuri ntre
programe se obinuiete s se scrie funcii de mpachetare i despachetare specifice acestor structuri i, odat
scrise, potenialul de erori scade.
O pereche de funcii PVM utile se refer la transmiterea tablourilor:
int info = PVM_PSEND (int tid, int msgtag, void *vp, int cnt, int type);
int info = PVM_PRECV (int tid, int msgtag, void *vp, int cnt, int *rtid, int *rtag, int *rcnt);
Coninutul bufferelor poate fi interogat prin:

10

Parallel Virtual Machine, UTCN, C. Ivan

int info = PVM_BUFINFO (intbufid, int *bytes, int *msgtag, int *tid);
n variabila bytes se returneaz lungimea mesajului curent din buffer, n msgtag eticheta sa, iar n tid
descriptorul task-ului sursa.
Aflarea descriptorilor bufferelor de emisie/recepie active se poate realiza folosind funciile:
int bufid = PVMGETSBUF(void);
int bufid = PVMGETRBUF(void);
Modificarea modului sincron/asincron n care putem atepta sosirea mesajelor n bufferul de recepie local se
poate realiza cu funcia:
int (*old) () = PVMRECVF (int (*new) (int buf, int tid, int tag));
Modelul de comunicaie ofer transmisie/recepie sincron- asincron blocant i recepie nonblocant. El
presupune c fiecare proces poate trimite un mesaj oricrui alt proces i faptul c nu exist o limitare a
numrului sau dimensiunii mesajelor, n afara limitrii memoriei fizice. Exist opiuni n PVM ce necesit
transferul datelor direct ntre procese, astfel dac mesajul este mare este posibil ca emitorul s se blocheze
pan n momentul n care receptorul a apelat rutina aferent de recepie a mesajului.

6. Funcii pentru controlul mainii virtuale


Interfaa de programare PVM pune la dispoziie o serie de funcii pentru controlul mainii virtuale i
notificarea proceselor la anumite evenimente n sistem, respectiv pentru managementul static/dinamic al
grupurilor de procese. Programatorul are la dispoziie o serie de funcii ce permit controlul proceselor i al
mainii virtuale.
7.1. Maina virtual poate fi configurat dinamic de aplicaia utilizator prin apelul unor funcii de
bibliotec specifice. Pentru a aduga unul sau mai multe hosturi mainii virtuale se poate utiliza funcia:
int info = PVM_ADDHOSTS(char **hosts, int nhosts, int *infos)
unde
hosts - tablou de stringuri fiecare coninnd numele unui host
nhosts - ntreg care precizeaz lungimea argumentelor hosts i infos
infos - tablou de ntregi n care se obin tid-urile hosturilor adugate cu succes la maina virtual sau
valori negative pentru hosturile la a cror adugare se raporteaz insucces.
Valoarea returnat: poate fi n caz de succes complet: info = nhost, succes parial: 0 < info < nhost, Insucces:
info < 1
Aceast funcie realizeaz aceeai aciune ca i comanda add a consolei.
Funcia ce permite tergerea unuia sau mai multor hosturi din maina virtual este:
7. 2. Eliminarea unui host din maina virtual presupune distrugerea tuturor proceselor pvm i a daemonului de pe maina respectiv, programatorul este cel care trebuie s implementeze mecanisme de toleran
la
cderi
de
host-uri al aplicaiilor.
int info = PVM_DELHOSTS(char **hosts, int nhosts, int *infos)

11

Parallel Virtual Machine, UTCN, C. Ivan

Deoarece n multe programe este necesar a ti configuraia mainii virtuale, funcia urmtoare returneaz
informaii despre configuraia mainii virtuale.
int info = PVM_CONFIG(int *nhost, int narch, struct pvmhostinfo **hostp)
struct pvmhostinfo{
int hi_tid;
char *hi_name;
char *hi_arch;
int hi_speed;
};
Semnificaia argumentelor este urmtoarea:
nhost - ntreg care returneaz numrul de hosturi ale mainii virtuale
narch - ntreg care returneaz numrul de formate de date folosite n maina virtual
hostp - tablou de structuri care conine informaii despre fiecare host (tid, nume, arhitectura
i viteza relativ). Aceast funcie returneaz aceleai informaii despre maina virtual ca i
comanda conf de la consola, nchide maina virtual adic distruge toate procesele pvm
(locale i la distan) i toi demonii (locali i la distan), ea realizeaz aceeai funcie ca i
comanda halt a consolei. int info = PVM_HALT(void)
7. 3. Funcia care returneaz starea unui host din maina virtual este:
int info = PVM_MSTAT(char *host)
pentru care semnificaia parametrilor este urmtoarea:
host - string care specific numele hostului a crui stare este de interes.
Valorile returnate posibile sunt:
Host fr probleme: info = PvmOk
Hostul nu este n maina virtual: info = PvmNoHost
Hostul a cazut: info = PvmHostFail
Aceast funcie se folosete pentru verificarea corectitudinii configuraiei mainii virtuale, prin detectarea
host-urilor care au czut i eliminarea lor din maina virtual:
#include<pvmsdpro. h>
int info = pvm_reg_hoster()
Procesul care apeleaz aceast funcie definit anterior va putea prelua de la pvmd-ul master o parte
din sarcini, ca urmare a primirii de ctre pvmd-ul master a unei cereri de adugare a unei maini virtuale, el
poate s delege procesul s execute aceast operaie.
#include<pvmsdpr. h>
int info = PVM_REG_RM(struct pvmhostinfo **hip)
unde hip - pointer la o structur care conine informaii despre host-ul master
Procesul care apeleaz aceast funcie va intercepta anumite apeluri de bibliotec (care se refer la
cereri de servicii sau la cderi de sistem) i va contribui la politica de planificare.
#include<pvmsdpro. h>
int info = PVM_REG_PROCESER()

12

Parallel Virtual Machine, UTCN, C. Ivan

Procesul care apeleaz aceast funcie va prelua o parte din sarcinile pvmd-ului master referitoare la
fork() i exec().
7. 4. O funcie deosebit de important care permite un control avansat al mainii virtuale este funcia de
notificare a evenimentelor. Aceast funcie specific faptul c se dorete notificarea anumitor procese
pentru anumite evenimente. Funcia este deosebit de util pentru supervizarea crerii sau distrugerii
anumitor procese i n general anunarea procesului printe despre dinamica proceselor copii generate.
int info = PVM_NOTIFY(int what, int msgtag, int cnt, int *tids)
Argumentele funciei sunt:
what - tipul de eveniment pentru care se dorete notificarea
PvmProcesExit: Proces exits / killed
PvmHostDelete: Host deleted
PvmHostAdd: New host
msgtag - eticheta atasat mesajului
cnt - pentru PvmProcesExit i PvmHostDelete specific lungimea celui de al patrulea argument
pentru PvmHostAdd specific numrul de mesaje de notificare
tids - pentru PvmProces i PvmHostDelete specific un ir de identificatori de proces sau de
identificatori de proces pvmd pentru care se dorete notificarea

7. Managementul grupurilor de procese n mediul PVM


Multe aplicaii modelate prin transmitere de mesaje necesit posibilitatea transmiterii de mesaje ctre
grupuri mari de procese, fapt ce poate fi implementat la nivelul aplicaiei prin apeluri de trimitere repetat,
dar cele mai multe medii au modaliti mai eficiente de a trimite un mesaj la n destinatari. Unui proces ce s-a
asociat unui grup i se atribuite un numr de instan unic n acel grup. Generalitatea funciilor oferite de
biblioteca PVM const i n faptul c orice proces se poate ataa sau prsi n orice moment grupul fr a
informa orice alt proces. De asemenea grupurile se pot suprapune i diverse mesaje broadcast pot fi
transmise de diverse procese chiar i grupurilor crora nu le aparin.
n PVM, de exemplu, putem realiza acest lucru prin apelul funciei pvm_mcast() cu un tablou de
identificatori de proces. Functia pvm_mcast poate fi utilizat doar n cazul n care emitorul cunoate
identificatorii de proces ai tuturor receptorilor. Ce se ntmpla ns dac un proces dorete s se asocieze
unei colecii de procese deja existente? El ar putea s trimit un mesaj unui procesor responsabil cu
meninerea unei liste a tuturor proceselor din colecie sau ar putea s trimit mesaje fiecrui membru al
coleciei afirmndu-si afilierea. Ambele variante sunt ncete i ntmpin dificulti serioase. Ce se ntmpla,
de exemplu, dac dou procese ncearc simultan s intre ntr-un grup? Desigur, programatorul ar putea
gestiona toate aceste aspecte la nivelul aplicaiei, dar acest fapt ar presupune efort suplimentar.
n locul acestei abordri mediul PVM furnizeaz o abstracie de grup care trateaz aceste aspecte. Intern,
implementrile grupurilor rezolv toate dificultile datorate necesitii de a asigur dinamica grupurilor,
astfel n orice moment un proces poate s se alture unui grup, iar un mesaj transmis unui grup va ajunge la
toi membrii grupului. Biblioteca pentru funciile de grup este construit pe nucleul celei anterioare dar
daemonul PVM nu gestioneaz funciile de grup, care sunt executate de un daemon distinct, lansat la
invocarea primei funcii de grup (group server).
PVM suport grupuri dinamice, conceptul fiind deosebit de flexibil, ns abordarea n acest mod crete
nedeterminismul programului.
Un program se asociaz unui grup apelnd funcia:

13

Parallel Virtual Machine, UTCN, C. Ivan


int inum = PVM_JOINGROUP (char *group);

Numele indic grupul cruia vrem s ne alturm. Dac numele nu exist deja, el este creat i procesul intr
n acest grup. Parametrul inum indic numrul de instan al procesului n cadrul grupului. Numrul de
instan ncepe cu 0 (pentru procesul care creeaz grupul) i continu cu 1, 2, etc. Parametrul inum se poate
schimba dac procesul intr, iese i apoi reintr ntr-un grup.
Analog, un proces prsete un grup apelnd:
int info = PVM_LVGROUP(char *group);
Furnizarea numelui grupului este necesar pentru c un program poate fi membru al mai multor grupuri.
Funcia de prsire a grupului va bloca procesul pan cnd toat prelucrarea relevant a fost efectuat. Exist
mai multe operaii pe care un program le poate efectua ntr-un grup. Printre ele se afl i funciile care fac
translaia ntre identificatorul de proces i numrul de instan. Funcia pvm_gettid furnizeaz numrul de
instan al unui proces ntr-un grup i returneaz identificatorul su de proces. Funcia pvm_getinst
realizeaz operaia invers, returnnd numrul de instan al unui proces:
int tid = PVM_GETTID (char *group, int inum);
int inum = PVM_GETINST (chat *group, int tid);
Numrul de procese dintr-un grup este returnat de funcia pvm_getsize:
int size = PVM_GETSIZE (char *group);
Orice proces care ruleaz la un moment dat, indiferent dac este sau nu membru al unui grup, poate trimite
mesaje tuturor membrilor unui grup prin intermediul funciei pvm_bcast:
int info = PVM_BCAST (char *group, int msgtag);
Mesajul este trimis tuturor proceselor care exist n grup n momentul apelului funciei de broadcast. Dac
un proces se altur grupului pe durata efecturii broadcast-ului, el risc s nu primeasc mesajul. Grupurile
pot fi utilizate ca metode de a controla (sincroniza) procesele unei aplicaii, astfel, o aplicaie master/slave
poate s-i nroleze toate procesele slave ntr-un grup.
Sincronizare. n PVM operaia de sincronizare se poate efectua prin intermediul funciilor tip barier, astfel
scenariul presupune c membrii unui anumit grup ajung pe rnd la bariera curent a grupului. Barierele sunt
funcii blocante, a cror execuie se ncheie imediat ce un anumit numr de programe au ajuns la barier. Un
program ajunge la o barier a unui grup particular apelnd:
int info = PVM_BARRIER (char *group, int count);
Bariera va bloca execuia programului ateptnd ca un numr count de membri ai grupului s apeleze
pvm_barrier. , iar count este egal cu numrul proceselor din grup, dar programul trebuie s specifice explicit
acest lucru. Funcia apelant este un membru al barierei.
Exist cazuri n care procesele unui grup calculeaz i stocheaz date care trebuie combinate intre ele pentru
a stabili o valoare final, global. Cu ajutorul funciei pvm_reduce este posibil efectuarea unei asemenea
operaii de reducere asupra unui grup. Apelnd aceast funcie, fiecare procesor ofer grupului datele sale
locale, memorate ntr-un tablou. Din aceste date, cu ajutorul unei funcii de combinare (predefinit sau
definit de utilizator), se calculeaz datele finale care vor fi memorate la nivelul unui proces desemnat ca
fiind rdcina grupului:

14

Parallel Virtual Machine, UTCN, C. Ivan

int info PVM_REDUCE( void (*func)(), void *data, int count, int datatype, int msgtag, char *group,
int rootginst)
Semnificaia parametrilor este urmtoarea:
func este funcia care definete operaia efectuat asupra datelor globale (de pe toate procesele
grupului). Exist un numr de patru funcii predefinite: PvmMax, PvmMin, PvmSum, PvmProduct.
In cazul unor operatii mai speciale, utilizatorii ii pot defini propriile lor funcii de reducie. Ele vor
fi declarate astfel:
void func(int *datatype, void *x, void *y, int *num, int *info)
Datatype este tipul datelor prelucrate (vezi mai jos), irurile x i y sunt irurile de date care conin
rezultatul parial, x, i datele urmtorului proces care intr n operaia de reducie. Variabila num
memoreaz numrul de elemente care se prelucreaz (dimensiunea irurilor), iar info este o variabil
n care se ntorc informaii despre execuia reduciei.
data este un pointer la adresa de nceput a tabloului de valori locale. La revenirea din funcie, tabloul
de date al rdcinii grupului va fi suprascris cu valoarea rezultatului reduciei. In cazul celorlalte
procese, valoarea elementelor tabloului dup revenire nu este definit.
count specific numrul de elemente ale tablourilor de date. Valoarea count trebuie s coincid n
apelurile proceselor din grup!
datatype este o valoare ntreag ce specific tipul elementelor din ir. Exist urmtoarele tipuri
predefinite: PVM_BYTE, PVM_SHORT, PVM_INT, PVM_FLOAT, PVM_CPLX,
PVM_DOUBLE, PVM_DCPLX, PVM_LONG.
msgtag este o eticheta de mesaj.
group este un ir de caractere preciznd numele grupului existent, asupra cruia se efectueaz
reducia dorit.
rootginst definete numrul de instan al membrului din grup cruia i se returneaz rezultatul.
info este parametrul de ieire i desemneaz codul de stare al operaiei, valorile negative desemneaz
erori.

8. Probleme propuse
1. S se implementeze un program care citete imaginea unui fiier ntr-un format convenabil, necomprimat
i genereaz un fiier al imaginii translatat cu N pixeli la dreapta (N parametru de intrare).
2. O soluie pentru calculul lui Pi o constituie calculul ariei aferente curbei f(x)=4/(1+x2) ntre 0 i 1, egal
numeric cu pi. S se implementeze un program paralel pentru calculul lui pi folosind 10 procese. O alt soluie
pentru calculul lui Pi este aceea de a calcula aria unui cerc de raza r=1. Determinai ecuaia cercului i propunei
un program paralel care s calculeze Pi n acest mod. Efectuai o analiz a celor dou moduri propuse.
3. S se implementeze un program paralel care s realizeze adunarea unui ir de numere generate aleator i
stocate ntr-un fiier. Determinai maximul i suma acestora utiliznd funciile bibliotecii PVM.
4. Implementai o barier de tip contor corespunztoare unui proces master i a unui grup de N procese
slave. Este necesar utilizarea unor rutine blocante sincrone pentru ambele operaii send/receive? Motivai
rspunsul.
5. O abordare pentru asignarea proceselor la procesoare poate fi bazat pe aleatorizarea asignrii folosind un
generator de numere aleatoare. Investigai aceast tehnic prin aplicarea ei unui program paralel ce adun o
secven de numere.
6. Propunei un algoritm paralel care s implementeze tehnica de echilibrare a ncrcrii bazat pe o structur
pipeline pentru un numr arbitrar de procese aritmetice.
7. Propunei o soluie paralel de tip pipeline pentru calculul lui X16. Realizai o alt implementare a
problemei bazat pe abordarea divide&conquer. Comparai cele dou metode analitic i experimental.

15

Parallel Virtual Machine, UTCN, C. Ivan

8. Comparai sortarea prin inserie implementat secvenial i implementat bazat pe abordarea pipeline n
termenii acceleraiei obinute i a complexitii de timp a algoritmilor utilizai.
9. Avnd cele trei implementri posibile pentru adunarea unui ir de numere: bazat pe operaii send()/
receive() separate, folosind o rutin de tip broadcast(), sau folosind rutinele scatter() i gatter(), s se propun
implementri paralele pentru acestea i s se instrumenteze codul astfel nct s extrag i informaia aferent de
timp cu scopul de a compara cele trei abordri.
10. S se scrie un program paralel pentru calculul sumei a n ntregi realiznd i analiza performanelor
programului, corespunztor urmtoarelor moduri de abordare, lucrnd n ipoteza n care n este o putere a lui 2:
a) Partiionai setul ntregilor n n/2 perechi. Utilizai n/2 procese pentru a aduna perechile de ntregi,
repetai metoda asupra celor n/2 ntregi rezultai la primul pas i continuai pn la obinerea rezultatului
final (algoritm de tip arbore binar).
b) Divizai setul de ntregi n n/logn grupuri de cate logn numere fiecare. Folosii n/logn procese, fiecare
adunnd numerele ntr-un grup n mod secvenial Adunai apoi cele n/logn rezultate bazat pe metoda
anterioar (a).
11. Proiectai i implementai o aplicaie care s calculeze valoarea minim a unei mulimi de ntregi stocai
ntr-un fiier i comparai performanele pentru dou abordri:
- fiierul este distribuit pe fiecare main fizic a mainii virtuale PVM
- fiierul este meninut doar pe maina ce lanseaz procesul printe.
12. nmulirea a dou matrici ptratice B, A (nxn), fiecare proces n sistem va calcula un subbloc a matricei
rezultat C. Dimensiunea matricei i a blocului sunt preluate la linia de comand, fiecare proces calculeaz un
subbloc al matricei rezultat. Matricile de intrare sunt stocate ca blocuri distribuite celor nxn procese. Iniial
fiecare proces ti, j( 0<=i, j<n) conine blocurile Ai, j, Bi, j Ci, j Algoritmul este urmtorul:
Procesele corespunztoare elementelor diagonale (I=j) i transmit blocul Ai, j celorlalte procese n
linia i.
Toate procesele calculeaz Ai, j xBi, j i adaug rezultatul la Ci, j
Blocurile coloan ale matricei B sunt rotite astfel nct ti, j i transmite blocul aferent din B
procesului T i-1, j
procesele revin la primul pas, astfel A i, j+1 este propagat tuturor celorlalte procese n linia i i
algoritmul reia pasul 1.
Dup n iteraii, matricea C conine produsul AxB iar matricea B a fost rotit n poziia sa iniial.
Fiecare proces se asociaz grupului Mat_mult, primului proces din grup i se ofer identificatorul
zero, el va crea i lansa celelalte procese i va transmite parametri necesari acestora. (n, blksize),
dup generarea proceselor este necesar implementarea barierei. Pentru diferite iteraii, se vor utiliza
diverse taguri de mesaj. La terminarea procesrii se verific corectitudinea prin relaia A=C.
nmulirea a dou matrici folosind algoritmul lui Cannon se bazeaz pe o topologie de procesoare tip torus,
necesar iftrii elementelor (respectiv submatricilor) matricii A la stnga, respectiv elementelor matricii B n sus.
Etapele algoritmului sunt:
1. Procesorul P ij conine iniial elementele a i, j, b i, j (0<i<n, 0<k<n)
2. Elementele sunt transferate din poziia lor iniial ntr-o poziie aliniat. ntreaga linie i a matricei A este
iftat i poziii la stnga iar coloana j a lui B j poziii n sus, determinnd ca elementele a i, j+1 i b i+1, j s
ajung la procesorul Pi, j, ca elemente necesare n acumularea lui c i, j
3. Fiecare procesor P i, j i multiplic elementele
4. Linia i a lui A ste iftat o poziie dreapta i coloana j a lui B o poziie n sus, cu scopul de a apropia
elementele adiacente din A i B necesare acumulrii. Fiecare procesor P i, j multiplic elementele ce au ajuns
la el i adaug rezultatele sumei pariale.
5. Paii 4, 5 se repet pan la rezultatul final (n-1 iftri ale celor n linii i n coloane de elemente).

S-ar putea să vă placă și