Sunteți pe pagina 1din 406

1.

Arhitecturi paralele
1.1 Notiuni caracteristice si motivatie
Un calculator secvential bazat pe modelul arhitectural Von Neumann efec-
tueaza o singura sarcina la un moment dat. O operatie fundamentala are
urmatorii pasi^n timp: ^ncarcare instructiune, decodare instructiune, ^ncarcare
operanzi (daca exista), executie operatie, stocare rezultate (Figura 1.1). Odata

Figura 1.1: Pasii ^n timp ai executiei unei instructiunii: FI, aducerea
instructiunii, DI, decodarea instructiunii, FO, aducerea operandului, EX, exe-
cutarea instructiunii, SR, stocarea rezultatului
cu evolutia calculatoarelor, din ce^n ce mai multe operatii au fost suprapuse (de
exemplu prin ^ncarcarea noii operatii ^n timp ce vechea operatie se efectueaza,
^ntr-o modalitate similara unei bande rulante), unele calculatoare au adaugat o
extra unitate logica aritmetica (ALU), altele au mai multe unitati centrale de
procesare (CPU), altele au co-procesoare specializate (matematice sau gra ce).
Acestea sunt exemple de procesare paralela. Exista paralelism ^ntr-o forma
sau alta ^n majoritatea calculatoarelor actuale. Termenul este ^nsa rezervat
supercalculatoarelor, care au majoritatea acestor forme de paralelism, ^n mod
special CPU multiple.
1.1.1 Ce sunt calculul si calculatorul paralel?
Calculul paralel este o forma de calcul concurent realizabila pe un calculator
paralel. Un calculator paralel este o colectie de resurse de procesare interconec-
tate pentru a permite coordonarea activtatilor si schimbul de date.
Procesare concurenta. Concurenta se refera la aparitia simultana a eveni-
mentelor pe un sistem de calcul. Un eveniment este o operatie aritmetica, o
operatie logica, o accesare a memoriei, o operatie de intrare sau iesire (I/O).
Avantajele procesarii concurente asupra procesarii secventiale sunt proce-
sarea mai rapida, utilizarea mai buna a resurselor, si toleranta la erori.
Procesarea concurenta poate realizata prin suprapunerea I/O cu proce-
sarea, multi-programare, multi-tasking, multi-procesare sau multi-thread.
Multi-programarea se refera la utilizarea ^n acelasi timp a unui procesor ^ntre
mai multe programe (prin alocare de intervale de timp). Multi-tasking (multi-
^nsarcinare) este o generalizare a conceptului de multi-programare: ecare pro-
gram este descompus ^ntr-o multime de taskuri (sarcini) concurente. Multi-
procesarea presupune ca multimea de sarcini concurente sa e procesate de o
1 Rezumat: Un calculator paralel are mai multe procesoare. Calculele efectuate pe calcu-
latoarele paralele sunt cazuri particulare de calcule concurente (ce se suprapun ^n timp).

1
Figura 1.2: Procesarea paralel a: (a) Se divide codul unei singure aplicatii ^ntre
procesoare multiple; (b) Termeni de baza: procesor, proces, identi cator de
proces
multime de procesoare interconectate; ecarui procesor i se poate aloca mai
mult dec^at o sarcina si timpul de procesare poate ^mpartit ^ntre sarcinile
alocate. Calculatoarele actuale utilizeaza programe multi-thread (multi- re),
care sunt foarte asemanatoare programelor paralele.
Procesare paralela. Exista un numar mare de de nitii si sisteme de clasi -
care. O de nitie intuitiva este urmatoarea. Procesarea paralela este o metoda
de organizare a operatiilor (^ntr-un sistem de calcul) ^n care sunt efectuate
concurent doua sau mai multe operatii. De nitia cea mai des ^nt^alnita este
^nsa urmatoarea. Procesarea paralela este utilizarea simultana a doua sau mai
multor procesoare pentru executarea unui program.
Procesarea paralela, numita si calcul paralel, este un caz particular de multi-
procesare. Difera de multi-tasking ce presupune ca o singura unitate centrala
de procesare executa mai multe programe la un moment dat.
Programare paralela. In mod ideal, prin procesare paralela un program
ruleaza cu at^at mai repede cu c^at exista mai multe elemente de procesare care-l
ruleaza. Practic^nsa este di cila divizarea unui program astfel^nc^at elementele
de procesare separate sa execute portiuni diferite fara a interfera^ntre ele. Cal-
culul paralel presupune astfel divizarea unei aplicatii (job, lucrare) intensiv
calculatorie ^n mai multe sarcini (implic^and astfel si partitionarea datelor, pre-
cum si un surplus datorat comunicarii) astfel ^nc^at problema poate rezolvata
mai rapid (Figura 1.2.a). Programarea paralela este astfel arta de a programa
o colectie de resurse de calcul pentru a executa e cient o anumita aplicatie.
E cienta se refera de obicei la terminarea corecta a aplicatiei ^ntr-un timp c^at
mai scurt. Termenii des utilizati (Figura 1.2.b) sunt procesor (componenta de
calculator), proces (componenta software) si identi cator de proces (identi ca-
tor unic asignat la ecare proces).
Calculator paralel. Este o colectie de elemente de procesare care coope-
reaza ^n rezolvarea rapida a unor probleme de calcul intensiv. Trasaturile
hardware esentiale ale unui calculator paralel sunt unitatile de procesare si
reteaua de inter-conectare care le leaga. Utilizarea efectiva a acestui hardware
necesita o infrastructura software care ofera un nivel adecvat de abstractizare
si functionalitate, si care permite aplicatiilor care ruleaza pe procesoare sa
utilizeze reteaua de intercomunicare.
2
Figura 1.3: Calcul concurent, paralel si distribuit

Figura 1.4: Cercetarea traditionala ^n calculul paralel { este necesar un efort
de comun acord
Procesare distribuita contra procesare paralela. Utiliz^and calculatoare
cu un singur CPU, este posibila procesarea paralela prin conectarea calcula-
toarelor ^n retea. Acest tip de procesare paralela necesita software so sticat
numit software de procesare distribuita. Procesoarele individuale ale unui sis-
tem distribuit sunt zic distribuite (slab cuplate), pe c^and ^n sistemele paralele
sunt^n "aceeasi cutie" (puternic cuplate si lucreaza ^ntr-o maniera bine coordo-
nata). Calculul paralel si cel distribuit sunt exemple de multi-procesare (Figura
1.3), dar calculul distribuit introduce anumite teme ^n plus. Scopul procesarii
paralele este executarea unor calcule mai rapid dec^at ar posibil cu un singur
procesor prin utilizarea concurenta a mai multe procesoare. Un sistem dis-
tribuit se bazeaza pe o multime de procesoare distribuite pe o arie geogra ca,
construit ^n scopul utilizarii resurselor disponibile, colectarea si transmiterea
informatiilor prin reteaua de conectare a procesoarelor.
Teme ale calculului paralel. Problemele principale ^n calculul paralel
sunt urmatoarele (Figura 1.4): designul calculatoarelor si algoritmilor paraleli,
metodele pentru evaluarea algoritmilor paraleli, limbajele si uneltele de progra-
mare paralela, portabilitatea programelor paralele si programarea automata a
calculatoarelor paralele. Cerintele ecarei directii enumerate sunt enumerate
^n Tabelul 1.1.
Scopurile arhitecturii paralele sunt performanta ^nalta (mai rapid dec^at cea
a cel mai rapid uni-procesor), cost si performante competitive cu statiile de
lucru, performanta scalabila cu numarul de procesoare si disponibilitate pen-
tru un domeniu vast de aplicatii. Rolul arhitectului calculatorului paralel este
designul si proiectarea numeroaselor nivele ale unui sistem de calcul pentru a
3
Tabelul 1.1: Cerinte ale calculului paralel efectiv
Componenta cerinta
Algoritm sa e e cient si paralel
Limbaj sa exprime algoritmul fara a ascunde paralelismul
Compilator sa trateze particularitatile limbajului si ale arhitecturii
Architectura comunicatii e ciente, exploatarea paralelismului disponibil
Sistem sa distribuie sarcinile de lucru ^n timp si n spatiu
Aplicatii construite pe baza celor de mai sus
maximiza performanta si programabilitatea ^n limitele tehnologiei si ale anu-
mitui cost.
Rolul programatorului. Deoarece un calculator paralel este o colectie de
elemente de procesare si de memorie, plus reteaua de comunicare utilizata
pentru a ruta cererile si informatiile ^ntre aceste elemente, sarcina programa-
torului este de a coordona operatiile acestor elemente diverse astfel ^nc^at sa se
ajunga la o executie e cienta si corecta a problemei de interes. Preocuparile
unui programator al unui calculator paralel sunt acelea ale oricarui alt pro-
gramator: designul algoritmului, modalitatea exprimarii, e cienta executiei,
usurinta depanarii, reutilizarea componentelor, si ciclul de viata. In particular,
un programator al unui calculator paralel necesita: limbaje si/sau interfete de
programare ale aplicatiilor (API) care permit exprimarea succinta a algorit-
milor complexi, ascunz^and detalii neimportante, dar oferind un control asupra
temelor critice ale performantei; unelte asociate (de exemplu, pro latori de
performanta) care permit diagnosticarea si corectarea erorilor si problemelor
de performanta; formulari convenabile ale algoritmilor e cienti pentru proble-
mele cheie, ideal ^mpachetate astfel ^nc^at sa poata usor integrate ^ntr-un
program aplicativ.
Caracteristicile particulare ale calculatoarelor si calculului paralel introduc
preocupari aditionale care tind sa complice at^at programarea paralela c^at si
dezvoltarea de unelte de programare paralela. In particular, trebuie raspuns la
urmatoarele trei mari provocari:
Concurenta si comunicare. Programele paralele pot implica crearea, coor-
donarea si managementul potential a mii de re de control independente
(interactiunile acestora pot conduce la ne-determinism).
Necesitatea unei performante ^nalte. In programarea secventiala, usurinta ex-
primarii poate la fel de importanta ca performanta programului.
Motivatia utilizarii calculului paralel este aproape ^ntotdeauna o dorinta
de performanta ^nalta; aceasta cerinta plaseaza constr^angeri stringente
asupra modelelor de programare si asupra uneltelor programarii paralele.
Diversitatea arhitecturii. Diversitatea considerabila ^n arhitectura calcula-
toarelor paralele face dezvoltarea uneltelor standard si a programelor
portabile mai di cila dec^at ^n cazul calcului secvential, caz ^n care ex-
ista o uniformitate remarcabila ^n arhitectura de baza.
In fata sarcinii de a scrie un program paralel e cient si corect, programatorul
poate apela la o varietate de limbaje de programare, compilatoare, biblioteci,
ecare dintre ele implement^and un model de programare distinct cu diferite
4
Tabelul1.2: Intrebarile fundamentale la elaborarea unui algoritm paralel
Categorie Intrebare
Alocarea c^at de mare colectia, c^at de puternice compo-
resurselor nentele, c^ata memorie
Acces date, comunicare, cum coopereaza si comunica elementele, cum
sincronizare sunt datele transmise ^ntre procesoare, care
sunt primitivele pentru cooperare
Performanta si cum se translateaza toate cele de mai sus ^n
scalabilitate performanta, scalare

Figura 1.5: Calcule paralele stinghere


abordari ale usurintei ^n utilizare, generalitate si performanta care poate
atinsa. Un limbaj concurent este un limbaj de programare de nivel ^nalt care
ofera urmatoarele facilitati: descrierea proceselor concurente, mijloace de co-
municare ^ntre procese si posibilitati de sincronizare a proceselor. Abordarea
standard este cea care utilizeaza un meta-limbaj compus dintr-un limbaj de
calcul (C, Fortran, etc) si un limbaj de coordonare (ce permite crearea si co-
municarea proceselor).
In designul algoritmilor paraleli, se ^nt^alnesc urmatoarele teme speciale:
executie paralela, dependenta, coordonare si sincronizare, alocarea datelor,
localitate, partitionarea operatiilor, comunicarea datelor, granularitatea cal-
culelor, echilibrarea ^ncarcarii, modelarea performantei (toate acestea fac ca
programarea paralela sa e mai di cila dec^at programarea secventiala).
Performanta unui program paralel presupune maximizarea concurentei
(numarul de operatii care pot efectuate simultan) ^n acelasi timp cu mini-
mizarea cantitatii de comunicatii necesare pentru a accesa date ne-locale, trans-
ferul rezultatelor intermediare si sincronizarea operatiilor unor re de control
diferite. Costurile comunicatiilor sunt frecvent sensibile la distributia datelor,
maparea structurilor de date ale aplicatiei la modulele de memorie: o distributie
buna a datelor poate reduce numarul de accesuri la memorie care necesita
operatii de comunicare costisitoare. Daca sarcinile de lucrul nu sunt distribuite
egal ^ntre procesoare, se ajunge la o ^ncarcare ne-echilibrata, reduc^andu-se
concurenta si performanta. In constructia si executia unui algoritm paralel
apar o serie de ^ntrebari precum cele din Tabelul 1.2.
Calcule paralele evidente (triviale, stinghere). Cele mai simple exemple
de probleme care pot rezolvate ^n paralel sunt cele care au un graf de calcul
de-conectat, precum cel din Figura 1.5. Un asemenea exemplu este calculul
fractalilor, precum a multimii Mandelbrot, caz ^n care calculele asociate cu
zone compacte de puncte din planul complex pot alocate unor procesoare
distincte care nu trebuie sa comunice pentru a-si realiza sarcinile.
5
1.1.2 Domeniul procesarii concurente
Termenul concurent poate utilizat ca o umbrela pentru a acoperi ambele as-
pecte ale multi-procesarii, calcul paralel si calcul distribuit. Dintre ^ntelesurile
variate ale cuv^antului concurent speci cate ^n dictionare retinem "aparitia si
existenta ^mpreuna sau alaturi" sau "actiune ^n conjunctie, cooperare", ceea
ce acopera trasaturile esentiale ale calculelor mentionate mai sus. O singura
problema este rezolvata cooperativ de mai mult dec^at un singur procesor. Pa-
sul fundamental este trecerea de la un procesor la doua. Dupa acest salt pot
exista teme precum c^ate procesoare exista, cum se schimba informatia, cum
lucreaza sincronizat sau asincron, ^n ce masura sunt de ^ncredere. Presupuneri
diferite conduc la diferite abordari care din, punct de vedere istoric, au fost
clasi cate ^n "vectorial", "paralel" sau "distribuit".
Calculul concurent apare la diferite nivele si ^n forme variate: ^n inte-
riorul cipurilor VLSI, ca paralelism la nivel de instructiune, banda-rulanta
(pipeline, conducta), multi-procesare pe baza de memorie partajata sau dis-
tribuita, SIMD, retele de calculatoare, Internet. O serie de masuri se ^ntrevad
la parcurgerea spatiului de posibilitati: performanta, exibilitate, grad de cu-
plare, esecuri, distributie geogra ca.
In cadrul unui singur cip VLSI, operatiile (de exemplu o operatie de
adunare) sunt ^n mod uzual efectuate ^n paralel de mai multe dispozitive.
In cadrul masinilor uni-procesor moderne exista un paralelism semni cativ
la nivel de instructiune. Paralelismul poate lua forma unei arhitecturi VLIW
sau superscalare, si ^n mod uzual este atins prin combinarea tehnologiilor com-
pilatoarelor, arhitectura partitionata, si hardware inteligent. Caracteristica
principala a acestei forme de concurenta este executia simultana a mai multor
instructiuni la un moment dat. Din pacate, paralelismul la nivel de instructiune
poate creste performanta cu un factor numai ^ntre 26.
Linia de procesare (banda-rulanta, pipeline) este o forma de concurenta
care apare at^at ^n sistemele uni-procesor c^at si ^n forme mai specializate de
procesoare vectoriale. Concurenta ^n asemenea sisteme este o combinatie de
facilitati arhitecturale inovative si tehnologii de compilare bazate pe vectori
care restructureaza codurile sursa pentru a atinge bene ciile performantei pe
asemenea sisteme. Aceasta este o forma relativ "ne-dureroasa" de concurenta,
iar multi-procesoarele vectoriale precum Cray T90 (si predecesorii sai Cray
X-MP, Y-MP) sunt caii de bataie ale aplicatiilor stiinti ce si comerciale.
Multiprocesoarele cu memorie partajata sunt caracterizate de procesoare
multiple care schimba informatie prin citirea si scrierea dintr-o si ^ntr-o me-
morie globala partajata de procesoare. Primele siteme de acest gen, precum
Encore Multimax si Sequent Symmetry, au utilizat o magistrala comuna pen-
tru a conecta procesoare multiple si aveau un sistem al memoriei care con-
stituia o entitate zica. Sistemele curente, precum SGI Origin 2000 sau
HP/Convex Exemplar, utilizeaza retele de interconectare punct-la-punct pen-
tru a conecta procesoarele si au un sistem al memoriei care este distribuit
zic. O tema majora ^n designul unui asemenea sistem este pastrarea coerentei
2 Rezumat: Procesarea concurent a se ^nt^alneste la cipurile procesor curente, la sistemele cu
mai multe procesoare si ^n retele de calculatoare. Motivele utilizarii concurentei sunt sporirea
vitezei aplicatiilor, restrictiile hardware si simpli carea rationamentului ^n programare.

6
informatiilor. Programarea se face utiliz^and anumite tipuri de pachete pen-
tru re de control. O problema ^n analiza performantelor unui algoritm pe
asemenea masini este costul ne-uniform al accesului la memorie.
Multiprocesoarele cu memorie distribuita (precum Cray T3E sau IBM SP-2)
aplica o alta forma populara a concurentei ^n care procesoarele sunt conectate
prin retele de interconectare punct-la-punct si modulele de memorie sunt asoci-
ate la elemente de procesare individuale. Daca un procesor doreste sa acceseze
date dintr-un modul de memorie a at la distanta, trebuie sa faca aceasta ne-
transparent prin operatii de comunicare ce necesita cooperarea procesorului
la care modulul de memorie este atasat. Esecurile procesor sau pierderea de
mesaje nu sunt teme tipice ^n asemenea sisteme.
Masinile SIMD (Maspar MP-1 si MP-2 sau Thinking Machines CM-2)
aplica o forma specializata de concurenta ^ntr-un sistem care este des uti-
lizata de aplicatii specializate precum procesarea semnalelor, a imaginilor sau
gra ca. Asemenea masini sunt caracterizate printr-un numar mare de elemente
de procesare ce lucreaza sincron la nivel de pas sub comanda unui procesor
gazda care difuzeaza instrcutiunile la matricea de procesoare. Acestea sunt
potrivite pentru exploatarea unei cantitati vaste de concurenta. Programarea
se face explot^and paralelismul^n date (acest stil de programare poate aplicat
pentru orice forma de sistem concurente).
Retelele de calculatoare sunt forme bine evidentiate de sisteme concurente.
Sunt constituite din colectii de uni-procesoare slab conectate si, ^n general,
sunt considerate ca fac^and parte din partea distribuita a domeniului calculului
concurent. Pot lucra e cient la calcule cu granularitate mare si performanta
lor este adesea dominata de caracteristicile retelei care le conecteaza. Sunt ^n
mod uzual programate utiliz^and sisteme precum PVM sau Java.
Internetul este o resursa de calcul concurent cu o distributie geogra ca
imensa, si calcule semni cative au fost recent efectuate cu ajutorul sau (de ex-
emplu, factorizari ^n numere prime a numerelor foarte mari). Aceasta resursa
este utila ^n cazul calculelor cu granulatie mica. Programele Internet sunt
scrise ^n mod uzual ^ntr-o maniera ad-hoc (de exemplu programul de factor-
izare a utilizat posta electronica ca mecanism de comunicare). Internetul este
de asemenea utilizat pentru a oferi resurse distribuite care sunt accesate prin
mecanisme precum un navigator HTML.
Caracteristica fundamentala a calculului concurent care-l deosebeste de cal-
culul secvential este prezenta unor re de control multiple (threaduri, prin
contoare de program multiple) ce pot exista ^n spatii de adresare disjuncte
(precum procesele Unix) sau ^ntr-un spatiu de adresare partajat si pot ex-
ecutate pe procesoare zic multiple (multi-procesare) sau pot plani cate pe
un singur procesor (multi-programare). Majoritatea temelor legate de sistem
^n calculul concurent se refera la crearea de re de control, coordonarea aces-
tora, si comunicarea dintre ele. Coordonarea si comunicarea reprezinta pretul
pentru utilizarea calculului concurent pentru rezolvarea unei probleme, expri-
mate printr-un surplusul peste minimul de calcul necesar (de obicei se urmareste
minimizarea surplusului). Una dintre modalitatile de minimizare a comunicarii
^ntre procesoare este sporirea localitatii datelor. Este important ca un calcul si
datele pe care le calculeaza sa e localizate pe acelasi nod (element de proce-
sare) al sistemului concurent. Acest deziderat poate realizat statistic sau
7
dinamic, de catre utilizator sau de compilator, prin mutarea datei la calcul,
sau viceversa.
Exista mai multe motive pentru utilizarea calculului concurent.
Viteza. Suntem interesati ^n rezolvarea rapida a unei singure probleme, si
procesarea secventiala este inadecvata pentru aceasta sarcina. Acesta
este motivul uzual de ce procesarea paralela este utilizata ^n context
stiinti c si ingineresc (de exemplu la prezicerea numerica a vremii sau
dinamica computationala a uidelor).
Terminare. Suntem interesati ^n reducerea timpului de raspuns a unui set de
programe, ^n conditiile ^n care timpul alocat unui program individual
nu descreste (de exemplu, orice forma de operatie pipeline sau procesare
vectoriala).
Distributie geogra ca. Aplicatia poate implica mai multe piese ale unui echipa-
ment specializat sau oameni localizati ^n pozitii geogra c distincte (de
exemplu, sistemele de rezervare a tichetelor pentru companiile aeriene ce
trebuie sa e capabile sa trateze tranzactii multiple efectuate din locatii
a ate la distanta, cu mentinerea consistentei informatiei).
Servicii. Operatiile concurente sunt adesea utilizate pentru a permite toleranta
la esecuri sau pentru a garanta performanta ^n timp real. Aceste carac-
teristici permit sistemului sa continue sa functioneze ^n ciuda esecurilor
de procesare sau comunicare si sa ofere rate predictibile de procesare (de
exemplu, programele computerelor de la bordul unui avion sau al unui
automobil).
Unealta pentru g^andire. Adesea concurenta este utilizata pentru a simpli ca
rationamentul asupra unui sistem software. Aceasta este ratiunea pentru
care interfetele gra ce folosesc multi-threading. Se permite astfel modu-
larizarea ecarei functii din multiplele functii ale interfetei si nu este nece-
sara rationarea explicita asupra tuturor posibilitatilor de ^ntrepatrundere
a actiunilor acestor functii.
1.1.3 De ce paralel?
Tendinta tehnologica este convergenta diversele abordari arhitecturale spre o
arhitectura pe deplin acceptata si e cienta (astazi, calculatoarele portabile si
supercalculatoarele sunt fundamental similare). Totusi exista argumente care
ne conduc la ideea revizuirii arhitecturii secventiale.
Limitarea masinii secventiale. Masina traditionala secventiala pe modelul
Von Neumann accepta o singura secventa de instructiuni, are o unitate centrala
de procesare si o memorie. Procesorul unui asemenea sistem este limitat zic,
iar cresterea vitezei procesorului este tehnologic di cila.
Un singur procesor poate atinge astazi sute de milioane de operatii^n virgula
otanta per secunda (M ops). Totusi multe probleme stiinti ce si ingineresti
necesita bilioane, trilioane de operatii ^n virgula otanta per secunda (giga-
ops/tera- ops).
Se considera spre exemplu problema construirii unei masini secventiale care
permite atingerea unui T op (10 operatii pe secunda; nivelul masinilor ac-
12

3 Rezumat: Calculatoarele cu un procesor sunt limitate zic. Calculatoarele cu mai multe


procesoare permit efectuarea de calcule mai rapid.

8
tuale cele mai performante este de ordinul 10 ) si o capacitate de stocare de
9

1Tb (10 octeti, actual sub 10 ). Datele trebuie sa calatoreasca o anumita
12 9

distanta r, pentru a ajunge de la memorie la CPU. Se presupune ca este adusa


o data la ecare ciclu, adica de 10 ori per secunda, la viteza maxima, cea a
12

luminii, c = 3  10 m/s. Astfel r < c=10 = 0:3 mm. Deci memoria de 1TB
8 12

se va a a pe o arie de 0.3 mm . Fiecare cuv^ant ocupa astfel ^n jur de 2 a ,


2 2

marimea celui mai mic atom, ceea ce tehnologic este imposibil de realizat.
Modalitati de evitare a limitarii masinilor secventiale. Exista 3 mo-
dalitati de baza pentru ^mbunatatirea productivitatii calculatorului secven-
tial (solutii cost-efective ^n afara stiinti co-fantasticului precum utilizarea
retelelor biologice neuronale): cresterea vitezei de operare a componentelor,
paralelizarea procesului de calcul, specializarea calculatoarelor pentru o anu-
mita clasa de probleme. Procesarea poate accelarata prin: instructiuni ^n
stil banda rulanta (pipeline: daca o instructiune este divizata ^n parti, atunci
urmatoarea instructiune poate lansata pe un asemenea sistem ^nainte de
terminarea instructiunii anterioare), utilizarea unor procesoare suplimentare
pentru activitati specializate (co-procesoarele sunt procesoare speciale utilizate
pentru sarcini particulare; cele mai comune sunt: co-procesoarele matematice
si cele gra ce; asemenea coprocesoare pot sa se a e pe acelasi cip cu unitatea
centrala de procesare), legarea mai multor procesoare si partajarea calculelor.
Ce ofera calculatorul paralel? Dorinta de a rezolva probleme mai mari,
aplicatii mai realiste este permanenta. Cele trei axiome ale puterii de calcul ce
guverneaza dezvoltarea calculatoarelor sunt urmatoarele:
1. Nu conteaza c^at de rapid este calculatorul cel mai performant la un mo-
ment de timp, cineva va dori sa utilizeze unul mai rapid.
2. Exista ^ntotdeauna probleme importante care cer mai mult dec^at puterea
de calcul disponibila la un moment dat.
3. Cu c^at puterea de calcul creste mai mult, cu at^at mai multe probleme
nerezolvate apar la orizont.
Solutia problemelor vechi ridica noi probleme (aceasta este natura stiintei,
provocarea sa si misterul sau).
Calculatoarele paralele au aparut din necesitatea de a rezolva probleme mai
mari, aplicatii mai realiste, deoarece limitele fundamentale ale calculatorului
secvential sunt aproape de a atinse si deoarece ofera solutii efective din punct
de vedere al costului. Modelele problemelor pot mai mari, cu mai multe
detalii, sa aiba o natura multi-disciplinara, sau sa e interactive.
Calculatoarele paralele ofera viteza si capcitate de stocare la o scara supe-
rioara calculatorului secvential. Se doreste rularea mai rapida a programelor
prin ^mprastierea sarcinilor de lucru pe mai multe procesoare. De exemplu,
sortarea a 10 milioane de ^ntregi pe 64-biti necesita 50 secunde pe o statie
DEC Alpha seriala, si numai 0.2 secunde pe un CM-5 cu 1024 procesoare. Se
doreste de asemenea mai multa memorie pentru a rezolva probleme mai com-
plexe si mai mari. Statiile de lucru actuale au ^n jurul a 64 Mb de RAM,
extensibile 512 Mb. Limita superioara de stocare a unei matrice este de 8192
 8192 numere ^n virgula mobila ^ntr-o memorie de 512 Mb. Calculator paralel
Intel Paragon are 1024 noduri cu 64 Mb ecare,^n total 64 Gb; ^ntr-o asemenea
memorie se poate stoca o matrice de 92000  92000 numere ^n virgula mobila.
9
Figura 1.6: Provocarile programarii paralele
Disponibilitatea este un alt motiv al utilizarii calculului paralel: hardware-
ul paralel a devenit ^n zilele noastre accesibil. Un alt motiv este utilizarea mai
buna a resurselor existente. Paralelismul ofera o alternativa pentru atingerea
unei performante ridicate, baz^andu-se pe o arhitectura ce se ^ndeparteaza de
arhitectura Von Neumann si devine centrala ^n procesarea informatiei.
1.1.4 Aplicatii ale calculului paralel si distribuit
Stiinta computationala. Calculatorul este astazi totodata microscop si
telescop al stiintei. Stiinta computationala (computational science) se refera
la utilizarea calculatoarelor pentru analiza problemelor stiinti ce si ingineresti.
Nu se identi ca cu stiinta calculatoarelor (computer science), implic^and
multi-disciplinaritate: stiinta calculatoarelor, matematica si o serie de disci-
pline aplicative. Stiinta computationala este totodata si o metoda relativ noua
de investigare a lumii. Aplicatiile comun acceptate ale stiintei computationale
sunt urmatoarele: dinamica computationala a uidelor, stiinta atmosferei,
seismologie, analiza structurilor, chimie, magneto-hidro-dinamica, modelarea
rezervoarelor, modelarea oceanelor, studiile de mediu, ingineria nucleara, etc.
Aplicatiile imediate sunt: cercetarea materialelor, procesarea imaginilor med-
icale, biologie, stiinta animalelor, economie, stiinte sociale, etc. Mediul de
calcul stiinti c consta ^n statii de lucru performante, super-calculatoare, retele,
o varietate mare de software si literatura tehnica.
Calcul de ^nalta performanta. High Performance Computing, HPC ofe-
ra o noua cale de progres a stiintei: triada experiment, teorie, si calcul. Calcu-
lul este utilizat pentru a aproxima sisteme zice. Avantajele includ: variatia
parametrilor simularii pentru studierea directiilor imediate, posibila reluare a
unui eveniment particular al simularii, studiul sistemelor pentru care nu exista
teorii exacte.
De ce se prefera simularea? Raspunsul depinde de problema. Problema
poate prea complexa, prea mare sau prea mica, prea costisitoare sau prea
periculoasa (Figura 1.6). Pe de alta parte simularea ^n sine este o provocare
pentru stiinta. Prea mari sunt problemele ce necesita date intensiv (precum
exploatarea datelor, simularea tezaurelor petroliere), sau problemele cu scara
mare de spatiu sau timp (cosmologie, de exemplu, sau problema modelarii
climatului terestru). Prea mici sunt problemele cu scara mica de spatiu sau
4 Rezumat: Utilizarea calculatoarelor paralele este justi cat
a la rezolvarea unor probleme
stiinti ce ce necesita calcule intensive.

10
Figura 1.7: Marile provocari
timp (de exemplu, problema designului de medicamente, designul cipurilor de
silicon sau biologie structurala). Prea complexe sunt de exemplu problemele
zicii particulelor elementare, problemele cu puternic caracter neliniar (precum
scurgerea uidelor), sau probleme cu teorie putin dezvoltata (precum modelarea
personalitatii). Prea costisitoare sunt problemele exploatarii zacamintelor (sau
alte probleme legate de productie), analizele efectelor ciocnirii ^n productia de
automobile, probleme care necesita o modelare costisitoare. Prea periculoase
sunt problemele de toleranta la esecuri precum cele de la avioane, testarea
dispozitiveor nucleare, simulari de aparare strategica.
Arii ale stiintelor aplicative pretabile la calculul paralel sunt de exem-
plu urmatoarele: gra ca (redare scene), simulare (prevestirea vremii, di-
namica moleculara), inteligenta arti ciala (retele neuronale, cautare), biologie
(cautarea genelor), design hardware (veri carea cipurilor), geo zica, astro zica,
optimizare neliniara, dinamica uidelor si a aerului, chimie computationala,
modelarea materialelor, modelarea neuronala, baze de date, medicina (tomo-
gra i asistate de calculator) etc.
Marile provocari. Provocatoare ^n calculul paralel sunt abilitatea de a re-
zolva probleme foarte mari, programarea, posibilitatea de exploatare intensiva
a tehnologiei, sau oportunitatile algoritmice vaste.
O mare provocare (grand challenge, GC, notiune introdusa de William
Graham ^n '87) este o problema fundamentala ^n stiinta sau inginerie, cu un
larg potential economic, politic sau impact stiinti c, care poate avansa prin
aplicarea resurselor de calcul de ^nalta performanta. Marile provocari sunt
acele proiecte care sunt prea di cil a investigate utiliz^and supercalculatoarele
curente. Problemele precum cele din Figura 1.7 (coltul dreapta sus) sunt citate
11
drept prototipuri de probleme care necesita puterea unui supercalculator.
Majoritatea marilor provocari implica modelarea unui sistem zic pe un
calculator si utilizarea acestui model pentru a crea o simulare a comportarii sale.
Altele implica reducerea si analiza datelor experimentale la scara larga ( siere
mari de date de analizat). Frecvent, analiza datelor necesita reprezentarea
datelor^n forma picturala, gra ca sau animata (vizualizare stiinti ca). Calculul
paralel poate oferi scale de timp practice ^n cazul ^n care timpul de raspuns al
unui supercalculator este prea lung (de exemplu ^n dinamica computationala a
uidelor, CFD, un experiment poate dura zile, iar o simulare, secunde).
Probleme stiinti ce rezolvate prin calcul paralel sau distribuit. In
problema pronosticului vremii, climei si a schimbarilor globale de mediu, scopul
modelarii este^ntelegerea sistemului cuplat atmosfera-ocean^n su ciente detalii
pentru a permite predictii pe termen lung asupra comportarii sale. Aplicatiile
includ ^ntelegerea dinamicii dioxdului de carbon ^n atmosfera, deprecierea
ozonului, perturbarile climatologice datorate eliberarii de catre om de chimi-
cale sau energie^ntr-una dintre componentele sistemului. Problemele implicate
sunt tipic legate de stiintele atmosferice si modelarea ecologica spatiala.
Predictiile curente ale vremii sunt precise pentru aproximativ 5 zile. Se
asteapta ca ^n urmatorii ani sa se ajunga la predictii de la 8 la 10 zile. Pe de
alta parte cercetatorii cauta modelarea c^at mai buna a fenomenelor neliniare
locale precum uraganele si tornadele. Prezicerea numerica a vremii presupune
descompunerea spatiului ^n celule de volum egal, S (latitudine, longitudine, al-
titudine); variabilele necunoscute sunt viteza v^antului (3-dimensional), temper-
atura (1-dimensional), umiditate (1-dimensional), si presiune (1-dimensional).
Ecuatiile ce leaga aceste variabile si evolutia lor^n timp sunt legate de scurgerea
uidelor (ecuatii Navier-Stokes), termo-dinamica, tranzitii H O, etc. Calculele
implicate se refera la rezolvarea unor ecuatii cu derivate partiale, ceea ce se
2

face ^n mod tipic utiliz^and o anumita schema bazata pe elemente nite. Sa
consideram problema prezicerii vremii globale a Pam^antului (Figura 1.8.a), a
carui suprafata este de aproximativ 500 milioane km , si se considera o altitu-
2

dine de maxim 10 km. Sa presupunem ca un volum elementar are 1 km  1


km  1 km, adica vom avea ^n jur de 5  10 volume (puncte ^n Figura 1.8.b).
9

Daca pentru ecare volum starea curenta a ecarei variabile va salvata pe


8 octeti, atunci pentru ecare moment de timp vom avea nevoie de 2:4  10 11

octeti  240 GB. In plus, sunt necesare 500 de instructiuni per volum pentru
calculul valorilor curente ale variabilelor, si avem nevoie de o prezicere pe 2 zile
cu o acuratete de 30 de minute, adica aproximativ 100 de pasi, atunci numarul
total de instructiuni va ^n jur de 25  10 . Deoarece o calculator secvential
13

cu un procesor poate efectua astazi ^n jurul a 10 instructini/secunda, pentru


9

calcul vor necesare aproximativ 25  10 secunde  69 ore, adica mai mult


4

dec^at ^i este necesar naturii. Daca calculatorul are 1000 de procesoare care lu-
creaza cu o e cienta scazuta, e de 10%, calculul va terminat ^n aproximativ
40 de minute. Modelele curente pentru uni-procesoare bazate pe legile zicii
atmosferei, chimiei si dinamicii oceanelor se rezuma la suprafete de 500 km .2 2

Modelarea climei presupune studierea comportarii pe termen lung a


climei globale (relevanta astazi pentru investigarea ^ncalzirii generale).
Aceasta problema este studiata prin simulari pe calculator care ne ajuta
sa ^ntelegem cum schimbarile concentratiei dioxidului de carbon ^n atmos-
12
Figura 1.8: Pronosticul vremii globale: (a) Descompunerea spatiala; (b) Ilus-
trarea grilei tri-dimensionale
fera contribuie la ^ncalzirea generala prin efectul de sera. Un studiu
de acest tip necesita modelarea climei pe o perioada de timp. Un mo-
del de clima cunoscut drept modelul circulatiei generale (propus de Na-
tional Center for Atmospheric Research, SUA) a fost utilizat pentru
studierea ^ncalzirii pe o perioada de 20 de ani care va cauzata de dublarea
concentratiei dioxidului de carbon. Calculele au fost efectuate pe un calculator
Cray-1, cu o viteza maxima de 200 M ops: timpul de rulare a necesitat 110
secunde pe zi simulata, astfel ^nc^at pentru doua simulari pentru 20 ani au fost
necesare peste 400 de ore de calcul pentru a naliza experimentul. Atmosfera
este un uid si astfel ecuatiile cu derivate partiale care guverneaza comportarea
uidelor constituie baza matematica a modelului. Solutiile numerice ale acestor
ecuatii sunt obtinute printr-un algoritm cu diferente nite^n care derivatele rel-
ative la coordonatele spatiale si timp sunt aproximate prin formule cu diferente
^n spatiu si timp. Variabilele sunt calculate^n punctele unei grile (plasa precum
cea din Figura 1.8.b) din spatiu. Solutia problemei implica pornirea de la o
multime de conditii initiale pentru ecare punct al grilei, iar un pas ^n timp
presupune actualizarea variabilelor (opt-noua variabile pentru ecare punct al
grilei, incluz^and temperatura, viteza v^antului, concentratia CO etc). Intr-o
grila ca cea utilizata ^n calculele efectuate, cu aproximativ 2000 de puncte pen-
2

tru suprafata Pam^antului si noua nivele pentru altitudini diferite, Rom^ania
este reprezentata printr-un punct. Pentru a creste acuratetea modelului sunt
necesare mai multe puncte. Dublarea densitatii punctelor ^n ecare dintre cele
trei directii duce la cresterea numarului de puncte ale grilei cu un factor de 8,
iar timpul de calcul creste de exemplu de la 400 de ore la 3200 ore.
In cazul stiintelor computationale ale oceanelor se cauta cuplarea cu mode-
larea atmosferica ^n efortul de a determina evolutia climei precum si a deter-
mina implicatiile speci ce pentru oceanogra a zica. Pentru a simula curentii
oceanici este utilizata o structura regulata precum cea din Figura 1.8.b. Dis-
cretizarea modelului matematic este realizata ^n timp si spatiu. Concurenta ^n
algoritmii de rezolvare apare de-a lungul si ^ntre calculele pe grile.
Descoperirea Universului. Mari provocari pot gasite ^n domeniile cos-
mologiei, astro zica computationala, procesarea de imagini astronomice. In as-
tronomie, volumul datelor generate de radio-telescoape^n mod curent depasesc
capacitatile de procesare ale calculatoarelor actuale. Cresterea capacitatii de
procesare poate creste semni cativ utilitatea datelor. Printre marile provocari
din domeniul astro zicii se numara modelarea structurii interne a stelelor, sim-
ularea supernovelor, modelarea structurii universului. Simularea evolutiei ga-
13
Figura 1.9: Simularea evolutiei galaxiei
laxiei de exemplu poate realizata pe o structura iregulata ca cea din Figura
1.9. Punctul erbinte al simularii interactiunii a n stele ce evolueaza ^n timp
este calcularea fortelor de atractie, calcul de ordinul O(n ) (costisitor deoarece
2

n este de obicei mare).Exista mai multi pasi ^n timp ai simularii si concurenta
este ^nt^alnita ^n calcule asociate cu stele distincte.
In interiorul organismelor. Printre domeniile actuale ale marilor provocari
se remarca biologia, procesarea imaginilor biologice si biologia computationala.
In biologia structurala, se cauta ^ntelegerea mecanismelor catalizarilor enzima-
tice, recunoasterea acizilor nucleici de catre proteine, legaturi anti-corpi/anti-
gene, si alte fenomene centrale ^n biologia celulelor. Simularile computationale
intensive ale dinamicii moleculare si vizualizarea tri-dimensionala a miscarii
moleculelor sunt esentiale^n realizarea acestor scopuri. Compararea secventelor
moleculare normale si patologice este metoda cea mai puternica pentru
^ntelegerea genomului uman si a bazelor moleculare ale bolilor. Comple-
xitatea combinatorica a secventelor lungi din genomul uman fac imposibile
asemenea comparatii pe calculatoarele actuale. Pronosticarea e cacitatii unui
medicament poate realizata astazi prin simulare; pentru aceasta este nece-
sara cunoasterea con guratiei si proprietatilor moleculelor mari. Pronosticul
conformatiei ascunse a proteinelor si a moleculelor ADN prin simulare pe cal-
culator este o unealta utila, si c^ateodata primara, pentru designul medica-
mentelor. Analiza structurile zice ale moleculelor complicate precum pro-
teinele, ajuta la ^ntelegerea reactiilor bio-chimice din organismele vii, si este
importanta la designul ieftin al medicamentelor. Functia proteinei depinde
de forma sa tri-dimensionala speci ca. Probleme ^n calcule apar deoarece
moleculele de proteine sunt mari, scala de timp a simularii este mai mica dec^at
10-15s, si interventia unei serii de substante suplimentare trebuie simulate (apa
de exemplu, proteina ind insolubila). Calculele de forte brute ale structurilor
proteinelor nu sunt su ciente ^n modelare. Totusi natura evolueaza ^ncet de-a
lungul a milioane de ani, astfel ^nc^at proteinele cu structuri similare se com-
porta ^n mod similar. Astfel se pot face comparatii ^ntre sectiuni ale proteinei
modelate cu acelea care sunt deja cunoscute (recunoastere de sabloane), iar
tehnicile de design ale medicamentelor sunt bazate pe determinarea structurii
moleculei cu functia ceruta si analiza secventei biologice (cautare de sabloane
^n baze mari de date).
Dinamica moleculara. Se considera n molecule ce interactioneaza unele
cu altele precum ^ntr-un uid. Fortele dintre ele sunt de asemenea natura
14
^nc^at la distante foarte mici de separare moleculele se resping unele pe celelalte
foarte puternic. La distante intermediare, se atrag. Dupa o anumita distanta
de ordinul mai multor diametre moleculare practic nu mai interactioneaza.
Problema consta ^n a urmari miscarea moleculelor ^n uid. Intr-o asemenea
problema, n poate de ordinul sutelor sau miilor sau chiar mai mult. Legea
Newton indica ecuatiile diferentiale care trebuie rezolvate, iar analiza numerica
ofera o serie de algoritmi pentru rezolvarea acestor ecuatii. Se alege un algoritm
care porneste executia de la momentul t = 0 ^n timp, cu ecare molecula ^ntr-
un anumit punct din spatiu si cu o anumita viteza. Se compun fortele ce
actioneaza asupra ecarei molecule datorita celorlalte molecule a ate p^ana la
o distanta data (vecine). Pe baza acestor informatii se calculeaza noile valori
pentru pozitie si viteza pentru ecare molecula la un moment t+t, repet^andu-
se apoi procesul de calcul ale noilor valori pentru fortele intermoleculare, pozitie
si viteza la momentul t + 2t, si asa mai departe. Se genereaza astfel solutia
pas cu pas p^ana la atingerea timpului nal de interes.
O idee imediata pentru efectuarea de calcule ^n paralel este asignarea
ecarui procesor la una sau mai multe molecule. Procesorul calculeaza noua
pozitie si viteza moleculelor sale la ecare pas si le comunica celorlalte proce-
soare. Distribuirea noilor valori pentru toate cele n molecule ^ntre toate proce-
soarele implica cantitati enorme de comunicatii. Pentru a reduce comunicatiile,
sa presupune ca ecare procesor comunica numai cu acele procesoare care detin
molecule din vecinatatea moleculelor sale. Determinarea procesoarelor care
detin molecule ^n vecinatatea unei molecule date este ea ^nsasi o problema di-
cila (odata cu miscarea moleculelor, populatia de vecini se schimba). Pentru
a implementa acest nou algoritm, ecare procesor va tine evidenta vecinilor
sai sau va trebui sa initieze o cautare la ecare pas. Mentinerea unei liste
cu vecinii implica calcule ne-paralele redundante, iar cautarea implica comu-
nicare suplimentara ^ntre procesoare. Minimizarea acestui surplus este ^n sine
o alta problema di cila. O alta abordare este aceea de a asigna procesoare
la regiuni speci ce din spatiu ^n locul asignarii la o multime de molecule. O
asemenea abordare rezolva evident problemele enumerate anterior. La miscarea
unei molecule, trebuie tinuta evidenta pe regiune, deci, la care procesor va
asignata. Din nou este necesar un calcul suplimentar sau o comunicare supli-
mentara pentru a mentine evidenta. In aceasta abordare apare o problema
noua, cea a echilibrarii ^ncarcarii per procesoare.
Inginerie. Designul si analiza ingineresca include ingineria chimica, di-
namica computationala a uidelor, ingineria structurilor etc. Masinile par-
alele sunt utilizate pentru analiza zacamintelor petroliere, automobile (simu-
larea ciocnirilor, analiza obstacolelor, e cienta combustiei), aeronautica (ana-
liza curentilor de aer, e cienta motoarelor, mecanica structurii, electromag-
netism), design asistat de calculator, farmaceutica (modelare moleculara),
vizualizare, cinematogra e ( lme precum Toy Story), arhitectura (plimbari
virtuale si redarea imaginii), modelare nanciara (analiza productiei), ana-
liza elementului- nit, inteligenta arti ciala (procesarea imaginii, recunoasterea
sabloanelor, recunoasterea vorbirii, sisteme expert, etc.), etc.
In domeniul zacaminte de petrol si gaz, provocarile se refera la localizarea
rezervelor si exploatarea economica a acestora; ambele implica tehnici de
analiza seismica si o^ntelegere profunda asupra scurgerii uidelor printre struc-
15
turile geologice, siguranta reactoarelor nucleare, modelarea fuziunii plasmei
etc. In zica teoretica a energiilor simularea pe calculator a cromo-dinamicii
cuantelor (quantum chromodynamics, QCD) presupune calculul proprietatilor
unor particule elementare ce interactioneaza. Aceasta conduce la pronosticul
unei noi faze a materiei si calculul proprietatilor ^n inima celor mai mari stele.
Simularile pe calculator a "teoriei tuturor" sunt departe de capabilitatile de
calcul curente. In zica plasmei, o mare provocare este ^n domeniul investigarii
dispozitivelor de fuziune a plasmei precum tokamak (pentru surse ale viitorului
de energie ieftina). Rezolvarea problemelor legate de structura cristalelor poate
conduce la ^ntelegerea posibilitatii de atac asupra unor asemenea structuri.
Provocari ^n stiinta materialelor. Calcul de ^nalta performanta ofera o
asistenta de nepretuit ^n ^mbunatatirea ^ntelegerii noastre asupra naturii ato-
mice a materialelor. Printre exemple se numara semiconductoarele si super-
conductorii la temperaturi^nalte. Simulari intensive se fac asupra dispozitivelor
semi-conductoare. Constructia unor materiale usoare dar rezistente este de
asemenea o tema importanta. Deoarece materiale, precum arsenida de galium,
sunt utilizate pentru comutatoare electronice, este esentiala ^ntelegerea mod-
ului ^n care opereaza si a conditiilor ^n care ^si schimba proprietatile. In mod
curent este posibila simularea propietatilor electronice ale unor sisteme sim-
ple si regulate. Simularea comportarii materialelor cu defecte sau constituenti
mixati este departe de capabilitatile actuale de calcul ale calculatoarelor uni-
procesor. Descoperirea super-conductibilitatii la temperaturi ^nalte ('86), a
oferit un potential spectaculos pentru tehnologii de transmitere e cienta a
energiei si instrumente ultra-sensibile. Puterea masiva de calcul este necesara
pentru o ^ntelegere profunda a super-conductibilitatii la temperaturi ^nalte, ^n
special cum se formeaza, stabilizeaza si utilizeaza materiale care le suporta.
Industria automobilelor este un utilizator important al tehnologiilor de
^nalta performanta (Ford este de exemplu al 25lea cel mai mare utilizator
de supercalculatoare din lume). Utilizarile principale ale simularilor sunt ^n
aerodinamica (similar cu cele aerospatiale), simularea ciocnirilor, formarea
foilor de metal, optimizarea zgomot/vibratie, simulari de tra c etc. Cele mai
mari bene cii sunt timpul redus de aparitie pe piata si calitatea cresc^anda.
Siguranta autovehiculelor este o preocupare de baza a clientilor, fabricato-
rilor si a guvernantilor. De aceea noile vehicule sunt subiectul a numeroase
teste de accidente. Simularea completeaza procesul de prototipizare prin re-
ducerea necesitatii de construire a unor prototipuri scumpe, raspuns rapid la
ecare test de accident, oferirea tuturor informatiilor legate de testul de ac-
cident, integrarea ^n procesul de manufacturare. Manufacturarea ^n industria
automobilelor se bazeaza pe formarea foliilor de metal. Procesul de mode-
lare este utilizat pentru a cauta ^mbunatatiri ^n reducerea solicitarii ^n matrite
(din otel scump) pentru o viata c^at mai lunga, reducerea posibilitatii de dez-
voltare a defectelor^n metalul caroseriei (calitate^mbunatatita), productivitate
^mbunatatita si calitate, integrarea ^n procesul de manufacturare.
Cercetarile ^n domeniul recunoasterii vorbirii au ca scop nal comunicarea
verbala cu calculatorul. Recunoasterea automata a vorbirii necesita un model
matematic foarte mare si cautari^n care se fac bilioane de calcule (Figura 1.10)
pentru evaluarea tuturor variantelor probabile.
Provocarile principale ^n domeniul gra cii constau ^n dezvoltarea capa-
16
Figura 1.10: Recunoasterea vorbirii ca o mare provocare
bilitatilor de nivel uman pentru calculatoare si roboti, procesarea semnalelor
imagini, modelarea texturii si a culorii, procesare geometrica si rationare, pre-
cum si modelarea obiectelor. Redarea scenelor de exemplu prin metoda drumu-
lui optic se bazeaza pe o structura iregulata de date; se traseaza raze imaginare
de la observator ^nspre scena prin pixelii unui plan al imaginii, iar de-a lungul
drumului unei asemenea raze, ele ricoseaza la lovirea unor obiecte sau genereaza
alte raze (arbore de raze pentru ecare raza de intrare), rezultatele nale ind
culoarea si opacitatea pixelilor. Paralelismul poate exploatat ^ntre raze.
Dinamica uidelor (CFD). In simularile scurgerii uidelor, ecuatii simple
pot modela comportari complexe (de exemplu, scurgerea apei din chiuveta),
^nsa multe fenomeme simple, precum fumul ce se ridica de la un chibrit, nu
pot simulate astazi^ntr-un mod realistic. Modelarea actuala a uidelor nece-
sita o putere de calcul foarte mare. Turbulenta ^n scurgerea uidelor afecteaza
stabilitatea si controlul, caracteristicile termice, si combustibilul necesar tu-
turor vehiculelor aero-spatiale. CFD are o serie de aplicatii precum analiza
si designul automobilelor, avioanelor, e cienta motoarelor. Optimizarea aero-
dinamica utilizeaza CFD pentru a studia scurgerea curentilor de aer peste
un model, prin simulare si nu pe baza de tunele de v^ant (designul actual al
avioanelor se face astfel^n "tunele de v^ant numerice"). Contributii substantiale
asupra performantei vehiculelor se pot realiza prin simulari pe calculator, de
exemplu prin modelarea comportarii dinamicii uidelor pe modele geometrice
complete ale avioanelor, modelarea scurgerii ^n interiorul turbinelor, sau mo-
delarea scurgerii prin gaurile vehiculului. Un design e cient poate conduce
de asemenea la costuri reduse de combustibili. Pentru a atinge ^mbunatatiri
semni cative ^n e cienta combustiei este necesara ^ntelegerea combinatiei ^ntre
scurgerile unor substante variate si potentialul chimic care cauzeaza reactia
substantelor. In anumite cazuri complicate ^ntelegerea conditiilor anumitor
reactii chimice este imposibila chiar cu ajutorul calculatoarelor actuale.
17
La motoarele de cautare, paralelismul poate utilizat la mai multe nivele:
la gasirea unei cai spre informatie, indexare, scor, cereri utilizator inde-
pendente, sau la procesarea cererii. De exemplu, Alta Vista are un in-
dex pentru aproximativ 30 de milioane de documente. Se bazeaza pe un
DEC SMP AlphaServer 8400 5/300, cu 10 procesoare av^and 4 Gb memorie
si 210 Gb disk, facilitatile si datele ind replicate ^n ^ntregime, iar site-ul este
ales dupa disponibilitate. HotBot are un index de 50 milioane de documente,
22 Sun Ultra si Ultra II conectate ^ntr-o retea de viteza mare, iar indexul
este distribuit la noduri.
Proiectiile economice sunt utile pentru ghidarea luarii unei decizii. Pronos-
ticul comportarii pietei stocurilor, ingineria nanciara si stiintele sociale pot
bene cia de calculul paralel. Calculul comercial se poate baza de asemenea pe
o forma de concurenta: scala calculelor nu este mare, dar utilizarea este mult
mai^mprastiata (distribuit geogra c). Bazele de date, procesarea tranzactiilor-
online, sprijinirea deciziilor, explorarea datelor (despre depozite de exemplu)
sunt teme erbinti. Dimensiunea problemei nu mai este xa, astfel^nc^at debitul
este utilizat ca masura de performanta (tranzactii per minut sau tpm).
Temele principale din domeniul militar, ce necesita putere mare de calcul
sunt urmarirea rachetelor multiple, simulari de batalii ghidate de evenimente,
spargerea de coduri, cercetarea^n domeniul armelor, interpretarea informatiilor
datorate supravegherii, etc. Electromagnetica computationala de exemplu s-
a dezvoltat de-a lungul anilor '80, ghidata ind de aplicatii de aparare: de-
terminarea sectiunilor transversale radar ale avioanelor, reducerea semnaturii
unui plan (furtul de tehnologie); alte aplicatii sunt ^n constructia antenelor si
a echipamentelor medicale. Exista doua abordari fundamentale: metoda mo-
mentelor bazata pe domenii de frecvente si metoda diferentelor nite bazate
pe domeniu timp. Ecuatiile integrale implicate sunt discretizate ^ntr-o multime
mare de ecuatii liniare.
1.1.5 Scurta istorie a supercalculatoarelor
Cuv^antul super-calculator a fost introdus la sf^arsitul anilor '60 c^and o serie de
calculatoare puternice noi au aparut ^n laboratoare universitare sau pe piata.
De atunci cuv^antul simbolizeaza cele mai puternice calculatoare ale timpului.
Evolutia calculatoarelor secventiale este marcata de aparitia sistemelor:
Calculator secvential simplu. Se bazeaza pe o singura secventa de instructiuni
si o singura secventa de date (Figura 1.11.a).
Procesor singular cu memorie intercalata. Viteza de acces la date este marita
prin cresterea numarului de canale de acces la date. Memoria este divizata
^ntr-un numar de blocuri (module) de memorie. Fiecare bloc de memorie
este accesat independent { de unde si termenul de intercalare (Fig.1.11.b).
Procesor singular cu memorie intercalata si cache. Creste viteza de acces la
date prin introducerea unei memorii de accelerare, mici si rapide, memo-
ria cache (Figura 1.11.c).
5 Rezumat: Exist a o varietate mare de retete de construire a unor sisteme de calcul cu
mai multe procesoare. Aceasta varietate a creat o problema: software-ul dedicat functionarii
optime a ecarui sistem ^n parte nu este portabil, iar numarul de utilizatori este redus. In
ultimul deceniu aceasta problema tinde sa dispara datorita similaritatii arhitecturilor noi.

18
Figura 1.11: Calculator secvential: (a) Simplu; (b) Procesor singular cu me-
morie intercalata; (c) Procesor singular cu memorie intercalata si cache; (d)
Procesor pipeline

Figura 1.12: O operatie vectoriala pe o masina vectoriala: adunarea a doi


vectori 63-dimensionali, a si b ^n c
Linie de procesare (pipeline). Creste viteza procesorului prin suprapunerea
executiei instructiunilor. O unitate functionala, precum cea de adunare,
este divizata ^n mai multe stadii si instructiuni diferite sunt executate
simultan, a ^andu-se ^n diferite stadii (ca pe o banda rulanta, Fig.1.11.d).
Masinile vectoriale au fost primele calculatoare ^nalt performante. Se ca-
racterizeaza printr-un numar mic de procesoare. Cu asemenea calculatoare
a fost posibila rezolvarea unor probleme numeric intensive precum cercetarile
^n domeniul armelor nucleare, industria aerospatiala, etc. Un asemenea sis-
tem este relativ usor de programat (Figura 1.12), si exista o baza software
larga pentru aplicatii comerciale. Din pacate un procesor vectorial este scump
(construit din cipuri speciale), este greu de mentinut (necesara o infra-structura
so sticata), si are o scalabilitate limitata (necesara cumpararea unei noi masini
^n ^ntregime). In cazul procesoarelor vectorriale raportul pret/performanta de-
screste anual cu aproximativ 20%, pe c^and, ^n cazul statiilor de lucru, raportul
descreste anual cu 40-50%.
O abordare alternativa la calculul secvential sau vectorial ^l ofera calculul
paralel, scalabil. Performantele procesoarelor seriale se dovedesc a limitate
din motive economice si zice. In calculul paralel se adopta o strategie divide-
et-impera: se utilizeaza procesoare mici si ieftine care lucreaza cooper^and la
19
Tabelul 1.3: Scalabilitatea, motiv al migrarii ^ntre solutiile arhitecturale
Vectorial Paralel
Investitia initiala cumpararea unei masini com- cumpararea unui numar de
plete (unica cale) procesoare corespunzatoare
bugetului (cu variante)
Actualizare cumpararea unei noi masini cumpararea de noi proce-
(unica cale) soare (cu variante)
Necesitati software ruleaza fara schimbari pe o protectia investitiei software
varietate de sisteme la cresterea sistemului

Figura 1.13: Cele cinci ere ^n calcul de ^nalta performanta


rezolvarea unei probleme. Avantajele sunt un raport mai bun pret/performanta
si scalabilitate (Tabelul 1.3).
Cele 5 ere ale calculului ^nalt performant (Figura 1.13) sunt marcate de
aparitia calculului mecanic (Babbage, anii 1800), componentelor cu stare dura-
bila (anii '60), VLSI (Very Large Scale Integration, anii '70), supercalcul-
ului vectorial (anii '70), calcului masiv paralel (anii '80), si de explozia calcula-
toarelor personale (anii '70), sau aparitia procesoarelor RISC (mijlocul anilor
'80). Dezvoltarile tehnologice au fost alimentate din doua surse principale:
oportunitate (^n primele trei ere, revolutia tehnologica ^n industrie, cresterea
productiei cost-efective a componentelor cu stari durabile/VLSI de calitate
ridicata) si necesitate (pentru solutii de realism si complexitate crescatoare,
pentru solutionarea unor probleme anterior inatacabile). Calculatoarele par-
alele deschid portile rezolvarii marilor provocari (Figura 1.14).
Din punct de vedere istoric, arhitecturile paralele au fost legate de modelele
de programare (arhitecturi divergente cu un sablon de crestere imprevizibil;
20
Figura 1.14: Evolutie tehnologica si marile provocari

Figura 1.15: Arhitecturi divergente


Fig. 1.15). Incertitudinea directiei a paralizat dezvoltarea de software paralel.
Obiectivul primelor calculatoare cu mai multe procesoare nu a fost obtinerea
de performante^n rularea unei singure aplicatii, ci abilitatea si posibilitatea de
rulare a mai multor aplicatii. Printre asemenea calculatoare se numara D-825
(4 procesoare, 16 pentru I/O, '62), B5500 (2 procesoare, '63), IBM 360/67 (3
procesoare, '67).
Prima generatie de calculatoare paralele reale (procesoare multiple utilizate
pentru rezolvarea unei singure aplicatii) a fost construita ^n laboratoare de cerc-
etare. Printre cele mai cunoscute se numara Iliac IV ('68, permitea efectuarea
a 15 M ops, mai putin dec^at permitea Cray-1 la acea vreme) si C.mmp ('78).
Sesiz^and potentialul calculatoarelor paralele,^n anii '80, o serie de companii
producatoare de calculatoare au introdus pe piata prima generatie de calcula-
toare paralele comerciale (a doua generatie de calculatoare paralele) fara un
succes deosebit datorita di cultatii de programare. Tabelul 1.4 prezinta c^ateva
asemenea sisteme.
A treia generatie de calculatoare paralele (dupa '85) a avut mai mult succes
deoarece a atins performantele supercalculatoarelor ceea ce justi ca investitia
^n dezvoltarea lor, iar software-ul pentru asemenea sisteme a fost ^mbunatatit.
A patra generatie de calculatoare paralele (dupa '90) se caracterizeaza
prin arhitectura similara (convergenta), modele de programare asemanatoare,
performante ale masinilor aproximativ aceleasi.
21
Tabelul 1.4: Calculatoare reprezentative pentru generatia din care fac parte
Produs Companie Clasi care Nr.proc.
Prima generatie
Iliac IV Univ. Ilinois SIMD 64
C.mmp Univ. Carnegie-MellonMIMD (mem.partaj.) 16
A doua generatie
FX Alliant MIMD (mem.distr.) 8
Butter y BBN MIMD (mem.partaj.) 256
T Flexible Computer MIMD (mem.distr.) 16348
PEPE Goodyear SIMD 8
MPP Goodyear SIMD 65536
DAP ICL SIMD 4096
iPSC/1 Intel MIMD (mem.distr.) 128
Computing SurfaceMeiko MIMD (mem.distr.) 156
nCUBE10 NCUBE MIMD (mem.distr.) 1024
Balance Sequent MIMD (mem.partaj.) 30
CM-1 Thinking Machines SIMD 65536
A treia generatie
Symmetry 2000 Sequent MIMD (mem.partaj.) 30
MP-1 MasPar SIMD 16384
iPSC/860 Intel MIMD (mem.distr.) 128
DBC/1012 Teradata MIMD (mem.distr.) 968
A patra generatie
J-Machine MIT MIMD (mem.distr.) 65536
Tera Tera MIMD (mem.distr. 256
CM-5 Thinking Machines MIMD (mem.distr.) 16348
Paragon Intel MIMD (mem.distr.) 2038
Enterprise Sun MIMD (mem.partaj.) 64
Origin 2000 Sun MIMD (partaj/distr) 128
HP 9000 Hewlett Packard MIMD (partaj/distr) 128
T3D Dec Alpha MIMD (partaj/distr) 2048
AlphaServer Compaq MIMD (mem.partaj.) 16

Tabelul 1.5: DRAM


An CapacitateCiclu Capacitate Viteza
1980 64 Kb 250 ns Logic: 2x ^n 3 ani 2x ^n 3 ani
1986 1 Mb 190 ns DRAM:4x ^n 3 ani 1.4x ^n 10 ani
1995 64 Mb 120 ns Disk: 2x ^n 3 ani 1.4x ^n 10 ani
'95/'80 1000:1 1:2

22
Figura 1.16: Tendintele performantei privita ca raport 1/timp necesar pentru
rezolvarea unei probleme de marime xa
1.1.6 Tendinte tehnologice
In ultimele doua decade, lumea s-a confruntat cu una dintre cele mai capti-
vante perioade din dezvoltarea calculatoarelor. Performantele calculatoarelor
au suferit ^mbunatatiri dramatice { o tendinta care promite sa continue si ^n
urmatorii anii. Imbunatatirea performantelor este datorata unei combinatii de
tehnologie, si software. Unul dintre motivele performantei cresc^ande este avan-
sul rapid ^n tehnologia microprocesoarelor. Microprocesoarele au devenit din
ceea^n ce mai mici, mai dense si mai puternice; astfel supercalculatoarele bazate
pe microprocesoare au devenit rapid tehnologia preferata pentru atacarea unor
probleme foarte importante din stiinta si inginerie.
Tendintele tehnologiei actuale sunt urmatoarele: cresterea performantei
micro-procesoarelor cu 50% - 100% per an (Figura 1.16), cresterea numarului
de tranzistoare per suprafata cu 60% pe an (Figura 1.17), cresterea numarului
de cicluri (frecventa) cu 40% per an (Figura 1.18), si cresterea performantei
memoriilor DRAM cu 7% pe an (Tabelul 1.5).
Se asteapta ca ^n jurul anului 2003 pe un cip sa e disponibili p^ana la 100
milioane de tranzistori. Se observa ca numarul de tranzistori pe un cip creste
rapid, mai repede dec^at frecventa (40% per an). Performantele microproce-
soarelor cresc de asemenea ^ntr-un ritm mult mai rapid dec^at cel al memoriei
(Figura 1.19). Exista si o pronuntata diferenta ^ntre evolutia capacitatii mem-
oriei si a vitezei; astfel capacitatea a crescut de 1000 ^n perioada 1980-95, dar
viteza numai de 2. DRAM-ul anului 2000 este de ordinul Gb, dar diferenta
fata de viteza procesorului este mai accentuata. Memoriile mai mari sunt mai
lente, pe c^and procesoarele devin din ce ^n ce mai rapide; se impune astfel
necesitatea transferarii mai multor date ^n paralel si utilizarea unor ierarhii
6 Rezumat: Performantele componentelor unui calculator cresc ^n timp ^ntr-un ritm diferit.
O diferenta mare este sesizabila ^ntre performantele procesoarelor si ale memoriilor. Sistemele
cu mai multe procesoare ^ncearca sa acopere ^n parte asemenea diferente.

23
Figura 1.17: Cre sterea numarului de tranzistoare pe suprafata corelata cu
tipurile de paralelism

Figura 1.18: (a) Cre sterea milioanelor de instructiuni per secunda; (b) Rata de
crestere a frecventei
mai ad^anci de memorii de accelerare. Paralelismul creste dimensiunea efectiva
a ecarui nivel al ierarhiei fara cresterea timpului de acces.
In masura ^n care dimensiunea unui cip (Intel utilizeaza 0.35u0.25u) de-
screste cu un factor x, frecventa creste cu x (cu un factor mai mic dec^at x,
datorita consumului de putere), numarul de tranzistori per unitate de arie
creste cu un factor x , iar puterea de calcul a cipului creste cu un factor de
2

aproximativ x din care x este datorat e paralelismului, e localitatii. Astfel


4 3

performanta cipurilor creste cu peste 100 per decada, pe c^and frecventa nu-
mai de 10; restul (peste > 10 per decada) se datoreaza cresterii numarului
24
Figura 1.19: Latenta ca diferenta ^ntre performantele procesoarelor si DRAM

Figura 1.20: Multi-procesoare bazate pe magistrala: (a) Evolutia numarului de


procesoare; (b) Latimea de banda a magistralei
de tranzistoare.
Numarul de procesoare ^n sistemele multi-procesor comerciale cu memorie
partajata, bazate pe magistrala, creste odata cu latimea de banda (Figura
1.20). Procesoarele rapide tind sa satureze magistralele, astfel ^nc^at tehnologia
magistralelor este fortata sa ^nainteze.
Ecuatia performantei microprocesoarelor este: timp=instructiuni executate
 cicluri per instructiune  frecventa. Astfel ^mbunatatirea performantei este
realizabila prin marirea frecventei prin ^mbunatatiri tehnlogice sau prin mai
multe instructiuni executate. In calculatoarele actuale paralelismul este ex-
ploatat la nivel de biti ^ntr-un ciclu (de exemplul la multiplicare), prin accesuri
multiple la memorie ^ntr-un ciclu (de exemplu prin divizare cache), sau prin
instructiuni multiple per ciclu (pipeline, super-scalar). Microprocesoarele ac-
tuale au suport multi-procesor. Mai multe servere si statii de lucru actuale
sunt multi-procesoare: Sun, SGI, DEC, Compaq etc.
P^ana ^n anul 1985 a predominat paralelismul la nivel de bit (de la 4-biti,
25
1.6: Cresterea performantei comparativa
Tabelul

IBM RS6000/397 Cray C90


statie de lucru super-calculator
An 1997 1992
MIPS > 200 < 100
Ceas 160 MHz 238 MHz
Cache 512 KB 8 KB
Memorie 4 GB 2GB
la 8, apoi 16-biti, procesul ind ^ncetinit dupa atingerea limitei de 32 biti).
Punctul de in exiune major este la 32 de biti; motivele sunt complexe si in-
clud si posibilitatile curente de integrare pe un cip. Se pune totusi problema
adoptarii paralelismului pe 64-biti, ^nsa cel pe 128-biti este ^ndepartat. Pe-
rioada '85-'95 este caracterizata de paralelism la nivel de instructiune (pipeline
si multimi de instructiuni simple), de avansul compilatoarelor, cache pe cip si
unitati functionale ce permit executia superscalara. Urmatoarea perioada este
caracterizata de paralelism la nivel de re de control (Figura 1.17).
Daca calculul stiinti c^n '88 presupunea utilizarea unui minisupercomputer
(la 1-20 M ops/s, precum Aliant, Convex, DEC) sau a unui procesor vecto-
rial (PVP la la 20-2000 M ops/s, precum CRI, CDC, IBM), ^n '98 presupunea
utilizarea unui PC (la 450 M ops/s, precum Intel Pentium II), a unei statii
de lucru RISC (la 10-1200 M ops/s, precum DEC, HP, IBM, SGI, SUN), a
unui multi-procesor simetric bazat pe RISC (SMP, la 0.5-15 G ops/s, precum
HP-Convex, DEC, SGI), a unui procesor vectorial (la 1-250 G ops/s, precum
SGI-CRI, Fujitsu, Hitachi and NEC), sau a unui multi-procesor cu multe
procesoare (de la 1-1000 G ops/s, precum HP-Convex, SGI-CRI, Fujitsu, IBM,
NEC, Hitachi). La mijlocul anilor '90, at^at serverele c^at si statiile de lucru per-
formante aveau ^n mod normal 2 sau 4 procesoare (de exemplu, Pentium Pro
cu 4 elemente de procesare ^n con guratie), suportul magistrala (drivere, arbi-
trare) ind inclus pe cip. Astfel super-calculatorul anului '92, a devenit ^n '97
un banal server (Tabelul 1.6).
In ceea ce priveste performanta raportata la cost,^n majoritatea aplicatiilor,
multi-procesoarele sunt superioare super-calculatoarelor conventionale. Exista
o serie de limbaje, compilatoare standardizate si portabile ^nsa programarea
este di cila si ram^ane obstacolul principal pentru majoritatea utilizatorilor. In
ceea ce priveste sistemele de operare, cele curente sunt robuste si exista o se-
rie de unelte pentru ^mbunatatirea utilizarii sistemului; totusi abilitatea nu
este la fel de buna ca cea a sistemelor conventionale. Ultimele tehnologii pen-
tru subsistemele I/O (discuri RAID, interfete HIPPI, etc) aduc o ^mbunatatire
substantiala ^n performantele operatiilor I/O, dar totusi acestea ram^an un fac-
tor de blocare a evolutiei arhitecturilor paralele.
Se poate vorbi astazi de o maturizare a tehnologiei calculatoarelor paralele;
sistemele paralele necostisitoare se dovedesc a mai rapide dec^at cele mai
bune super-calculatoare conventionale, iar clientii nu mai provin numai din
laboratoarele de cercetare.
26
1.2 Organizare hardware
Calculatoarele actuale includ calculatoare personale, statii de lucru, mainframe
si super-calculatoare. Unele sunt utilizate pentru procesarea textelor, altele
pentru capabilitatile gra ce. Motivul masurarii performantei unui sistem de
calcul este pronosticul performantei sale la anumite calcule pe care le doreste
utilizatorul. Prin masurarea vitezei aritmetice pe probleme simple se poate
face o idee asupra performantei asteptate^n cazul problemei de rezolvat. Totusi
pronosticul performantei calculatorului este di cil, datorita multitudinii de fac-
tori ce in uenteaza performanta. Timpii necesari pentru adunare, multiplicare
si divizare sunt priviti drept standarde; utilizarea acestor masuri pentru a prez-
ice performanta unei calcul major, precum simularea scurgerii unui uid ^ntr-o
conducta, este aproape imposibila. Se poate ^n cel mai bun caz prezice o
margine superioara a performantei.
1.2.1 Masurarea performantei calculatorului
Prin performanta calculatorului se ^ntelege efectivitatea unei operatii pe un
calculator, ^n mod uzual o aplicatie sau un standard. Notiunea de performanta
include viteza, costul si e cienta. Factorii ce in uenteaza performanta unui
calculator sunt: timpul CPU de executie (pentru operatii asupra registrilor,
^ntregilor, ^n virgula mobila, pe siruri), timpul de acces la memorie (pentru
citirea si scrierea de date ^n cache, ^n memoria principala sau ^n memoria
auxiliara), dimensiunea memoriei, serviciile de sistem si siere, compilatoare,
intrari/iesiri, comunicatii (^n special ^n cazul paralel sau distribuit).
Determinarea vitezei unui CPU. Viteza unitatii centrale de procesare a
unui calculator nu este identica cu performanta acelei masini. Viteza CPU ne
spune c^at de rapid poate lucra CPU; metricele de performanta ne spun c^at
de rapid poate executa CPU sarcini date. Se reamintesc urmatoarele de nitii:
millisecunda (ms) pentru 10 s, microsecunda (s) pentru 10 s, nanoseconda
3 6

(ns) 10 s, Hertz (Hz) pentru un ciclu pe secunda (unitatea internationala de


9

frecventa), MegaHertz (MHz), pentru un milion de cicluri pe secunda. Ciclul


de ceas al CPU este cea mai mica unitate de timp a unei operatii. Viteza CPU
poate astfel de nita prin rata de ceas adica numarul de cicluri executate ^ntr-
o secunda (uzual ^n MHz), sau prin viteza de ceas adica lungimea perioadei de
timp necesare pentru a executa un singur ciclu (uzual ^n ms sau ns). Aceste
doua de nitii sunt reciproce una alteia. Daca rata unui ceas CPU este de 50
MHz, atunci lungimea unui singur ciclu de ceas pentru acest CPU este de 20
ns. Daca ecare ciclu apare la ecare 12.5 ns, atunci rata este de 80 MHz.
Masurarea timpului. Pentru a determina performanta unui calculator este
necesara determinarea timpului de executie la rularea unor sarcini de lucru
variate. Exista urmatoarele masuri: timpul utilizator, timpul sistem, timpul
scurs (cronometrat, sau de raspuns).
Timpul utilizator este cantitatea de timp c^at CPU este activ pentru un
proces dat, excluz^and surplusul datorat sistemului de operare. Timpul sistem
1 Rezumat: Performantele unui sistem de calcul pot m asurate pe baza timpilor de
executie a unor sarcini precise (^n nanosecunde, instructiuni per secunda, informatii tratate),
pe baza de teste de evaluare, sau pe baza vitezei diferitelor componente.

27
este cantitatea de timp ^n care sistemul de operare este activ pentru un proces
dat. Timpul scurs este diferenta dintre timpul la care procesul urmarit ^ncepe
pe un anumit procesor si timpul la care se termina (acesta este timpul total
necesar procesului^n rulare; deoarece majoritatea calculatoarelor permit multi-
procesare, timpul scurs pentru un proces este mai mult dec^at suma timpului
utilizator cu timpul sistem). Timpul cronometrat este un alt termen pentru
timpul scurs. Timpul de raspuns este de asemenea un alt termen pentru timpul
scurs, ind timpul pe care un utilizator ^l asteapta pentru ca executia unui
program sa e terminata. Un termen aditional legat de timpul de executie este
debitul (throughput) de nit prin cantitatea de lucru (joburi sau operatii) pe
care un calculator le poate termina ^ntr-o cantitate data de timp.
Granularitatea ceasului este legata de marimea celui mai mic interval
masurat de ceas; este timpul real asociat cu avansarea ceasului calculatorului
cu o unitate. O granularitate na implica un interval foarte mic (de exemplu ^n
ns), pe c^and o granularitate grosiera implica un interval mare de timp (s). Cu
c^at granularitatea este mai na, informatia obtinuta de rutinele de estimare a
timpului este mai apropiata de cea exacta. O granularitate grosiera necesita
secvente lungi de instructiuni pentru o masurare c^at mai corecta.
Masurarea vitezei calculatorului. Performanta unui calculator este mai
buna dec^at a altuia daca aceeasi aplicatie ruleaza mai repede pe primul cal-
culator dec^at pe al doilea. Cu alte cuvinte, performanta calculatorului este
masurata prin inversarea vitezei de executie. Totusi exista si alti factori ^n
afara vitezei CPU a unei masini care afecteaza executia unui program aplicativ
dat. Acesti factori pot produce rezultate de performanta con ictuale c^and o
masina este testata pe mai multe aplicatii.
Urmatoarele unitati au fost dezvoltate de-a lungul anilor pentru a masura
viteza: mips, mops, CPI, flops si performanta teoretica maxima (peak).
Mips. Original acest termen se refera la viteza unui calculator ^n termeni
de milioane de instructiuni per secunda pe care le poate efectua. De exemplu
daca o multime de 15000 de instructiuni ruleaza ^n 3 ms pe o anumita masina,
atunci mips-ul aplicatiei este 5 (15000 instr./3 msec = 5 mips).
Masurarea mips este dependenta de instructiunile utilizate pentru a produce
timpii de executie. Un program ce executa instructiuni cu un mare procent de
operatii simple pe ^ntregi ruleaza ^ntr-un timp mai scurt dec^at un program cu
acelasi numar de instructiuni dar cu un^nalt procentaj de instructiuni complexe
precum operatiile ^n virgula otanta. Astfel doua programe diferite cu acelasi
numar de instructiuni pot avea mips diferite pe aceeasi masina.
O alta problema legata de acuratetea masuratorilor performantei ^n mips
este aceea ca anumite arhitecturi au o multime simpla de instructiuni pe c^and
altele sunt construite cu o multime de instructiuni complexe. Programul ce
ruleaza pe o arhitectura cu o multime simpla de instructiuni are mai multe
instructiuni la compilare dec^at acelasi program pe o arhitectura cu multimea
de instructiuni complexe, iar instructiunile simple se executa ^n mod uzual mai
rapid dec^at instructiunile complexe. Astfel este di cila compararea mips a
doua masini diferite chiar daca utilizeaza acelasi program.
Mops. Acest termen de neste viteza calculatorului ^n termeni de numar de
milioane de operanzi per secunda care pot tratati. Acesti operanzi se pot
referi la valori din registrii sau la date localizate^n cache sau^n memoria masini.
28
Tabelul 1.7: Flops si Bytes
Unitate viteza Unitate memorie
1 M op 1 Mega op 10 Flop/s 6
1 MB 1 Megabyte 10 octeti
6

1 G op 1 Giga op 10 Flop/s 9
1 GB 1 Gigabyte 10 octeti
9

1 T op 1 Tera op 10 Flop/s 12
1 TB 1 Terabyte 10 octeti
12

1 P op 1 Peta op 10 Flop/s 15
1 PB 1 Petabyte 10 octeti
15

Daca instructiunile masina pentru acelasi procesor contin numai un operand


per instructiune, masura mops trebui sa e aceeasi cu mips. Daca procesoarele
au doi, trei sau mai multi operanzi ^ntr-o instructiune, masura mops este mai
mare dec^at mips. Se considera de exemplu o multime de 15000 de instructiuni
ce ruleaza ^n 3 ms pe o anumita masina si se presupune ca ecare instructiune
pentru acea masina contine trei operanzi; atunci mops este 15 pentru aplicatia
data (15000 instr.  3 operanzi/instr/3 ms = 15 mops).
CPI. Este utilizat pentru a de ni viteza unui calculator^n termeni de numar
de cicluri per instructiune. Continu^and cu exemplul de mai sus, sa presupunem
ca rata de ceas este 20 MHz. Aceasta ^nseamna ca ecare ciclu necesita 50
nsec. Exemplele anterioare au aratat ca aceasta masina executa 5 mips sau o
instructiune la 200 nsec. Deci ecare instructiune necesita ^n medie 4 cicluri,
si masina opereaza la 4 CPI.
Flops. Aceasta unitate comuna pentru performanta de neste viteza unui
calculator ^n termenii numarului de operatii ^n virgula mobila care le poate
efectua ^ntr-o secunda. Ne ^ntoarcem la exemplul anterior si consideram ca
ecare instructiune efectueaza o operatie ^n virgula mobila (atunci numarul
este operatii ^n virgula mobila este acelasi cu numarul de instructiuni). Astfel
masina opereaza la 5000000 ops. Totusi este improbabil ca toate instructiunile
sa e ^n virgula mobila; de exemplu unele pot operatii pe ^ntregi precum cele
de control a ciclurilor sau calculule de indici. Daca numai 4/5 din instructiuni
sunt ^n virgula mobila, atunci masina opereaza la 4000000 ops.
Problema principala a acestei masuri de performanta este aceea ca nu toate
operatiile ^n virgula mobila necesita acelasi numar de cicluri. De exemplu, o
operatie de divizare necesita de 4 p^ana la 20 de ori mai multe cicluri dec^at
o adunare ^n virgula mobila. Astfel masura flop trebuie sa e mai precis
de nita de c^ate ori este utilizata pentru a masura performanta masinii. In
anumite contexte, toate operatiile ^n virgula mobila sunt incluse ^n numararea
flops, pe c^and ^n altele, numai multiplicarile si adunarile (standardul LinPack
utilizeaza o asemenea de nitie a flopului). O alta de nitie a flopului include
si timpii de acces la elemente de matrice suplimentar fata de multiplicari si
adunari (prin calcule de tipul s = s + ai;k bk;j ). Toate aceste de nitii sunt valide
^nsa este necesara o atentie sporita care dintre ele este utilizata ^n compararea
sistemelor de calcul. Flop este o masura populara a performantei masinilor de
calcul ^n cazul programelor stiinti ce, ^nsa nu este o masura rezonabila pentru
programe si standarde care utilizeaza un numar mic sau nici unul de operatii
^n virgula otanta. Multiplii flopului sunt prezentati ^n Tabelul 1.7.
Limita G ops a fost atinsa ^n jurul anului '91 cu ajutorul calculatoarelor
paralele. Astazi statiile de lucru sunt capabile doar de 10 = ops. Un P op
15 2

29
per o secunda necesita astazi aproximativ 1 an de calcule pe o statie de lucru
tipica. Un sistem P op al viitorului va avea ^ntre 10000 si 1000000 procesoare,
memorie^ntre 10 Tb si 1 Pb. Construit astazi ar consuma 1 TWatt. Se asteapta
ca un asemenea sistem sa e disponibil ^n jurul anului 2010.
Performanta teoretica maximala (peak). Este utilizata pentru a descrie
performanta unei masini prin numarul maxim de ops care poate obtinut
teoretic. Este determinata prin numarul de adunari si multiplicari (cu precizie
maxima) ^n virgula mobila care pot realizate de-a lungul unei perioade de
timp, uzual ciclul unei masini. Precizia maxima ^n acest context denota dubla
precizie aritmetica (utilizeaza 64 biti pe majoritatea arhitecturilor). Valorile
peak nu sunt obtinute de obicei ^n practica, ^nsa nu pot depasite.
Teste de evaluare. Relativ la masurarea performantei, cuv^antul benchmark
se refera la o multime de programe sau segmente de programe care sunt utilizate
pentru a masura performatele. Timpul necesar unui calculator pentru a executa
un test de evaluare ofera o masura a performantei. Testele pot astfel utilizate
la compararea performantei a doua masini. Alegerea unui sistem sau altul se
poate baza pe asemenea teste daca acestea au fost realizate pe teste c^at mai
apropiate de aplicatiile care vor rula pe sistemul de achizitionat.
Testele sunt scrise cu scopuri diferite: pentru a veri ca performanta CPU
a unui calculator, performanta ca server de siere, interfata I/O, retea, viteza
de comunicare, etc. Unele teste sunt scrise de utilizatori (interne organizatiei
utilizatorului, disponibile pe Internet); rezultatele testelor se pot compara cu
performantele corespunzatoare altor masini care au rulat aceleasi teste. Alte
teste de evaluare apartin unor organizatii speciale care testeaza calculatoare noi
si publica rezultatele; aceste rezultate sunt considerate mai putin provocatoare
dec^at cele realizate de producatorii de calculatoare.
Daca un test de evaluare este luat dintr-un cod existent, este numit test
de nucleu (creat din nucleul unui program aplicativ, partea esentiala a pro-
gramului, precum ciclul principal din cod sau o versiune simpli cata a codului
original, ne ind ^nsa reprezentativ pentru programul original). Alte programe
de test sunt programe aplicative reale. C^and un test de evaluare este scris spe-
cial pentru a reprezenta o mostra statistica de operatii, este numit test sintetic
(codul nu exista pentru alt scop). Anumite teste pot clasi cate drept ciudate
sau de joaca; aceste programe mici sunt bazate pe algoritmi care nu reprezinta
programe aplicative normale. Programele de rezolvare de puzzle sau alte jocuri,
precum si rutinele de sortare, se includ ^n aceasta categorie.
Netlib (http://netlib.org) include o serie de teste comune precum si
rezultatele de performanta pentru un numar mare de masini (inclusiv par-
alele). De asemenea National Institute for Standards and Technology
(NIST, USA) stocheaza o serie de teste comune. In anii '70, a fost dezvoltata
o multime de subrutine pentru rezolvarea sistemelor liniare, sub denumirea
LinPack. Deoarece acest pachet a devenit popular ^n multe arii ale calculului
stiinti c, este logic faptul ca unele dintre rutinele sale au devenit sursa unui test
nucleu pentru compararea performantei operatiilor^n virgula mobila pe diferite
masini (respectiv pentru masurarea vitezei de rezolvare a uni sistem de 100 de
ecautii liniare algebrice ^n dubla precizie aritmetica). Ciclurile Livermore, sau
Livermore Fortran Kernels (LFK), sunt 24 de nuclee Fortran si C derivate
dintr-un grup de aplicatii de la Lawrence Livermore National Laboratory.
30
Unele dintre acestea sunt foarte simple (produsul scalar sau multiplicare ma-
triceala), altele includ teste mai complicate (fragment a unei probleme de hidro-
dinamica, factorizare Cholesky combinata cu metoda gradientului conjugat,
etc). Precum testele LinPack, rezultatele sunt date ^n M ops. Whetstones
este construit pentru a masura performanta ^n operatii ^n virgula mobila
(cod Fortran), iar Dhrystones, pentru a determina performanta sistemului
sau a compilatoarelor (test sintetic, codul sursa ^n Ada, C, si Pascal). Co-
dul Shallow Water este un nucleu al unei aplicatii de pronostic a vremii.
Spice (Simulation Program with Integrated Circuit Emphasis) este un
test real, un simulator de circuite dezvoltat ^n anii '70 la Berkeley; numeroase
versiuni ale acestui program sunt utilizate astazi ^n designul procesoarelor
(^n C si Fortran, rezultate ^n Mflops). SPECmark (System Performance
Evaluation Cooperative) a fost creat^n anii '80, incluz^and reprezentanti de la
Hewlett-Packard, DEC si Sun Microsystems; acest grup mentine o multime
de programe de evaluare pentru a testa performantele noilor masini. Valoarea
SPECmark este raportul dintre media geometrica a performantei programelor
SPECmark raportata la cele realizate pe un VAX 11/780 utiliz^and timpul scurs
(at^at programe de calcul cu numere ^ntregi, c^at si ^n virgula mobila.
O multime de teste de evaluare cunoscute drept nucleele NAS au fost dez-
voltate de NASA Ames Research Center pentru compararea performantelor
masinilor paralele. Setul este constituit din 8 nuclee, de la programe de sortare
a^ntregilor la paralelism evident (^n majoritate fara comunicare). Utilizatorului
i se permite modi carea codului pentru a utiliza mai bine arhitectura masinii
paralele. Rezultatele sunt date ca rapoarte ^ntre timpii de executie a nucleelor
si timpii necesari acelorasi nuclee ^n executie pe Cray Y-MP cu un procesor.
In uenta memoriei asupra performantei calculatorului. Necesitatea
de a accesa date si intructiuni din memorie constituie o g^atuire pentru viteza
calculatorului. Memoriile mari tind sa e lent accesibile. Timpul de acces la
memorie al unei masini este timpul necesar pentru ca valoarea unei date sau
a unei instructiuni sa e transferata la memoria principala. Timpul mediu
de citire a unei date dintr-o memorie mare este mai mare dec^at timpul nece-
sar operatiilor aritmetice si logice (cu c^ateva ordine de marime). Pentru a
demonstra g^atuirea, se considera urmatorul exemplu: se presupune ca o masina
este capabila sa adune doi ^ntregi ^n 3 cicluri si ca necesita 5 cicluri pentru a
citi ecare operand si ^nca 5 pentru a stoca rezultatul. Aceasta ^nseamna ca
adunarea pe acea masina necesita nu 3 cicluri, ci cel putin 18.
Designul calculatoarelor actuale depaseste aceasta problema prin utilizarea
de ierarhii de dispozitive de memorie. Ierarhia memoriei este organizata pe
baza de memorie principala, auxiliara si cache. Ideea este plasarea datei care
este accesata ^ntr-o memorie rapida (cache de exemplu). Memoriile rapide sunt
mici si nu pot contine toate valorile necesare pentru un program de marime
rezonabila. In plus memoriile rapide sunt mai scumpe dec^at memoriile mari.
Unitatea aritmetico-logica (ALU) a CPU contine sierul registru care poate
considerat o forma a unei memorii mici, rapide si scumpe. Accesul la registrul
ALU este uzual realizat ^ntr-un ciclu. Costul accesului la cache este uzual de 2
la 4 ori mai mare dec^at costul accesului la registru. Pentru a accesa datele din
memoria principala sunt necesare de la 5 la 10 cicluri CPU. Costul accesului la
memoria auxiliara (disc) este de ordinul 20000000 ns (milioane de cicluri).
31
Referindu-se la componentele ierarhiei memoriilor, termenul de latenta se
refera la timpul de raspuns (timpul necesar pentru a aduce data din memorie),
iar latimea de banda se refera la debit (numarul de octeti per unitate de timp
care poate livrat din memorie la viteza completa sau numarul maxim de
biti pe secunda care pot mutati de-a lungul unui canal de la o componenta
a calculatorului la alta), numit de asemenea si rata de comunicare sau rata
de transfer. Acesti doi factori sunt complicati de natura multi-nivel a ierahiei
memoriilor, deoarece ecare nivel are o latime de banda si o latenta speci ca.
De exemplu, SGI Origin poate livra ^n jur de 4 octeti per ciclu masina de la
nivelul 1 cache si 4 octeti per ciclu de la nivelul cache 2 la nivelul 1 cache, dar
numai ^n jur de 0.8 octeti per ciclu de la memorie la nivelul 1 cache.
Ierarhia memoriilor este efectiva datorita principiului localitatii referintei.
Localitatea spatiala implica faptul ca datele stocate unele l^anga altele ^n spatiu
de adresare al memoriei tind sa e accesate la timpi apropiati. Localitatea tem-
porala implica faptul ca datele referite ^ntr-o fereastra de timp xa se schimba
^ncet cu timpul. Aceasta ^nseamna ca datele accesate de un program la un
timp dat vor probabil accesate din nou ^n viitorul apropiat. Pun^and cele mai
recente date ^n memoria rapida astfel ^nc^at sa e accesate din nou rapid, se jus-
ti ca utilizarea memoriei mici. Mai mult, continutul memoriei mici si rapide
trebuie sa e dinamic, cu schimbare lenta de-a lungul executiei programului.
Un cache (memorie de accelelare) este o memorie mica rapida care este ade-
sea plasata pe acelasi cip cu CPU si detine copii ale celor mai recent accesate
cuvinte (conform principiului temporalitatii este probabil sa mai e accesate).
Datele dintr-un cache pot accesate rapid. Reutilizarea cuvintelor din cache
elimina accesuri multiple la memoria principala care ar necesita mai multe ci-
cluri. Valorile pot scrise direct ^n cache si copiate ^n memoria principala la
un moment ulterior, evit^and ^nt^arzierea adesea cauzata de scrierea^n memorie.
Dimeniunea unui bloc de date ce este copiat de la (si la) memoria principala
la (si de la) cache ^ntr-un singur acces la memorie este numita linie cache; o
asemenea linie poate contine de la 8 la 512 octeti de date, depinz^and de masina.
Aceasta ^nseamna ca anumite date vecine cu data ^n cauza sunt de asemenea
plasate ^n cache la acelasi moment cu data dorita. Conform principiului lo-
calitatii spatiale, aceste date vecine sunt de asemenea necesare.
C^and o valoare este ceruta din memorie, cache-ul este primul veri cat daca
valoarea nu se a a acolo. Daca este, are loc un succes a cache-ului (reusita,
cache hit) si valoarea este obtinuta din cache. Daca data nu se a a ^n cache
(eroare a cache-ului, cache miss), linia cache contin^and valoarea necesara este
adusa din memoria principala si pusa ^n cache; aceasta necesita actualizarea
unui tabel al intrarilor curente ^n cache (tabelul cache). Apoi data ceruta este
regasita din cache. Orice cerere ulterioara a acelei date se va solda cu un succes.
Liniile cache distruse de noua linie trebuie rescrise ^n memorie numai daca au
fost modi cate si nu au mai fost scrise ^n memoria principala. Rata de succes
cache a unui proces ce ruleaza pe un cache dat este media h a numarului de
reusite cache^mpartita prin numarul de accesuri. Rata de erori cache este 1 h.
Se presupunem ca procesorul si nivelul 1 al memoriei cache se gasesc pe
cip si un nivel 2 cache se a a ^ntre cip si memorie. C^and procesorul executa
o instructiune de ^ncarcare, nivelul 1 cache este primul interogat pentru a de-
termina daca data dorita este disponibila. Daca este, atunci data va livrata
32
la procesor ^n 2 la 5 cicluri de procesor. Daca data nu este gasita ^n nivelul
1 cache, procesorul se blocheaza at^ata timp c^at este interogat nivelul 2 cache.
Daca data dorita este gasita ^n nivelul 2, perioada de blocare poate dura numai
10-20 cicluri. Daca data nu este gasita ^n cache, apare un esec de cache si este
posibia o ^nt^arziere de c^ateva sute de cicluri.
C^and o multime de date curent utilizate de un program^n executie nu^ncap
^n cache ^n acelasi timp, procesul este ^ncetinit de ^nlocuirile necesare a liniilor
cache ce contin datele. Aceasta situatie este considerata drept supra^ncarcare
(thrashing); acelasi fenomen se^nt^ampla si^ntre memoria principala si memo-
ria auxiliara c^and numarul de pagini asignat unui proces nu este su cient de
mare pentru a detine multimea de pagini utilizate de acel proces (memoria
principala contine date si instructiuni pentru ecare program ce se executa,
^n unitati de pagini; dimensiunea unei pagini este ^ntre 256 si 8192 octeti,
depinz^and de masina { multiplu de dimensiunea liniei cache). Calculatoare ac-
tuale utilizeaza memorii virtuale. Programelor care se executa li se asigneaza
un numar limitat de pagini ^n memoria principala ce este partajata cu alte
procese si cu sistemul de operare. Memoria auxiliara (disc) este locatia restu-
lui de date si instructiunilor. Daca un program necesita accesarea anumitor
date sau instructiuni care nu sunt curent ^n memoria principala, apare un esec
de pagina (eroare); programul se opreste p^ana c^and una din paginile sale este
scrisa ^n memoria auxiliara si noua pagina contin^and data ceruta este citita ^n
memoria principala. Aceasta implica scrierea vechii pagini pe disc (daca a fost
modi cata), citirea noii pagini de pe disc, si actualizarea tabelului cu intrarile
de pagina curente; toate acestea necesita un timp considerabil fata de un acces
simplu la memorie si sistemul trece la executia altui program care este pregatit
p^ana c^and noua pagina este instalata.
1.2.2 Modele arhitecturale
Calculul paralel a fost promovat de modele si arhitecturi divergente, fara un
sablon de crestere previzibil (Figura 1.21): memorie partajata, transmitere de
mesaje, paralelism al datelor, ux de date si matrice sistolice.
Problemele fundamentale arhitecturale sunt prezentate ^n Tabelul 1.8. Nu-
mirea se refera la spatiul de adrese: liniar global singular (memorie partajata),
segmentat global singular (obiecte globale), sau local multiplu (trasmitere de
mesaje). Strategia de numire are implicatii asupra programatorului si software-
ului, performantei si complexitatii designului.
Coordonarea (sincronizarea) ia trei forme: excludere mutuala, noti -
carea evenimentelor (punct la punct, de exemplu interactiuni producator-
consumator, sau global/punct la multipuncte, de exemplu sf^arsitul unei faze),
sau operatii globale (de exemplu, suma).
Abilitatea pentru tratarea latentei este critica pentru procesoare rapide.
Optiunile pentru tratarea latentei sunt: frecventa scazuta a evenimentelor cu
latenta lunga (schimbari algoritmice, distributia calculelor si datelor, etc), re-
2 Rezumat: Exist a c^ateva modele arhitecturale bine conturate pentru calculatoarele par-
alele: sisteme cu memorie partajata ^ntre procesoare sau distribuita la procesoare, sisteme
dedicate calculului vectorial, sisteme dedicate unor calcule similare pe date numeroase, sis-
teme dedicate unor calcule speciale. Paralelismul preocupa producatorii de procesoare care
ofera o serie de solutii constructive ce permit anumite forme de concurenta.

33
Figura 1.21: Perspectiva istorica

Tabelul 1.8: Temele fundamentale ^n design arhitectural


Tema Continut
Numire cum se comunica datele si sau cum se sunt
referite, cum sunt numite datele partajate si sau
comunicate partenerului
Sincronizare cum se coordoneaza activitatile producatorilor si
consumatorilor datelor
Latenta c^at timp este necesar pentru comunicarea datelor
^ntr-un mod protejat
Latimea de banda c^ate date pot comunicate per secunda, c^ate
operatii per secunda (Figura 1.22)
Granularitatea nodurilor ^mpartirea ^ntre procesoare si memorie a cipului
Aplicabilitate cu scop general sau cu scop special
ducerea latentei (cache pentru datele partajate, sau prin interfetei de retea),
tolerarea latentei prin suprapunerea comunicatiilor si calculelor (sub controlul
programatorului ^n modelul cu transmitere de mesaje), sau suprapunerea ac-
cesului si calculului utiliz^and multi-threading sau transfer ^n bloc (modelul de
adresare partajata).
Granularitatea elementelor de procesare raspunde la ^ntrebarea c^at hard-
ware (de exemplu, arie de silicon) trebuie dedicat pentru ecare nod {
granulatie grosiera (de exemplu zeci de SGI Challenges legate prin ATM),
34
Figura 1.22: Latimea de baza
granulatie medie (de exemplu, Intel Touchstone cu sute de procesoare i860s,
ecare av^and 32 biti de memorie conectate ^ntr-o plasa cu rutare tip gaura de
vierme), granulatie na (de exemplu, MIT J-Machine cu mii de MDP ecare
cu 1 Mbyte de memorie conectate printr-o plasa cu rutare tip gaura de vierme).
Masini cu memorie partajata si masini cu memorie distribuita. Ma-
joritatea masinilor paralele moderne se ^ncadreaza ^n doua categorii de baza:
masini cu memorie partajata care au un singur spatiu de adresare partajat care
poate accesat de ecare procesor, si masini cu memorie distribuita ^n care
memoria sistemului este plasata la procesoare individuale, iar anumite forme
de comunicare sunt necesare pentru a oferi datele din memoria unui procesor
unui alt procesor diferit.
Caracteristica cheie ^n arhitectura memoriei partajate consta ^n faptul ca
toate procesoarele din sistem pot accesa direct toate locatiile de memorie din
sistem (un spatiu de adresare global), astfel oferind un mecanism convenabil
si rapid de comunicare ^ntre procesoare (transparenta locatiei si abstractizarea
sunt aceleasi cu cele suportate ^n uniprocesoarele curente). Fiecare procesor
poate sa aiba memoria sa locala. Accesul la memoria partajata poate rea-
lizata prin magistrala (sau abordare mini-calculator) sau printr-o retea de co-
mutatoare (sau abordare mainframe, Figura 1.23). Spatiul de adresare global
simpli ca programarea paralela si usurinta implementarii compilatoarelor ce
automatizeaza paralelismul, dar hardware-ul nu atinge un nivel masiv paralel.
Multe multi-procesoare simple sunt construite arhitectural astfel ^nc^at
ecare procesor are un cache privat care este interconectat la memoria par-
tajata globala via o singura magistrala a sistemului; aceasta organizare este
utilizata ^n statiile de lucru multi-procesor moderne precum cele de la Sun si
Hewlett-Packard. Oricare procesor poate accesa oricare locatie din memoria
globala via operatii de^ncarcare standard. Hardware-ul asigura coerenta cache-
urilor, urmarind tra cul pe magistrala sistemului si invalid^and copiile cache ale
oricarui bloc care este rescris. Acest mecanism este general invizibil pentru
utilizator, except^and cazul c^and procesoare diferite ^ncearca simultan sa scrie
35
Figura 1.23: Arhitectura memoriei partajate: (a) Retea de comutatoare; (b)
Magistrala; (c) Retea de comutatoare tip crossbar (abordare maiframe); (d)
Abordare mini-calculator
^n aceeasi linie cache, ceea ce conduce la o supra^ncarcare (trashing). Pentru
a evita aceasta problema, programatorul si sistemul de programare trebuie sa
e atent la structura datei partajate si a celor ne-partajate care pot localizate
pe acelasi bloc cache, o situatie cunoscuta drept partajare falsa. Sincronizarea
accesului la structurile de date partajate este tema majora ^n sistemele de me-
morie partajata { ram^ane pe seama utilizatorului sarcina ca operatiile efectu-
ate de procesoare diferite pe structuri de date partajate sa lase acea structura
de date ^ntr-o stare consistenta. Problema principala ^n sistemul cu memo-
rie partajata este aceea ca nu este scalabil. Majoritatea sistemelor bazate pe
magistrala sunt limitate la 32 de procesoare. Daca magistrala este ^nlocuita cu
o punte de comutatoare, sistemele se pot scala p^ana la 128 de procesoare, desi
costul comutatoarelor creste cu patratul numarului de procesoare.
Aceasta limitare atrage atentia asupra organizarii distribuite a memoriei.
Memoria partajata globala este ^nlocuita cu o memorie mica locala atasata
la ecare procesor. Comunicarea ^ntre aceste memorii foloseste reteaua de
interconectare.
Intr-un sistem cu memorie distribuita, ecare procesor are propria sa me-
morie locala (Figura 1.24.b). Procesoarele comunica ^ntre ele prin mesaje.
Reteaua poate seriala sau paralela, adica au loc conectari singulare per pro-
cesor (de exemplu Ethernet) sau conectari multiple per procesor (de exemplu,
inel, grila, hipercub). Topologia retelei poate statica sau dinamica (via retea
de comutatoare). Hardware-ul se poate scala usor, programarea este ^nsa mult
mai di cila dec^at ^n cazul memoriei partajate, iar compilatoarele automate
sunt ^nca ^n stadiul de dezvoltare. Principala problema ^n programare pentru
masinile cu memorie distribuita este managementul comunicarii de date ^ntre
procesoare. In sistemele cu transfer de mesaje rezolvarea problemei amintite se
face prin minimizarea numarului de comunicatii si suprapunerea comunicarii cu
calculul. Avantajul designului memorie-distribuita este acela ca accesul la date
locale se poate face foarte rapid. Pe de alta parte accesul la memorile a ate la
36
Figura 1.24: Comunicare prin retea: (a) Abordarea sala de dans; (b) Abordarea
memorie distribuita
distanta necesita mai mult efort. Procesorul ce detine data necesara trebuie s-o
expedieze la procesorul care o cere. O comunicare prin expediere-receptionare
implica timpi de start lungi, desi latimea de banda dupa start poate mare
(se prefera expedierea unor mesage mai lungi si mai putine).
Arhitecturile hibride combina memoria partajata si memoria distribuita.
Structura de comunicare uniforma se realizeaza via mesaje sau prin combina-
rea mesageriei si memoriei partajate de latenta joasa. Anumite masini cu
memorie distribuita permit unui procesor sa acceseze direct date ^ntr-o me-
morie la distanta. In asemenea sisteme, cu memorie partajata distribuita
(distributed-shared-memory, DSM), latenta asociata cu o ^ncarcare variaza
cu distanta la memoria ^ndepartata. Coerenta cache ^n sistemele DSM este
o problema complexa si este ^n mod uzual tratata de o unitate so sticata de
interfata cu reteaua. SGI Origin si HP/Convex Exemplar sunt exemple de
asemenea sisteme DSM comerciale.
O arhitectura hibrida cu numar mare de procesoare este clusterul (grup).
Un cluster arata ca un sistem cu memorie distribuita ^n care ecare compo-
nenta individuala este un multi-procesor cu memorie partajata (^n locul unui
nod uni-procesor). Acest design permite e cienta paralela ^nalta ^ntr-un nod
multi-procesor si scalabilitate la sute sau chiar mii de procesoare.
Scalarea se poate face^n stilul salii de dans (reteaua ram^ane scalabila, dar cu
un cost mai mic dec^at crossbar; Figura 1.24.a), ^n stilul memorie distribuita,
sau acces la memorie ne-uniform (nonuniform memory access, NUMA), con-
struirea unui spatiu de adresare partajata prin tranzactii de mesaje simple de-a
lungul unei retele cu scop general). De exemplu, Cray T3E se poate scala p^ana
la 1024 procesoare, cu legaturi de 480MB/s si cu un numar de instructiuni
necesare pentru adresare la distanta, fara mecanism hardware pentru coerenta.
Ierarhia memoriei. Designul ierarhiei memoriei este parte integranta a
designului calculatoarelor paralele deoarece ierarhia memoriilor determina
performanta nodurilor individuale ale masinii. Ierarhiile memoriilor pe masinile
paralel sunt mult mai complicate datorita existentei cache-urilor multiple^n sis-
temele cu memorie partajata si a latentelor lungi ^n accesul la memorii a ate la
distanta ^n con guratii cu memorie distribuita. Exista mai multe strategii pen-
tru a depasi problema latentei. Ascunderea latentei ^ncearca sa suprapuna un
37
Figura 1.25: Operatii ^n arhitectura vectoriala

Figura 1.26: (a) Un graf de ux al datelor pentru calculul Z = 2(X + Y ); (b) O


masina bazata pe scurgerea datelor
esec cache cu calculul. Pre-aducerea liniilor cache este de asemenea o strate-
gie de ascundere a latentei. Toleranta latentei pe de alta parte ^ncearca sa
restructureze calcul.
Arhitectura vectoriala. Operatiile sunt divizate ^n mai multe sarcini sau
faze. Performanta este caracterizata de timpul de start si numarul de cicluri.
Este operativ numai c^and nu exista dependente ^ntre operanzi consecutivi.
Pentru vectori lungi, performanta se apropie de o operatie per ciclu (Fig. 1.25).
Arhitectura bazata pe paralelismul ^n date. O matrice de procesoare
simple, numeroase, ieftine si cu memorie mica este atasata la un procesor de
control specializat care asigura comunicarea si sincronizarea globala ieftina.
Modelul de programare este caracterizat de faptul ca operatiile sunt efectuate
pe ecare element ale unei structuri de date regulate ^ntr-un singur pas (de ex-
emplu operatii aritmetice, transfer global de date). Procesoarele sunt asociate
logic cu elemente ale structurii de date.
Arhitectura bazata pe uxul de date. Masina Von Neuman este gu-
vernata de uxul controlului, exist^and o unitate ce controleaza secventa de
operatii. In cazul uxului de date (scurgere) secventa de control este bazata pe
aparitia datelor (instructiunile nu sunt secventiale si teoretic se maximizeaza
gradul de concurenta a sarcinilor). Calculele sunt reprezentate prin grafuri de
dependente esentiale (Figura 1.26.a). Procesorul logic de la ecare nod este
activat de disponibilitatea operanzilor. Mesaje (semnale) ce poarta etichete
ale urmatoarei instructiuni sunt expediate la procesorul urmator. Etichetele
sunt comparate si daca se potrivesc are loc o executie.O masina cu structura
bazata pe scurgerea datelor este prezentata ^n Figura 1.26.b.
38
Figura 1.27: (a) Arhitectur a secventiala; (b) Arhitectura sistolica; (c) Exemplu
de matrice sistolica pentru o convolutie uni-dimensionala
Arhitecturi sistolice. O arhitectura sistolica ^nlocuieste procesorul singular
cu o etalare (matrice, array) de elemente de procesare regulate si orchestreaza
uxul datelor cu un acces mic la memorie (Figura 1.27.b). O arhitectura sis-
tolica se distinge de o arhitectura vectoriala deoarece structura etalata poate
sa e neliniara (de exemplu hexagonala), caile ^ntre elementele de procesare
pot multi-directionale, elementele de procesare pot avea instructiuni si date
locale si sa e mai complexe dec^at o faza a unui calculator vectorial. O arhitec-
tura sistolica este diferita de un SIMD, deoarece ecare element de procesare
poate face ceva distinct. Motivarea initiala este aceea ca VLSI permite crearea
de cipuri necostisitoare cu scop special si reprezentarea algoritmilor direct pe
cipuri conectate^ntr-un sablon regulat. Realizarile practice (de exemplu iWARP)
utilizeaza procesoare generale si permit executia unei varietati mari de algo-
ritmi pe acelasi hardware. Totusi canale de interconectare sunt dedicate, iar
datele sunt transferate direct de la registru la registru de-a lungul canalelor.
Principalele teme sunt ^ncarcarea datelor ^n etalare, arhitectura celulelor si cea
de comunicare, maparea automata a calculelor pe matrice sistolice.
CISC si RISC. Majoritatea procesoarelor actuale fac parte din cate-
goria procesoarelor cu multime complexa de instructiuni (CISC, Complex
Instruction Set Computers). Un CISC este caracterizat de o multime
mare de instructiuni puternice. Necesita mai multe nivele logice rezult^and
o executie lenta per instructiune. DEC VAX 11/780 cu aproximativ 256 de
instructiuni este un sistem tipic CISC; alte exemple sunt Intel 80486,
Pentium, Motorola 68040.
Calculatorul cu o multime redusa de instructiuni (Reduced Instruction
Set Computers) aplica metoda de crestere a vitezei masinii prin reducerea
numarului de instructiuni din multimea de instructiuni numai la acelea mai
frecvent utilizate. O trasatura importanta a calculatoarelor RISC este aceea
ca instructiunile necesita un singur ciclu (un ceas de 40 MHz corespunde unei
viteze de executie de 40 Mips), numarul de nivele logice^n hardware ind redus.
Pe l^anga o multime mica de instructiuni simple, executia instructiunilor se face
^n stil pipeline si se utilizeaza memorie cache. DEC 5000 cu 64 de instructiuni
este un sistem RISC tipic; numeroase alte statii de lucru utilizeaza arhitectura
RISC (de exemplu Intel i860, MIPS 4000, IBM RISC 6000, Sun SPARC).
Mutarea ^nspre sistemele RISC a fost stimulata de recunoasterea faptului
ca o performanta mai buna poate atinsa printr-o mutime simpla si mica de
instructiuni. Instructiunile mai complexe sunt prea specializate si nu sunt nece-
39
sare^n multe calcule, si compilatoarele le recunosc destul de di cil. Prin reduce-
rea si simpli carea multimii de instructiuni, timpul de decodare a instructiunii
si spatiul pe cip au fost reduse (mai mult spatiu pentru cache).
Ideea executiei instructiunii ^n stilul liniei de procesare (pipeline) poate
^nteleasa printr-o analogie cu linia de asamblare a automobilelor (lucrul este
divizat ^ntr-o serie de pasi ecare necesit^and aceeasi cantitate de timp, e ,
astfel ^nc^at rata de producere este de un automobil la ). In mod similar
^n pipeline-ul unei instructiuni sarcinile necesare executarii instructiunii sunt
^mpartite^n pasi precum este ilustrat^n Figura 1.1. C^and segmentul FI aduce o
instructiune, segmentul DI decodeaza instructiunea anterioara, etc (se asteapta
c^astigarea unui factor de maxim 5^n viteza de executie fata de cazul secvential).
Viteza promisa de un pipeline nu poate ^ntotdeauna atinsa. De exem-
plu, instructiunile cu rami care pot cauza probleme deoarece instructiunea
urmatoare rami carii nu este cunoscuta p^ana c^and testul rami carii nu este
executat. Astfel o rami care^ntrerupe scurgerea neteda a instructiunilor ^ntr-o
linie de procesare. Daca rami carile apar frecvent ^n cod, pot degrada se-
rios performanta. Pentru a trata aceasta problema, sistemele RISC utilizeaza
o rami care ^nt^arziata, adica ^nt^arzie aducerea urmatoarei instructiuni dupa
rami care cu un numar x de cicluri. Bula creata ^n conducta poate umpluta
cu o instructiune care va executata ^n directia la care o ia rami catia.
Sistemele RISC au ^n mod uzual co-procesoare pipeline separate pentru vir-
gula mobila, iar anumite sisteme contin unitati functionale multiple ce permit
suprapunerea operatiilor (de exemplu IBM RS6000 si Intel i860). Asemenea
sisteme pot sa se atinga o performanta chiar mai mare dec^at o instructiune per
ciclu, caz referit drept performanta super-scalara. De exemplu, suprapunerea
adunarii si multiplicarii ^n virgula mobila pe un sistem IBM RS6000 permite
evaluarea a  b + c ^ntr-un ciclu, oferind o performanta teoretica maxima (peak)
de 50 M ops cu un ceas 25 MHz. Intr-un ciclu al unui sistem cu co-procesoare
este posibila executia a patru instructiuni simultan: o rami care, o instructiune
conditie-registru, o instructiune pe ^ntregi, si o instructiune ^n virgula mobila.
Incluz^and posibilitatea de suprapunere a adunarii si multiplicarii ^n virgula
mobila, acest sistem poate executa cinci instructiuni pe ciclu.
Procesoare superscalare si procesoare VLIW. Procesorul super-
scalar (Figura 1.28.d) permite executarea unor instructiuni multiple per
ciclu; aceasta tehnica este numita paralelism la nivel de instructiune
(Instruction-Level Parallelism, ILP). Hardware-ul este utilizat pen-
tru a detecta instructiuni independente (detectare pe drum). Pro-
cesoarele contemporane super-scalare sunt Intel Pentium, DEC Alpha
21064, Motorola 88110, IBM Power1 (RS/60000).
Un procesor VLIW (introdus ^n '96; very long instruction word) plani-
ca operatii multiple ^n cuvinte instructiune foarte lungi. Intreaga responsabi-
litate pentru gasirea si plani carea corecta a instructiunilor paralele este lasata
pe seama compilatorului. Avantajul primar asupra procesorului super-scalar
este cantitatea de paralelism detectata { paralelismul este detectat apriori.
O masina paralela generica. Taxonomiile traditionale nu sunt absolute,
la fel modelele de programare si structurile hardware (acelasi model poate
suportat de arhitecturi radical diferite). Arhitectura calculatoarelor este astazi
40
Figura 1.28: (a) Pasi ^n executarea unei instructiuni; (b) Pipeline; (c) Super-
pipeline; (d) Superscalar

1.29: Arhitectura de comunicare


Figura

extinsa pentru a suporta comunicatiile si cooperarea. Arhitectura bazata pe


o multime de instructiuni a fost ^nlocuita cu o arhitectura de comunicare. O
serie de primitive sunt implementate hardware (Figura 1.29).
O arhitectura de comunicare este o interfata ^ntre utilizator si sistem^nsotita
de o implementare. Primitivele de comunicare sunt oferite utilizatorului de
catre nivelul software. Modelele de programare sunt universale si se face pre-
supunerea implicita ca operatiile primitive sunt implementate e cient. Struc-
41
Figura 1.30: Un multi-procesor modern generic
turile organizatorice care implementeaza aceste primitive sunt hardware-ul sau
sistemul de operare. Distinctiile arhitecturale afecteaza software-ul: compila-
toarele, bibliotecile, programele. Designul interfetei utilizator/sistem si hard-
ware/software este constr^ansa de modelele de programare si de tehnologie.
Principiile de ghidare sunt oferite pe straturi: ce primitive sunt oferite ca ab-
stractizare a comunicarii, cum modelele de programare sunt mapate la acestea
si cum sunt la r^andul lor mapate pe hardware.
Intr-un multi-procesor generic modern, un nod are mai multe procesoare si
blocuri de memorie, este asistat la comunicare (interfata cu reteaua), reteaua
este scalabila, iar sistemul de operare este esential (Figura 1.30).
1.3 Clasi carea arhitecturilor
Nu exista ^nca un standard pentru modelul masinii paralele precum modelul
Von Neumann al masinii secventiale. Algoritmii paraleli sunt destinati ^nca
unei masini ^n loc de a avea unul singur pentru o problema data. Pentru a
clasi ca masinile paralele trebuie mai ^nt^ai dezvoltat un model de calcul.
1.3.1 Clasi carea Flynn pe baza mecanismului de control
Abordarea urmatoare este datorata lui Flynn (1966). Orice calculator,
secvential sau paralel, executa instructiuni asupra unor date. O secventa de
instructiuni (algoritmul) indica ceea ce trebuie sa faca calculatorul. O secventa
de date (intrarea) este afectata de aceste instructiuni. Clasi carea se bazeaza
pe numarul de unitati de control si procesoare:
SI: o singura secventa sau ux de instructiuni (single instruction stream)
daca arhitectura are o singura unitate de control ce produce un singur
ux de instructiuni;
MI: secvente sau uxuri multiple de instructiuni (arhitectura are unitati de
control multiple, ecare produc^and o secventa distincta de instructiuni);
SD: o singura secventa sau ux de date (un singur procesor este disponibil
pentru a trata secventa de date);
1 Rezumat: Exist
a mai multe ^ncercari de a clasi ca varietatea de arhitecturi ale sistemelor
cu mai multe procesoare. Majoritatea se refera la programarea unor asemenea arhitecturi.

42
Figura 1.31: (a) SISD; (b) MISD; (c) SIMD; (d) MIMD

Figura 1.32: Potentialul celor 4 clase arhitecturale


MD: secvente sau uxuri multiple de date (sunt disponibile procesoare multiple
ecare trat^and o secventa distincta de date).
Taxonomia Flynn este bazata pe multiplicitatea secventelor de instructiuni
si de date. Astfel exista 4 clase de calculatoare (Figura 1.31):
SISD: un singur ux de date si un singur ux de instructiuni (Single
Instruction Single Data, secvential);
MISD: un singur ux de date si uxuri multiple de instructiuni (Multiple
Instruction Single Data, calculator pipeline sau nu exista { notiunea
este controversata);
SIMD: uxuri multiple de date si un singur ux de instructiuni (Single
Instruction Multiple Data, organizare hardware generalizata ^n mo-
delul de paralelism ^n date);
MIMD: uxuri multiple de date si uxuri multiple de instructiuni (Multiple
Instruction Multiple Data, majoritatea sistemelor multi-procesor
str^ans sau slab cuplate).
Clasi carea caracterizeaza arhitecturile baz^andu-se pe numarul de
instructiuni care se executa simultan si numarul de parti ale structurilor de
date asupra carora se lucreaza (Figura 1.32).
43
Figura 1.33: SISD

Figura 1.34: MISD


Calculatoarele paralele din aceasta clasi care sunt de doua tipuri: MIMD
si SIMD. Procesoarele unui multiprocesor MIMD se pot comporta independent
unele de celelalte oper^and pe date diferite, pe c^and procesoarele unei masini
SIMD efectueaza aceeasi instructiune ^n acelasi moment, dar pe date diferite.
SISD. Este masina secventiala tipica. Poate executa o instructiune la un
moment dat pe o parte din date. Nu se ia ^n considerare tehnica pipeline
si procesarea vectoriala. O singura unitate de procesare primeste o singura
secventa de instructiuni care opereaza pe o singura secventa de date (Fig.1.33).
Algoritmii pentru calculatoare SISD nu contin nici o forma de paralelism.
De exemplu, pentru a calcula suma a n numere a ; a : : : an procesorul necesita
c^astigarea accesului la memorie de n ori consecutiv. Cele n 1 adunari sunt
1 2

executate ^n secventa. De aceea calculul necesita O(n) operatii.


MISD. Sistemul are cel putin doua procesoare ( e n numarul lor), ecare
av^and propria unitate de control si partaj^and o memorie comuna (Figura 1.34).
Exista n secvente de instructiuni (algoritmi/programe) si o secventa de date.
Paralelismul este atins prin faptul ca procesoarele efectueaza sarcini diferite
la acelasi moment de timp. Masinile MISD sunt utile ^n calcule c^and aceeasi
intrare este subiectul mai multor operatii diferite. Aceasta organizare este
controversata (se a rma adesea ca nu exista masini comerciale de acest tip;
procesoarele pipeline sunt consisedrate ca fac^and parte din aceasta categorie).
Se considera problema testarii daca un numar natural Z este prim. O solutie
simpla este aceea de a determina toti divizorii posibili a lui Z . Se presupune
ca numarul de procesoare este p = Z 2. Toate procesoarele primesc Z drept
intrare si ecare^ncearca sa-l^mparta la dizivorul sau asociat. Astfel veri carea
este posibil a realizata ^ntr-un singur pas. Daca p < Z 2 atunci o submultime
de posibili divizori este asignata la ecare procesor.
44
Figura 1.35: SIMD

Figura 1.36: SIMD: (a) Architecture; (b) In actiune


SIMD. Toate cele p procesoare identice opereaza sub controlul unei singure
secvente de instructiuni ^naintata de o unitate de control centrala. Exista n
secvente de date, una pentru ecare procesor, astfel ^nc^at date diferite pot
utilizate ^n ecare procesor (Figura 1.35). Procesoarele opereaza sincron si
ceasul global asigura executarea la ecare pas (tic de ceas global) a aceleiasi
instructiuni (pe date diferite).
O arhitectura SIMD are un numar mare de procesoare simple (Figura 1.36).
Fiecare procesor are propria sa memorie, este ^n mod tipic conectat la vecinii
sai si executa aceleasi instructiuni pe datele sale locale. Instructiunile sunt
^naintate de procesorul controlor. Aceleasi instructiuni sunt executate sincron
de toate unitatile de procesare. Unitatile de procesare sunt construite pentru a
efectua operatii simple (procesoarele adesea au o constructie speciala; de aceea
un SIMD poate foarte costisitor). Masinile SIMD sunt adesea dependente de
o masina gazda care expediaza o secventa de instructiuni la masina SIMD.
Masinile SIMD sunt ^n particular utile ^n exploatarea paralelismul datelor,
^n rezolvarea problemelor care au o structura regulata, si ^n cazul carora
45
se aplica aceleasi instructiuni la submultimi de date. Un exemplu trivial
ce ilustreaza natura calculelor ^ntr-o masina SIMD este adunarea matriceala
C = A + B . Se stocheaza matricele astfel ^nc^at ecare element se a a pe un
procesor separat. Daca avem n procesoare asezate ^ntr-un plan precum ^ntr-o
2

matrice si conectate cu vecinii cei mai apropiati (4), se pot mapa elementele
Aij si Bij ale matricelor matricele n  n la procesorul pij localizat ^n linia
row i si coloana j ale matricei de procesoare. Cu aceasta distributie, o sin-
gura instructiune de adunare efectuata la unison pe toate procesoarele poate
produce suma (10000 de adunari de exemplu ^ntr-un singur pas pentru ma-
trice patratice de ordin 100). Rezultatul ram^ane distribuit, un element pe un
procesor; ^n particular procesorul pij detine elementul Cij . In acest exemplu,
instructiunea este simpla, dar ^n general poate mai complexa (precum inter-
clasarea a doua liste sortate de numere). Datele pot sa e simple (un numar
de exemplu) sau complexe (mai multe numere). Uneori este necesara consid-
erarea unei submultimi de procesoare la executarea unei instructiuni, adica
numai anumite date trebuie sa e operate de acea instructiune; informatia de
selectie poate codata ^n instructiunea ^nsusi indic^and daca procesorul este
activ (executa instructiunea) sau inactiv (asteapta urmatoarea instructiune).
Un SIMD este usor de programat, dar nu este indicat pentru toate aplicatiile
(este o masina specializata), av^and o exibilitate redusa ^n exprimarea algo-
ritmilor paraleli. Este ^n mod tipic programat utiliz^and notatia matriceala
precum cea din Fortran 90.
Masinile SIMD nu partajeaza memorie, ci au memorie distribuita, un modul
pe ecare procesor si comunicarea datelor se face prin transmitere de mesaje.
Precum calculele, trasmiterea de mesaje este realizata ^n general ^n paralel.
Un SIMD poate procesor vectorial sau procesor matriceal (Fig. 1.37). In
primul caz exista o unitate functionala specializata care executa o instructiune
pe o secventa de date. In cazul secund exista mai multe unitati de memorie,
o retea de interconectare si o unitate de control care difuzeaza instructiuni
la toate procesoarele care le executa ^n memoriile lor. Procesorul matriceal
este indicat pentru calcule simultane pe elemente de matrice (procesor gazda
si un numar de procesoare interconectate conform cerintelor problemei care se
rezolva). De exemplu, ecare procesor se poate ocupa de analiza si ^ntretinerea
unei parti dintr-o baza de date (daca este vorba de o baza de date de personal,
un procesor se ocupa de persoanele de la A-C, altul de la D-F, etc).
Exemple de asemenea calculatoare sunt Illiac IV, Goodyear MPP,
TMC CM-2, si MasPar MP-2. Procesoarele matriceale precum ICL DAP,
Connection Machine CM-200, si MasPar sunt calculatoare SIMD.
Una dintre problemele SIMD este tratarea rami catiilor (Figura 1.38).
MIMD. Este cea mai generala si mai puternica masina din clasi carea Flynn.
Pentru p procesoare ale sistemului exista p secvente de instructiuni si p secvente
de date (Figura 1.39). Procesoarele pot opera asincron, adica pot efectua
instructiuni diferite pe date diferite la acelasi moment de timp. Ca si ^n cazul
calculatoarelor SIMD comunicarea datelor sau a rezultatelor ^ntre procesoare
se face via memorie partajata sau printr-o retea de interconectare. Fiecare
procesor are un control independent, ceea ce indica o exibilitate mare pentru
aplicatii. Nu exista un control (sincronizare) ^ntre toate procesoarele. Pro-
cesoarele sunt mai complexe (datorita controlului propriu) si este posibil sa
46
Figura 1.37: Clasi care SIMD: (a) Arhitectura unui procesor vectorial; (b) Arhi-
tectura unui procesor matriceal; (c) Efectuarea unei instructiuni ^ntr-un pro-
cesor vectorial; (d) Efectuarea unei instructiuni ^ntr-un procesor matriceal

Figura 1.38: Probleme cu SIMD: inactivitatea unei submult


imi de procesoare
(cele ne^ncadrate la pasul 1 si 2)

47
Figura 1.39: MIMD

Tabelul 1.9: Sisteme MIMD cu memorie partajata sau distribuita


Memorie distribuita Memorie partajata
Numar de procesoare mare (100 la 1000) modest (10 la 100)
Performanta peak ridicata modesta
Expansiune nelimitata limitata
Utilizare la capacitate di cila usoara
Programare paralela revolutionara evolutionara
e utilizate procesoare cu scop general, costul sistemului ind mult mai redus
dec^at ^n cazul unui SIMD. Tehnologiile de control ale tra cului pe magistrale
sau ^n reteaua de comutatoare determina rata de acces a datelor.
Exemple de asemenea sisteme sunt Cray Y-MP, Cray T3D, IBM SP2, Intel
Paragon, TMC CM5, Convex SPP-1200.
Un MIMD are procesoare complet independente ce comunica ^ntre ele via
memoria partajata (o memorie accesibila la toate procesoarele; instructiunile
pot executate pe orice locatie de memorie) sau via retea de interconectare
(memorie distribuita ^ntre procesoare, procesoarele executa instructiuni pe
datele proprii, iar datele sunt pasate ^ntre procesoare via mesaje). Calcu-
latoarele MIMD cu memorie partajata sunt cunoscute drept multiprocesoare
(exemple sunt cele produse de Encore si Silicon Graphics), iar cele cu retea
de interconectare sunt cunoscute drept multicalculatoare (exemple: Intel
Paragon, nCUBE-2, si retelele de transputere { "computer cu transmitere").
O comparare succinta a sistemelor cu memorie partajata si cele cu memorie
distribuita este prezentata ^n Tabelul 1.9. Intr-un sistem cu memorie parta-
jata, precum cel din Figura 1.40.a, toate procesoarele au acces la elementele
matricelor A(1:100) si M (1:10,1:10) din memoria globala. Intr-un sistem cu
memorie distributa ecare procesor poate accesa rapid numai datele alocate
memoriei sale locale.
Retele de comunicare pot sa aiba con guratii variate: comutatoare, magis-
trala, arbore, hipercub, etc (Figura 1.41). Importanta este modalitatea de
comunicare simultana a procesoarelor si viteza comunicarii.
48
Figura 1.40: Distribut
ia datelor: (a) Memorie partajata; (b) Memorie dis-
tribuita

Figura 1.41: Retele de comunicare sau interconectari bazate pe magistrala

Figura 1.42: Multiprocesoare: (a) Cu memorie partajata bazate de magistrala;


(b) Cu memorie distribuita bazate pe retea de conectare; (c) Cu memorie par-
tajata distribuita bazate pe retea
SM-MIMD. Un multiprocesor MIMD cu memorie partajata (SM-MIMD)
are o singura memorie care poate accesata de oricare dintre proce-
soare. Primele masini SM-MIMD ofereau acces la memorie printr-o magis-
trala cu o latime de banda mare (prin utilizarea cache se poate reduce
latenta memoriei); aceasta conecteaza toate procesoarele la memorie ^ntr-o
maniera liniara. Printre asemenea masini se remarca Encore Multimax si
Sequent Balance. Alliant FX/8 este o masina similara, cu un procesor vec-
torial atasat la ecare procesor; este astfel un multiprocesor MIMD cu memorie
partajata/procesor-vectorial (SM/V-MIMD). Alte exemple de SM/V-MIMD
sunt Convex C3, Cray X-MP si Cray Y-MP.
In sistemele cu memorie partajata bazate pe magistrala (Figura 1.42) con-
trolul procesoarelor si a magistralei este complex. Modelul de programare este
cel cu adrese globale, usor de programat. Numarul de procesoare este uzual
49
^ntre 2 si 16. Datorita limitarilor tra cului pe magistrale, majoritatea multi-
procesoarelor de acest tip au p^ana la 30 procesoare.
O problema greu de depasit ^n cazul multiprocesoarelor SM-MIMD este
scalabilitatea, adica abilitatea de a creste performanta odata cu cresterea
numarului de procesoare. C^and numarul de procesoare creste, creste si tra -
cul pe magistrala ce conecteaza memoria partajata si procesoarele. Cresterea
latimii de banda a magistralei slabeste aceasta dependenta. Totusi numeroase
programe necesita utilizarea unor variabile comune de catre majoritatea sau
de catre toate procesoarele. Daca valoarea variabilei este actualizata de ecare
procesor, atunci procesoarele trebuie sa se alinieze astept^and accesul serial la
acea variabila. Fenomenul este numit competitie (disputa, contention). Daca
ecare dintre procesoare are un cache privat, variabilele comune pot tinute
acolo, elimin^and ^n parte problema. Daca variabila este modi cata, atunci
ecare cache trebuie actualizat { problema coerentei cache.
DM-MIMD. In sistemele MIMD cu memorie distribuita (de exemplu Meiko
CS2, Cray T3D), ecare procesor ruleaza programe pe datele locale. Memoria
este distribuita ^ntre procesoare si procesoarele sunt conectate printr-o retea.
Un procesor ^mpreuna cu memoria sa asociata este numit nod. Nodurile ex-
pediaza mesaje la alte noduri si receptioneaza mesaje ce contin date de la alte
noduri. De aceea asemenea masini sunt numite calculatoare MIMD cu transfer
de mesaje. Numarul de procesoare poate de ordinul miilor. Sistemul este
^nsa usor de scalat.
Reteaua ce uneste nodurile este construita ^n diferite modalitati (de exemplu
la Intel Paragon formeaza o structura de grila regulata). Reteaua de noduri
este adesea conectata la o masina gazda ce este ^n mod uzual o statie de lucru
care trateaza intrarile si iesirile multiprocesorului si este utilizat pentru editare,
compilare si stocare de programe.
Costul de comunicare a datelor ^ntre diferite noduri este un element im-
portant ce afecteaza performanta masinii. Costul comunicarii inter-procesoare
depinde de marimea mesajelor, distanta dintre procesoare, tra cul pe retea,
etc. In sistemul Intel iPSC/1 ce se bazeaza pe o conectare de tip hipercub
este necesar pentru pasarea unei valori^ntre doua noduri ^n jur de 1000 ori mai
mult timp dec^at pentru accesarea unei valori din memoria locala. Odata cu
^mbunatatirea tehnologiilor de comunicare, factorul s-a redus ^nsa ram^ane un
factor de performanta important.
Un alt exemplu de DM-MIMD este CM-5 de la Thinking Machines
Corporation. Fiecare dintre nodurile sale contine patru procesoare vectori-
ale; de aceea masina poate descrisa drept multiprocesor MIMD cu memorie
distribuita/procesor-vectorial (DM/V-MIMD).
Programarea unor asemenea calculatoare se face la nivel scazut, adica tre-
buie speci cate comenzi de expediere si receptionare individuale. Linda, Dini
si HPF ^ncearca sa simpli ce acest proces.
Un cluster (grup) de statii de lucru conectate printr-o retea poate consid-
erat drept DM-MIMD cu timpi de comunicare lungi ^ntre procesoare. IBM SP1
a fost initial construit dintr-un cluster de statii de lucru IBM RS/6000 conec-
tate ^ntr-o retea. Daca toate statiile de lucru au acelasi tip, acest fel de mul-
tiprocesor este numit cluster omogen. Clusterele heterogene sunt compuse din
tipuri diferite de statii de lucru conectate ^mpreuna ^n aceeasi maniera. Clus-
50
1.43: Cluster
Figura

terele de procesoare (Figura 1.43) sunt conectate via o magistrala de viteza


mare pentru comunicare ^n cluster si o retea de interconectare ^ntre clustere.
Sistemul PVM (Parallel Virtual Machine) a fost dezvoltat pentru a trata
detalii de transmitere de mesaje pentru acest tip de multiprocesoare. MPI
(Message-Passing Interface) este astazi un standard pentru toate masinile
cu transmitere de mesaje, incluz^and si clusterele de statii de lucru.
In sistemele cu memorie distribuita bazate pe retea de interconectare un
model de programare comun este program-singular date-multiple (SPMD). Pro-
gramarea SPMD este di cila deoarece necesita adresarea locala si transmiterea
de mesaje explicita.
S/MD-MIMD. Arhitectura cu memorie distribuita ofera scalabilitate, iar
memoria partajata ofera usurinta ^n programare. Astfel apare naturala ideea
de a implementa un mediu virtual partajat pe hardware distribuit. Sis-
temele cu memorie partajata distribuita bazate pe retea de interconectare
partajeaza avantajele memoriei partajate si cele ale memoriei distribuite:
usurinta ^n programare si scalare. Este di cila ^nsa implementarea coerentei
cache. Anumite arhitecturi MIMD sunt construite drept DM-MIMD, dar au
software care le permite sa se comporte drept SM-MIMD (S/DM-MIMD).
Datele sunt pasate de la memoria unui procesor la memoria unui alt pro-
cesor fara transmiterea de mesaje explicita, permit^and astfel programe sim-
ple. BBN Butterfly a fost una dintre primele masini de acest tip (retea
uture). Sistemul KSR1 de la Kendall Square Research este de aseme-
nea membru al acestui grup de multiprocesoare (32 de procesoare legate ^n
inel si inelele sunt conectate ^ntr-o structura de arbore). Alte exemple sunt
Cray T3D, Intel Paragon, SGI Origin, HP-Convex, SUN Enterprise.
1.3.2 Exemple de masini paralele
Statiile de lucru au performanta teoretica maxima (peak)^ntre 10100 M ops,
pe c^and super-calculatoarele ^ntre 500 M ops  100 G ops. Tabelul 1.10 lis-
teaza performantele anumitor statii de lucru. Viteza de operare si peak pot
substantial diferite, precum este ilustrat ^n tabel: viteza indicata de LinPack
este substantial sub viteza peak a acestor sisteme.
2 Rezumat: Firmele mari producatoare de calculatoare manifesta interes ^n dezvoltarea cal-
culatoarelor cu mai multe procesoare si prezinta pe piata solutii arhitecturale foarte variate.

51
Tabelul 1.10: Statii de lucru tipice la nivelul anului '95 si performanta lor
Statie de lucru Producator Ceas SPEC LinPack Peak
MHz mark M ops M ops
Sparc10/40 SUN Microsystems 40.0 60.2 10.0 40
RS6000-350 IBM 41.6 74.2 19.0 84
Power2-990 IBM 71.5 260.4 140.0 286
5000/240 DEC: Digital Equipment 40.0 35.8 5.3 40
9000/735 HP: Hewlett-Packard 99.0 167.9 41.0 200
Indigo R4000 SGI: Silicon Graphics 50.0 60.3 12.0 |
Crimson SGI: Silicon Graphics 50.0 63.4 16.0 32

Tabelul 1.11: O lista scurta cu super-calculatoare si performanta lor maxima


Masina Producator Numar de Teor. Peak
procesoare (G ops)
CM 5 Thinking Machines 16384 2000
Y-MP Cray Research 16 15
T3D Cray Research 2048 307
ES/9000 IBM 6 2.7
9076 SP2 IBM 128 32
iPSC/860 Intel 128 7.7
Paragon Intel 4000 300
KSR2 Kendall Square Research 5000 400
MP-2 MasPar 16384 2.4
SX-A NEC: Nippon Electric Company 4 22
Tabelul 1.11 ofera o lista scurta de super-calculatoare. Se poate a rma
^ntr-un mod brutal ca avantajul^n ceea ce priveste viteza unui super-calculator
relativ la o statie de lucru ^nalt performanta este exprimata printr-un factor de
1000, pretul ind aproximativ acelasi.
Performantele uni-procesoarelor si ale multi-procesoarelor pot masurate
cu pachete precum LinPack (Figura 1.44).
Cray Research Inc. fondat ^n '72, este creatorul super-calculatoarelor
de tip vectorial si mai t^arziu masiv paralele: Cray-1 ('76), Cray-2('85),
XMP ('82), YMP ('87), C90 ('92), J90 ('93), T3D ('94), T90 ('95), T3E ('96).
Silicon Graphics Inc. (SGI) fondat ^n '81 s-a bazat initial pe v^anzarea
de statii gra ce. In '96 a introdus paralelismul odata cu Origin 2000 (200
MHz, 400 M op/s) un sistem scalabil si accesibil. IBM a introdus SP2 ^n '94
bazat pe cipuri de statii de lucru. Intel a experimentat destul de timpuriu
masinile hipercub ('82-'90). HP Convex, introdus ^n '94, a unit cunostiintele
despre statii de lucru. Alte companii au introdus de asemenea calculatoare
paralele care se a a pe piata: Fujitsu, NEC, Hitachi, Tera, Meiko.
Printre SIMD cu memorie distribuita se remarca DEC MasPar MP-1,
MP-2 Thinking Machine CM-2.

52
Figura 1.44: Performanta masurata cu ajutorul LinPack (n este numarul de
ecuatii liniare)
Exemple de MIMD cu memorie partajata, tip calculator vectorial, sunt
NEC SX, Cray J90/T90. Alte procesoare vectoriale sunt prezentate ^n Tabelul
1.12. Printre MIMD cu memorie partajata se remarca si Cray C90, Cray Y-MP,
Alliant FX-80, Kendall Square KSR1, NEC SX-4, Sun Enterprise, Cray Y--MP
C916, T32, NEC SX-3, SX-4, Hitachi S820, Fujitsu VP2600. MIMD cu me-
morie partajata distribuita sunt SGI Origin, HP-Convex si SUN Entreprise.
MIMD cu memorie distribuita sunt Cray T3E, IBM SP, Fujitsu VPP (vector),
Intel Paragon, Intel iPSC/860, IBM SP-1, Cray T3D, Cray/SGI T3E,
Fujitsu VPP500, IBM SP-2, Meiko CS-2, nCUBE2, nCUBE3, Parsytec
GigaCube GC-2, Thinking Machines CM-5, clustere de procesoare precum
COWS, NOWS, Beowulf, retele de statii de lucru. Masini ce implementeaza para-
lelismul datelor sunt Thinking Machines CM-1, CM-2 si CM-5, Maspar MP-1
si MP-2, Wavetracer.
1.3.3 Taxonomii diverse
Instructiuni sincrone sau asincrone. Se pot identi ca doua tipuri dis-
tincte de calculatoare paralele corespunzator modalitatii ^n care respecta
instructiunile: sincron sau asincron. Ulterior aceastea pot clasi cate si dupa
modalitatea ^n care comunica informatia (prin partajarea unui spatiu de me-
morie sau prin expedierea de mesaje) si apoi dupa natura zica a retelei.
3 Rezumat: O serie de termeni sunt asociati cu sistemele multi-procesoare: sincronicitate,
simetrie, masivitate, retele de interconectare, granularitate.

53
Tabelul 1.12: Exemple de masini vectoriale
Procesor An Rata ceas Registrii Elemente Unitati fct.
Cray-1 '76 80 8 64 6
Fujitsu VP100/200 '82 133 8-256 32-1024 3
Hitachi S810/820 '83 71 32 256 4
Cray X-MP '83 120 8 64 8
NEC SX/2 '84 160 8 256 16
Cray-2 '85 166 8 64 5
Convex C-1 '85 10 8 128 4
Cray Y-MP '88 166 8 64 8
DLXV '90 200 8 64 5
Cray C-90 '91 240 8 128 8
Convex C-4 '94 135 16 128 3
NEC SX/4 '95 400 8 256 16
Cray J-90 '95 100 8 64 4
Cray T-90 '96 500 8 128 8
Calculatoarele paralele cu memorie distribuita ^n care procesoarele indi-
viduale executa instructiuni asincron sunt etichetate DM-MIMD cu (Intel
iPSC/2, iPSC/860, Paragon). Calculatoarele paralele ale caror instructiuni se
executa asincron ^nsa partajeaza un spatiu de adresare comun (Cray Y-MP si
C-90, IBM SP1 si SP2, SGI Challenge, Convex Exemplar) sunt adesea referite
drept SM-MIMD. Calculatoarele paralele^n care procesoarele opereaza sincron
(Maspar MP1 si MP2) sunt de tip SIMD. Primul calculator paralel real Illiac IV
terminat ^n jurul anului '70 a apartinut acestei clase.
In cazul pipeline, se aplica tehnici asemanatoare unei linii de asamblare
pentru a mari performata. Comunicatiile sunt bazate pe zone tampon si de
aceea asincrone.
Arhitecturi SMP, MPP, si VSM. Un multiprocesor simetric (Symmetric
Multiprocessors, SMP) este o arhitectura cu memorie partajata (Figura 1.45).
Are un numar mic de procesoare care se pot comporta independent. Fiecare are
acces la memorie prin intermediul unei magistrale. Este o arhitectura matura
^ncep^and de la Cray X-MP ce este simplu de programat (fara comunicatii ex-
plicite). Din pacate, are o scalare slaba datorita problemelor de g^atuire a acce-
sului la memorie. Multiprocesarea simetrica trateaza toate procesoarele drept
egale. Fiecare procesor poate efectua sarcinile oricarui alt procesor si aplicatiile
sunt divizate ^n re care pot rula concurent pe orice procesor disponibil. Un
sistem SMP ruleaza aplicatii ce pro ta de paralelismul multi-thread-urilor si
presupune un sistem de operare ce suporta acest tip de concurenta (Unix,
OS/2, Windows NT). Exemple de aplicatii care pro ta de arhitectura SMP in-
clud suita Microsoft BackOffice, precum si managerele de baze de date SQL
precum Oracle, Sybase si Informix.
Un multiprocesor masiv paralel (Massively Parallel Processing, MPP)
este o arhitectura cu memorie distribuita (Figura 1.46) care are un numar
mare de procesoare ce se comporta independent. Fiecare procesor are propria
54
Figura 1.45: SMP: (a) Arhitectura; (b) In actiune

Figura 1.46: MPP: (a) Arhitectura; (b) In actiune


sa memorie, este conectat cu alte procesoare si comunica via pasare de mesaje.
Timpul de acces la memorie este mai rapid pentru memoria locala dec^at pentru
memoria a ata la distanta. Un asemenea sistem este mai ieftin si mai scalabil
dec^at arhitectura cu memorie partajata, dar este mai greu de programat.
Memoria partajata virtual (Virtual Shared Memory, VSM) are un design
hibrid (Figura 1.47) ce permite ca o masina cu memorie distribuita sa se com-
porte ca o masina cu memorie partajata. Are un numar mare de procesoare ce
lucreaza independent, ecare procesor av^and propria sa memorie. Este scalabil
si usor de programat. Accesul la memorii la distanta este direct (^n spate ind
o comunicare pe retea).
Paralelism ^n date si paralelism functional. Din categoria arhitecturilor
ce exploateaza paralelismul datelor se numara arhitecturile vectoriale, arhitec-
turile neuronale si asociative, arhitecturi sistolice, SIMD. Din categoria arhi-
tecturilor ce exploateaza paralelismul functional se remarca ILP (procesoare
pipeline), VLIW, procesoarele superscalare, cele care exploateaza concurenta
relor de control, MIMD cu memorie distribuita sau partajata. In cazul para-
lelismul^n date, o anumita operatie este efectuata ^n paralel pe diferite instante
ale datei (consistenta cu arhitectura SIMD, dar poate de asemenea rula pe un
MIMD ^n versiunea SPMD). In cazul paralelismului functional, diferite proce-
duri sau operatii, ecare cu datele proprii, pot efectuate^n paralel (consistent
cu arhitectura MIMD). Ambele forme pot sa apara ^ntr-o aplicatie.
55
Figura 1.47: Arhitectura VSM

Figura 1.48: Tipuri SAS: (a) UMA; (b) NUMA; (c) NUMA distribuit
Arhitectura SAS. Arhitectura cu spatiu de adresare partajat (shared-
address-space architecture, SAS) este un sistem ce ofera suport hardware
pentru citirea si scrierea de catre toate procesoarele la un spatiu de adresare
partajat. Procesoarele interactioneaza prin modi carea datelor din spatiul de
adresare partajat. Arhitectura SAS este divizata ^n trei clase (Figura 1.48): cu
acces uniform la memorie (Uniform-memory access, UMA), cu acces ne-uniform
la memorie (Non-uniform-memory access, NUMA) si NUMA cu memorie locala.
Retele de interconectare. Calculatoarele SAS sau cu transfer de mesaje
pot construite conect^and procesoare si unitati de memorie printr-o vari-
etate de retele de interconectare. O retea de interconectare statica consista
din legaturi de comunicare punct-la-punct ^ntre procesoare, care este ^n mod
tipic utilizata pentru a construi calculatoare cu transmitere de mesaje. O
retea dinamica este construita utiliz^and comutatoare si legaturi de comunicare
{ legaturile de comunicare sunt conectate ^ntre ele dinamic prin elemente de
comutare pentru a stabili drumuri ^ntre procesoare si unitatile de memorie (^n
mod tipic utilizata ^n constructia unui SAS).
Granularitatea procesoarelor. Un calculator paralel poate compus din
diferite tipuri de procesoare. In cazul calculatoarelor cu granulatie grosiera,
exista un numar de procesoare puternice (de exemplu, la Cray Y-MP ^n jur de
8 la 16 procesoare). Calculatoarele cu granulatie na au un set relativ mare
de procesoare mai putin puternice (de exemplu MasPar are 16K procesoare).
56
Figura 1.49: Discuri: (a) Organizare secventiala; (b) Organizare distribuita
1.13: Exemple pentru clasi carea Handler
Tabelul

Masina Flynn Handler


MPP SIMD < 1; 16384; 1 >
Cray-1 SISD < 1; 12  8; 64  (1  14) >
C.mmp MIMD < 16; 1; 16 > + < 1  16; 1; 16 > + < 1; 16; 16 >

Figura 1.50: Cuplare si ^ncredere ^n diferite arhitecturi multiprocesor


Calculatoare cu granulatie medie sunt de exemplu CM5 si Paragon.
I/O pe masinile paralele. In sistemele de siere obisnuite, exista un singur
disc la unul dintre procesoare. Toate cititile/scrierile trebuie sa treaca prin
reteaua de comunicare (Figura 1.49). In cazul distribuit mai multe sau toate
procesoarele au discuri locale, ceea ce ^nseamna o ^ncarcare mai mica a retelei.
Clasi carea Handler. Un calculator este descris printr-un triplet ce contine
6 valori: T (C0) =< K  K 0; D  D0 ; W  W 0 >, unde K este numarul de
procesoare, K este numarul de procesoare care pot pipeline, D este numarul
de ALU a ate sub controlul unui procesor, D0 este numarul de ALU care pot 0
pipeline, W este lungimea unui cuv^ant acceptat de ALU sau procesor, iar W
este numarul de faze ^n toate ALU sau ^ntr-un procesor. C^ateva exemple sunt
prezentate ^n Tabelul 1.13.
Convergenta arhitecturala. Fiecare tehnologie are limite si costuri xe.
Arhitectura densa are o serie de avantaje, ^nsa apar probleme de disipare a
caldurii, depanare, mentinere si cost (Figura 1.50). Costul depinde de numarul
57
Figura 1.51: Mecanism de control al proceselor: (a) Trecut, curent; (b) Viitor

Figura 1.52: Convergenta arhitecturilor paralele


de procesoare, de cel al unitatilor de memorie, al dispozitivelor de I/O si de
reteaua de intercomunicare. O masina scalabila ^n ^ntelesul ideal al cuv^antului
nu exista. Scopul este designul masinilor scalabile ^n limitele unui interval (doi
la zece, zece la sute, sute la mii).
Modelele de programare sunt distincte ^nsa organizarea si implementarile
converg (Figura 1.51): nodurile sunt conectate prin retele generale si asistenti
de comunicare, paralelismul este generat ^n programe de nivel ^nalt ca rezultat
al unor apeluri de functii si cicluri paralele. Rezultatul unui asemenea design
este esential un NUMA cu suport direct pentru o multime de re de control
(Figura 1.52), o masina SAS cu memorie distribuita care la nivel de baza este
o masina cu transmitere de mesaje (diferenta consta ^n e cienta abstractizarii;
masinile SAS sunt specializate^n tratarea e cienta a operatiilor de citire/scriere
si comunicare a liniilor cache).
Majoritatea serverelor sunt astazi SMP bazate pe magistrala (SUN
Enterprise 10000, HP Convex). Modelul de programare majoritar este SPMD.

58
2. Teoria calculului paralel
2.1 Masurarea performantei
Pentru a cuanti ca performanta algoritmilor concurenti este necesara de nirea
unor metrice de performanta sau masuri de complexitate. Acestea sunt similare
cu masurile de complexitate exprimate ^n timp si spatiu la calculul secvential.
In mod tipic performanta este caracterizata printr-o functie de n, dimensiunea
problemei, si p, numarul de procesoare.
2.1.1 Timpul de rulare
Fie TS (n) complexitatea de timp secventiala pentru o problema data si e
TC (n; p) timpul de rulare a algoritmului concurent pentru aceeasi problema pe
p procesoare. O regula evidenta este TS (n)  TC (n; 1).
Timpul de executie al unui algoritm paralel este timpul care se scurge ^ntre
momentul la care un prim procesor porneste executia algoritmului si c^and un ul-
tim procesor termina executia algoritmului. Timpul de executie a unui procesor
este Tcalc + Tcom + Tinactiv unde Tcalc este timpul de calcul, Tcom este timpul de
comunicare, si Tinactiv este timpul c^at procesorul este inactiv (^n timpul rularii
algoritmului). Timpul mediu de executie este p Ppi (Tcalcul
1 i + Tcom
1 i +T i
inactiv ).
Timpul de executie al algoritmului paralel este mai mare dec^at timpul mediu.
=0

Timpul de comunicare este timpul petrecut ^n comunicarea dintre proce-


soare. Poate interprocesoare, adica ^ntre procese sau sarcini localizate pe
procesoare diferite, sau intraprocesor, ^ntre procese sau sarcini localizate pe
acelasi procesor. Parametrii ^n determinarea timpului de comunicare ^ntr-un
sistem cu transfer de mesaje sunt: timpul de pornire, timpul per-hop, tim-
pul de transfer per cuv^ant. Timpul de pornire (de startare), notat ts , este
timpul necesar tratarii mesajului la procesul expeditor, incluz^and timpul de
pregatire al mesajului, timpul de executie al algoritmului de rutare si timpul
de stabilire a interfetei dintre procesor si ruter. Timpul per-hop, notat th, este
timpul necesar transferului capului de mesaj ^ntre procesoare direct conectate.
Este cunoscut si drept latenta nodului. Timpul de transfer per cuv^ant, notat
tw , este timpul necesar unui cuv^ant pentru a traversa o legatura directa ^ntre
doua procesoare. Daca latimea de banda a unui canal este de r cuvinte per
secunda, atunci timpul de transfer per cuv^ant este tw = 1=r. Valorile ts si
tw pot obtinute experimental sau din documentatia oferita de producatorii
masinii. In general ts  tw ; astfel pentru un numar m mare de cuvinte ale unui
mesaj, ts nu este semni cativ, dar pentru m mic, ts poate domina timpul de
comunicare. Timpul de comunicare depinde ^ntr-o anumita masura de dimen-
siunea problemei, poate varia functie de localizarea procesoarelor comunicante
(daca procesoarele nu sunt uniforme), si poate varia cu schimbarea numarului
1 Rezumat: Timpul de executie a unei aplicatii pe mai multe procesoare include nu numai
timpii de efectuare a calculor ci si timpii necesari comunicarii unor informatii ^ntre procesoare
si timpii de inactivitate a procesoarelor ^n timpul rularii aplicatiei.

59
de procesoare. Modelul liniar al intercomunicarii dintre procesoare presupune
ca Tcom = ts + tw m unde m este lungimea mesajului ^n cuvinte.
Timpul de inactivitate este di cil de determinat. Poate timpul datorat
lipsei de date sau calcule. Combinarea unei structurari propice a programului
cu tehnicile de echilibrare a ^ncarcarii pot conduce la reducerea inactivitatii.
2.1.2 Accelerare si e cienta
C^and se analizeaza performanta unui program paralel pe un multiprocesor,
aceasta este uzual comparata cu perfomanta aceluiasi program pe un singur
procesor al aceleiasi masini.
Accelerarea. Scopul aplicatiilor ce utilizeaza masini paralele este accelera-
rea. Accelerarea prin utilizarea a p procesoare este raportul dintre performanta
aplicatiei ce exploateaza p procesoare si performanta aplicatiei ce foloseste un
procesor. Pentru o problema de marime xa (multimea datelor de intrare),
performanta este 1/timp. Timpul de executie ^n contextul dat si ^n cazul
uni-procesor poate : cel al algoritmului paralel pe un procesor al masinii pa-
ralele (caz 1), cel al algoritmului secvential cel mai apropiat pe un procesor al
masinii paralele (caz 2), cel al celei mai bune implementari secventiale pentru
rezolvarea problemei pe un procesor al masinii paralele (caz 3) sau cel al celei
mai bune implementari secventiale pe o masina standard comun acceptata (caz
4). Cazul (3) este mai onest dec^at (1) sau (2) pentru utilizatori; (2) este utilizat
de arhitectii masinilor pentru a testa performanta masinii; (4) este utilizat si
la evaluarea performantei masinilor uniprocesor.
Notam cu TC (n; p), sau mai simplu Tp(n), complexitatea ^n timp a algorit-
mului concurent ce utilizeaza p procesoare pentru a rezolva problema de marime
n si TC (n; 1), sau T1(n), complexitatea^n timp a algoritmului concurent pen-
tru problema de marime n ce utilizeaza un numar nelimitat de procesoare.
Accelerarea S (n; p) (speedup) a unui algoritm concurent ce utilizeaza p
procesoare, pentru o problema de marime n, este raportul dintre complexitatea
de timp secventiala a problemei si complexitatea de timp necesar rezolvarii
aceleiasi probleme utiliz^and p procesoare:
T (n)
S (n; p) = S :
TC (n; p)
De obicei algoritmul secvential cu care se compara este cel mai bun (cel mai
rapid, daca exista; cazul 3) pentru problema data si poate chiar diferit de
algoritmul concurent caracterizat. Astfel acceleratia unui algoritm paralel este
raportul dintre timpul necesar rularii celui mai bun algoritm pe un procesor al
masinii paralele si timpul rularii pe p procesoare ale aceleiasi masinii paralele.
In situatia ideala, ecare parte a programului poate rulat ^n paralel si
accelerarea va egala cu p. In acest caz spunem ca algoritmul etaleaza o
accelerare liniara. De obicei egalitatea nu este posibila, S (n; p) < p, si algo-
ritmul paralel este considerat foarte bun daca accelerarea sa se apropie de p.
2 Rezumat: Accelerarea este m asura standard pentru a indica factorul de reducere a tim-
pului de executie a unei aplicatii cu cresterea numarului de procesoare utilizate. E cienta
indica gradul de utilizare a procesoarelor disponibile pentru o aplicatie data. Sunt de preferat
valorile ridicate ale accelerarii si e cientei.

60
Figura 2.1: Accelerare: (a) Sub-liniara; (b) Pentru un numar dat de procesoare,
accelerarea creste cu dimensiunea problemei n
Sursele de ine cienta care contribuie la accelerarea subliniara (Figura 2.1) sunt
concurenta insu cienta,^nt^arzieriile^n comunicatii sau datorate sincronizarilor.
Daca accelerarea unui program paralel depaseste p, programul este numit
supra-liniar (sau super-liniar). Desi a rmatiile anterioare exclud o asemenea
posibilitate, anumiti algoritmi au aceasta proprietate. In practica, accelera-
rea supraliniara poate observata si ca manifestare a efectelor de sistem cum
ar disponibilitatea a mai multa memorie ^n mediul concurent sau datorita
unor caracteristici anormale ale problemei (^n mod tipic probleme de cautare
cu rami care si marginire). In particular, tehnicile de cautare paralela permit
ecarui dintre procese sa se ^ndrepte spre directii diferite; unele dintre ele pot
ajunge la fundaturi, altele pot ajunge pe cai mai pro tabile, iar odata ce rezul-
tatul este gasit ^ntr-un proces, acesta poate semnala faptul celorlalte procese
care termina cautarea ^nainte de terminarea lor normala.
Accelerarea proprie (sau relativa) este de nita utiliz^and algoritmului paralel
ce ruleaza pe un procesor:
T (n; 1)
Sprop (n; p) = C :
TC (n; p)
Fie Ts timpul necesar pentru operatiile secventiale ale algoritmului paralel,
si e Tk reprezent^and timpul secvential necesar pentru a efectua toate operatiile
paralele. Timpul total al algoritmului executat pe un calculator secvential este
T = Ts + Tk , pe c^and timpul necesar pentru a-l executa pe un calculator
1
paralel cu p procesoare este Tp = Ts + Tk=p. Substituirea valorilor pentru T si 1
Tp ^n ecuatia acceleratiei proprii conduce la Sprop (p) = (Ts + Tk )=(Ts + Tk=p):
Presupun^and ca T este considerata unitatea de timp, Ts este 5% din T si
p variaza ^ntre 1  128 si analiz^and raportul anterior, se observa ca odata cu
1 1

cresterea numarului de procesoare, Sprop tinde spre marginea superioara 1=Ts.


Accelerarea scalata este privita tot ca raportul dintre timpul de executie
necesar celui mai bun algoritm secvential pe un singur procesor si timpul nece-
sar executiei pe procesoare multiple. Accelerarea si accelerarea scalata difera
prin faptul ca pentru a masura accelerarea problema trebuie sa e su cient de
mica pentru a ^ncapea ^n memoria unui procesor (masurare linitata numai la
probleme mici). Pentru gasirea accelerarii scalate se permite estimarea tim-
61
pului de rulare pe un procesor, astfel ^nc^at pot considerate probleme mai
mari. In general costul surplusului datorat rularii concurente creste cu di-
mensiunea problemei ^nsa la o rata mai mica dec^at dimensiunea, astfel ^nc^at
accelerarea este o functie crescatoare de dimensiunea problemei (Figura 2.1.b),
iar utilizarea accelerarii scalate permite masurarea unor accelerari mai mari.
Accelerarea "normala" este masurata pentru dimensiune constanta a pro-
blemei (rezolvarea mai rapida a aceleiasi probleme). Accelerarea scalata este
masurata utiliz^and constr^angeri de scalare de memorie sau de timp. In primul
caz se ajusteaza dimensiunea problemei astfel ^nc^at stocarea maxima per pro-
cesor este constanta (rezolvarea de probleme mai mari pe masina). Daca n este
dimensiunea problemei pe un procesor, atunci
mem (p) = TS (n)
Sscal
TC (np; p)
In cazul constr^angerilor de timp, dimensiunea problemei este ajustata astfel
^nc^at timpul de executie este constant (probleme mai mari ^n timpul dat).
Una dintre probleme care se pune este care metrica, timpul sau accelerarea,
re ecta performanta mai bine. Utilizarea unei variante sau a celeilalte depinde
de context. Timpul de executie este indicat ^n compararea masinilor. Acce-
lerarea nu poate folosita ^n acest caz, except^and cazul ^n care raportul se
refera la implemetarea celui mai bun algoritm pe o masina standard comun ac-
ceptata (cazul 4; altfel cu c^at este mai lenta performanta uni-procesor, cu at^at
mai buna este accelerarea). Accelerarea este indicata la evaluarea gradului de
concurenta exploatat fata de cazul utilizarii unui singur procesor a unei masini
(de asemenea pentru a determina daca o ^ncarcare de lucru data este indicata
pentru testarea naturii paralele a arhitecturii). Accelerarea poate conduce ade-
sea la concluzii false. Accelerarea izolata fara a lua ^n calcul procesorul este
nerealista si fara sens. Accelerarea poate utilizata pentru studierea ^n izo-
lare a scalarii unui algoritm pe un calculator, sau ca variabila adimensionala ^n
teoria scalarii, ^nsa nu trebuie utilizata pentru a compara algoritmi diferiti pe
acelasi calculator, acelasi algoritm pe calculatoare diferite, sau structuri diferite
de interconectare. Suplimentar, gradul de utilizare a procesorelor individuale
este o metrica utila pentru arhitect ^n ^ntelegerea perfomantei, dar nu si pentru
utlizator sau pentru compararea masinilor.
E cienta. E (n; p) a unui algoritm concurent pentru o problema este raportul
dintre accelerarea S (n; p) si numarul de procesoare p:
S (n; p)
E (n; p) = :
p
E cienta este astfel accelerarea medie per procesor. Valorile E (n; p) sunt teo-
retic^n domeniul 1=p si 1; valoarea ideala pentru E (n; p) este 1, adica S (n; p) =
p si procesoarele sunt utilizate 100% de-a lungul executiei programului.
Se considera exemplul operatiei de reducere. Este vorba despre adunarea a
n numere pe p procesoare. Fiecare procesor aduna n=p numere secvential (^n
timp (n=p 1)tc, unde tc este timpul de efectuare al unei operatii ^n virgula
mobila). Recursiv, la pasul i, p=2i procesoare vor aduna p=2 i numere ^n
( 1)

62
Tabelul 2.1: Accelerarea teoretica si e cienta ^n operatia de reducere
n p = 1 p = 2 p = 4 p = 8 p = 16 p = 32
64 11::00 1:97 3:71 6:30 9:00 10:50
00 0:99 0:93 0:78 0:56 0:33
128 1:00 0:99 0:96 0:88 0:72 0::5088
1 :00 1:98 3 :85 7:06 11:55 15
256 11::00 1:99 3:92 7:50 13:42 21:25
00 1:00 0:98 0:94 0:84 0:66
512 11::00 2:00 3:96 7:74 14:60 25:55
00 1:00 0:99 0:97 0:91 0:80
paralel (^n timp tc log p). Timpul secvential este (n 1)tc, iar timpul paralel
este (n=p + log p 1)tc: Atunci
n 1 S n 1
S= ; E= = :
n=p + log p 1 p n + p log p p
Evolutia accelerarii si e cientei sunt prezentate ^n Tabelul 2.1.
2.1.3 Suprasarcina
Daca e cienta, accelerarea per procesor, este E (n; p), atunci suprasarcina este
f (n; p) =
1 1:
E (n; p)
De exemplu, daca cel mai bun algoritm secvential pentru o problema necesita
8 s, si algoritmul paralel necesita 2 s pe 5 procesoare, atunci accelerarea este
8/2=4, e cienta este 4/5=0.8 (80%), iar suprasarcina este 1/0.8-1=0.25 (25%).
Dat ind un anumit grad de paralelism, suprasarcina (surplusul) este bari-
era cea mai mare ^n obtinerea accelerarii dorite. In detalii, surplusul include:
costul pornirii unui r de control sau a unui proces, costul comunicarii datelor
partajate, costul sincronizarii, extra calcule, etc. Fiecare dintre acestea sunt
de ordinul milisecundelor (milioane de ops pe anumite sisteme). Factorii care
limiteaza accelerarea si creaza un o suprasarcina (surplus, overhead) ^n algo-
ritmul concurent sunt cel putin urmatorii (Figura 2.2): concurenta disponibila,
software suplimentar, inechilibrul ^ncarcarii, comunicatiile.
Surplus software. Chiar daca algoritmii secventiali si paraleli efectueaza
aceleasi calcule, surplusul software este de obicei prezent ^n algoritmul paralel.
Acesta include calcule aditionale necesare la descompunerea datelor si asignarea
la procesoare, si alte tipuri de^nregistrari care sunt cerute de algoritmul paralel
dar nu si de algoritmul secvential. Managementul paralelismului si al calculelor
redundante este dependent de programatorul aplicatiei. Un program tipic poate
^mpartit ^n doua parti: sectiuni inerent secventiale (care nu pot rulate ^n
paralel) si sectiuni potential paralele. Partile secventiale sunt adesea mici.
3 Rezumat: Surplusul sau supra-sarcina este motivul principal al limit arii accelerarii si
e cientei aplicatiilor. Include timpi datorati introducerii paralelismului ^n aplicatii.

63
Figura 2.2: Perspectiva procesorului: (a) Secvent ial; (b) Paralel cu patru pro-
cesoare
Metoda de divizare a partii potential paralele este critica. Se cauta ^n general
mentinerea tuturor procesoarelor (egal) ocupate, ^n timp ce comunicarea inter-
procesoare este minimizata.
Surplus datorat inechilibrului ^ncarcarii. Fiecarui procesor trebuie sa i se
asigneze aceeasi cantitate de lucru ^ntre punctele de sincronizare. Altfel anu-
mite procesoare vor inactive astept^and ca celelalte sa ajunga ^n acelasi punct.
Fenomenul este cunoscut drept ne-echilibrarea (sau imbalansul) ^ncarcarii. Ac-
celerarea este limitata de procesorul cel mai ^ncet. Inechilibrul ^ncarcarii este
masurat prin timpii ^n care anumite procesoare sunt inactive datorita paralelis-
mului insu cient (de-a lungul unei faze) sau sarcinilor de marime inegala. Ex-
ista o serie de tehnici pentru evitarea fenomenului precum adaptarea la partile
solicitate ale unui domeniu sau calcule structurate arborescent.
Surplus datorat comunicarii. Deoarece accesarea unor memorii a ate la
distanta (comunicare) sau a unor memorii mari este lenta este preferabil lucrul
asupra datelor locale. Presupun^and ca este imposibila suprapunerea comu-
nicarii si a calculelor, atunci orice timp petrecut ^n comunicarea datelor ^ntre
procesoare reduce accelerarea. Marimea granulatiei este cantitatea de lucru
realizat ^ntre faze de comunicare ale unui algoritm. Se doreste ca marimea
granulatiei sa e mare astfel ^nc^at impactul comunicarii sa e mai mic. Un
algoritm necesita unitati de lucru su cient de mari pentru a rula ^n paralel.
Scopuri diferite ^n programare pot conduce la situatii con ictuale ca cele
prezentate ^n Tabelul 2.2 si sugerate de Figura 2.3.
2.1.4 Cost
Se considera o instanta a unei probleme de dimensiune n, si se considera un
algoritm concurent pentru problema care ruleaza pe p(n) procesoare ^n timp
4 Rezumat: Costul exprim a efortul total al sistemului cu mai multe procesoare ^n rularea
unei aplicatii care nu trebuie sa e mult mai mare dec^at cel al unui sistem cu un procesor.

64
Tabelul 2.2: Cerinte con ictuale
Cerinta Granulatie Programare
Echilibrarea ^ncarcarii na asignare aleatoare sau dinamica
Lucru suplimentar grosiera asignare simpla
Comunicare grosiera descompunere pentru localitate, un
transfer mare amortizeaza surplus, un
transfer mic reduce competitia

Figura 2.3: Tensiuni fundamentale ^n programarea de performanta


TC (n; p). Atunci costul computational al problemei C (n; p) (lucrul sau sarcina,
work) este de nit drept
C (n) = TC (n; p(n))p(n) (cost) sau W (n; p) = pTC (n; p) (lucru)
E cienta este astfel TC (n; 1)=costul per p procesoare. Drept consecinta a
de nitiei de mai sus se poate a rma ca exista un algoritm secvential pentru
problema, cu complexitatea timpului O(C (n)) si pentru orice p  p(n) exista
un algoritm concurent care ruleaza ^n timpul O(C (n)=p). De exemplu, un al-
goritm care necesita n procesoare si un timp log n are un cost n log n. Costul
este numarul total de cicluri utilizate de algoritm.
Algoritmul (respectiv un sistem) paralel este optimal ^n cost (sau cost-
optimal, e cient ^n lucru, lucru-e cient) daca costul rezolvarii problemei cu aju-
torul algoritmului paralel (respectiv pe sistem) este egal cu timpul de executie
al celui mai rapid algoritm secvential cunoscut pe un uni-procesor, except^and
un factor multiplicativ constant, adica nu se efectueaza mai mult lucru dec^at
^n cel mai bun algoritm secvential: C (n) = O(Ts (n)). Un sistem sau algo-
ritm este ine cient (^n cost sau lucru) daca nu utilizeaza toate procesoarele ^n
acelasi timp (daca procesoarele efectueaza lucru inutil, sau sunt inactive, ele
nu contribuie la solutionarea problemei). E cienta unui sistem cost-optimal
este O(1). Drept exemplu, se considera un algoritm paralel de sortare numit
sortare bitonica; acest algoritm necesita n procesoare si un timp O(log n), ast-
2

fel o sarcina de O(n log n); nu este e cient ^n lucru deoarece sortarea seriala
2

se poate realiza ^ntr-un timp O(n log n).


Motivul studierii algoritmilor lucru-e cienti este costul acestora: ciclurile
pierdute costa bani. Utiliz^and un algoritm paralel e cient ^n lucru, nu mai
exista necesitatea celor seriale (se poate rula un algoritm paralel pe un procesor,
algoritmul ind portabil pe un calculator paralel).
Exemplul: adunarea a n numere. Complexitatea algoritmului secvential
este O(n). Se presupune ca este necesara o unitate de timp pentru adunarea a
doua numere si pentru a comunica un numar ^ntre doua procesoare. Adunarea
65
Figura 2.4: Adunarea a n = 16 numere ^ntr-un sistem cu memorie partajata:
(a) Distributia initiala a datelor si primul pas de comunicare; (b) Al doilea
pas de comunicare; (c) Al treilea pas de comunicare; (d) Al patrulea pas de
comunicare

Figura 2.5: Adunare optimala


celor n numere ^ntr-o masina cu memorie partajata este descrisa ^n Figura
2.4, si poate realizata ^n Tp = O(log n); S = O(n= log n); E = O(1= log n).
Algoritmul are e cienta O(1= log n), si de aceea nu este cost-optimal. Una
din cauze este utilizarea a prea multe procesoare. Pentru a obtine o e cienta
mai buna se poate creste granularitatea distributiei datelor prin asignarea a
mai multe date la un procesor. O modalitate naiva pentru a face acest lucru
este designul unui algoritm cu n=p intrari per ecare procesor zic (n este
numarul de intrari, iar p < n este numarul de procesoare), iar ecare procesor
zic simuleaza n=p procesoare virtuale. Complexitatea timpului algoritmului
este: Tp = (n=p) log p + n=p = O(n log p=p), iar e cienta E = S=p = 1= log p,
care nu este optimala. Adunarea optimala este descrisa ^n Figura 2.5. Atunci
Tp = (n=p 1) + log p + log p  n=p + 2 log p. Pentru algoritmul secvential
Ts = (n 1)  n. De aceea
n
S
n=p + 2 log p
= n + 2npp log p ; E
n
n + 2p log p
66
Costul este O(n+p log p). Daca n = O(p log p), atunci E = O(1) (cost-optimal).
Maparea este astfel importanta ^n atingerea e cientei. Functia surplus T pen-
tru adunarea a n numere este: T = p(n=p + 2 log p) n = 2p log p.
0

Daca se cauta timpul de executie minim pentru o dimensiune xa a proble-


0

mei, acesta se poate obtine din dTp=dp = 0. Pentru cazul adunarii a n numere,
Tp = n=p + 2 log p, avem dTp =dp = 2n=p + 2=p = 0. Rezolvarea aceastei
2

ecuatii conduce la p = n=2. Astfel Tpmin = 2 log n. Executia cost-optimala


minima se realizeaza pentru 3 log n 2 log log n.
2.1.5 Reducerea costului de comunicare
Scopul este reducerea componentelor din numitorul expresiei accelerarii. At^at
programatorul c^at si sistemul au un rol important ^n realizarea acestui
deziderat. Arhitectura nu poate face mare lucru ^n cazul ne-echilibrarii
^ncarcarii sau a prea multe comunicari, dar poate reduce stimularea crearii
programelor cu comportare proasta (printr-o numire e cienta, comunicare si
sincronizare), poate elimina comunicarile esuate, poate oferi o numire e cienta
pentru asignare exibila, si poate permite suprapunerea efectiva a comunicarii
cu calculele sau alte comunicari.
Costul comunicarii asa cum este vazut de un proces este
C = f (o + l + nc =m=B + tc s);
unde f este frecventa mesajelor, o este surplusul (suprasarcina) per mesaj (la
ambele capete), l, ^nt^arzierea retelei per mesaj, nc, cantitatea datelor expe-
diate, m, numarul de mesaje, B,latimea de banda de-a lungul unui drum, tc,
costul indus de competitia per mesaj, si s, cantitatea de latenta ascunsa prin
suprapunerea comunicarii cu calculele. Cantitatea din paranteza este costul
unui mesaj. Fara suprapunere, cantitatea de sub paranteza este latenta unui
mesaj. D^andu-se o cantitate de comunicare, scopul este reducerea costului,
adica reducerea termenilor ^n latenta si cresterea suprapunerii.
Reducerea suprasarcinii. o este uzual determinat de hardware si software de
sistem. Programul trebuie sa reduca m prin unirea mesajelor. Unirea datelor
^n mesaje mai lungi este usoara ^n cazul comunicarii regulate, de granulatie
grosiera, dar di cila ^n cazul comunicarilor iregulate, la o granulatie na (^n
cazul acesta este necesara schimbarea algoritmului si a lucrului suplimentar;
datele sunt unite si se determina cine la cine sa expedieze mesaje).
Reducerea ^nt^arzierii datorate retelei. Componenta datorata ^nt^arzierii
retelei este fhth unde h este numarul de hopuri traversate^n retea si th este tim-
pul necesar traversarii unei legaturi directe (incluz^and latenta de comutare per
hop). Reducerea lui f ^nseamna mai putine comunicatii, sau mesaje mai mari.
Reducerea lui h poate realizata prin maparea sabloanelor de comunicare la
topologia retelei (de exemplu ^ntre procesoare vecine). In uenta componentei
^n discutie asupra costului comunicarii depinde de numarul de procesoare si de
valoarea lui th comparata cu celelalte componente.
Reducerea competitiei. Efectele competitiei (disputa, contention, Figura
2.6) sunt cresterea costului mesajelor, reducerea latimii de banda pentru mesaje
5 Rezumat: Pentru cresterea acceler arii si a e cientei o varianta este organizarea comu-
nicarilor: o reducere a acestora este recomandata.

67
Figura 2.6: Competitie: (a) Structurare stap^an-sclavi; (b) Structurare tip ar-
bore
individuale, inechilibru ^ntre procesoare, probleme per de de performanta.
Competitia este usor de ignorat la programare, put^and ^ncetini transferul de
mesaje care nici macar nu necesita acea resursa (^n trecere), cauz^and congestii
la alte resurse dependente (efectul poate devastator). Competitiile pot de
retea si sau de punct nal (punct erbinte). Acestea din urma pot locatii
(la acumularea^ntr-o variabila globala, bariere; solutionare prin utilizarea unei
structurari tip arbore) sau module (comunicari toti-la-toti; solutionare prin
accesul procesoarelor diferite la acelasi nod temporar).
Suprapunerea comunicarilor. Suprapunerea cu calculele si alte comunicari
este realizata pentru a ascunde latenta. Necesita o latime de banda mare si
extra concurenta. Tehnicile utilizare sunt pre-^naintarea, transferul datelor ^n
bloc, multi-threading.
2.1.6 Legile performantei
Legea lui Amdahl. Presupun^and de exemplu ca 50% din timpul de executie
al unui program secvential este petrecut execut^and instructiuni care pot
operate ^n paralel, iar restul de 50% este petrecut execut^and instructiuni care
trebuie efectuate secvential, atunci chiar si ^n cazul cel mai bun, c^and executia
paralela este realizata ^n timpul virtual zero, timpul total de executie este redus
doar la o jumatate. Legea lui Amdahl este o formalizare a acestei observatii.
Legea lui Amdahl spune ca timpul de executie a unei parti a unui program
poate descreste cel mult la timpul secvential petrecut ^n acea parte a progra-
mului. Astfel acele operatii ale unui program paralel care trebuie executate
secvential restrictioneaza accelerarea potentiala a programului, si accelerarea
maxima a unui algoritm este limitata de numarul relativ de operatii care tre-
buie efectuate secvential, adica prin fractia sa seriala. Acesta este unul dintre
motivele pentru care accelerarea nu creste liniar cu numarul de procesoare.
Presupunem ca putem partitiona timpul secvential T ^ntr-o componenta
inerent secventiala si o componenta perfect paralelizabila, iar componenta
secventiala necesita o fractie (fractia seriala) din timpul total. Presupunem
de asemenea ca putem converti algoritmul ^ntr-un algoritm concurent. Atunci
T
TS (n) = T; TC (n; p) = T + (1 ) ;
p
6 Rezumat: Accelerarea nu poate crescut a liniar cu numarul de procesoare. O serie de
legi ^ncearca sa justi ce aceasta observatie.

68
Figura 2.7: Efectul legii lui Amdahl: (a) 10 procesoare; (b) 1024 procesoare
S (n; p) =
T
= 1 ; lim S (n; p) = 1;
T + (1 )T=p + (1 )=p p!1
adica accelerarea maxima care poate atinsa este marginita de inversa fractiei
seriale a algoritmului.
Se considera efectul legii lui Amdahl asupra accelerarii drept functie de
fractia seriala, , pentru p = 10 si p = 1024 procesoare (Figura 2.7). Daca
1% din programul paralel implica un cod serial, accelerarea maxima este 9
pe o masina cu 10 procesoare, dar numai 91 pe o masina cu 1024 procesoare
(accelerarea maxima este 100). Daca = 5%, atunci S  20.
Daca se considera pro lul paralelismului pp(t), ca ind numarul de operatii
la pasul t, atunci accelerarea este
P
pp(t)
S (n; p)  P t :
t jpp(t)=pj
Legea lui Amdahl pare a o veste proasta pentru calculul paralel si pen-
tru calculatoarele cu mii de procesoare. Legea spune ca fractia seriala pune o
constr^angere severa asupra accelerarii care poate atinsa odata cu cresterea
numarului de procesoare. Legea de asemenea sugereaza ca nu este cost-efectiva
construirea sistemelor cu numar mare de procesoare deoarece accelerarea su-
cienta nu va atinsa. Totusi aplicatiile importante care trebuie paralelizate
contin foarte mici fractii seriale, astfel ^nc^at utilizarea unor masini cu numar
mare de procesoare este justi cata.
Legea lui Gustafson. A rma ca accelerarea scalata este p+(1 p) 0 unde 0
este fractia unui cod care este serial pe un calculator paralel, si p este numarul
de procesoare. Adica daca dimensiunea problemei este scalata cu cresterea
numarului de procesoare, accelerarea deviaza numai putin de la valoarea ideala.
Conjunctura lui Minsky. A rma ca algoritmii precum cautarea binara,
rami care si marginire etc, ofera cea mai buna accelerare de log p.
2
Legea lui Moler. Paralelismul variaza cu dimensiunea problemei. Pro-
gramele nu sunt simplu seriale/paralele. Premiul Karp a fost stabilit pentru
primul program care depaseste accelerarea de 200. In '88, o echipa de la labora-
toarele Sandia a raportat o accelerare de peste 1000 utiliz^and un sistem cu 1024
procesoare pe trei probleme diferite. O presupunere implicita a legii lui Amdahl
este aceea ca fractia unui program care este inerent serial, , este independenta
69
de dimensiunea programului { experimentele Sandia au aratat ca aceasta pre-
supunere este falsa. Odata cu cresterea dimensiunii problemei partea inerent
seriala ram^ane aceeasi sau creste cu o rata mai lenta dec^at dimensiunea pro-
blemei. Astfel legea lui Amdahl trebuie exprimata prin S (n; p)  1= (n) astfel
^nc^at daca dimensiunea problemei n creste (n) descreste si S creste. Moler a
de nit un algoritm paralel ca ind e cient daca (n) ! 0 c^and n ! 1.
Teorema lui Sullivan. Accelerarea maxima este o proprietate a structurii
unui algoritm sau program paralel. Accelerarea unui program este min(p; c),
unde p este numarul de procesoare si c este concurenta programului. Daca n
este numarul de operatii ai algoritmului si d este cel mai lung drum prin graf
atunci concurenta este c = n=d.
Teza calculului paralel. Timpul paralel este relationat polinomial de tim-
pul secvential. Aceasta a rmatie nu a fost dovedita ^n general, dar poate
utilizata pentru a determina daca modelul calculului paralel este rezonabil.
Problemele care sunt rezolvate e cient pe masina paralela trebuie sa e
rezolvabile ^ntr-un numar polinomial de pasi. Un algoritmk paralel rapid este
de nit drept unul ce necesita timp polilogaritmic (O(log (n))) utiliz^and un
numar polinomial de procesoare. Se poate formaliza aceasta de nitie utiliz^and
o familie de circuite logice. Un limbaj L apartine clasei NCk (k  1) daca
exista o familie de circuite C astfelk^nc^at C decide L, dimensiunea circuitului
este
S ^n kO(n ), ad^
h ancimea ^n O(log (n)). Clasa NC este de nita drept NC =
k NC . Majoritatea problemelor interesante exista ^n primele c^ateva nivele
NCk , de exemplu sortarea paralela, invertirea matricelor, plani carea joburilor
de marime xa, probleme de cale cea mai scurta, etc. Problemele din ierarhia
NC sunt problemele care pot rezolvate e cient ^n paralel.
2.1.7 Modele de performanta
Modelele matematice de performanta si cost sunt utilizate pentru compara-
rea diferitilor algoritmi paraleli posibili. Ajuta de asemenea la identi carea
ine cientelor ^nainte de implementare si a optimizarilor potentiale. Modelele
pot considera numai anumite aspecte: costul executiei sau scalabilitatea.
Se reamintesc metricele de performanta anterior de nite: complexitatea
secventiala TS (n), timpul de rulare concurent TC (n; p), accelerarea S (n; p) =
TS (n)=TC (n; p), e cienta E (n; p) = S (n; p)=p, costul C (n) = T (n)p(n), precum
si notatiile similare enumerate ^n Tabelul 2.3.
Cele trei tehnici traditionale de evaluare a performantei sunt: modelarea
analitica, simularea si masurarea.
Modelarea analitica a performantei
Modelele de performanta trebuie sa prezica comportarea (costuri) aplicatiilor
pe diferite arhitecturi realistic, dar ^ntr-un mod abstract (^n afara detaliilor
de nivel scazut, de exemplu dependente de masina). Modelul pur analitic este
bazat pe contorul teoretic de operatii. Durata operatiilor individuale trebuie
sa e cunoscuta (estimata). Se stabileste o formula algebrica pentru timp. Se
7 Rezumat: Exist
a mai multe retete pentru exprimarea performantei unei aplicatii pe un
sistem cu mai multe procesoare.

70
Tabelul 2.3: Metrici ale performantei
Metrica Notatie/formula Inteles
Timpul rulare secventiala Ts La rularea celui mai bun al-
goritm secvential
Timpul rulare paralela Tp Timpul algoritmului paralel
Accelerare S = Ts =Tp Supra-liniara daca S > P
E cienta E = S=p In general E < 1
Cost pTp Cost-optimal daca pTp = Ts
Suprasarcina To = pTp Ts To trebuie minimizat
poate realiza fara a pune^n discutie sistemul de calcul (acuratetea este^n multe
cazuri de aceea foarte scazuta).
Analiza asimptotica ofera margini asupra timpului de executie (de exemplu
algoritmul X necesita timp O(n log n) pe O(n) procesoare). In mod tipic se
ofera informatii de cost pentru probleme de marimi mari si numar mare de
procesoare. Se ignora comportarea pentru n si p mici (^n aceste cazuri analiza
nu este de folos), nu se spune nimic despre cost si adesea se presupun modele de
masini paralele ideale. Exista o serie de probleme legate de modelarea analitica
a performantei: dezvoltarea modelelor de timp pentru aplicatii reale poate
foarte greoaie, iar posibilitatea de erori sistematice este foarte mare.
Modelarea performantei prin simulare
Poate realizata prin: emulare (utiliz^and un simulator hardware), metoda
Monte Carlo (simuleaza stari de echilibru, fara dependente de timp), conducere
pe baza de urme (^nregistrarea ordinii^n timp a evenimentelor), sau evenimente
discrete (starile interne discrete ale sistemului).
Modelarea performantei bazata pe masuratori
Acest tip de modelare stabileste formule algebrice de timp baz^andu-se pe
dependente teoretice de timp. Anumiti parametrii liberi sunt utilizati ^n mo-
delare; parametrii sunt calibrati prin masuratori. Modelele comune sunt: mod-
elele liniare de timp, modelul lui Hockney, legile (Amdahl, Gustafson, etc),
pipeline, comunicare, etc.
Modelarea performantei prin modelarea fazelor. Codul este divizat ^n
mai multe faze, pentru care se stabilesc individual modele de timp (care pot
include parametrul necunoscut accelerare). Se potrivesc formulele de timp si
parametrii ecarei faze la masuratori (se veri ca acuratetea potrivirii si fazele
sunt ra nate daca acuratetea este prea scazuta). Modelul de timp a progra-
mului complet este suma modelelor de timp ale fazelor.
Modele liniare de timp. Numeroase modele exprima timpul de executie ca
o functie de timpul de start si faza de executie. Timpul petrecut ^ntr-o faza de
executie depinde ^n mod tipic de parametrii resurselor (numarul de procesoare,
multiplicitatea pipeline, etc) si parametrii problemei (dimensiunea matricei,
lungimea vectorului, lungimea mesajului, etc): tm = t + tc(r; n) unde t este
adesea independent de resurse (r) si dimensiunea problemei (n), pe c^and tc
0 0

depinde adeasea liniar sau invers de resurse si de dimensiunea problemei.


71
Modelul lui Hockney. A fost original dezvoltat pentru unitati vectoriale,
^nsa poate aplicat si la cazuri mai generale. Se presupune ca timpul per
operatie ^ntr-o faza de executie este constant, adica tn = t + tcn; unde t este
timpul de startare si tc este accelerarea ^n faza de executie. Uzual:
0 0

performanta = tn = 1 + rn1 =n ;
n =
1 2

unde r1 = 1=tc este accelerarea pentru probleme de dimensiuni mari, n = = 1 2


t =tc este dimensiunea problemei pentru performanta la jumatate, si n poate
orice metrica a dimensiunii problemei.
0

Legea lui Amdahl. A fost initial dezvoltata pentru stabilirea performantei


unui singur procesor pe un mainframe; poate aplicata si ^n cazuri mai ge-
nerale, astazi ind uzual formulata pentru sisteme paralele. Se presupune ca
timpul ^n faza de executie este invers resurselor disponibile: tp = t + tc=p. In-
terpretarea acestei formule este urmatoarea: avem doua tipuri de lucru, ideal
0

paralel si total serial, iar raportul dintre ele este x (adica dimensiunea proble-
mei este ea ^nsasi xa). Doua formulari sunt comune:
performanta = t1p = 1 + rp1 =p sau performanta = t1p = (1 r) + =p ; 1

1 2 =
unde r1 = 1=t este accelerarea pentru probleme de dimensiune mare (t 6= tc),
p = = tc =t , dimensiunea sistemului la performanta ^njumatatita, p poate
0 0
1 2 0
orice metrica de resursa, r = 1=(t + tc) , accelerarea pe un procesor, si
= tc =(t + tc), raportul de paralelizare.
1 0
0

Legea lui Gustafson. Avem si ^n acest caz doua parti ^ntr-un algoritm:
ideal paralela si total seriala, ^nsa raportul lor relativ nu este x, ci se modi ca
cu dimensiunea problemei. Lucrul paralel se scaleaza cu dimensiunea proble-
mei, pe c^and lucrul serial ram^ane constant: tn;p = t + tcn=p. Dimensiunea
problemei se scaleaza cu numarul de procesoare n = p, tn = t + tc = constant.
0

Pentru un numar mare de procesoare se poate atinge accelerare liniara:


0

performanta = t + tcn = r [(1 ) + p]:


0
tn;p 1

Alte modele de timp. Pipeline. Daca se presupune ca operatia efectuata


este optimala, adica ^n faza de startare t este xat, iar la faza de executie
se obtine un rezultat per ciclu, atunci tn = t + tcn, ating^andu-se modelul
0

Hockney. La procesarea paralela, faza de startare nu se paralelizeaza (t xat),


0

faza de executie se paralelizeaza (un rezultat per ciclu per procesor). Atunci
0

tn;p = t + tc n=p: Daca p este xat se obtine modelul lui Hockney, dar r1 si
n = sunt invers proportionale cu p. Daca n este xat se obtine legea Amdahl
0
1 2
relativ la p. Daca n=p este xat, obtinem legea lui Gustafson.
Comunicari. Problema cheie este dependenta datelor comunicate de
numarul de procesoare. Modelul cel mai simplu exprima tn;p = t + tcn=p;
unde n reprezinta cantitatea totala de date comunicate. Un model mai ra nat
0

este modelul LogP.


72
Sarcinile paralele ce sunt paralelizabile pe toate procesoarele: tp =
sp (n)=(rp p) cu up = 1=p; unde sp(n) este cantitatea de lucru depinz^and de
dimensiunea problemei si numarul de procesoare, 1=p este accelerarea pentru
acest tip de lucru, si up este functia ce caracterizeaza dependenta performantei
de numarul de procesoare.
Sarcina secventiala este independenta de numarul de procesoare utilizat:
ts = ss (n)=rs cu us = 1.
Suprasarcina difera de sarcina secventiala: tO =const cu uO = 1:
Operatia de reducere. Se presupune n  p. O prima parte a calculelor se
efectueaza ^n paralel, iar ultimele p operatii^ntr-o operatie pe baza unui arbore:
 
sr (n) n p log p
tr =
rr p
+ p cu ur = 1; ur = p1 si ur = logp p
1 2 3

Paralelismul limitat. Daca gradul de paralelism dintr-un calcul este mai


mic dec^at numarul de procesoare, putem distinge ^ntre doua cazuri posibile.
Formulam aceasta utiliz^and functia pas (x), care este 0 daca x  0 si 1 altfel:
(s n
spl (n) 1 pl
( ) 1
dacapcrit > p
tpl = = rpl p
rpl pcrit (pcrit p)(pcrit p) spl
rpl pcrit daca pcrit  p
n
( ) 1

Difuzare. Daca difuzarea este implementata pe baza unui sablon de co-


municare tip arbore binar, atunci timpul de executie creste cu log p: tb =
sb (n) log p=rb cu ub = log p:
Comunicare punct la punct. C^at timp nu apare o competitie pe retea, co-
municarile sunt paralelizabile, dar timpul de executie este x: tpc = spc(n)=rpc
cu upc = 1:
Sectiune critica. Presupunem ca toate procesoarele p ^ncearca sa intre ^n
sectiunea critica ^n acelasi timp. Astfel timpul de executie se scaleaza cu p:
tcs = scs (n)p=rcs cu ucs = p:
Sincronizarea la bariera. Exista mai multe modalitati de implementare a
sincronizarii la bariera. Poate implementata printr-o singura instanta globala.
Se va obtine o comportare similara la una dintre sectiunile critice. Poate
implementata de asemenea utiliz^and instante locale si o operatie de combinare
a lor (o comportare similara difuzarii): ubs = p sau ubs = log p:
Accesul la memorie. Functii separate sunt necesare pentru diferite nivele ale
memoriei. Se presupune din motive de simplicitate ca timpul necesar pentru
mutarea datelor de la si la cache este proportional cu data extrasa din cache:
 (
sca (n) 1

f (n) 0; f (n)=p  dcrit
tca =  dcrit = sca n  f n dcrit  f (n)=p > d
( ) ( )
rca p p rca p2 p crit
Suprapunerea ^ntre comunicare si calcul. Se presupune ca comunicarea
poate doar partial suprapusa cu calculul depinz^and de dimensiunea problemei
per procesor. Se utilizeaza din nou functia pas (x) pentru a descrie situatia
c^and toate comunicarile pot suprapuse (sau cazul contrar):
 (
sco(n)

f (n) 0  ncrit  f (n)=p
tco =  ncrit = 
fn : N
crit > f (n)=p
sco n n
( ) ( )
rco p rco crit p

73
Modelarea performantei prin abordare statistica
Dezvoltarea modelelor de timp pentru aplicatii reale poate foarte greoaie,
exist^and si posibilitatea unor erori sistematice. Ideea de baza ^n combinarea
modelelor de timp si a celor statistice este masurarea timpului de executie al
codului sau nucleului, selectarea unei multimi de functii de timp caracteristice
ui (p) si determinarea unei combinatii
X
t = Æi ui (p);
c^at mai apropiate de timpul masurat, prin determinarea deviatiei standard
a parametrilor. Multimea de functii caracteristice este critica. Analiz^and
modelele din paragraful anterior, functiile caracteristice pot de exemplu
urmatoarele:
u =
1 u = 1 u = log(p) u = p1 u = 1 u = log(p) u = p:
1
p2 2
p 3
p p 4 5 6 7

2.1.8 Scalabilitate
Scalabilitatea este ^n general un termen prost-de nit si poate avea ^ntelesuri
diferite pentru diferite persoane. Scalabilitatea unui sistem paralel sau a unui
cod paralel este o masura a abilitatii de a utiliza resurse de procesare cresc^ande.
Accelerarea raspunde la ^ntrebarea cum se schimba performanta daca
parametrul sistemului este scalat (numarul de procesoare p). Performanta este
exprimata ^n acest context ^n M ops, Mips, 1/timp etc. Utilizatorii vor sa
ruleze probleme mai mari pe masini mai puternice (compresie video, gra ca,
rutare VLSI). Daca se doreste acest lucru este necesara studierea scalarii pro-
blemei (marimea setului de date, complexitatea algoritmica).
Analiza scalabilitatii
Analiza scalabilitatii este evaluarea abilitatii unui sistem de calcul (paralel)
si/sau a unui algoritm/cod paralel de a utiliza resurse crescatoare ^n numar.
Evaluarea include si depinde de alegerea metricii de performanta si de scalarea
parametrilor cu numarul de procesoare. Parametrii resurselor pot numarul
de procesoare, viteza procesoarelor, conectivitatea retelei, latenta, capacitatea,
parametrii de con gurare I/O, sau ai sistemului de operare, etc. Parametrii
legati de problema pot dimensiunile grilei de calcul sau matricelor, numarul
de ecuatii, etc. Alti parametrii pot legati de metoda de implementare.
Exista mai multe tipuri de analiza a scalabilitatii. Scalabilitatea arhitecturii
paralele este abilitatea de a creste debitul prin cresterea resurselor sistemului.
Scalabilitatea algoritmului paralel este abilitatea de a utiliza resursele de cal-
cul cresc^ande. Scalabilitatea sistemului paralel se refera at^at la scalabilitatea
arhitecturii c^at si cea algoritmica (daca un algoritmul scalabil este scalabil pe
o arhitectura scalabila).
Precum ^n cazul performantei cel mai important lucru este de nirea unui
scenariu pentru studiu (scalabilitatea devine o notiune mai clara). Intrebarile
8 Rezumat: Scalabilitatea este un deziderat at^ at pentru o arhitectura paralela c^at si pentru
un algoritm paralel, indic^and o crestere liniara a performantei cu cantitatea de componente
hardware utilizate.

74
tipice ^n analiza scalabilitatii sunt: c^ate procesoare sa e utilizate pentru a
maximiza performanta sau debitul sistemului, c^at de sensibila este performanta
la capacitatea retelei, care sunt datele cele mai bune pentru executia paralela.
Pasii^n analiza sunt urmatorii. Se formuleaza ^ntrebarea legata de performanta.
Se identi ca parametrii relevanti ai problemei. Se identi ca parametrii de
resurse. Se decide care abordare sa e considerata. Apoi se plani ca, exe-
cuta si analizeaza experimentele.
Scalabilitatea sistemului de calcul
Data ind o problema de marime xa, e cienta procesorului descreste cu
cresterea numarul de procesoare. Data ind o problema rezolvabila pe un
numar x de procesoare, e cienta creste c^and dimensiunea problemei creste.
Performanta este astfel relationata de numarul de procesoare si dimensiunea
datelor. Un sistem paralel este scalabil daca e cienta procesor poate sa ram^ana
xa c^and numarul de procesoare si dimensiunea problemei cresc. De exemplu,
Cray T3E este scalabil p^ana la 1024 procesoare, cu legaturi de 480MB/s.
C^and se vorbeste despre scalabilitatea retelei, se considera patru aspecte:
latimea de banda, latenta, costul si aspectul zic. Scalabilitatea latimii de
banda se refera la modalitatea ^n care latimea de banda sau debitul unui sis-
tem creste la adaugarea de procesoare (^n mod ideal, proportional cu numarul
de procesoare). Intr-un multiprocesor scalabil, are loc scalarea liniara a latimii
de banda a memoriei locale si a latimii de banda a comunicarilor interpro-
cesoare. Scalabilitatea latentei se refera la modul ^n care latenta comunicarii
creste la adaugarea de procesoare (^n mod ideal, ar trebui sa ram^ana constanta).
Scalabilitatea costului se refera la modalitatea ^n care costul sistemului creste
la adaugarea de procesoare (^n mod ideal, proportional cu numarul de proce-
soare). Costul adaugarii de procesoare depinde de modelul utilizat: c^and se
utilizeaza comutatoare, marirea numarului de procesoare este costisitoare, dar
totusi latimea de banda rezultata creste cu numarul de porturi, iar c^and se
utilizeaza o magistrala, costul este mic, ^nsa latimea de banda rezultata este
xa (cache-ul poate reduce tra cul, ^nsa problema noua este coerenta cache).
Scalabilitatea zica se refera la modalitatea de ^mpachetare a sistemului.
Scalabilitatea algoritmica
Scalabilitatea este o masura a modalitatii ^n care un algoritm face uz de proce-
soare aditionale. Ea determina variatia ^n performanta ca o functie de unul sau
mai multi parametrii ale problemei sau sistemului (^n mod traditional incluz^and
numarul de procesoare).
Un algoritm paralel este scalabil daca e cienta concurenta poate mentinu-
ta la o valoare constanta c^and numarul de procesoare creste odata cu cresterea
dimensiunii problemei. Formal putem spune ca un algoritm este scalabil daca
TC (n; 1)
lim
n!1 TS (n)
= 0:
De exemplu daca avem un algoritm cu 4 parti care ecare este secventiala (care
pot rula^nsa ^n paralel), atunci algoritmul nu este scalabil deoarece accelerarea
este xata la un maxim 4.
75
De nitia ne spune ca algoritmul este scalabil daca obtinem accelerare pro-
gresiva prin utilizarea mai multe procesoare pentru probleme mai mari. De ex-
emplu, daca dupa limita de 1000 de procesoare nu se poate obtine o performanta
mai buna prin adaugarea de procesoare pentru probleme mai mari, atunci al-
goritmul nu este scalabil (se indica o g^atuire sau o faza care este seriala).
Compararea unor algoritmi diferiti se face pe baza de metrici. O aseme-
nea metrica poate accelerarea pentru dimensiune xa a problemei, scalarea
pentru timp de executie x, izoe cienta pentru e cienta paralela xata, sau
izoviteza pentru viteza xata. Se considera urmatoarele notatii. Metrica pri-
mara pentru evaluarea performantei este timpul de rulare Tp. E cienta pa-
ralela este calculata relativ la timpul celui mai bun algoritm secvential, Ts.
Cantitatea de lucru este Wp . Rata de operatii per secunda este de nita prin
r = Wp =Tp. Accelerarea absoluta este Sa (p) = Ts =Tp(p). Accelerarea rel-
ativa este Sr (p) = Tp(1)=Tp(p). Viteza este de nita prin V (p) = r(p)=p.
E cienta absoluta este Ea(p) = Sa(p)=p = Ts=(Tp(p)p), iar e cienta relativa
este Er (p) = Sr (p)=p = Tp(1)=(Tp(p)p). Criteriile pentru o scalabilitate buna
sunt urmatoarele: accelerare crescatoare (S (p) > S (q) daca p > q), crestere
liniara a accelerarii (S (p) = cp), e cienta constanta (E (p) > c, c xat), viteza
constanta (V (p) > c, c xat).
Exemplu: ^nsumarea a n numere pe o grila patratica de p procesoare. Algo-
ritmul procedeaza ^n felul urmator. Fiecare procesor gaseste suma locala a n=p
numere si paseaza suma sa locala la un alt procesor ^ntr-un mod coordonat;
suma globala este ^n nal ^n procesorul P . Timpul celui mai bun algoritm
secvential este Ts = (n 1)tc unde tc este timpul de efectuare al unei operatii
11

^n virgula mobila. Formarea sumelor locale ^n algoritmul paralel este realizata
^n Tp = (n=p 1)tc. Suma de-a lungul unei linii de procesoare se realizeaza
1

^n Tp = (pp 1)(tc + te ) unde te este timpul de comunicare a unui numar


2

^n virgula mobila ^ntre procesoare ^nvecinate. Insumarea pe prima linie de


procesoare se face ^n Tp = (pp 1)(tc + te ). Timpul paralel si accelerarea sunt
3

p p
Tp (p) = (n=p + 2 p 3)tc + 2( p 1)te ;

S (n; p) = n p
(n 1)tc p(1 1=n)
( p + 2 p 3)tc + 2(pp 1)te = 1 + np (2pp 3) + 2 np (pp 1)
unde  = tc=te. In acest algoritm o masura a granulatiei algoritmului este
numarul de elemente per procesor, g = n=p. Se poate scrie S astfel
p 1=g
S (g; p) =
1 + (2pp 3)=g + 2 (pp 1)=g :
C^pand g ! 1 cu p constant, S ! n. C^and p ! 1 cu g constant, S 
g p=(2(1 +  )). C^and p ! 1 cu n constant, S ! 0. Daca n  1 si p  1,
p 1 p
S
1 + 2pp(1 +  )=g ; E = 1 + 2pp(1 +  )=g ; f = 2 p(1 +  )=g:
Un algoritm este scalabil daca este posibila mentinerea constanta a e cientei
la cresterea dimensiunii problemei si numarului de procesoare. Dimensiunea
76
Figura 2.8: Algoritmi nescalabili, scalabili si e cient scalabili (dimensiunea pro-
blemei se presupune a crescatoare cu numarul de procesoare)
problemei se refera e la lucrul efectuat, e la dimensiunea datelor. De exemplu
algoritmul de ^nsumare este scalabil: pentru aceasta trebuie ca g  pn.
Un algoritm este scalabil e cient daca este scalabil si este e cient ^n lucru
(Figura 2.8). Un algoritm este perfect scalabil daca e cienta ram^ane constanta
c^and dimensiunea problemei si numarul de procesoare cresc cu acelasi factor
(algoritmul de^nsumare nu este perfect scalabil). Un algoritm este ^nalt scalabil
daca e cienta depinde slab de numarul de procesoare c^and dimensiunea pro-
blemei si numarul de procesoare cresc cu acelasi factor (algoritmul de ^nsumare
este ^nalt scalabil).
Intr-o simulare costisitoare ^n timp si memorie nu se pot aborda probleme
mari si se pune problema scalarii descrescatoare a parametrilor problemei pen-
tru a face simularea posibila si apoi scalarea crescatoare a parametrilor masinii
pentru a se potrivi cu scalarea parametrilor problemei.
Scalarea este realizata ^n diferite conditii. Exista doua tipuri de constr^an-
geri: orientate utilizator (tranzactii, operatii I/O), sau orientate resursa (me-
morie, timp). Prima categorie este folosita de catre utilizatori pentru urmari
efectele unor schimbari, pe c^and cea de a doua categorie este mai generala si
adesea mai reala. Modelele de scalare orientate resursa sunt bazate pe: con-
str^angeri de problema (PC), constr^angeri de memorie (MC) sau const^angeri de
timp (TC). Constr^angerile de timp ofera cel mai viabil model.
Scalare bazata pe constr^angeri de problema. C^and numarul de proce-
soare p creste,^n mod tipic timpul de executie descreste, cantitatea de lucru per
procesor descreste si rata de calcul poate creste datorita localitatii^mbunatatite
a datelor si utilizarii cache. Suplimentar, cantitatea de comunicare interproce-
soare per procesor descreste mai ^ncet dec^at cantitatea de lucru per procesor
si poate chiar creste; costul comunicatiilor globale creste precum si costul I/O.
In plus apar probleme de echilibrare a ^ncarcarii datorita lipsei de concurenta.
Accelerarea este calculata prin T (1)=T (p) si este limitata de lipsa de lu-
cru (Sa (p)  cW pentru o constanta c dependenta de arhitectura), lipsa de
concurenta (calcule duplicate pe procesoare, inechilibru ^ncarcarii, limitarea
data de legea Amdahl, S (p)  cQ=q pentru o constanta c dependenta de arhi-
tectura si fractia q din lucrul efectuat de algoritmul paralel ^n care cel mult
Q procesoare sunt active) si suprasarcina (daca Op (p) este cantitatea de timp
77
petrecuta de ecare procesor ^n sarcini care nu se regasesc ^n implementarea
secventiala { include comunicarile inter-procesor si costurile de sincronizare {
Sr (p)  tp (1)=Op (p)). Accelerarea superliniara S (p) > p poate atinsa pentru
anumite valori ale lui si pentru anumite sisteme paralele.
Se reia exemplul reducerii globale prezentat la de nirea e cientei, pentru o
dimensiune xa a problemei:
n
n = constant; Tp (p; n) = + log p; Ts (n) = n = Tp (1; n);
p
Ts (n) S (p; n)
Sa;r (p; n) =
Tp (p; n)
= 1+
p
log p ; Ea;r (p; n) = a;r
p
= 1 + 1p log p
n p
1 1
n
unde si sunt constante (aproximativ 1).
Scalare bazata pe constr^angeri de timp. A fost introdusa pentru a depasi
limitarile legii lui Amdahl. Timpul de executie este tinut x la scalarea sis-
temului (utilizatorul asteapta un raspuns ^n acelasi timp). Accelerarea este
masurata prin raportul W (p)=W (1): Daca W creste mai repede dec^at p, tim-
pul de executie creste, cantitatea de lucru per procesor creste si rata de calcul
poate descreste. Pe de alta parte cantitatea de comunicare inter-procesoare per
procesor creste, dar mai lent dec^at lucrul per procesor; costul comunicatiilor
globale ram^ane acelasi sau creste, iar costurile I/O cresc.
Fie T timpul maxim care este disponibil pentru a rezolva problema. Se
de neste Wt (p) ca ind numarul de operatii (^n algoritmul standard serial)
^n cea mai mare problema care poate rezolvata prin algoritmul paralel uti-
liz^and p procesoare^n intervalul de timp cerut. Se utilizeaza Wt (p) la de nirea
accelerarii, e cientei, etc. Se observa ca Wt(p)  cT p pentru o constanta c de-
pendenta de arhitectura, adica lucrul nu poate creste mai rapid dec^at p. Orice
crestere ^n suprasarcina ca functie de p descreste mai mult marimea lui Wt(p).
Majoritatea problemelor realiste pe arhitecturi reale au o dimensiune
maxima care poate rezolvata d^andu-se un numar de procesoare. Permit^and
cresterea dimensiunii problemei cu restrictia de timp este improbabil ca sis-
temul sa e scalabil asimptotic. Aceasta este presupunerea de scalare indicata
pentru evaluarea practica a multor sisteme ^n timp real.
Se considera exemplul reducerii globale pentru un timp de executie xat:
n
Tp (p; n) = + log p = T = constant;
p 0

p p
Nt (p) = (T0 log p); p  2T0 = ; Wt (p) = Nt (p) = (T0 log p);

 
Nt (p) St (p)
St (p) = = p 1 log p ; Et (p) = = 1 log p:
T0 T0 p T0
Scalare bazata pe constr^angeri de memorie. Se scaleaza parametrii ast-
fel ^nc^at utilizarea memoriei per procesor sa ram^ana xata. Accelerarea este
masurata prin W (p)=T (p)  T (1)=W (1) = Crestere ^n lucru=Crestere ^n timp:
Se poate ajunge la o crestere mare ^n timpii de executie (daca lucrul creste
mai rapid dec^at linear ^n utilizarea memoriei). De exemplu pentru factorizarea
78
unei matrice 10000  10000 sunt necesari 800Mb si 1 ora pe un uni-procesor;
cu 1000 de procesoare se pot factoriza matrice 320K320K, dar timpul paralel
ideal creste la 32 ore (la 10000 procesoare timpul creste la 100 ore, etc).
In scalarea bazata pe constr^angeri de memorie raportul n=p este tinut con-
stant (dimensiunea problemei creste liniar cu numarul de procesoare). Aceasta
presupune nu numai cresterea numarului de elemente caracteristice, ci si
scalarea tuturor surselor de eroare astfel ^nc^at contributia lor la eroarea gen-
erala sa ram^ana constanta. De exemplu,^n difuzia caldurii se utilizeaza metoda
explicita a diferentelor nite; sursele de eroare sunt discretizarea spatiala,
acuratetea algoritmica, rotunjirile. Scalarea presupune^mbunatatirea rezolutiei
spatiale cu cresterea lui n; astfel scal^and n cu un factor k stocarea creste cu un
factor k , operatiile cresc cu k , calcule si comunicarea cu k=4.
2 3

Scalarea bazata pe constr^angeri de memorie ofera un model realistic pentru


anumite aplicatii (de exemplu LinPack). Se de neste M (p) drept cantitatea de
memorie din sistemul paralel si Wm(p) numarul de operatii pentru cea mai mare
problema care poate rezolvata de algoritmul paralel utiliz^and p procesare si
dimensiunea memoriei de M (p). Se utilizeaza Wm(p) la de nirea accelerarii,
e cientei, etc. In mod tipic se utilizeaza presupunerea M (p) = pM (1) (memorie
distribuita). Pentru o factorizare matriceala densa, Wm(p) = cM (p) = . 3 2

Daca Wm (p) creste cu p, atunci Ts si Tp(1) trebuie estimate, deoarece


aceasta problema este (prin de nitie) prea mare pentru a rula pe un proce-
sor ^ntr-o con guratie tipica. Daca Wm (p) creste cu p, atunci limitele asupra
accelerarii si e cientei pot sa dispara: nu exista lipsa de lucru, iar surplusul
paralel creste semni cativ mai ^ncet dec^at Wm(p) (pentru multi algoritmi
paraleli), sau timpi ^n care toate procesoarele pot folosite cresc mai rapid
dec^at timpii ^n care nu pot toate utilizate. Exista ^nsa si o limitare. Daca
Wm (p) creste mai rapid dec^at liniar ^n p atunci timpul de executie paralel ex-
plodeaza la cresterea lui p, deoarece marginea superioara a vitezei procesorului
V (p)  c, Tp (p)  Wm (p)=(cp). Mai mult, pentru numeroase aplicatii paralele
suprasarcina creste ca o functie de p, caz ^n care timpul de executie paralel ca
functie de p explodeaza independent c^at de repede creste Wm(p).
Se considera exemplul reducerii globale pentru un consum x de memorie
per procesor (memorie distribuita):
M (p) = M p = n p = n(p) = Nm (p) = Wm (p); tm (p) = n + log p
1 1 1

N (p) p Sm (p) 1
Sm (p) = m =
tm (p) 1 + n1 log p ; Em (p) = p = 1 + n1 log p :
1 1

Exemple de scalare bazata pe constr^angeri. Se considera doua exemple.


Exemplul 1: rezolvarea unei ecuatii cu derivate partiale eliptica pe opgrila
regulata prin diferente nite. In scalarea MC dimensiunea grilei este n p 
npp; numarul de iteratp ii este npp; lucrul este O((npp) ); ptimpul paralel ideal
3

de executie este O((n p) =p); factorul de crestere este n p; astfel o ora pe


3

un uni-procesor ^nseamna 32 de ore pe 1024 procesoare. In scalarea TC, daca


grila scalata este k  k, atunci k =p = n , astfel ^nc^at k = n p3 p; necesarul
3 3

de memorie per procesor este k =p, care se diminueaza cu radacina cubica din
2

numarul de procesoare. In ceea ce priveste gradul de concurenta ^n cele trei


79
modele de scalare, situatia este urmatoarea: ^n pcazul PC este xa, ^n cazul MC
creste cu un factor p, iar ^n cazul TC creste cup 3 p. In ceea ce priveste raportul
calcule/comunicare, ^n cazul PC creste cu p, la MC ram^ane x, iar la TC
creste cu p6 p. Multimea de lucru la PC descreste cu p, la MC ram^ane xa, iar
la TC descreste cu p3 p. In acest caz modelul MC este cel mai realist.
Exemplul 2: simularea galaxiei prin modelul Barnes-Hut. Diferiti
parametrii guverneaza sursele de erori: numarul de corpuri (n), rezolutia pa-
sului ^n timp (t), acuratetea de calcul a fortelor (). Regula de scalare este
aceea ca toate componentele mentionate trebuie sa se scaleze cu aceeasi rata.
Ca rezultat, dacp4a n se scaleaza cu un factor de s, t si  trebuie ambele scalate
cu un factor 1= s. Daca numarul de procesoare, p, este scalat cu un factor p k,
scalarea TC presupune cresterea numarului de corpuri mai mica dec^at =k, iar
scalarea MC presupune cresterea numarului de corpuri cu un factor k . In 3 4

ultimul caz timpul de executie devine inacceptabil de mare, astfel^nc^at modelul


TC este mai realist pentru aceasta aplicatie.
Izoe cienta. O metrica importanta a scalabilitatii este functia de
izoe cienta, notata e (p) sau We (p), ce indica dimensiunea problemei necesare
pentru a mentine o e cienta xa fata de cresterea numarului de procesoare p.
Fie E e cienta dorita care trebuie mentinuta si e We (p) numarul de operatii
(dintr-un algoritm serial standard) din cea mai mica problema care poate
rezolvata cu algoritmul paralel ce utilizeaza p procesoare cu o e cienta de cel
putin E ; un sistem este scalabil daca functia We (p) exista pentru orice E .
Viziunea intuitiva asupra functiei de izoe cienta este aceea ca determina
usurinta cu care un sistem paralel poate mentine o e cienta constanta si deci sa
atinga accelerari crescatoare ^n proportie cu numarul de procesoare. O functie
mica de izoe cienta indica faptul ca o crestere mica ^n dimensiunea proble-
mei este su cienta pentru a atinge e cienta constanta cu cresterea numarul de
procesoare (scalabilitate buna); o functie mare indica o scalabilitate saraca.
Fie W dimensiunea problemei ca numar de pasi cu calcule de baza din
cel mai bun algoritm secvential pentru rezolvarea problemei pe un singur
procesor (se presupune timp unitate pentru ecare pas asociat cu un calcul
de baza). Daca TS este timpul de rulare serial al celui mai rapid algoritm
secvential cunoscut, atunci W = Ts. Fie T functia de suprasarcina (parte
a costului algoritmului paralel care nu apare ^n algoritmul secvential cel mai
0

bun), ca o functie de W si p, notat T (W; p). Daca costul rezolvarii pro-
blemei de dimensiune W pe p procesoare este pTp si timpul de rulare serial
0

(lucrul util) este W atunci T = pTp W . Astfel timpul de rulare paralel este
Tp = T (W; p) + W=p, iar accelerarea este S = W=Tp = W=(W + T (W; p)), si
0

e cienta E = S=p = W=(W + T (W; p)) = 1=(1 + T (W; p)=W ). Daca W este
0 0

constant si p creste, E descreste deoarece T creste cu p. Daca W este crescator


0 0

cu p constant, E creste pentru sisteme paralele scalabile. E poate mentinut


0

constant la valoarea dorita, pentru p crescator, daca si W creste. Raportul


la care W este necesar a crescut pentru a mentine E constant determina
scalabilitatea sistemului paralel. Pentru un E dorit, W = T (W; p)E=(1 E ).
Daca K = E=(1 E ), atunci W = KT (W; p). W poate obtinut ca o functie
0

de p prin manipulare algebrica (functia de izoe cienta).


0

Daca doi algoritmi A si B satisfac We (p; A) < We (p; B) pe o arhitectura


80
data pentru toate valorile lui E , atunci A este mai scalabil dec^at B. Aceasta
implica ca problema nu trebuie sa e mai mare pentru A pentru a atinge o
e cienta data. Aceasta nu implica ca A este mai "bun" (mai rapid) dec^at B,
numai daca A si B rezolva aceeasi problema, e cienta absoluta este utilizata ^n
de nitie, si e cienta este o functie nedescrescatoare de dimensiunea problemei.
Daca doua arhitecturi X si Y pentru un algoritm paralel dat satisfac
We (p; X ) < We (p; Y ) pentru toate valorile lui E , atunci X este mai scalabil
dec^at Y . Aceasta implica faptul ca problema nu trebuie sa e la fel de mare ca
pentru X pentru a se atinge o e cienta data. Aceasta nu implica ca X este mai
buna (mai rapida) dec^at Y . Daca X si Y rezolva aceeasi problema, e cienta
absoluta este utilizata ^n de nitie, si e cienta este o functie nedescrescatoare
de dimensiunea problemei, atunci este mai usoara obtinerea unei e ciente de
calcul mai ridicate pe X dec^at pe Y .
Se considera exemplul reducerii globale. In cazul dat
Ea;r (p) = s =
T 1 = E = const; Ne (p) = Kp log p
Tp (p)p 1 + n p log p
1 0

cu K = 1 E E ; We (p) = Ne(p) exista pentru orice E ! deci scalabil!


0

0
0

Daca pTp este proportional cu timpul de executie al celui mai rapid algoritm
secvential cunoscut, atunci sistemul este cost-optimal. O alta modalitate de
de nire este pe baza ^ndeplinirii conditiilor T (W; p) = O(W ); W = O(f (p))
unde f este functia de izoe cienta.
0

Izoviteza. Se pune problema daca o anumita viteza (per procesor) poate


atinsa la o anumita dimensiune a sistemului, cum trebuie crescuta dimensi-
unea problemei pentru a realiza aceasta si daca exista o marime maximala a
sistemului sub care nu poate atinsa viteza dorita.
Izoviteza este similara cu izoe cienta. Fie V viteza care se doreste a
mentinuta. Se de neste Wv (p) numarul de operatii (^ntr-un algoritm serial
standard) din cea mai mica problema care poate rezolvata prin algoritmul
paralel ce utilizeaza p procesoare cu viteza de cel putin V . Sistemul este scalabil
daca functia Wv (p) exista pentru un anumit V .
Daca doi algoritmi A si B pe o arhitectura data satisfac Wv (p; A) <
Wv (p; B ) pentru toate valorile lui V , atunci A este mai scalabil dec^at B .
Aceasta implica faptul ca problema nu trebuie sa e at^at de mare ca pen-
tru A pentru a atinge viteza dorita. Aceasta nu implica ca A este mai "bun"
(mai rapid) dec^at B, numai daca A si B rezolva aceeasi problema, e cienta
absoluta este utilizata ^n de nitie, si viteza este o functie nedescrescatoare de
dimensiunea problemei. Concluzii similare cu cele de mai sus se pot stabili si
pentru cazul arhitecturilor.
Exemplu pentru izoe cienta si izoviteza. Se considera exemplul trans-
punerii matriceale. Se considera o partitionare a datelor ^n stil tabla de sah.
Se discuta scalabilitatea acestui algoritm pentru constr^angeri PC, TC, MC si
e cienta constanta. Formula timpului pentru transpunerea ^n paralel a unei
matrice patratice n  n este: tp(p) = n =p + pp + n =pp; unde ; ;
2 2

81
sunt constante. Pentru dimensiunea problemei xa:
n p
p
n p 1 2 2
n = constant; Ts (n) = n ; Tp (p; n) = + p 1 + p
2
;
p p
p S (p; n)
Sa (p; n) = p p ; Ea (p; n) = a
1+ 1+
n2 p p
1
p 1 p
Pentru timp de executie xat,
n p
2
p
n p 1 2
Tp (p; n) = + p 1 + p = T = const;
p p 0

T0 p
p 1 ; p  1+  T  ; Wt(p) = Nt(p) = p T ppp 1 ;
2
Nt (p)2 = p p 0 2 0
+ p 1 + p 1
N (p)2 1 T0p p 1 ; E (p) = St(p) 1 T0ppp 1 :
p
St (p) = t =p 1+ p 1 t = 1+ p 1
T0 p
Pentru un consum de memorie per procesor xat (memorie distribuita),
2 p
M (p) = M p = n p = n(p) ; Nm (p) = n p; 2
1 1 1
p
Wm (p) = Nm (p) = n p; tm (p) = n + ( + n ) p 1;
2 2 2 2

Nm (p) 2
p
1
p
pp 1 1 1

Sm (p) = =   p 1; Em (p) =   :
tm (p) 1 + n21 + 1
1 + n21 + 1

Izoe cienta este:


Ea (p) = s =
t 1
t (p)p 1 + ppp 1 + pp 1
1
;
p n2
Kppp 1 E

1 2
Ne (p) = p
1 K p 1 cu K = 1 E ; p ;
2 0

0 K
We (p) = Ne (p) exista dar nu pentru toti E0 ! Ne-scalabil!
2.2 Paradigme ale programarii paralele
De-a lungul anilor au fost de nite si explorate un numar mare de modele de pro-
gramare paralele. Putine ^nsa au supravietuit, dar a fost c^astigata o experienta
vasta despre ceea ce este util ^n practica.
In cazul paralel, un model de programare speci ca comunicarea si sin-
cronizarea. Exemple sunt (Figura 2.9): multiprogramarea (fara comunicare
sau sincronizare la nivel de program), spatiu de adresare partajat (SAS, pre-
cum un panou cu informatii, cu locatii partajate accesibile mai multor agenti
ce efectueaza o operatie), transfer de mesaje (precum scrisorile, apelurile tele-
fonice etc.), paralelism ^n date (marsaluire ^n regiment; actiuni globale asupra
datelor, implementate pe baza de spatiu de adrese partajat sau transfer de
mesaje).
82
Figura 2.9: Abordari ^n programare
2.2.1 Compararea modelelor de programare
Modelele de programare depind de control, numire, multimea de operatii si cost.
Controlul se refera la modalitatea ^n care este exploatat paralelismul, ce ordine
exista ^ntre operatii, cum are loc sincronizarea. Numirea indica apartenenta
datei, privata sau partajata, cum sunt accesate datele (partajate logic sau
comunicate). Prin multimea de operatii se indica care sunt operatiile de baza,
care sunt considerate atomice. Costul se refera la modalitatea de contorizare a
costului controlului, numirii si operatiilor.
P
Exempli care. Se considera problema determinarii sumei in f (A[i]). 1

Se observa ca, pentru evaluare paralela, ecare evaluare de termen sau suma=0

partiala se poate considera o sarcina. Se presupune ca se asigneaza n=p termeni


la ecare dintre cele p procesoare. Fiecare calculeaza independent rezultate pri-
vate si sume partiale, iar un procesor va colecta cele p sume partiale si va calcula
suma globala. Variabile logic partajate sunt cele n numere si suma globala; cele
private sunt termenii evaluati individual si sumele partiale.
Modelul de programare 1: spatiu de adresare partajat. Programul consista
dintr-o colectie de re de control (thread), ecare cu o multime de variabile pri-
vate (de exemplu variabile locale pe stiva). Threadurile comunica implicit prin
scrierea si citirea de variabile partajate si sunt coordonate explicit prin operatii
de sincronizare pe variabile partajate (steaguri la citire si scriere, blocaje, se-
mafoare). Modelul este asemanator programarii concurente pe uniprocesor.
Modelul masina 1: o masina cu memorie partajata. Toate procesoarele
sunt conectate la o memorie partajata mare (de exemplu SGI Origin). Codul
pentru calcularea sumei poate :
// Thread 1 // Thread 2
[s = 0 initial] [s = 0 initial]
local_s1= 0 local_s2 = 0
for i = 0, n/2-1 for i = n/2, n-1
local_s1 = local_s1 + f(A[i]) local_s2= local_s2 + f(A[i])
1 Rezumat: Modelele de programare paralele se clasi c a functie de modalitatea de ex-
ploatare a paralelismului sau de modalitatea de acces a datelor. Spatiu de adresare partajat
si transmiterea de mesaje sunt modelele preponderente

83
s = s + local_s1 s = s +local_s2
Problema principala este adunarea s = local_s1 + local_s2. La executie se
va proceda astfel:
// Thread 1 (init
ial s=0) // Thread 2 (init
ial s=0)
load s [din mem. ^
n reg.] load s [din mem. ^n reg.]
s = s+local_s1 s = s+local_s2
store s [de la reg. la mem.] store s [reg. la mem.]
Instructiunile relor de control diferite pot intercalate arbitrar. Rezultatul
nal stocat^n s nu poate anticipat. O solutie posibila este utilizarea excluderii
mutuale implementata pe baza de blocaj (atomic, adica executat complet fara
^ntrerupere):
// Thread 1 //Thread 2
lock lock
load s load s
s = s+local_s1 s = s+local_s2
store s store s
unlock unlock
Modelul de programare 2: transfer de mesaje. Programul consista dintr-
o colectie de procese cu nume ( re de control plus spatiu local de adresare).
Procesele comunica prin transfer explicit de date. Coordonarea este implicita
^n ecare eveniment de comunicare. Datele partajate logic sunt partitionate
^ntre procese. Modelul este asemanator programarii distribuite. Programarea
se face cu ajutorul unor biblioteci standard (precum MPI si PVM).
Modelul masina 2: o masina cu memorie distribuita. Procesoarele inter-
conectate au memorii proprii si nu pot accesa direct memoria altor procesoare.
Fiecare asemenea nod are o interfata cu reteaua (NI), toate comunicarile si
sincronizarile realiz^andu-se prin aceasta interconectare. Exemple de asemenea
masini sunt Cray T3E, IBM SP2, NOW.
Pentru calcul sumei s = x + x , o solutie pentru comunicarea sincrona este
urmatoarea:
1 2

// Procesor 1 [xlocal = x(1)] // Procesor 2 [xlocal = x(2)]


send xlocal, proc2 receive xremote, proc1
receive xremote, proc2 send xlocal, proc1
s = xlocal + xremote s = xlocal + xremote
iar alta pentru comunicarea asincrona:
// Procesor 1 [xlocal = x(1)] // Procesor 2 [xlocal = x(2)]
send xlocal, proc2 send xlocal, proc1
receive xremote, proc2 receive xremote, proc1
s = xlocal + xremote s = xlocal + xremote
Modelul masina 3: clustere SMP. Deoarece masinile cu memorie partajata
de tip SMP sunt cele mai rapide masini cu componente comode, se pune pro-
blema construirii unei masini mai mari prin conectarea lor la o retea (memorie
84
partajata ^ntr-un SMP, transfer de mesaje ^n afara). Exemple sunt masinile
Clump, Intel Millennium, ASCI Red, etc. Modelul de programare trateaza
masina ca una "plata", adica se utilizeaza tranferul de mesaje chiar si ^n SMP
(performanta ^nalta, dar greu de programat).
Modelul de programare 3: data-paralel. Exista un singur r de control con-
sist^and din operatii paralele care sunt aplicabile ^ntregii structuri de date sau
unui subset de nit; comunicatia este implicita ^n operatorii paraleli si struc-
turile de date. Acest model de programare ofera un mod elegant de ^ntelegere
si rationare, dar din pacate nu toate problemele se potrivesc modelului.
Modelul masina 4: o masina SIMD. Exista un numar mare de procesoare.
Un singur procesor de control ^nainteaza ecare instructiune, iar celelalte pro-
cesoare executa aceasta instructiune. Anumite procesoare pot dezactivate
la orice instructiune de interconectare (de exemplu, CM2). Masinile nu sunt
populare, dar modelul de programare este implementat printr-o serie de com-
pilatoare (precum HPF).
Modelul de programare 5: majoritar sincron. Este utilizat ^n modele cu
transfer de mesaje si memorie partajata drept conventie de programare. Fazele
unei aplicatii sunt separate de bariere globale. Calcule se efectueaza pe date lo-
cale (din memoria distribuita) sau acces^n citire la datele globale (din memoria
partajata). In fazele de comunicare toate participa ^n rearanjarea sau reducerea
datelor globale. In general toate fac "acelasi lucru" ^ntr-o faza (f din suma).
Caracteristicile modelelor de programare. Sunt prezentate ^n Tab. 2.4.
In modelul de programare secvential, numirea se poate face pe orice vari-
abila din spatiul de adresare virtual, hardware-ul sau compilatoarele fac^and
translatarea ^n adrese zice, iar compilatoarele si hardware-ul violeaza adesea
ordinea programului fara a se sesiza aceasta. Are loc o replicare^n cache pentru
reducerea comunicarii cu memoria.
Un model simplu de ordonare ^n programarea SAS (Shared Address
Space) este urmatorul: ordinea din interiorul unui proces/thread este ordinea
secventiala, ^ntre procese se permite o anumita intercalare, ordine aditionala
prin sincronizare (si ^n acest caz compilatoarele si hardware-ul pot viola or-
dinea fara a se sesiza aceasta). Sincronizarea presupune: excluderea mutuala
(fara o ordine garantata, prin blocaje), sincronizarea evenimentelor (prezerva
dependentele de tip producator-consumator; de trei tipuri: punct-la-punct,
global, grup). Replicarea este transparenta la nivel hardware prin cache sau
sistem de operare la nivel de pagina sau obiecte (apar probleme de coerenta).
Masina nativa pentru acest model de programare are memorie partajata.
In modelul de programare MP (Message Passing) operatii speciale sunt
comunicarile explicite prin expediere (date de la un spatiu de adrese privat
la un alt proces) si receptionare (copii de date de la procese spre spatiul de
adresare privat). Replicarea (Tabel 2.5) are loc la receptionare (un nou nume).
Ordonarea^n cadrul unui proces este cea data de program, transferul de mesaje
ofera sincronizare punct la punct ^ntre procese, iar excluderea mutuala este
inerenta, si nu se fac presupuneri asupra ordinii ^ntre procese except^and cele
impuse de perechile expediere/receptionare (Tabelul 2.6). Se poate construi
un spatiu de adresare partajata virtual (numar de proces plus adresa ^n cadrul
spatiului de adresare al procesului), dar nu se pot face operatii directe. Masina
nativa pentru acest model de programare este una cu memorie distribuita.
85
Tabelul 2.4: Caracteristicile a trei modelele de programare
Uniprocesor SAS MP
Numire Procesul poate numi Fiecare proces numes- Fiecare proces numes-
biti, cuvinte, etc, din te date din spatiul de te date din spatiul lo-
spatiul sau de adre- adresare privat si cel cal de adresare sau a
sare, asociate cu vari- partajat altor procese
abile, pointeri, struc-
turi
Operatii Citire, scriere, arit- Operatii uniprocesor, Operatii
metice operatii de sincroniza- uniprocesor pe datele
re pe adrese partajate locale, expediere la si
(de exemplu blocaj) receptionare de la un
proces
Ordine Citirea unei adrese re- Operatile pe spatiu Operatiile pe date-
program turneaza cea mai re- de adresare partajat le locale apar ca -
centa valoare scrisa la apar a efectuate ind efectuate ^n or-
acea adresa; ordinea ^n ordinea programu- dinea program, expe-
de executie este data lui; celelalte operatii dierea si receptiona-
de program; compila- sunt intercalate (pre- rea au semantici de
toarele si arhitectura cum partajarea tim- sincronizare explicita,
pot schimba ordinea pului pe un sistem intercalarea cu cele-
at^ata timp c^at iluzia uni-procesor); sincro- lalte operatii
ordinii este pastrata nizarea explicita a o-
peratiilor este utiliza-
ta c^and ordinea pro-
gramului insu cienta
2.5: Replicare
Tabelul

Problema SAS MP
Cine efectueaza copiile locale ale datelor sistem program
La ce granularitate e alocata data la replicare bloc cache prin program
Cum este tinuta coerenta datelor replicate sistem program
Cum este realizata ^nlocuirea datelor replicate dinamic la margini de faze
2.6: SAS contra MP
Tabelul
SAS MP
Structura datelor globale explicita implicita
Descompunere a lucrului, independent de a datelor, determin^and
date lucrul
Comunicatii implicit explicit
Sincronizare explicita implicita

86
Figura 2.10: Modelele de programare din perspectiva programatorului: (a) Pa-
ralel ^n date; (b) MP; (c) SAS uniform; (d) SAS segmentat
Paradigmele din punctul de vedere al programatorului. Paradigma
de programare de baza este cea care presupune un singur proces secvential.
Programatorul are o imagine simpla asupra masinii tinta ca un singur procesor
care acceseaza o anumita cantitate de memorie si scrie un singur program care
sa ruleze pe acea masina. Paradigma poate ^n fapt implementata ^n mod-
uri variate, posibil ^ntr-un mediu de partajare a timpului ^n care alte procese
partajeaza procesorul sau memoria. Programatorul doreste sa ram^ane departe
de aceste detalii de implementare, ^n ideea ca programul sau sa e ^n principiu
portabil pe orice calculator secvential.
Din punctul de vedere al programatorului (Figura 2.10.a), modelul de pro-
gramare paralel-^n-date este vazut ca o secventa de transformari pe scara mare
asupra unor structuri de date globale (procesoarele/threaduri sunt ascunse ved-
erii; se realizeaza exemplu prin directive HPF). Imaginea modelului MP este
centrat per procesor; se speci ca sarcina ecarui procesor/thread, iar o imagine
globala implicita este posibila doar pe baza datelor locale si sabloanelor de co-
municare. In cazul modelului SAS uniform, imaginea programatorului ram^ane
centralizata per procesor; o imagine globala implicita este posibila urmarind
sablonul partajarii datelor. In cazul unui SAS segmentat programatorul are
o imagine locala (care procesor/thread ce face) si una globala (date globale,
operatii si sincronizare).
Un avantaj al modelului SAS implementat pe o masina paralela cu memo-
rie partajata din punctul de vedere al programatorului este lipsa notiunii de
proprietar si astfel nu este necesara speci carea explicita a comunicarii datelor
de la producatori la consumatori. Desi apare necesitatea utilizarii blocajelor si
monitoarelor, modelul simpli ca dezvoltarea programelor. Totusi ^ntelegerea
si managementul localitatii pot mai di cile dec^at ^n sistemele MP cu memo-
rie distribuita. In paradigma memorie partajata (Figura 2.11.a) sunt oferite
o serie de primitive pentru alocarea variabilelor partajate, primitive pentru

87
Figura 2.11: (a) SAS: comunicare, partajare si sincronizare via sto-
care/^ncarcare ^n/din variabile partajate; (b) Abstractizarea MP
crearea de procese (de tip fork, join), primitive pentru excluderea mutuala
si sincronizare.
Comunicarea MP este asemanatoare unei operatii I/O (Figura 2.11.b). Pro-
gramatorul imagineaza mai multe procese ecare cu propriul sau spatiu de
memorie si scrie un program care sa e executat de ecare proces. Fiecare
proces dintr-o aplicatie MP este identi cat printr-un nume unic care este uti-
lizat ^n transferul mesajelor. Un mesaj consta din datele care sunt expediate
si orice informatie necesara sistemului pentru rutarea mesajului la destinatia
sa (anvelopa mesajului). Paradigma MP nu este limitata la hardware cu me-
morie distribuita; este implementat si pe masini paralele cu memorie partajata
zic cu bune performante ^n comunicare. Desi pe asemenea sisteme aplicatiile
pot programate e cient prin utilizarea directa a memoriei partajate, avanta-
jul paradigmei MP este aceea ca garanteaza performanta aproape-optimala pe
ambele tipuri de sisteme, cu memorie distribuita sau partajata, astfel oferind
cel mai ^nalt nivel de portabilitate programelor aplicative. Programele ^nsa
sunt greu de ^nteles si depanat.
Paralelism ^n date contra paralelism ^n control. Programele paralele
pot clasi cate corespunzator executiei concurente a aceleiasi sarcini pe ele-
mente de data diferite (paralelism ^n date sau data-paralel) sau executiei con-
curente a sarcinilor diferite pe aceleasi sau diferite date (paralelism ^n sarcini
sau paralelism ^n control). De exemplu, simularea formarii galaxiei poate nece-
sita aceleasi operatii efectuate pe ecare data (stea) dintr-un numar mare de
date; ^n acest caz, un algoritm data-paralel este obtinut^n mod natural. In con-
trast, de exemplu, o optimizare multi-disciplinara a structurii unii avion poate
include simulari ale curentilor, si ale motoarelor (sau orice simulare a unui
sistem zic complex) implica procese multiple diferite (paralelism ^n sarcini).
Modelul paralelismului ^n date (sau data-paralel) exploateaza usor
concurenta care deriva prin aplicarea aceleasi operatii asupra unor elemente
multiple ale unei structuri de date (de exemplu, "adauga 2 la toate elementele
matricei date" sau "creste retributia tuturor angajatilor corespunzator cu 5 ani
de serviciu"). Un program data-paralel consista dintr-o secventa de operatii
care sunt aplicate la ecare element de data constituind sarcini independente.
Paralelismul ^n date este indicat pentru probleme regulate si implementare pe
88
masini SIMD desi poate executabil si pe un MIMD ^n modelul SPMD. Lim-
bajele utilizate sunt de exemplu C*, CM-FORTRAN, HPF. Compilatoarele data-
paralele cer adesea programatorului sa ofere informatii referitoare la distributia
datelor pe procesoare si translateaza programele data-paralele^ntr-o formulare
SPMD si genereaza cod de comunicare automat (precum in HPF si Fortran 90).
Cantitatea paralelismului ^n control este ^n mod uzual limitata. Astfel ma-
joritatea programelor pentru calculatoarele paralele scalabile exploateaza pa-
ralelismul ^n date pentru simplul motiv ca gradul de concurenta ce poate
obtinut din paralelismul datelor tinde sa e mai mare dec^at cel obtinut prin
paralelismul controlului. Totusi paralelismul ^n control are un rol important ^n
aplicatiile ingineresti si ^n general ^n cele modulare.
Paralelism explicit contra paralelism implicit. Sistemele de programare
paralele pot clasi cate dupa modul ^n care suporta explicit sau implicit mod-
elele de programare paralele. Un sistem paralel explicit cere ca programa-
torul sa speci ce direct activitatile unor re de control concurente multiple
(programatorul speci ca maparea datelor si lucrul). In contrast, un sistem
paralel implicit permite programatorului sa speci ce, la un nivel ^nalt, com-
portarea programului ^n care paralelismul este reprezentat direct; este res-
ponsabilitatea compilatorului sau bibliotecii sa implementeze acest paralelism
e cient si corect (se utilizeaza un limbaj secvential pentru speci carea algo-
ritmului si compilatorul insereaza constructiile paralele necesare, analizeaza
dependentele, determina maparea etc, adica paralelizeaza programul; posibil
^n Fortran, Jade, Id90).
Sistemele paralele implicite pot simpli ca programarea prin eliminarea nece-
sitati pentru programator de a coordona executia proceselor multiple. De ex-
emplu, ^n HPF (limbaj implicit paralel primar data-paralel) programatorul
scrie un program secvential si c^ateva directive noi, iar codul nu trebuie rescris
pentru a pro ta de arhitecturi paralele diferite. Sistemele paralele explicite
ofera programatorului mai mult control asupra comportarii programului si deci
poate adesea utilizat pentru atingerea unei performante ^nalte. De exemplu,
o implementare MPI poate incorpora tehnici so sticate pentru structurarea
comunicatiilor si redistribuirea datelor c^and apare inechilibrul ^ncarcarii (capa-
bilitati inexistente ^n compilatoarele HPF).
Un stil de programare paralel care a devenit popular este acela de a
^ncapsula operatii complexe de comunicare de exemplu ^n biblioteci. Un
program aplicativ poate astfel consta dintr-o secventa de apeluri la aseme-
nea functii de biblioteca. Astfel avantajele abordarii paralele implicite pot
obtinute ^ntr-un cadru de programare paralela explicita.
Sistemele de programare paralela explicita pot clasi cate mai departe
functie de care model de programare este utilizat, partajat sau distribuit.
SPMD contra MP. SPMD (Single Program Multiple Data) nu este o
paradigma hardware, de aceea nu este inclusa ^n clasi carea Flynn. Este o
paradigma software pentru masini MIMD. Fiecare procesor executa un pro-
gram SPMD pe date diferite astfel ^nc^at este posibil sa e considerate diferite
rami cari, conduc^and la paralelism asincron. Procesoarele nu fac neaparat
acelasi lucru (executa instructiuni diferite ^n cadrul aceluiasi program) ^n pasi
coordonati precum se ^nt^ampla ^ntr-o masina SIMD. Daca de exemplu x este
89
0 pe procesorul 1, si 1 pe procesorul 2, iar instructiunea curenta pe ambele
procesoare este IF X = 0 THEN S1 ELSE S2, atunci procesorul 1 executa S1,
iar procesorul 2 executa S2 (ceea ce nu se poate ^nt^ampla pe o masina SIMD).
In modelul SPMD acelasi program ruleaza oriunde (ceea ce impune restrictii
asupra modelulului MP). Un numar x de taskuri identice sunt create la
startare, nu se pot crea noi taskuri sau distruge cele existente de-a lungul
executiei programului (de exemplu la MPI), spre deosebire de modelul MP care
nu exclude crearea dinamica de procese, executia de procese multiple per pro-
cesor, sau executia unor programe diferite pe procesoare diferite. Numeroare
sisteme de programare MP permit implementarea modelului SPMD, deoarece
acesta este su cient pentru un rang variat de probleme. Insa reducerea sis-
temului numai la capabilitatile unui model SPMD implica ascunderea celelalte
posibilitati de dezvoltare a algoritmilor paraleli.
2.2.2 Niveluri de paralelism
Paralelismul poate examinat la diferite niveluri: job (lucrare), program,
instructiune, aritmetic sau bit. Paralelismul la nivel de job are loc ^ntre joburi
independente sau faze ale aceluiasi job ce ruleaza pe acelasi sistem de calcul
(de tip paralelism evident). Paralelismul la nivel de program are loc ^ntre
parti ale unui job sau ^n cadrul unor cicluri (mai multe sarcini sunt efectu-
ate simultan pentru a rezolva o problema comuna). Paralelismul la nivelul
instructiunilor (ILP) are loc ^ntre faze ale executiei instructiunii (la proce-
sarea unei instructiuni precum adunarea a doua numere ce poate divizata ^n
sub-instructiuni); daca mai multe instructiuni similare urmeaza a efectuate,
sub-instructiunile lor pot suprapuse utiliz^and tehnica pipeline. La nivel arit-
metic sau bit paralelismul are loc ^ntre elementele unei operatii vectoriale sau
^n circuitele logice aritmetice c^and bitii dintr-un cuv^ant nu sunt tratati unul
dupa celalalt (operatie bit-seriala), ci in paralel (operatie bit-paralela).
Paralelismul automat ^n masinile de calcul moderne "secventiale" se poate
referi la paralelism la nivel de bit (^n cadrul operatiilor ^n virgula mobila de
exemplu), la paralelism la nivel de instructiune (instructiuni multiple execu-
tate ^ntr-un ciclu de ceas), paralelism la nivelul sistemului de memorie (supra-
punerea unor operatii de memorie cu calculele), paralelism la nivelul sistemului
de operare (joburi multiple care ruleaza ^n paralel pe SMP).
Exemplu de paralelism^ntre joburi independente. Se considera un calculator
cu 4 procesoare si care ruleaza joburi care sunt clasi cate ca ind mici (S), medii
(M), si mari (L). Un job mic necesita 1 procesor, unul mediu 2, iar unul mare 4,
iar ecare job necesita o unitate de timp. Initial exista o coada de joburi: S M L
S S M L L S M M. Se cere o programare o plani care ^n ordinea data ^n timpul
cel mai scurt si determinarea celei mai bune plani cari fara a impune restrictia
de ordine. Solutia problemei este prezentata ^n Tabelul 2.7. In primul caz
media utilizarii este 83.3%, iar timpul cel mai scurt pentru a termina joburile
din coada este de 7 unitati de timp. O plani care optima este posibila c^and nu
se tine seama de ordine, scopul ind atingerea celui mai mare indice de utilizare;
se permite joburilor sa migreze ^n fata cozii. Solutia propusa ^n Tabelul 2.7.b
2 Rezumat: Paralelismul se poate aplica la diferite niveluri hardware (nivel aritmetic, nivel
instructiune) sau software (nivel program, nivel aplicatii).

90
Tabelul 2.7: Plani carea joburilor: (a) P
astr^and ordinea; (b) Plani carea op-
tima fara a pastra ordinea
Timp Joburile ce ruleaza Utilizare Timp Joburile ce ruleaza Utilizare
1 S,M 75% 1 S,M,S 100%
2 L 100% 2 L 100%
3 S,S,M 100% 3 S,M,S 100%
4 L 100% 4 L 100%
5 L 100% 5 L 100%
6 S,M 75% 6 M,M 100%
7 M 50%
Tabelul 2.8: Sarcinile robotului
Sarcina Viziune Manipulare Miscare
Cautarea unei prize x x
Miscare ^nspre priza x x
Conectarea la reteaua electrica x x
are utilizarea medie 100%, timpul necesar terminarii joburilor ind de 6 unitati
de timp. Situatia este mai complexa daca joburile ruleaza la diferite lungimi
de timp. Plani catoarele de joburi trebuie sa echilibreze indicele ridicat de
utilizare cu corectitudinea (altfel joburile mari nu vor niciodata rulate).
Paralelismul poate aparea c^and joburi diferite independente ce ruleaza pe
o masina au mai multe faze (de exemplu calcule, scrierea unui zone tampon
gra ce, apeluri la sistem etc). Sa presupunem ca un job se executa si necesita
efectuarea unei operatii I/O (costisitor comparativ cu un calcul) ^nainte de a
merge mai departe; jobul concurent care ruleaza este suspendat (este startat
un altul), si este reluat dupa ce operatia I/O a fost terminata (se presupune ca
exista hardware specializat, precum canale I/O sau procesor special I/O, iar
sistemul de operare plani ca joburi diferite si partajarea resurselor).
Exemplu de paralelism la nivel de program. Un robot a fost programat sa
caute o priza c^and ram^ane fara energie; c^and o gaseste se re^ncarca singur. Trei
subsisteme sunt implicate ^n acest proces: subsistemele de viziune, de mani-
pulare si de miscare. Fiecare subsistem este controlat de un procesor diferit si
toate proceseaza date c^and robotul face o actiune (Tabel 2.8). Subsistemul de
viziune le ghideaza pe celelalalte. Poate exista si un procesor central (creier).
Acesta este un exemplu de paralelism ^n control ^n care sarcini diferite sunt
efectuate concurent pentru a atinge un scop comun.
2.2.3 Linii de procesare
O metoda pentru a accelera executia unui program este aceea de a permite
urmatoarei instructiuni sa e adusa din memorie ^n timp ce instructiunea
3 Rezumat: Liniile de procesare (pipeline) implementeaz a paralelismul la nivel hardware.
Performantele unei asemenea linii depind de capacitatea de divizare ^n etape a sarcinii pentru
care este destinat. Surplusul este dominat de timpul de umplere a liniei.

91
Tabelul 2.9: De nitii
Denumire Inteles
Coliziune competitia pentru unitatea functionala
Initiere timp speci c pentru o instanta
Latenta numarul de pasi de timp ^ntre initializari
Ciclul latentei o iteratie repetitiva
Latenta interzisa multime de sarcini care cauzeaza coliziunea

Figura 2.12: Ordonare completa


curenta este executata. Procesoarele pipeline (tip conducta, tub sau banda
rulanta) duc aceasta idee mai departe. O instructiune poate ^naintata c^and o
alta este decodata, o a treia^nainteaza operanzii sai, a patra efectueaza operatia
dorita si o a cincea scrie rezultatul sau. Cu alte cuvinte, diferite parti implicate
^n executarea unei instructiuni sunt rupte ^n etape; ecare etapa poate opera
concurent cu alte etape pe o instructiune independenta ^n linia de procesare
a instructiunii. Daca ecare etapa necesita un ciclu de ceas, procesorul este
capabil sa execute o instructiune per ciclu. Totusi nu este posibila mentinerea
liniei de procesare plina tot timpul deoarece apar o serie de instructiuni de
rami care si alti factori.
Forme timpurii de procesare pipeline au aparut la IBM/360 Model 91 si
CDC 6600. Printre cele mai recente exemple de procesoare pipeline se remarca
procesoarele RISC, precum IBM RS/6000, MIPS, HP-PA si Sun SPARC.
Procesarea^n linie (pipelining) este o tehnica de executie a instructiunilor
multiple^ntr-o maniera suprapusa (precum^ntr-o linie de asamblare; paralelism
prin suprapunere). Debitul este o expresie pentru c^at de des este terminata
o instructiune. Timpul necesar pentru a trece la urmatorul pas (^n termenii
ciclului masinii) este determinat de cel mai mare pas al liniei (adesea este de
un ciclu). Lungimea este numarul de faze (ce determina latenta). O serie de
alte de nitii sunt prezentate ^n Tabelul 2.9.
O linie de procesare clasica se obtine prin divizarea proceselor ^n sarcini
(task) secventiale, executarea secventiala a sarcinilor prin suprapunere. Poate
stabilita o ordonare partiala astfel: Ti  Tj daca si numai daca exista un
drum de la Ti la Tj (Figura 2.12).
Pentru un linie de procesoare poate stabilita o diagrama logica si o harta
Gantt (Figura 2.13). Un tabelul de rezervare poate asociat unei structuri
liniare (Figura 2.14; cu o intrare per linie si coloana) sau unei structuri ne-liniare
(multiple intrari/linie { utilizare multipla a etapelor). O linie de procesare are
mai multe etape logice, blocaje si magistrale de alimentare; o linie de procesare
generala cu 3 etape este prezentata ^n Figura 2.15. Valorile pasate (date sau
control) de la o etapa la alta sunt de obicei plasate ^n registrii. O instructie
este activa ^n exact o etapa ^n pipe la orice moment de timp.
92
Figura 2.13: Exemplu: A = (B  C + D)=E (a) Diagrama bloc; (b) Diagrama
spatiu-timp (harta Gantt)

Figura2.14: (a) Tabel de rezervare; (b) Managementul resurselor ^n cazul seg-
mentelor unui sarcini A

Figura 2.15: O linie de procesoare generala

Figura 2.16: Descompunerea ^n timp

93
Tabelul 2.10: Exemplu: adunarea numerelor ^n virgula mobila
Activitate Timp
Comparare exponenti si deplasarea mantisei 60ns
Adunarea mantiselor 50ns
Normalizarea mantisei 90ns
Ajustarea nala a exponentului 80ns
E cienta depinde de mentinerea plina a liniei de procesare (Figura 2.16). In
conditii ideale, timpul per instructiune este timpul per instructiune pe masina
secventiala divizat la numarul de faze (sarcini) ale liniei, iar accelerarea este
numarul de etape. Practic este di cila echilibrarea sarcinilor. Astfel frecventa
1=Tcl  1= maxifTig. Int^arzierea liniei (latenta; timpul petrecut ^n linie) cu
k faze este kTcl. Ine cientele sunt datorate ^ntreruperilor, inechilibrului si
timpului de umplere a liniei. Intreruperile pot apare de exemplu ^n rami cari
conditionale.
Fie k numarul de etape (sarcini, faze) din linia de procesare, numarul n
de rezultate, tk numarul de unitati de timp pentru a obtine n rezultate ca
ajutorul liniei cu k-etape. Accelerarea este S = t =tk = nk=[k + (n 1)],
si pentru n  k, S  k. E cienta utilizarii este  = S=Smax = S=k =
1

n=[k + (n 1)]. Debitul este numarul mediu de rezultate obtinute per unitate
de timp, n=(tk T ) = n=[(k + (n 1))T ]:
Exemplul 1. Timpul pentru cinci etape este 10, 8, 10, 10, 7 ns. Timpul de
umplere este de 1 ns. Timpul mediu de executie a instructiunii este 10 + 7 +
10+10+7 = 45ns, iar timpul pentru linia de procesare este 11 ns. Accelerarea
este 45=11 = 4:1.
Exemplul 2. Un caz particular de valori Ti inechilibrate sunt prezentate ^n
Tabelul 2.10. In acest exemplu, S = 280=90 = 3:1 si daca timpul de umplere
este Tlan = 10ns, S = 280=(90 + 10) = 2:8.
Clasi carea pipeline-urilor este data ^n Tabelul 2.11.
2.2.4 Calcul vectorial
Un calculator vectorial numit si procesor vectorial este o masina destinata
sa trateze e cient operatiile aritmetice pe elemente de date numite vectori.
Asemenea masini sunt utile^n mod special^n calculul stiinti c^nalt-performant,
^n care matricele si vectorii sunt des ^nt^alniti.
Anumite arhitecturi contin mai multe linii de procesare de instructiuni si
permit ca mai multe instructiuni sa e executate ^n acelasi timp. Daca o
masina este capabila sa execute mai mult dec^at o instructiune per ciclu de
ceas (CPI>1), atunci este numita calculator superscalar. De exemplu, un
IBM Power2 contine procesor RISC cu pipeline de instructiune, cu linii de
procesare multiple si separate pentru operatii pe ^ntregi si operatii ^n virgula
mobila; este capabil astfel sa execute doua operatii pe ^ntregi, doua operatii
4 Rezumat: Un calculator vectorial are linii de procesare pentru operatii pe vectori de date.
Aceste linii sunt legate ^ntre ele pentru a reduce timpii de inactivitate.

94
Tabelul 2.11: Clasi care pipeline
Criteriu Clasi care Exemple
Ierarhie Aritmetic Pipeline ALU
Instructiune Suprapunere ^naintare/executie
Procesor Un procesor per etapa
Functie Uni-functie Adunator
Multi-functie Recon gurabil pentru diverse functii
Recon gurabilitate Static O functie/moment (nu poate mixa +/*)
Dinamic Mixeaza functii
Control Scalar Controlat software, cel putin o instructiune
per sarcina
Vector Controlat hardware, utilizeaza o instructiune
pentru initierea unei secvente de sarcini,
elimina ^naintarea instructiunii
Structura Regulat Ti constant, xat
Iregulat Ti poate varia la timpul rularii, necesita con-
trol al raspunsului (activ)
de adunare ^n virgula mobila, si doua multiplicari ^n virgula mobila ^n acelasi
ciclu de ceas, astfel conduc^and la o viteza de procesare ideala de CPI=6.
Un calculator vectorial contine o multime de linii de procesare aritmetice.
Acestea sunt utilizate pentru a procesa elementele unor vectori sau matrice
e cient prin suprapunerea executiei diferitelor parti ale unei operatii aritmetice
pe elemente diferite. Exista o similaritate cu liniile de asamblare a produselor.
Un procesor vectorial (de exemplu Convex C3880 si Cray Y-MP) opereaza
pe vectori ^n loc de operanzi scalari conventionali.
Operatiile din liniile de procesare pot realizate ^n paralel. Totusi, para-
lelismul nu este complet p^ana c^and primele elemente ale vectorilor nu umplu
linia de procesare (timp de start).
Etapele unei operatii ^n virgula otanta. Se considera pasii sau etapele
urmatoare implicate ^ntr-o adunare ^n virgula mobila pe o masina secventiala
s = x + y. Exponentii celor doua numere ^n virgula mobila ce se aduna sunt
comparati pentru a gasi numarul cu cea mai mica valoare absoluta (A). Man-
tisa numarului cu cel mai mic exponent ^n modul este deplasata astfel ^nc^at
exponentii celor doua numere devin aceiasi (B). Mantisele sunt adunate (C).
Rezultatul adunarii este normalizat (D). Se fac veri cari pentru a vedea daca
nu apar exceptii de-a lungul unei adunari, precum depasirile (E). In nal se
fac rotunjirile cerute reprezentarii rezultatului (F). Tabelul 2.12.a prezinta un
exemplu; numerele adunate sunt x = 1234:00 si y = 567:8 (sunt reprezentate
^n notatie zecimala cu mantisa cu patru cifre).
Se considera problema efectuarii unei asemenea adunari scalare pe toate
elementele unei perechi de vectori de lungime n. Daca ecare etapa a executiei
unei adunari scalare necesita  unitati de timp, atunci ecare adunare necesita
6 unitati de timp (nu se contorizeaza timpul necesar pentru a^nainta si decoda
instructiunea ^nsasi sau pentru a ^nainta cei doi operanzi). Astfel numarul de
95
Tabelul 2.12: (a) Un exemplu ce arata etapele unei adunari ^n virgula mobila:
s = x + y; (b) Adunarea ^n virgula mobila scalara a elementelor vectoriale
Pas A B C D E F
x 0.1234E4 0.12340E4
y -0.5678E3 -0.05678E4
s 0.066620E4 0.66620E3 0.66620E3 0.6662E3
Timp !
Pas  2 3 4 5 6 7
A x +y 1 1 x +y 2 2
B x +y 1 1
C x +y 1 1
D x +y 1 1
E x +y 1 1
F x +y 1 1

Figura 2.17: Linie de procesare pentru adunarea^ n virgula mobila a elementelor


vectoriale
unitati de timp necesare pentru adunarea tuturor elementelor celor doi vectori
^ntr-o maniera seriala va Ts = 6n (Tabelul 2.12.b).
Presupun^and ca operatia de adunare descrisa mai sus este realizata de o linie
de procesare (Figura 2.17). Fiecare etapa a liniei de procesare are o unitate
aritmetica separata pentru operatia efectuata ^n respectiva etapa. Daca etapa
A a fost terminata pentru prima pereche de elemente, aceste elemente pot
mutate la urmatoarea etapa B pe c^and a doua pereche de elemente intra
^n etapa A. Din nou ecare etapa necesita  unitati de timp. Tabelul 2.13
evidentiaza modalitatea ^n care lucreaza linia de procesoare. Se observa ca
sunt necesare 6 unitati de timp pentru a termina ^nsumarea primei perechi
de elemente, dar rezultatul ^nsumarii urmatoarei perechi este disponibil peste
 unitati de timp. Astfel timpul Tp pentru adunarea a doi vectori de lungime
n este Tp = 6 +(n 1) = (n +5) . Primele 6 unitati de timp sunt necesare
pentru umplerea liniei de procesare si a obtine primul rezultat. Dupa ultimul
resultat xn + yn linia de procesare este golita.
Compar^and ecuatiile pentru Ts si Tp se observa clar ca (n +5) < 6n , pen-
96
Tabelul 2.13: Diagrama de timp a adunarii vectoriale a doi vectori
Timp !
 2 3 4 5 6 7 8
A x1 + y1 x2 + y2 x3 + y3 x4 + y4 x5 + y5 x6 + y6 x7 + y 7 x8 + y8
B x1 + y1 x2 + y2 x3 + y3 x4 + y4 x5 + y5 x6 + y 6 x7 + y7
C x1 + y1 x2 + y2 x3 + y3 x4 + y4 x5 + y 5 x6 + y6
D x1 + y1 x2 + y2 x3 + y3 x4 + y 4 x5 + y5
E x1 + y1 x2 + y2 x3 + y3 x4 + y 4
F x1 + y1 x2 + y2 x3 + y 3
tru n > 1. Astfel versiunea liniei de procesare este mai rapida dec^at versiunea
seriala cu un factor aproape egal cu numarul de etape din linia de procesare.
Pentru exemplul dat, pentru n mare, adunarea pe baza liniei de procesare este
^n jur de 6 ori mai rapida dec^at adunarea scalara. Pentru anumite arhitec-
turi, numarul de etape ^n adunarea ^n virgula mobila poate mai mica dec^at
6. Operatiile dintr-o linie de procesare pentru multiplicarea ^n virgula mobila
sunt putin diferite de cele ale liniei pentru adunare (inclusiv ^n numarul de
etape). Exista de asemenea linii de procesare pentru operatii pe ^ntregi. Pen-
tru efectuarea operatiilor vectoriale ^ntr-un Cray-1, liniile de procesare au de
la 1 la 14 etape depinz^and de tipul de operatie efectuat.
Operatii de ^mprastiere si str^angere (scatter, gather). Uneori numai
anumite elemente de vector sunt necesare^n calcule. Majoritatea procesoarelor
vectoriale permit selectarea elementelor unui vector (operatie de str^angere) si
punerea lor ^ntr-un vector sau registru vectorial. Daca elementele respecta un
sablon regular spatiat, spatiile ^ntre elemente care trebuie str^anse se numeste
pas (stride). De exemplu daca x ; x ; x ; x ; : : : ; x b n = c sunt extrase
1 5 9 13 4 ( 3) 4 +1
din vectorul (x ; x ; x ; x ; x ; x ; : : : ; xn ) pentru o anumita operatie vectoriala,
atunci pasul este egal cu 4. Operatia contrara, de ^mprastiere, reformateaza
1 2 3 4 5 6

vectorul de iesire astfel ^nc^at elementele sunt spatiate conform unui sablon.
Inlantuire si registrii vectoriali. Anumite masini contin registrii vectoriali
pentru a accesa mai multe elemente ale unui vector la un moment dat. Registrii
vectoriali ^nainteaza valorile elementelor vectorilor ^n liniile de procesare arit-
metice, permit^and unui pipeline sa efectueaza o operatie aritmetica per unitate
de timp (uzual un ciclu de ceas). Un registru general sau un registru ^n virgula
mobila detine o singura valoare; registrii vectoriali contin mai multe elemente
ale unui vector la un moment dat. De exemplu, un registrul vectorial al unui
Cray Y-MP contine 64 elemente pe c^and un registru vectorial al unui Cray C90
contine 128 elemente. Continutul unui registru vectorial este expediat la (sau
receptionat de la) o linie de procesare vectoriala, element cu element.
Registrii scalari sunt con gurati astfel ^nc^at sa e utilizati de un pipeline
vectorial: valoarea din registru este citita odata la ecare  unitati de timp si
pusa ^n linia de procesare asemenea unui element vectorial. Aceasta permite
elementelor unui vector sa e operate cu un scalar. Pentru calculul y = 2:5  x,
de exemplu, 2:5 este stocat ^ntr-un registru scalar si elementele lui x sunt
^naintate liniei de multiplicare vectoriala la ecare  unitati de timp.
97
Figura 2.18: (a) Inlantuirea utilizata pentru calculul ax + y; (b) O arhitectura
vectoriala generica
Anumite arhitecturi vectoriale permit ca iesirea unei linii de procesare sa
e ^nantuita direct la o alta linie de procesare. Aceasta ^nlantuire elimina
necesitatea de a stoca rezultatele primei linii de procesare^nainte de expedierea
la a doua linie de procesare. Figura 2.18 demonstreaza utilizarea unei^nlantuiri
^n calcule a operatiei vectoriale ax + y, unde x si y sunt vectori si a este
un scalar constant. Inlantuirea poate dubla numarul de operatii ^n virgula
mobila care sunt realizate ^n  unitati de timp. Odata ce linia de procesare
pentru multiplicare si adunarea sunt umplute, o operatie de multiplicare si
una de adunare ^n virgula mobila sunt terminate la ecare  unitati de timp.
Conceptual este posibila ^nlantuirea a mai multe unitati functionale laolalta,
oferind o accelerare mai mare.
Daca un procesor vectorial contine registrii vectoriali, elementele vectorului
sunt citite din memorie direct ^n registrul vectorial prin operatii de ^ncarcare
vectoriala. Rezultatul vector al unei operatii vectoriale este pus^ntr-un registru
vectorial ^nainte de stocarea sa ^n memorie printr-o operatie de stocare vecto-
riala; se permite astfel utilizarea sa^n alt calcul fara a necesar sa e recitit si se
permite suprapunerea stocarii cu alte operatii. Pe asemenea masini, operatiile
artitmetice si logice sunt operatii registru-la-registru; adica sunt efectuate nu-
mai pe vectori care sunt deja ^n registrii vectoriali. Registrii vectoriali pot
umpluti c^and liniile de procesare efectueaza alte operatii. Vectorul rezultat al
procesarii poate pus ^napoi ^ntr-un registru vectorial sau expediat direct la o
alta linie de procesare (^nlantuire).
Procesoare vectoriale cu memorie-la-memorie. Acest tip de procesoare
vectoriale permite operanzilor vectoriali sa e ^naintati direct de la memorie
la diferitele linii de procesare si rezultatele sa e scriese direct ^n memorie.
Deoarece elementele vectorului trebuie sa soseasca de la memorie si nu de la
un registru, este necesar un timp mai lung pentru a starta operatia (costul
accesului la memorie ind mai ridicat). Un exemplu de asemenea procesor
vectorial este CDC Cyber 205.
Datorita abilitatii de suprapunere a accesului la memorie si posibila re-
utilizare a registrilor vectorili, procesoarele registru-la-registru sunt ^n mod
uzual mai e ciente dec^at cele memorie-la-memorie. Totusi odata cu cresterea
98
lungimii vectorilor, aceasta diferenta este diminuata si chiar mai mult: proce-
soarele memorie-la-memorie se dovedesc mai e ciente c^and vectorii sunt lungi.
Pe de alta parte ^n practica vectorii scurti sunt mai des utilizati.
Intercalarea bancilor de memorie. Pentru a permite accesul rapid la el-
ementele vectoriale stocate ^n memorie, memoria procesoarelor vectoriale este
adesea divizata ^n blocuri de memorie. Se asociaza adrese de memorie succe-
sive la blocuri succesive ^n mod ciclic: astfel cuv^antul 0 este stocat ^n blocul 0,
cuv^antul 1 este ^n blocul 1, . . . , cuv^antul n este ^n blocul n, cuv^antul n +1 este
^n blocul 1,. . . , etc, unde n estek numarul de blocuri de memorie. n este ^n mod
uzual o putere a lui 2: n = 2 , unde k = 1; 2; 3; sau 4. Un acces la memorie
(^ncarcare sau stocare) a valorii unei date necesita mai multe cicluri pentru a
nalizata. Fiecare bloc de memorie permite numai unei singure date sa e
accesata la un moment dat, dar la acelasi moment de timp pot accesate mai
multe blocuri de memorie. C^and sunt citite elementele unui vector stocat^ntr-o
memorie intercalata, citirile sunt transmise la blocurile de memorie astfel ^nc^at
un element de vector este citit de la un bloc ^ntr-un ciclu de ceas. Daca un
acces la memorie necesita n cicluri de ceas, atunci n elemente ale unui vector
pot citite la costul unui acces de memorie (de n ori mai rapid dec^at accesul
la o singura banca de memorie).
Performanta calculului vectorial. Pentru arhitecturi vectoriale tipice, val-
oarea  a timpului necesar pentru a naliza o etapa a liniei de procesare este
echivalent cu un ciclu de ceas a masinii. Aceasta ^nseamna ca hardware-ul
efectueaza o operatie ^n virgula mobila per ciclu de ceas.
Fie k numarul de  unitati de timp ale operatiei secventiale echivalente
(numarul de etape din linia de procesare). Atunci timpul de executie a operatiei
secventiale pe un vector de lungime n este Ts = kn , si timpul pentru efectuarea
versiunii pipeline este Tp = k +(n 1) = (n + k 1) , c^astigul ind semnalat
^n cazul n > 1 : Ts > Tp.
Timpul de start este timpul necesar pentru a porni operatia. Intr-o masina
secventiala este de asemenea necesar un timp pentru a pregati ciclul de repetare
a operatiei pe ^ntregul vector; elementele vectorului sunt de asemenea necesare
a ^naintate de la memorie. Daca Ss este numarul de  unitati de timp pentru
startul timpului secvential, atunci Ts = (Ss + kn) . In versiunea pipeline,
transferul de la registrii vectoriali sau de la memorie la pipeline indica timpul
de start; e aceasta cantitate Sp. Un alt cost de k unitati de timp reprezinta
timpul necesar pentru a umple linia de procesare. Deci Tp = (Sp + k + n 1) .
C^and lungimea vectorului devine mare (n ! 1), timpul de start devine
neglijabil ^n amble cazuri, adica Ts ! kn si Tp ! n . Astfel pentru n mari,
Ts este de k ori mai mare dec^at Tp .
Exista un numar de alti termeni care descriu performanta procesoarelor
vectoriale: Rn ; R1 ; n = ; nv . Rn este numarul de M ops obtinuti pentru un
vector de lungime n. R1 este numarul asimptotic de M ops pentru un calcu-
1 2

lator vectorial dat c^and lungimea vectorilor devine mare. n = este lungimea
1 2
n a vectorului pentru care Rn este egal cu R1 =2 (n = reprezinta lungimea
vectorului necesara pentru a obtine un rezultat la aproximativ 2 unitati de
1 2

timp sau la ecare doua cicluri de ceas). nv este lungimea minima n a vec-
torului pentru care efectuarea unei operatii vectoriale pe n elemente este mai
99
Figura 2.19: Performanta unei pipeline vectorial: (a) Timp per rezultat ca
functie de lungimea vectorului; (b) Rn functie de lungimea vectorului n
Tabelul 2.14: Caracteristicile de perfomanta ale procesoarelor vectoriale ce uti-
lizeaza numere ^n virgula mobila pe 64 biti; expresia x  y se refera la multi-
plicarea element cu element a doi vectori, x si y.
Masina An Ciclu Peak R1 n=
1 2
ceas perf. (x  y) (x  y)
(nsec) (M ops) (M ops)
Cray-1 '76 12.5 160 22 18
CDC Cyber 205 '80 20.0 100 50 86
Cray X-MP (4 proc.) '83 9.5 840 70 53
Cray-2 (4 proc.) '85 4.1 1951 56 83
IBM 3090 (8 proc.) '85 18.5 432 54 25
Alliant FS/8 (8 proc.) '86 170.0 47 1 23
e cienta dec^at executarea a n operatii scalare. Figura 2.19 sugereaza relatia
dintre acesti termeni pentru o masina vectoriala cu  = 6 ns si Sp = 16 (ima-
gine idealizata; exista mici salturi ^n curbe c^and n este egal cu un multiplu de
lungimea registrului vectorial). Tabelul 2.14 prezinta c^ateva caracteristici pen-
tru calculatoare vectoriale cunoscute; valorile R1 si n = sunt corespunzatoare
multiplicarii a doi vectori.
1 2

Evolutia calculatoarelor vectoriale. Unul dintre primele supercalcula-


toare cu procesoare vectoriale a fost CDC Star 100 ('74, bazat pe limba-
jul de programare APL). CDC Cyber 205 ('80, masina vectoriala memorie-la-
memorie) este bazat pe conceptele originale ale lui CDC Star 100, contine p^ana
la 4 linii de procesare cu scop general (^n locul celor destinate unor operatii
speci ce) si are posibilitatea de a efectua operatii de ^mprastiere si str^angere.
Calculatoare vectoriale mai recente includ IBM 3090, Alliant FX/8 (un mul-
tiprocesor cu memorie partajata cu 8 CPU, ecare cu un procesor vectorial
100
Tabelul 2.15: Caracteristici ale masinilor Cray
Caracteristici Cray-1 Cray X-MP Cray Y-MP
1 Proc/4 Proc 1 Proc/8 Proc
An de lansare '76 '83 '89
Nr. maxim de procesoare 1 4 8
Nr. registrii vectoriali 8 8 8
Ciclu ceas 12.5 nsec 9.5 nsec 6.0 nsec
Memorie maxima 1 Mb 16 Mb 128 Mb
Cuv^ant 64 biti 64 biti 64 biti
Dimensiune registru vectorial 64 cuvinte 64 cuvinte 64 cuvinte
Peak (M ops) 160 235 / 940 333 / 2667
LinPack (M ops, n =1000) 110 218 / 822 324 / 2144
atasat), si calculatoarele din seria Convex series.
Calculatoarele Cray au avut cel mai mare succes ^n acest domeniu. Cray-1
('76), a fost construit pentru super-calcul pe baza unor unitati vectoriale ar-
itmetice si a fost cea mai rapida masina a timpului sau si prima care a uti-
lizat ^nlantuirea. Ofera operatii de ^mprastiere si str^angere, este o masina cu
registrii vectoriali de 64 de elemente ^n simpla precizie (64 biti). At^at Cray-1
c^at si urmatoarele procesoare vectoriale Cray contin 12 unitati diferite sau
unitati functionale, de urmatoarele tipuri: linii de procesare vectoriale/scalare
pentru operatii vectoriale cu elemente ^ntregi sau logice, linii de procesare vec-
toriale/scalare pentru operatii ^n virgula mobila utiliz^and scalari sau vectori,
linii de procesare pentru calcularea adreselor. Cray X-MP ('83, MP de la mul-
tiprocesare) este mai rapid dec^at Cray-1 si suporta suplimentar suprapunerea
operatiilor; este un multiprocesor (2-4 CPU) cu memorie partajata cu ecare
CPU control^and propria multime de procesoare vectoriale, este capabil de 2
citiri si 2 scrieri per ciclu de ceas, iar simultan pot opera 3 linii de proce-
sare ^n virgula mobila. Cray-2 ('85) cu p^ana la 4 procesoare a ^mbunatatit
performantele unui Cray X-MP numai pentru acele probleme care necesitau o
cantitate mare de memorie. Cray Y-MP ('87) a fost o reeditare a lui Cray X-MP
^n versiunea cu p^ana la 8 procesoare, iar Cray C90 ('90, ciclu de ceas 4.2 ns)
cu p^ana la 16 procesoare. Cray Y-MP/M90 ('91, de la 8 la 16 procesoare, ciclu
de ceas 6 ns), asemanator cu Cray Y-MP a oferit posibilitatea tratarii adreselor
de memorii mari (mai multa memorie); datorita memoriei aditionale opereaza
la jumatate din viteza unui Cray C90. Tabelul 2.15 prezinta caracteristicile
masinilor discutate. Cray-3 ('93) nu a avut un succes comercial; contine 4 pro-
cesoare si ciclu de ceas de 2.1 ns. Procesoarele masinii sunt complet^nconjurate
de un lichid din motive de racire; ^n varianta sa ^n plastic, Cray-3 este similar
cu un acvariu mare cu multe re atasate procesoarelor care se leagana usor cu
scurgerea lichidului (masina este numita uneori calculatorul{bol al pestisorului
de aur). Caracteristicile ultimelor modele sunt prezentate ^n Tabelul 2.16.
Programarea calculatoarelor vectoriale. Pentru a crea programe care
maximizeaza performanta pe aceste calculatoare, datele trebuie organizate ca
vectori si trebuie utilizate c^at mai multe operatii vectoriale.
101
Tabelul 2.16: Parametrii sistemelor de calcul vectorial SGI/Cray
Model Cray J90 Cray T90
Ciclu ceas 10 ns (100 MHz) 2.2 ns (455 MHz)
Performanta peak per procesor 200 M ops 1.8 G ops
Nr.procesoare 4-32 1-32
Maximal 6.4 G ops 58 G ops
Mmeoria principala 4 Gb 8 Gb
Latimea de banda a unui procesor 1.6 Gb/s 24 Gb/s
Compilatoarele vectoriale ^ncearca sa converteasca cod scalar ^n cod vec-
torial pe c^at posibil. Aceste compilatoare nu cunosc programul utilizator si
este posibil sa nu e capabile sa vectorizeze codul e cient. De aceea este re-
comandata declararea explicita a operatiilor vectoriale. Producatorii de calcu-
latoare vectoriale ofera compilatoare cu constructori aditionali de limbaj care
asista ^n tratarea vectorilor si matricelor. Acesti constructori ajuta program-
atorul sa interpreteze un vector ca o singura entitate ^n locul unei liste de
elemente. Cray Fortran de exemplu este o extensie a Fortranului 77 care
speci ca operatiile vectoriale pentru super-calculatoarele Cray. Multe din
constructiile aditionale din Cray Fortran sunt incluse astazi ^n Fortran 90
si HPF (High Performance Fortran). Se considera ^n cele ce urmeaza c^ateva
exemple ^n Cray Fortan.
Exista mai multi termeni care apar frecvent ^n relatie cu programarea vec-
toriala sau paralela: notatie vectoriala, benzi de lucru, recurente, operatii de
reducere, analiza dependentelor.
Notatia vectoriala permite programatorului sa considere matrice si vectori
ca entitati. Daca un vector x de lungime n este declarat ^n Cray Fortran
prin DIMENSION X(N) atunci ^ntreaga matrice este referita prin X(1:N) sau X
si se elimina necesitatea de a considera ecare element dintr-o matrice sep-
arat ^n cicluri DO. De exemplu, ciclul de dublare a ecarui element al vec-
torului se poate scrie X(1:N) = 2.0* X(1:N) (nu numai ca scrierea este mai
scurta, mai simpla si mai evidenta pentru programator, dar si compilatorul
recunoaste faptul ca este o operatie vector, produc^and codul obiect corect).
Pentru o dublare numai a elementelor de index impar, ^n notatia vectoriala
X(1:N:2) = 2.0 * X(1:N:2) (incrementul ciclului este 2; parametrul 2 este
referit drept pas al operatiei vectoriale). Uneori este utila referirea la coloane
sau linii individuale ale unei matrice sau vector. Sa presupunem ca ma-
tricea A este declarata DIMENSION A(N,M). Atunci expresia A(2,1:M) sau
A(2,:), reprezinta linia secunda a lui A. Notatii similare sunt utilizate ^n
MatLab, IDL (Interactive Data Language), Fortran 90, HPF.
Banda de lucru este o metoda de ^mpartire a unei operatii vectoriale mari
^n bucati e ciente. De exemplu, se considera executia unui ciclu DO ^n care
elementele vectorului A de 500 de elemente sunt calculate secvential. Daca se
utilizeaza o masina vectoriala cu 64 de elemente ^n registru vectorial, atunci
este indicata ^mpartirea acestui ciclu ^n segmente mai mici astfel ^nc^at ecare
piesa sa lucreze pe un vector de lungime 64; se acorda astfel un timp registrilor
pentru umplere cu urmatorul segment de vector, altfel va exista o ruptura ^n
102
performanta at^ata timp c^at registrul vectorial este golit ^n pipeline ^nainte ca
urmatoarele 64 elemente ale vectorului sa e^naintate la memorie. De exemplu,
^n notatia vectoriala ciclul devine
DO K=1,448,64
A(K:K+63) = ....
ENDDO
A(449:500) = ....
O recurenta reprezinta un calcul ^n pasi ^n care rezultatul unui pas este
utilizat ^ntr-un pas ulterior. De exemplu
DO I=1,N
X(I+1) = 2.0 * X(I)
ENDDO
contine o recurenta, deoarece calculul lui X(3) utilizeaza valoarea X(2), calcu-
lului lui X(4) utilizeaza valoarea X(3), etc. O recurenta poate sa apara si c^and
variabila asignata ^ntr-o instructiune apare ^ntr-o expresie aritmetica pentru a
calcula acea variabila, precum Q = Q + X(I)*Y(I). Determinarea recurentelor
este importanta pentru ca acestea nu pot usor vectorizate. In exemplul dat
daca X(1) este 1, atunci X(2) este 2, X(3) este 4, si X(N+1) este 2N . Notatia
vectoriala nu poate utilizata ^n acest caz. Sa presupunem ca ^ncercam sa
vectorizam acest ciclu prin X(2:N+1) = 2.0* X(1:N). Aceasta ^nseamna ca
elementele lui X vor ^nt^ai dublate, apoi valorile dublate sunt stocate ^n el-
emente succesive ale lui X . Cu alte cuvinte, daca cele N + 1 elemente ale lui
X initiale sunt (1, 2, 3, 4, . . . , N; N + 1), atunci se produce (2, 4, 6, 8, . . . ,
2N; 2N + 2) si ecare valoare va stocata ^n urmatorul element al matricei,
adica ^n nal (1, 2, 4, 6, . .. , 2N 2; 2N ), care nu este rezultatul dorit.
O operatie de reducere returneaza un rezultat scalar la o operatie asupra
unui vector. Un exemplu comun de asemenea operatie este produsul scalar a
doi vectori. Fie x  y acest produs. Atunci ^n cazul serial,
DP = 0.0
DO I=1,N
DP = DP + X(I)*Y(I)
ENDDO
Deoarece valoarea DP este alterata la ecare iteratie a ciclului, acest ciclu nu
poate transmis unei linii de procesare (exista o recurenta). In fapt toate
operatiile de reducere pot scrise ca recurente. O metoda de a trata acest caz
este aceea de a calcula produsele xi yi utiliz^and o linie de procesare. Produsele
sunt acumulate^ntr-un vector q de lungime k cu elementele q = x y +xk 
yk + x k  y k +   , q = x  y + xk  yk + x k  y k + : : :
1 1 1 +1

etc (vector de sume partiale), iar ^nsumarea celor k elemente ale vectorului q
+1 2 +1 2 +1 2 2 2 +2 +2 2 +2 2 +2

produce valoarea corecta a produsului scalar. Functii speciale sunt uzual oferite
pentru a trata operatiile de reducere (^n Cray Fortran prin SDOT).
Doua instructiuni sunt dependente daca o variabila dintr-o instructiune
este utilizata ^n cealalta instructiune. De exemplu exista o dependenta ^ntre
instructiunile: A = B + C si D = A * E deoarece variabila A este de nita ^n
103
Figura 2.20: Graf de ux al datelor: ecare nod al grafului este un proces sau
un r (conceptual un procesor)
prima instructiune si este utilizata ^ntr-o instructiune ulterioara. De aseme-
nea exista o dependenta ^ntre instructiunile corespunzatoare unei recurente.
C^and se vectorizeaza un ciclu, programatorul trebuie sa e atent sa veri ce
daca exista o dependenta ^ntre iteratiile ciclului. Majoritatea compilatoarelor
vectoriale si paralele includ analiza anumitor dependente ale codului. Analiza
include si veri carea aparitiei operatiilor de reducere si relatiilor de recurenta.
2.2.5 Fluxul datelor
In modelul de programare bazat pe uxul (tra cul, scurgere, flow) datelor,
instructiunile sunt activate la disponibilitatea datelor operanzi ai instructiu-
nilor (Figura 2.20), spre deosebire de modelele de ux a controlului ^n care
calculul este reprezentat printr-o multime de instructiuni ^ntr-o secventa im-
plicita sau explicita. Unul dintre avantaje este acela ca toate dependentele sunt
explicit prezente^n graful de ux al datelor, astfel^nc^at paralelismul nu este as-
cuns de hardware. Temele principale sunt granularitatea operatiilor, localitate,
tratarea e cienta a structurilor de date complexe precum matricele, probleme
datorate paralelismului ^n exces.
Executiile paralele trebuie sa prezerve semantica programelor secventiale.
Nu toate programele pot executate ^n paralel. O secventa paralelizabila este
de exemplu urmatoarea:
a = b - c; d = e + f; x = u - v; y = u + v
(toate instructiunile pot executate ^n paralel obtin^andu-se aceleasi valori de
ecare data); o secventa neparalelizabila este urmatoarea:
x = u - v; y = x + y; z = u - v; z = u + v
(x; y; z pot sa aiba valori diferite ^n executia paralela a instructiunilor).
Dependentele sunt proprietati ale programelor ce determina ordinea^n care
rezultatele trebuie calculate, determin^and o margine superioara a paralelismu-
lui posibil. Instructiunile dependente nu pot executate simultan sau complet
5 Rezumat: In modelul de programare bazat pe uxul datelor, instructiunile sunt activate
la disponibilitatea datelor operanzi ai instructiunilor.

104
suprapuse. Dependentele in uenteaza astfel gradul de paralelism. Anumite
dependente pot eliminate prin modi carea programelor.
Dependentele pot : de date, de nume sau de control. O instructiune J este
dependenta ^n date de instructiunea I daca instructiunea I produce un rezultat
care este utilizat de instructiunea J , sau instructiunea J este dependenta de
instructiunea K , si instructiunea K este dependenta de instructiunea I s.a.m.d
(lanturile de dependente pot foarte lungi). Dependenta de nume are loc
c^and doua instructiuni utilizeaza acelasi registru sau locatie de memorie, dar
nu exista o scurgere a datelor ^ntre instructiunile asociate cu numele. Exista
doua tipuri: antidependenta, c^and j scrie un registru sau o locatie de memorie
pe care i o citeste si i este executat primul, sau dependenta de iesire c^and i si j
scriu acelasi registru sau memorie. Dependenta controlului determina ordinea
instructiunilor la o instructiune de rami care (instructiunile pe ramuri sunt
executate numai c^and sunt necesare). Se impun doua conditii: o instructiune
care este dependenta de control asupra unei ramuri nu poate mutata ^nainte
de rami care astfel ^nc^at executia sa nu mai este controlata de ramura, si o
instructiune care nu este dependenta de control pe o ramura nu poate mutata
dupa rami care astfel ^nc^at executia sa este controlata de ramura.
In cazul unei dependente datorate cursului unui program o variabila este
actualizata ^ntr-o instructiune si este ulterior utilizata ^ntr-o alta, de exemplu:
a:= b * c; d:= a - e
In cazul antidependentei, o variabila este utilizata ^ntr-o instructiune si apoi
actualizata ^ntr-o instructiune ulterioara:
a:= b * c; b:= d + e
In cazul dependentei de iesire, o variabila este actualizata ^ntr-o instructiune
si apoi este actualizata din nou ^ntr-o instructiune ulterioara:
a:= b + c; a:= d - e
Regula proprietarului spune ca procesorul ce detine variabila din partea
st^anga a unei asignari va efectua calculele. Se considera secventa de program:
for i:= 1 to 99 do a[i]:= b[i] + b[i + 1]
O varianta paralela este urmatoarea:
for_all i:= 1 to 4 do for j:= 1 to 25 do {
ii:=(i-1)*25+j; if ii<100 then a[ii]:=b[ii]+b[ii + 1]}
procesorul 1 efectueaza iteratiile 1 la 25, procesorul 2 de la 26 la 50, procesorul
3 de la 51 si 75 si procesorul 4 de la 76 la 99.
2.2.6 Paralelism la nivel de instructiune (ILP)
Pentru ca CPI< 1 trebuie efectuate mai multe instructiuni ^ntr-un ciclu, ^n
paralel. Gradul de paralelism la nivel de instructiune poate crescut prin nu-
meroase tehnici: desfasurarea ciclurilor, plani carea pipeline de baza, plani -
carea dinamica cu tabla de scor, plani care dinamica cu redenumirea registrilor,
pronosticarea dinamica a rami carii, ^naintarea mai multor instructiuni per ci-
clu, analiza dependentei de catre compilatoare.
6 Rezumat: O serie de tehnici duc la cresterea numarului de instructiuni ^ntr-un ciclu.

105
Figura 2.21: Iteratie la care se aplica pipeline software

Figura 2.22: Cicluri: (a) Pipeline prin software; (b) Desfasurarea ciclului
Desfasurarea ciclului. Se considera urmatorul exemplu de paralelism la
nivel de ciclu: for i:=1 to 1000 do x[i]:=x[i] + y[i]. Fiecare iteratie
a ciclului este independenta. Desfasurarea unui ciclu de acest tip poate
realizata static de compilator sau dinamic de catre hardware.
Pipeline prin software. Prin aceasta tehnica se plani ca diferite iteratii
ale aceluiasi ciclu simultan, de obicei prin reorganizarea ciclurilor, astfel ^nc^at
ecare iteratie a codului este realizata din secvente de instructiuni alese din
diferite iteratii ale segmentului de cod original. Plani catorul intercaleaza
instructiuni din diferite iteratii ale ciclului (Figura 2.21). Desfasurarea sim-
bolica a ciclurilor produce de obicei un cod mai lung (Figura 2.22).
Plani carea instructiunilor. Procesarea pipeline avansata este reprezen-
tata prin plani carea dinamica ce admite hazardul (dependenta datelor), al-
goritmul Tomasulo si predictia dinamica a rami carii. Printr-o plani care a
instructiunilor, executia instructiunilor poate sa nu e exact cea data de pro-
gram. O instructiune necesita p^ana la doi operanzi, o unitate functionala si
106
un loc de plasare al rezultatului. Astfel o instructiune este prima data de-
codata si veri cata relativ la dependente, se asteapta p^ana c^and nu exista un
hazard al datelor, apoi se citesc operanzii. Hazardul poate structural (con ict
de resurse), de date (dependenta de date), sau de control (rami cari sau alte
instructiuni care pot schimba controlul programului). Plani carea dinamica a
instructiunilor trebuie sa asigure faptul ca instructiunile dependente nu apar
adiacent si sa mareasca pe c^at posibil numarul de instructiuni executate^ntr-un
ciclu de ceas. Daca instructiuni multiple nu sunt expediate la aceeasi unitate
functionala, atunci numai stocarile si ^ncarcarile vor crea dependente.
Plani carea dinamica cu tabla de scor. Tabla de scor este utilizata pentru
a urmari hazardul si pentru a ^nainta instructiunile. O asemenea tabla de
scor poate la fel de complicata ca o unitate functionala. Pasii ^n executia
plani carii sunt urmatorii:
1. Daca o unitate functionala este libera si nu exista alte instructiuni care
au acelasi registru destinatie, atunci instructiunea este ^naintata unitatii
functionale si se actualizeaza starea sa interna.
2. Daca apare o blocare ^ntr-o etapa datorita existentei hazardului struc-
tural, atunci nici o instructiune urmatoare nu este ^naintata p^ana nu
este clari cat hazardul. Daca exista o singura coada pentru instructiuni,
atunci toate instructiunile sunt blocate; daca exista cozi multiple, atunci
blocarea are loc c^and cozile sunt umplute.
3. Citirea operanzilor presupune monitorizarea disponibilitatii operanzilor
(daca nici o instructiune anterioara nu va scrie unul dintre operanzi sau
daca registrul ce contine operandul este tocmai scris de catre o uni-
tate functionala activa). C^and disponibilitatea este veri cata, unitatea
functionala citeste operanzii din registrii si ^ncepe executia. Tabla de
scoruri rezolva hazardurile dinamic ^n acest pas. Instructiunile pot e
expediate pentru executie ^ntr-o ordine diferita de cea data de program.
4. Unitatea functionala ^ncepe executia si c^and rezultatele sunt gata, noti ca
tabla de scoruri.
5. La scrierea rezultatelor se veri ca hazardul si are loc o blocare daca
este necesar (o instructiune care nu a citit operanzii precede aceasta
instructiune si unul dintre operanzi este acelasi registru ca rezultatul
instructiunii ce se nalizeaza).
Aplicarea schemei este limitata de cantitatea de paralelism disponibil ^ntre
instructiuni, numarul de intrari ale tabelei de scoruri, numarul si tipul de unitati
functionale, si de prezenta autodependentelor si a dependentelor de iesire.
Algoritmul lui Tomasulo. Avantajul este distribuirea detectarii hazardului
si a controlului de executie, precum si eliminarea blocarii la scriere si citire.
Rezultatele sunt pasate direct la unitatile functionale. Se utilizeaza o zona
speciala pentru date numita statie de rezervare.Valoarea operandului este sto-
cata ^n statia de rezervare ^ndata ce este disponibila. Mai multe instructiuni
pot ^naintate depinz^and de disponibilitatea statiilor de rezervare si nu de
unitatile functionale. Daca instructiuni multiple asteapta un rezultat, toate ^l
vor receptiona la acelasi moment de timp. In varianta tablei de scoruri, val-
oarea trebuia citita din registru. Arhitectura DLX FP de exemplu foloseste acest
algoritm. PowerPC 620 poate de asemenea ^nainta 4 instructiuni per ciclu la
cele 6 unitati de executie cu statiilor lor proprii de rezervare.
107
Figura 2.23: Ierarhia memoriilor din sistemele de calcul moderne
Abordarea VLIW (Very Long Instruction Word). Se ^mpacheteaza
operatii multiple ^ntr-un cuv^ant foarte lung. Instructiunile au o multime
de c^ampuri pentru ecare unitate functionala. Pentru a mentine unitatile
functionale ocupate trebuie sa existe su ciente sarcini ^n cod. In abordarea
VLIW at^at hardware-ul c^at si compilatorul sunt implicati ^n structurarea pro-
gramului. Exista o serie de limitari ale acestei abordarii: paralelismul limitat
(este necesar gasirea numarul de operatii independent corespunzator numarului
de unitati functionale), resurse hardware limitate (datorate costului), explozia
dimensiunii codului (operatii precum desfasurarea ciclurilor duc la cresterea
dimensiunii codului).
2.2.7 Ierarhii de memorii
Ierarhia memoriilor din sistemele de calcul moderne este prezentata pe scurt ^n
Figura 2.23. Pentru atingerea unei performante ^nalte datorate ierarhiei este
necesar un grad ^nalt de reutilizare a datelor at^at ^n registrii c^at si ^n memoria
cache. Pentru a pro ta de localitatea temporara este indicat accesul repetat la
aceeasi adresa, iar pentru localitatea spatiala, a adreselor ^nvecinate.
Managementul ierarhiei memoriilor ^n sistemele uniprocesor. Intr-
un uni-processor, timpul de acees la date poate redus prin optimizarea masinii
(cache mai mare, latenta mai scazuta etc), sau optimizarea programului (local-
itate temporala si spatiala).
Exista trei strategii principale disponibile programatorului pentru a
^mbunatatii performanta: acces ^n pasi unitari, utilizare ^n bloc si reorgani-
zarea datelor.
Acces ^n pasi unitari. Majoritatea memoriilor cache sunt organizate ^n
blocuri de date mai lungi dec^at o singura data. De exemplu, nivelul 2 cache a
unui SGI Origin poate detine 16 numere ^n virgula mobila ^n dubla precizie.
Pe ecare masina aceste numere sunt la adrese continue din memorie. Ast-
fel programele care acceseaza date continue ^n cicluri sunt ^n mod tipic mai
7 Rezumat: Utilizarea memoriilor rapide este o problem
a at^at ^n calculatoarele cu un
procesor c^at si ^n cele cu mai multe procesoare.

108
e ciente dec^at cele care nu fac acest lucru.
Utilizare ^n bloc. Performanta programelor poate de asemenea ^mbuna-
tatita prin asigurarea faptului ca datele ram^an^n cache^ntre accesuri succesive
ale aceleiasi locatii de memorie. De exemplu, se considera codul:
for I:= 1 to N do
for J:= 1 to N do
A[I]:= A[I] + B[J]
Desi se atinge un grad ^nalt de reutilizare al matricei A, eroarea cache apare
numai de N=L ori, unde L este dimensiunea blocului cache, iar pentru B, de
N =L. Problema este aceea ca desi accesul la B se face cu un pas, BJ nu
2

ram^ane^n cache p^ana la urmatoarea utilizare din urmatoarea iteratie din ciclul
exterior. Daca ciclul asupra lui J este realizat la o dimensiune (bloc) la care
toate elementele lui B atinse vor ram^ane ^n cache, atunci rezulta ciclul:
for J:= 1 to N by S do
for I:=1 to N do
for j:= J to min(J+S,N) do
A[I]:= A[I] + B[j]
unde S este numarul maxim de elemente ale lui B care ram^an ^n cache ^ntre
doua iteratii a ciclului exterior. In aceasta noua organizare, apar cel mult N=L
erori de cache pentru B, deoarece ecare element a lui B este reutilizat N ori.
Pe de alta parte, crestem numarul de erori cache asupra lui A la N =(LS ) 2

deoarece apar erori cache pentru toate elementele lui A ^n ecare dintre cele
N=S iteratii ale ciclului exterior.
O a treia strategie pentru ^mbunatatirea comportarii unei ierarhii de mem-
orii uniprocesor este reorganizarea stucturilor de date astfel ^nc^at datele care
sunt utilizate ^mpreuna sa e stocate ^mpreuna ^n memorie. De exemplu, daca
se utilizeaza o declaratie Fortran de tipul DOUBLE PRECISION PART(10000,5)
^n care a doua dimensiune este utilizata pentru a stoca c^ampurile unei struc-
turi de date a unei particule din cele 10000 de particule ale unei simulari,
o asemenea organizare a datelor este eronata pentru ca Fortran utilizeaza
ordinea de stocare pe coloane si cele 5 c^ampuri vor aparea ^n linii diferite
de cache. O organizare mai buna este aceea care schimba declaratia ^n
DOUBLE PRECISION PART(5,10000).
Managementul ierarhiei memoriilor ^n sistemele multiprocesor.
Multiprocesoarele adauga o serie de teme la problema tratarii accesului la me-
morie si ^mbunatatirea reutilizarii, precum sincronizarea, eliminarea falsei par-
tajari, minimizarea comunicatiilor etc (multe strategii utile sunt automatizate
de compilatoare).
Sincronizare. In multi algoritmi paraleli este utila actualizarea aceleiasi
date partajate de catre mai multe procesoare. Un exemplu este codul de calcul
al miscarii particulelor ^n care fortele asociate cu un singur procesor sunt cal-
culate de un numar de alte procesoare, ecare determin^and forte ce actioneaza
asupra particulei asociate cu procesorul. Daca doua procesoare^ncearca sa faca
simultan actualizari, pot apare rezultate incorecte, solutia ind sincronizarea.
Eliminarea partajarii false. Partajarea falsa (Figura 2.24) este o problema
care apare c^and doua procesoare diferite acceseaza date care rezida ^n acelasi
109
Figura 2.24: Partajare falsa

Figura 2.25: Ierarhia memoriilor ^ntr-o arhitectura paralela


bloc cache. In masina cu memorie partajata, daca ambele procesoare ^ncearca
sa scrie ^n acelasi bloc, blocul poate face o miscare de ping-pong ^ntre cache-
urile procesoarelor. Partajarea falsa este ^n mod tipic evitata asigur^and faptul
ca datele utilizate de procesoare diferite rezida pe diferite blocuri cache. Acest
deziderat poate atins de catre programator sau compilator prin utilizarea de
umpluturi ^n structurile de date (inserarea de octeti nesetati ^n structura).
Intr-o arhitectura paralela ierarhia memoriilor consta din memorii cache,
memorie locala, memorie globala partajata si memorie externa (Figura 2.25).
Pentru a pro ta de o asemenea ierarhie, calculele si sabloanele de acces la date
trebuie adaptate de catre compilator sau prin design algoritmic.
Multiprocesorul poate privit ca o ierarhie de memorii extinsa. Nivelele ^n
ierarhia extinsa sunt registrii, cache, memorii locale, memorii la distanta, unite
printr-o arhitectura de comunicare. Nivelele comunica la o anumita granu-
laritate a transferului de date. Este necesara exploatarea localitatii spatiale
si temporare ^n ierarhie, altfel vor cauzate extra comunicari (important
deoarece comunicatiile sunt costisitoare). Cache-urile sunt manevrate de hard-
ware. Nivelele mai apropiate de procesor au o latenta mai scazuta si o latime
de banda mai mare.
2.3 Modele teoretice ale sistemelor paralele
Pentru a dezvolta teoria complexitatii algoritmilor paraleli avem nevoie de un
model adecvat al unui calculator paralel. Se poate extinde modelul masinii
Turing, ^nsa o asemenea abordare ridica problema cum pot accesa masinile
Turing multiple benzile partajate.
Designerul unui algoritm secvential ^n mod tipic formuleaza algorit-
110
mul utiliz^and modelul abstract de calcul numit masina cu acces aleator
(random-access machine, RAM). In acest model, masina consista dintr-un
singur procesor conectat la un sistem de memorie. Fiecare operatie de baza
(operatiile aritmetice si logice, accesurile la memorie etc), necesita un pas ^n
timp. Scopul designerului este dezvoltarea unui algoritm cu cerinte de memo-
rie si timp modeste. Modelul RAM permite designerului sa ignore detalii ale
calculatorului pe care algoritmul va ^n nal executat, dar speci ca su ciente
detalii astfel ^nc^at designerul sa poata aprecia cum va evolua algoritmul cu o
anumita acuratete.
Modelarea calculatoarelor paralele este mult mai complicata deoarece ^n
practica diferitele calculatoare paralele tind sa varieze ^n organizarea lor mai
mult dec^at calculatoare secventiale. Drept consecinta, pentru calculatoarele
paralel nu exista un singur model care poate pronostica c^at de bine va evolua
un algoritm paralel pe alte masini paralele. In locul utilizarii unui model
diferit pentru ecare masina diferita, designerii algoritmilor paraleli utilizeaza
un numar mic de modele abstracte care nu ^ncearca sa re ecte comportarea
oricarei masini particulare. Aceste modele sunt utile deoarece un algoritm care
este e cient ^ntr-unul dintre aceste modele abstracte poate adesea translatat
^ntr-un algoritm care este e cient pe masini paralele reale.
Modelele acceptate de calcul paralel sunt circuitele, PRAM (APRAM),
retelele de interconectare ( xe si de comparare). Modelele circuit si PRAM
sunt echivalente.
2.3.1 Circuite
Modelele circuit au fost utilizate multi ani pentru a studia aspecte teoretice
variate ale paralelismului, de exemplu pentru a demonstra ca anumite probleme
sunt greu de rezolvat ^n paralel.
In modelul circuit, un algoritm este reprezentat printr-o familie de circuite
aciclice orientate. Exista un circuit pentru ecare dimensiune posibila a intrarii.
Un circuit este constituit din noduri si arce (muchii). Un nod reprezinta o
operatie de baza, precum adunarea a doua valori. Pentru ecare element de
intrare pe care opereaza nodul, exista un arc de intrare. Arcul indica care nod
a produs data. Similar, exista un arc de iesire la ecare nod care opereaza pe
rezultatul nodului. Sarcina (lucrul) sau dimensiunea circuitului este numarul
total de noduri. Ad^ancimea circuitului este lungimea celui mai lung drum
orientat ^ntre oricare pereche de noduri. Figura 2.26 schiteaza un circuit ^n
care intrarile sunt sus, ecare "+" este un nod de adunare si ecare arc poarta
rezultatul circuitului de adunare; ad^ancimea este 4 si dimensiunea este 15.
Suma nala este returnata jos.
In modelul circuitului boolean, ecare calcul este reprezentat de un nod
(sau poarta) din circuit. Iesirea unei porti particulare devine intrare la alte
porti, reprezentate de muchii orientate de la o poarta la alta. Aditional, exista
porti de intrare fara nici o muchie orientata ^nspre poarta.
O functie booleana f este de forma f : f0; 1gn ! f0; 1g, unde n este numarul
de argumente ale functiei (f poate de nit drept un tabel de adevar).
1 Rezumat: Circuitele sunt adesea utilizate pentru analiza algoritmilor paraleli. Un circuit
este caracterizat de ad^ancime si dimensiune. Ad^ancimea este o masura a timpului de executie
a algoritmului, iar dimensiunea indica costul.

111
Figura 2.26: Insumarea a 16 numere pe baza unui arbore

Figura 2.27: Un circuit care calculeaza functia XOR


Fie
o multime nita de functii booleene. Un circuit boolean cu baza

este un graf orientat aciclic astfel ^nc^at


1. exista o multime de v^arfuri distincte, de grad 0, numite noduri de intrare
si etichetate cu variabile distincte;
2. ecare alt nod (numit poarta) este etichetat cu o functie din
, unde
numarul de argumente ale functiei este egal cu gradul de intrare a nodului;
3. exista un subset distinct de porti, numite noduri de iesire.
De exemplu un circuit pentru 2 variabile pentru functia booleana XOR cu
baza
= f^; _; :g este prezentat ^n Figura 2.27, x XOR x ind de nit prin
(x ^ :x ) _ (:x ^ x ).
1 2

Ad^ancimea unui circuit c, notata depth(c), este lungimea celui mai lung
1 2 1 2

drum de la o poarta de intrare la o poarta de iesire din circuit. Dimensiunea


unui circuit c, notata size(c), este numarul de porti pe care le contine si care nu
sunt de intrare. Ad^ancimea circuitului din Fig. 2.27 este 3, iar dimensiunea, 5.
Ad^ancimea si dimensiunea circuitului corespund cu timpul si respectiv
numarul de procesoare necesare pentru a afectua algoritmul paralel de nit de
circuit. Ad^ancimea corespunde timpului, deoarece reprezinta cel mai mare
numar de calcule ce sunt efectuate secvential. Dimensiunea corespunde sarcinii
de calcul total realizat de circuit si ofera o margine superioara pentru numarul
de procesoare. Numarul curent de procesoare poate mic daca un procesor
calculeaza operatiile de la mai multe porti ^n secventa.
112
Un program ^n linie dreapta este o secventa de functii booleene, ; : : : ; k ,
unde ecare i este o intrare initiala sau un rezultat al unei compuneri de functii
1

anterioare ^n secventa. Fiecare i corespunde la o poarta. Cu alte cuvinte, un


program ^n linie dreapta este o sortare topologica a unui graf orientat aciclic.
Un program ^n linie dreapta corespunzator Figurii 2.27 este: := x ; :=
: ; := x ; := :x ; := ^ ; := ^ ; := _ .
1 1 2

O baza
este completa daca ecare functie booleana poate calculata
1 3 3 4 3 5 2 3 6 4 1 7 5 6

pentru anume circuit cu baza


. Un exemplu de baza completa este
=
f^; _; :g.
= f; ^g nu este o baza completa deoarece negarea nu poate
exprimata utiliz^and numai elemente din
.
Se considera ca operatiile efectuate de o poarta sunt oi = f^; _; :g, ca
circuitul consista din n + q porti gi conectate prin muchii numite linii, iar
primele n porti sunt portile de intrare si gn q este poarta de iesire. O linie de
circuit conecteaza iesirea unei porti de intrarea unei alte porti. Urmatoarele
+

conditii trebuie satisfacute de multimea de linii de circuit: exact o linie este


conectata la intrarea unei porti, except^and portiile de intrare, cel putin o linie
este conectata la iesirea unei porti, except^and poarta de iesire, iar portile sunt
numerotate astfel ^nc^at daca iesirea lui gi este conectata la intrarea lui gj ,
atunci i < j . Daca intrarea unui circuit c este x = x x : : : xn (o intrare binara
de lungime n) atunci functia fi asociata cu gi este de na astfel
1 2

8
< i
> x daca 1  i  n;
fi (x) = f (x) _ f (x) dacaa nn +
f j (x) dac + 1  i  n + q si oi = :,
1  i  n + q si oi = _,
> j k
:
fj (x) ^ fk (x) daca n + 1  i  n + q si oi = ^,
presupun^and ca iesirile lui gj si gk sunt conectate la intrarea lui gi . Functia
fn q este functia calculata de circuitul c pentru un circuit acceptor. Un circuit
transductor are m porti de iesire a caror valori reprezinta codarea binara a
+

valorii calculate de circuit.


Un circuit singular nu poate considerat drept model pentru calcul paralel
deoarece trateaza numai cuvinte de lungime xa. Pentru a extinde circuitul
astfel ^nc^at sa decida un limbaj cu cuvinte de lungimi diferite, se considera o
secventa in nita de circuite similare, numita familie de circuite.
O familie de circuite este de nita drept o secventa de circuite C = fcnjn 
1g astfel^nc^at ecare cn include n porti de intrare. Familia de circuite C decide
un limbaj L daca ecare cn 2 C decide limbajul Ln, unde Ln este o submultime
a lui L ce contine cuvinte de lungime n. Dimensiunea unei familii C este o
functie de nita prin sizeC (n)= size(cn). In mod similar, ad^ancimea familiei
C este o functie de nita prin depthC (n) =depth(cn). O familie de circuite C
este polinomiala daca sizeC (n) = O(p(n)) unde p(n) este un polinom.
2.3.2 PRAM
Majoritatea modelelor abstracte sunt generalizari ale modelului secvential
RAM ce permit utilizarea de procesoare multiple. Modelele multiprocesor pot
2 Rezumat: PRAM este un model abstract al unui sistem cu memorie partajat a si proce-
soare multiple, utilizat la descrierea algoritmilor (timpul de comunicare ^ntre procesoare este
considerat nul). Modelul WT este cel mai ^nalt nivel de abstractizare al algoritmilor PRAM.

113
Figura 2.28: Arhitectura PRAM
clasi cate ^n trei mari tipuri: masinile cu memorie locala, masinile cu me-
morie modulara si masinile paralele cu acces aleator (PRAM). O masina cu
memorie locala consista dintr-o multime de p procesoare ecare cu memoria
sa locala, iar procesoarele sunt atasate la o retea de comunicare comuna. O
masina cu memorie modulara consista din m module de memorie si p proce-
soare toate atasate la o retea comuna. Un PRAM consista dintr-o multime de
p procesoare conectate la o memorie partajata.
PRAM: un calculator paralel idealizat. Este o extensie a modelului
RAM ^n care exista procesoare multiple care acceseaza memoria partajata
globala, cu o dimensiune nemarginita si uniform accesibila de catre toate pro-
cesoarele (Figura 2.28). Mai multe procesoare pot citi si scrie ^n aceeasi locatie
de memorie simultan. Fiecare dintre cele p procesoare este un RAM care poate
efectua orice operatie RAM pe memoria partajata. Fiecare procesor are un
identi cator unic ^n domeniul 1  p. La ecare unitate de timp, un procesor
este e activ e inactiv depinz^and de identi cator. Toate procesoarele exe-
cuta acelasi program pe date diferite (data-paralel). Procesoarele sincronizate
comunica prin intermediul memoriei partajate.
Acest model idealizat si cu scop-general al calculului paralel permite concen-
trarea programatorului asupra paralelismului inerent din probleme, ignor^and
detaliile speci ce masinii.
Presupunem ca, suplimentar memoriei globale, ecare procesor are memo-
ria locala care este utilizata pentru calculele sale locale. Fie p procesoare
P ; P ; : : : ; Pp , si m celule de memorie, M ; M ; : : : ; Mm . In ecare pas, ecare
procesor citeste dintr-o celula de memorie, efectueaza calcule locale, scrie ^ntr-
1 2 1 2

o celula de memorie. O intrare x a unui PRAM consista din n valori, notate


x ; x ; : : : ; xn . Aceste valori pot stocate initial ^n M ; M ; : : : ; Mn (daca
n  m), continute ^ntr-o memorie numai-^n-citire, sau distribuite la memo-
1 2 1 2

riile locale ale procesoarelor. Aceste trei modele de stocare a intrarilor sunt
echivalente, data ind o memorie su cienta (daca n  m). Iesirile pot
de nite ^n mod similar: de exemplu, iesirea y ; y ; : : : ; yn0 poate plasata ^n
M ; M ; : : : ; Mn0 .
1 2

Fiecare proces poate executa diferite instructiuni sau accesa siruri de date
1 2

diferite (MIMD). Are loc ^nsa o sincronizare implicita la ecare pas masina
(potential cod diferit; MIMD sincron cu memorie partajata). Nici un procesor
nu va trece la instructiunea i + 1 p^ana c^and instructiunea i nu este nalizata.
Sistemul poate lucra si^n varianta^n care procesoarele efectueaza instructiunile
^n acelasi timp, sincronizate de un ceas central (SIMD). Astfel exista doua tipuri
principale de PRAM: SIMD-PRAM si MIMD-PRAM.
Intr-un SIMD-PRAM toate procesoarele executa aceeasi instructiune la
ecare moment. SIMD-PRAM este o extensie a modelului RAM care include
114
Tabelul 2.17: Clase PRAM
Scriere exclusiva Scriere concurenta
Citire exclusiva EREW ERCW
Citire concurenta CREW CRCW
doi registrii: ID, un registru numai-^n-citire care contine numarul de procesor si
ACC un registru citire-scriere care se a a ^n memoria locala. Instructiunile unui
SIMD-PRAM sunt aceleasi cu ale unui RAM except^and ACC ID, si faptul ca
ACC poate ^nlocui orice referinta la i; sau Mi ^n instructiunile modelului RAM.
MIMD-PRAM este similar cu un SIMD-PRAM except^and faptul ca lui ACC i
se permite sa ^nlocuiasca e i sau Mi ^n instructiunile de rami care a modelului
RAM. Aceasta permite procesoarelor sa execute diferite instructiuni. Desi acest
model pare a mai puternic, un SIMD-PRAM poate simula un MIMD-PRAM
cu un mic surplus. Atentia se ^ndreptata asupra modelului SIMD-PRAM.
PRAM are mai multe clase (Tabelul 2.17):
EREW-PRAM: Citire exclusiva, scriere exclusiva { numai un procesor poate
citi sau scrie ^ntr-o locatie la un moment dat;
CREW-PRAM: Citire concurenta, scriere exclusiva { sunt posibile citiri mul-
tiple de la o locatie, ^nsa numai un singur procesor poate scrie la un
moment dat;
ERCW-PRAM: Citire exclusiva, scriere concurenta { sunt posibile scrieri mul-
tiple la o locatie si numai un singur procesor citeste la un moment dat;
CRCW-PRAM: Citire concurenta, scriere concurenta { este posibila utiliz^and
o serie de strategii de rezolvare a con ictelor la accesare.
Permiterea accesului concurent ^n citire nu creaza discrepante semantice.
Scrierea concurenta ^nsa necesita arbitrare. Exista mai multe protocoluri care
rezolva scrierile concurente:
Comun: scrierea concurenta este permisa daca toate valorile pe care proce-
soarele ^ncearca sa le scrie sunt identice (altfel eroarea este anuntata si
calculul se opreste); este modelul CRCW cel mai putin restrictiv.
Arbitrar: se alege arbitrar un procesor care scrie si restul esueaza (se va scrie
o valoare arbitrara).
Prioritate: procesoarele sunt organizate ^ntr-o lista de prioritati prede nte, iar
procesorul cu cea mai mare prioritate va avea succes, celelalte vor esua
la scriere (de exemplu procesorul cu cel mai mic index).
Combinare: valoarea scrisa este o combinatie liniara de valorile care se^ncearca
a scrise, de exemplu suma tuturor valorilor care se ^ncearca a scrise
(^n general orice operatie asociativa calculabila ^n timp constant pe un
RAM serial); acesta este modelul CRCW cel mai restrictiv.
Astfel, c^and procesoare multiple fac simultan o cerere de scriere sau citire la
aceeasi resursa, exista mai multe posibilitati. Anumite modele interzic aseme-
nea operatii permit^and accesul a cel mult un procesor la un moment dat
(EREW PRAM). Altele permit accesul limitat la resursa partajata (CRCW
PRAM). C^and se face o scriere concurenta, o valoare arbitrara va scrisa,
valoarea va aleasa corespunz^and procesorului cu cel mai mic index, sau se
respecta o anumita logica.
115
Diferitele modele PRAM satisfac o anumita ordine de putere, de nit de
operatorul  care poate interpretat drept "cel putin la fel de puternic ca".
Cu alte cuvinte, daca A  B, un algoritm care ruleaza pe un model PRAM tip
A va rula de asemenea si pe un model B , dar nu si ^n mod necesar are loc si
reciproca. Astfel
EREW  CROW  CREW  CRCW
iar ^ntre diferitele modele CRCW PRAM avem:
COMMON  ARBITRARY  PRIORITY.
O varianta necuprinsa ^n clasi carea de mai sus este cea care permite accesul
pe baza de coada: accesul concurent este permis^nsa timpul pentru un pas este
proportional cu numarul de accesuri la orice resursa (QRQW-PRAM, queue-
read queue-write). O alta clasi care a modelelor PRAM este cea care^mparte
modelele ^n cinci tipuri: EREW, CREW, CRCW, EROW (exclusive read,
owner write), CROW (concurrent read, owner write). Scrierea proprietar se
refera la modelul ^n care ecare celula are desemnat un singur procesor caruia
i se permite sa scrie ^n ea.
Exemple de algoritmi pentru modelul PRAM. Insumarea a n-elemente
de vector este realizata secvential ^n O(n) pasi, cu o sarcina de O(n). Pe un
CRCW PRAM cu combinare (prin ^nsumare) este necesar un timp O(1) uti-
liz^and n procesoare, ceea ce este cost-optimal. Pe celelalte modele se emuleaza
reducerea pe un arbore de locatii de memorie, ^n timp O(log n) cu n=2 pro-
cesoare, ceea ce nu este cost-optimal. Daca totusi se utilizeaza n= log n pro-
cesoare, ecare ^nsum^and log n valori secventiale, timpul de combinare este
O(log n) ceea ce este cost-optimal.
In mod similar, gasirea celui mai mare element al unui vector n dimensional,
secvential necesita timp O(n), iar pe un CRCW PRAM cu combinare (se aplica
functia maxim) este necesar un timp O(1) daca se utilizeaza n procesoare,
ceea ce este cost-optimal. Celelalte modele se comporta ca si ^n cazul sumei,
necesit^and timp O(log n) pe O(n= log n) procesoare.
Algoritmul secvential de multiplicare a doua matrice patratice n-
dimensionale necesita timp O(n ). In abordarea PRAM,^n pasul 1 se genereaza
3

toate cele n multiplicari simple ^n paralel, necesit^and un timp O(1) pe n pro-
3 3

cesoare si numai citire concurenta; ^n pasul 2, se produc rezultatele ^nsum^and
n multimi de grupuri corespunzatoare de n termeni simplii, timpul necesar
2

ind O(1) pe un model CRCW cu combinare cu n procesoare (cost-optimal),


3

si O(log n) pe modele mai putin puternice (CREW) cu n procesoare (nu este
3

cost-optimal).
Se utilizeaza notatia ` : h : s cu `  h si s > 0 pentru a nota multimea f` +
isj0  i  d(l h)=seg. Daca s = 1, este eliminat din notatie. Astfel ` : h este
echivalent cu ` : h : 1. Notatia este extinsa la etalari multi-dimensionale prin
produs cartezian. Astfel, A[` : h : s ; ` : h : s ] este multimea elementelor
fA[i; j ]ji 2 ` : h : s ; j 2 ` : h : s g.
1 1 1 2 2 2

Se cere determinarea produsului matricei A de dimensiune m  n cu un


1 1 1 2 2 2

vector x n-dimensional, ambele ind stocate ^n memoria partajata. Vectorul


m-dimensional rezultat y = Ax trebuie sa e lasat ^n memoria partajata. Se
116
2.18: Cautare ^n PRAM
Tabelul
Pas 1 Pas 2 Pas 3 Timp total
EREW O(n) O(m=n) O(n) O(n) + O(m=n)
ERCW O(n) O(m=n) timp constant O(n) + O(m=n)
CREW timp constant O(m=n) O(n) O(n) + O(m=n)
CRCW timp constant O(m=n) timp constant O(m=n)
presupune ca tipul datelor este ^ntreg. Pentru simplicitate se presupune de
asemenea ca m = rp pentru un anume ^ntreg r. In plus fata de variabilele
globale A; x; si y, se presupune ca m; n; r, si identi catorul procesorului i
sunt disponibile local la ecare procesor. Descrierea unui algoritm PRAM se
poate face d^and programul ce se executa pe procesorul i, pentru 1  i  p.
Pentru aceasta problema, programul este dat mai jos (este parametrizat de
identi catorul de procesor i):
local integer z[1:n], B[1:r, 1:n], w[1:r]
z := Global_Read(x)
B := Global_Read(A[(i-1)r+1 : ir, 1 : n])
w := Bz
y[(i-1)r+1 : ir] := Global_Write(w)
Global_read muta datele din memoria partajata ^n memoria locala, pe c^and
Global_write muta datele ^n cealalta directie. Cantitatea de calcule efectuate
este O(mn=p). Cantitatea de date transferate^ntre memoria globala si memoria
locala este n + mn=p + m=p = O(mn=p). In nal, acest program necesita
cel putin un CREW PRAM, deoarece toate procesoarele efectueaza o citire
concurenta a vectorului x (O(mn=p) calcule, O(mn=p) transferuri).
Pentru a observa comportarea celor 4 subclase de masini cu memorie
partajata se considera exemplul a n procesoare care cauta ^ntr-o lista S =
fL ; L ; : : : ; Lmg indexul unui element dat x. Se presupune ca x va apare
de mai multe ori. Algoritmul este schitat ^n cele ce urmeaza. In pasul 1
1 2

se citesc valorile x ^n paralel. In pasul 2, se construiesc ^n paralel sublistele


Si = fL i m=n ; : : : ; Lim=n g, se face o cautare secventiala pe sublista Si ce
returneaza Ki = 1 daca nu este ^n lista, altfel indexul. In pasul 3, simultan,
( 1) +1

daca Ki > 0 atunci k = Ki. Cautarea secventiala necesita timp O(m), iar
complexitatea ^n timp pentru ecare dintre cele 4 subclase de calculatoare cu
memorie partajata este prezentata ^n Tabelul 2.18.
Paradigma sarcina-timp (work-time, WT). Modelul PRAM este de
nivel-scazut si adesea st^anjenitor, iar scrierea oricarui alt algoritm dec^at cele
triviale este foarte di cila. De aceea se poate trece la un model echivalent, dar
de un nivel mai^nalt de abstractizare (independent de asemenea detalii), numit
paradigma lucru-timp (Work-Time, WT). WT este astfel cel mai ^nalt nivel de
abstractizare al algoritmilor PRAM.
In paradigma WT, se descrie un algoritm ^n termenii pasilor ^n timp, cu un
numar arbitrar de operatii ^n ecare pas. Se utilizeaza constructia for_all
pentru a nota operatii concurente (nu se face nici o referire la identi ca-
torul procesoarelor, contine at^at operatii seriale c^at si concurente). Astfel,
117
diferenta majora ^ntre modelul WT si modelul PRAM este acela ca se renunta
la mentionarea explicita a lui p, numarul de procesoare.
Se asociaza doua masuri de complexitate cu descrierea WT al unui algoritm.
Complexitatea pasilor unui algoritm, notata T (n), este numarul de pasi paraleli
pe care algoritmul ^i executa. Complexitatea lucrului algoritmului, notata cu
W (n), este numarul total de operatii efectuate de algoritm. Daca Wi (n) este
PT n
numarul operatiilor simultane la pasul i, atunci W (n) = i Wi (n):
( )

Exemplu: reducerea. Se da o secventa de n = 2k elemente de tip T ^n


=1

memoria partajata, un operator asociativ binar Æ : T  T ! T . Se cere


S = Æni ai = a Æ    Æ an ^n memoria partajata.
=1 1

// Algoritmul de reducere a unei secvente ^n descriere WT


// Intrare: secventa elementelor de tip T, o : T x T -> T
T B[1:n]
for_all i in 1 : n do B[i]:=a(i)
for h = 1 to k do
for_all i in 1 : n/2^h do B[i]:=B[2i-1] o B[2i]
S:=B[1]
Nu se face referire la identi catorii de procesor. Algoritmul de mai sus contine
at^at operatii seriale c^at si concurente. Adunarile sunt efectuate ^n ordine
diferita dec^at ^n programul secvential (de aceea presupunerea de asociativitate
a operatiei este critica pentru asigurarea corectitudinii rezultatului). Com-
plexitatile pasilor si lucrului
P
^n algoritmul descris sunt: T (n) = 1 + k + 1 =
O(log n); W (n) = n + kh n=2h + 1 = O(n): Cantitatea totala de lucru efec-
tuata de algoritmul paralel este asimptotic la fel cu cel efectuat de algoritmul
=1

secvential optimal. Bene ciul paralelismului este reducerea numarului de pasi.


Urmatoarea a rmatie, atribuita lui Brent, leaga complexitatea lucrului si a
timpului unui algoritm paralel descris^n modalitatea WT cu timpul de rulare al
algoritmului pe un PRAM cu p-procesoare: un algoritm WT cu complexitatea
pasilor T (n) si complexitatea lucrului W (n) poate simulat pe un PRAM cu
p procesoare ^n nu mai mult de bW (n)=pc + T (n) pasi paraleli. De exemplu,
timpul de rulare concurent al algoritmului de reducere pe un PRAM cu p
procesoare este
!  
k 
n X n  n
TC (n; p) = O + =O + log n ;
p h=1 2k p p
asa cum prezice teorema Brent.
Un algoritm WT este e cient ^n lucru sau lucru-e cient daca complexita-
tea lucrului sau este asimptotic aceeasi cu complexitatea secventiala a proble-
mei, adica daca W (n) = O(TS (n)). De exemplu pentru reducerea secventei
mentionate anterior, algoritmul este e cient ^n lucru. Nu se mentioneaza com-
plexitatea pasilor algoritmului, ceea ce ^nseamna ca pot exista mai multi al-
goritmi lucru-e cienti pentru aceeasi problema. Se pune astfel problema com-
pararii acestor algoritmi.
Unul dintre cei mai cunoscuti algoritmi pentru PRAM este cel de deter-
minare a maximului unui vector. Un algoritm CRCW pentru determinarea
maximului este urmatorul (Figura 2.29), ^n formularea WT:
118
Figura 2.29: Detectarea maximului unui vector prin numarare
int M[1..n], B[1..n, 1..n]
for_all i in 1 : n do M[i] := 1
for_all i in 1 : n do
for_all j in 1 : n do
if X[i]>=X[j] then B[i,j] := 1 else B[i,j] := 0
for_all i in 1 : n do
for_all j in 1 : n do
if not B[i,j] then M[i] := 0

In nal Mi = 1 daca si numai daca Xi este elementul maximal. Complexitatea


pasilor este O(1), dar complexitatea lucrului este O(n ), adica algoritmul nu
2

este lucru-e cient.


Pe baza teoremei Brent stim ca se poate simula un algoritm WT lucru-
e cient pe un PRAM cu p-procesoare ^n timp TC (n; p) = O(TS (n)=p + T (n)).
Astfel, acceleratia atinsa de un PRAM cu p procesoare poate S (n; p) =
O (TS (n)=(TS (n)=p + T (n))) si S (n; p) este O(p) (cel mai bun caz) c^and p =
O(TS (n)=T (n)). Astfel, printre algoritmii paraleli lucru-e cienti pentru o prob-
lema, cel cu cea mai mica complexitate a pasilor este de preferat pentru a tine
acceleratia optimala peste un numar mare de procesoare.
Un algoritm PRAM este optimal daca nu este posibila ^mbunatatirea at^at
a timpului c^at si a numarului de procesoare simultan cu mai mult de un factor
constant. Daca un algoritm este e cient, atunci este optimal. Insa un algoritm
PRAM optimal poate sa nu e e cient.
Modelul sarcina-ad^ancime. Deoarece exista o multime de modalitati de
organizare a calculatoarelor paralele si de aceea si pentru modelarea lor, este di-
cila selectarea unui model multi-procesor care este adecvat tuturor masinilor.
Alternativa la concentrarea asupra masinii este concentrarea asupra algoritmu-
lui. Cel mai abstract model WD este modelul circuit.
Intr-un model de sarcina-ad^ancime (ad^ancime-lucru, WD, Work-Depth),
costul unui algoritm este determinat examin^and numarul total de operatii care
sunt efectuate si dependentele dintre aceste operatii. Se noteaza cu W numarul
total de operatii pe care le efectueaza algoritmul; ad^ancimea D este cel mai lung
drum al dependentelor printre operatiile sale. Paralelismul algoritmului este
de nit prin P = W=D.
In modelul vector un algoritm este exprimat ca o secventa de pasi, ecare
efectu^and o operatie pe un vector de valori de intrare, produc^and un vector
rezultat. Sarcina ecarui pas este egal cu lungimea vectorului sau de intrare
(sau iesire). Sarcina algoritmului este suma sarcinilor pasilor sai. Ad^ancimea
unui algoritm este numarul de pasi.
119
In modele multiprocesor, W este timpul necesar algoritmului pentru a -
naliza executia multiplicat cu numarul de procesoare, iar D este egal cu timpul
total necesar pentru a executa algoritmul. Ad^ancimea unui algoritm este im-
portanta deoarece exista anumite aplicatii pentru care timpul necesar efectuarii
unui calcul este crucial. De exemplu, rezultatele unui program de prevedere
a vremii sunt utile numai daca executia programului este nalizata ^nainte
de aparitia reala a fenomenelor meteorologice. Cea mai importanta masura a
costului unui algoritm ram^ane lucrul, deoarece costul unui calculator este apro-
ximativ proportional cu numarul de procesoare din calculator, si astfel costul
efectuarii unui calcul este aproximativ proportional cu numarul de procesoare
din calculator multiplicat cu cantitatea de timp utilizata, adica lucrul.
Modelele WD sunt mai abstracte dec^at modelele multiprocesor. Algoritmii
care sunt e cienti ^n modelele WD pot translatati ^n algoritmi care sunt
e cienti^n modelele multiprocesor si din acestea pe calculatoarele paralele reale.
Avantajul modelului WD este acela ca nu exista detalii dependente de masina
pentru a complica designul si analiza algoritmilor.
Din fericire exista tehnici de translatare e cienta si automata a algoritmilor
construiti ^ntr-un model ^n algoritmi pentru un alt model. Aceste translatari
prezerva lucrul ^n sensul ca lucrul efectuat de ambii algoritmi este acelasi,
except^and un factor constant. De exemplu, teorema lui Brent spune ca un
algoritm construit pentru un model circuit poate translatat prezerv^and lucrul
^ntr-un algoritm PRAM. Mai exact, teorema lui Brent a rma ca orice algoritm
care poate exprimat printr-un circuit de dimensiune (lucru) W si ad^ancime
D poate executat ^n O(W=P + D) pasi pe un model PRAM. Ideea de baza
^n demonstratie este aceea ca PRAM poate emula calculele dintr-un circuit
^ntr-o maniera nivel-cu-nivel (nodurile cu zero arce de intrare sunt de nivel
0 si inductiv nivelul oricarui nod este cu unu mai mare dec^at nivelul maxim
al nodurilor cu muchii ^nspre el). Astfel produsul timp-numar de procesoare
pentru algoritmul PRAM este O(W + P D). Aceasta emulare prezerva lucrul
^n cadrul unui factor constant c^and paralelismul (W=D) este cel putin la fel
de mare ca numarul de procesoare, P . Cerinta ca paralelismul sa depaseasca
numarul de procesoare este tipica pentru emularea ce prezerva lucrul. Teorema
Brent arata de asemenea ca putem emula un algoritm construit pentru unul
din modelele WD pe un model multiprocesor.
O alta clasa importanta de translatoare ce prezerva lucrul sunt acelea care
permit translatarea ^ntre modele diferite de multiprocesoare. Importante sunt
^n special cele care fac trecerea de la PRAM la modele masina realiste. Se con-
sidera ^n particular o masina uture ^n care cele P procesoare sunt atasate
printr-o retea speciala de interconectare ( uture) de ad^ancime log P la P
blocuri de memorie. Se presupune ca ^ntr-un timp constant un procesor poate
translata o adresa de memorie virtuala la un bloc de memorie zica si o adresa
din acel bloc utiliz^and o functie su cient de puternica. Teorema lui Ranade
spune ca orice algoritm care necesita timp T pe un PRAM cu P -procesoare
poate translatat ^ntr-un algoritm ce necesit0a timp O(T (P=P 0 +log P 00)), cu 0o
probabilitate mare, pe o masina uture cu P -procesoare. Daca P  P log P ,
adica numarul de procesoare utilizate de algoritmul PRAM depa0seste numarul
de procesoare din masina uture cu un factor de cel putin log P , atunci emu-
larea prezerva lucrul. C^and se face translatarea unui algoritm de la un model
120
multiprocesor oaspete (PRAM) la un model multiprocesor gazda ( uture), este
obisnuita cerinta ca numarul de procesoare oaspete sa depaseasca numarul de
procesoare gazda cu un factor proportional cu latenta gazdei.
Datorita multiplelor posibilitati de translatare dintre diferite modele de
calcul paralel, dispunem de posibilitatea de a alege modelul care credem ca
ilustreaza mai clar ideile de baza din spatele unui algoritm. Modelul poate
informal, ne ind neaparat necesara o sintaxa pentru limbaj, dar trebuie sa
descrie c^ateva reguli simple pentru asignarea costului (^n termeni de lucru si
ad^ancime) diferitelor operatii si compunerii acestora. De exemplu se poate con-
sidera W = D = 1 pentru primitive scalare (precum adunarea a doua numere);
W pentru efectuarea iteratiilor unui ciclu ^n paralel este egal cu suma lucrului
iteratiilor individuale, iar D este maximum ad^ancimilor iteratiilor individuale.
Aplicabilitatea modelului PRAM. Algoritmii PRAM sunt studiati din
mai multe motive dintre care enumeram urmatoarele. Exista o parte bine
dezvoltata a literaturii despre designul algoritmilor PRAM si complexitatea
unor asemenea algoritmi. Modelul PRAM se concentreaza exclusiv pe teme
de concurenta si ignora explicit sincronizarea si comunicarea; cu alte cuvinte,
daca nu se poate obtine un algoritm paralel bun pentru modelul PRAM, nu
se poate obtine un algoritm mai bun ^n lumea reala. Modelul este explicit:
trebuie speci cate operatiile efectuate la ecare pas si plani carea operatiilor
per procesoare. Este o paradigma de design robusta. Multi alti algoritmi
pentru alte modele (precum modelul retea) pot derivati direct din algorit-
mii PRAM. Simplicitatea si generalitatea modelului a condus la acceptarea sa
ca unealta de cercetare. Aplicabilitatea modelului este totusi redusa deoarece
PRAM presupune un acces ^n unitatea de timp. PRAM nu poate construit
cu tehnologiile curente numai pentru cazul a unui numar mic de procesoare
(memorie partajata pentru un numar mare de procesoare nu este realizabila).
Trebuie realizat faptul ca modelul PRAM este un model abstract care nu cap-
tureaza toate detaliile oricarui calculator paralel real. Daca modelul secvential
RAM modeleaza masinile secventiale reale cu o acuratete rezonabila, scopul
nal al unui model abstract nu este modelarea directa a masinii reale, ci aju-
torul acordat designerilor de algoritm ^n producerea unor algoritmi e cienti.
Astfel, daca un algoritm construit pentru un PRAM (sau orice alt model)
poate translatat ^ntr-un algoritm care ruleaza e cient pe o masina reala,
atunci modelul a avut succes. Chiar si cei mai simpli algoritmi PRAM de-
scrisi ^n teorie au factori constanti care ^i fac prohibiti c^and se considera o
implementare reala. Adesea modelul PRAM poate conduce programatorul la
o alegere proasta. PRAM nu este indicat astfel pentru analiza performantei
realiste. De exemplu, gasirea maximului a n numere cu un algoritm optimal
PRAM se realizeaza ^n timp O(log log n), dar pe un calculator paralel zic, cu
un algoritm naiv pe arbore ^n timp O(log n log log n).
2.3.3 Modelul LogP
LogP este modelul parametric al retelelor. Scopul modelului de calcul paralel
LogP este crearea unei baze de design si analiza a algoritmilor paraleli rapizi
3 Rezumat: LogP este modelul de calcul paralel care tine seama de timpii de comunicare
pe retea de interconectare dintre procesoarele unui calculator paralel.

121
Figura 2.30: Studiul sortarii pe o masina paralela reala

Figura 2.31: Modelul LogP


si portabili. Modelul LogP este motivat de convergenta tehnologiei calcula-
toarelor paralele spre o arhitectura cu comunicare: nodurile multiprocesor cu
interfete de retea dedicate sunt astazi inima unei statii de lucru. Modelul LogP
poate utilizat ^n studiul performantei algoritmilor pe masini (Figura 2.30).
Procesarea este bazata pe P microprocesoare puternice, pe un DRAM mare
si cache. Comunicarile au o latenta L semni cativa (de ordinul sutelor de ci-
cluri), o latime de banda g limitata (1 { 5% din latimea de banda a memoriei),
o suprasarcina o semni cativa (zeci p^ana la sute de cicluri) si o capacitate lim-
itata. Majoritatea problemelor au o dimensiune N  P . Datele problemei
N dimensionale sunt mapate pe cele P procesoare, calculele se fac la nivel de
ecare procesor si se estimeaza costurile si echilibrarea d^andu-se o caracterizare
a procesorului si a performantei retelei (fara detalii ce se ^nt^ampla ^n retea).
Se fac urmatoarele notatii (Figura 2.31): L latenta medie ^n expedierea
unui mesaj (mic) ^ntre module, o suprasarcina la expeditor si receptor (surplus
simtit de procesor la expedierea sau receptionarea mesajelor), g golul dintre
expedieri sau receptionari succesive (1/latimea de banda), P numarul de pro-
cesoare/module de memorie. Relatiile dintre valorile mentionate sunt sugerate
122
Figura 2.32: Utilizarea modelului: (a) Semni catia parametrilor; (b)
Dependenta ^ncarcare-latenta
Tabelul 2.19: Costuri de baza
Operatie Intr-un limbaj Cost
Citeste, scrie x = *G, *G = x 2(L + 2o)
Stocare *G := x L + 2o

de Figura 2.32. Timpul de livrare a unui mesaj este L + 2o, iar L=g este limita
volumului pe retea. Expedierea a n mesaje de la un procesor la altul necesita
un timp 2o + L + g(n 1) ( ecare procesor efectueaza on cicluri de surplus;
sunt disponibile (o g)(n 1) + L cicluri de calcul). Doua procesoare care
expediaza n cuvinte de la unul la altul (schimb) realizeaza acest lucru ^n timp
2o + L + max(g; 2o)(n 1)  max(g; 2o) + L (Tabelul 2.19). De exemplu ^n
modelul LogP a masinii CM-5: L = 6s; o = 2:2s; g = 4s, iar P variaza de
la 32 la 1024.
Difuzarile unu-la-toti ^n modelul LogP, se realizeaza utiliz^and arbori de
acoperire precum cel din exemplul din Figura 2.33. Una din proprietatile in-
teresante este faptul ca diferitele valori ale parametrilor in uenteaza topologia
de acoperire optimala { trei exemple sunt prezentate ^n Figura 2.34.
Avantajele modelului LogP fata de alte modele sunt urmatoarele. Descu-
rajeaza comunicarile excesive, competitiile excesive la modulele de memorie,
sau multi-threading excesiv pentru ascunderea latentei. Recompenseaza tehni-
cile aprobate precum asignarea coordonata a datelor si a calculelor asupra lor,
suprapunerea comunicarii cu calculele, echilibrarea comunicarilor.
Modelul LogGP. Este utilizat pentru a incorpora mesajele lungi ^n modelul
LogP (Fig. 2.35). Timpul de transmitere al unui mesaj de lungime m biti este
T = Tsnd + m=W + H  R + Trcv ;
unde W este latimea de banda a legaturii, H este numarul de hopuri si R
^nt^arzierea retelei. Astfel timpul de transmitere este liniar ^n lungimea mesaju-
lui. Daca se face aproximarea ^n modelul LogP (expedierea a N mesaje inde-
pendente contin^and un cuv^ant), atunci
T = o + (N 1)  g + L + o;
ceea ce este substantial mai costisitor dec^at expedierea unui singur mesaj.
Latimea de banda a mesajelor lungi este G (gol per cuv^ant)^n modelul LogGP:
T = o + (N 1)  G + L + o;
123
Numarul date care trebuie ^nsumate la timpul t:

0  t  L + 2o + 1
f (t) = t;f (t 1) + f (t L 2o); altfel

Timpul pentru difuzarea unei singure date: B(P ) = r, unde r este cel mai
mic index pentru care f (t)  P
Figura 2.33: O difuzare a unei date de la un procesor la toate celelalte { cazul
L = 6; o = 2; g = 4; P = 8)

Figura 2.34: Schimbarea arborelui de acoperire functie de valorile parametrilor:


(a) L = 6; o = 2; g = 4; P = 8; (b) L = 6; o = 2; g = 8; P = 8; (c) L = 20; o =
1; g = 2; P = 8

Figura 2.35: Modelul LogGP

124
Figura 2.36: Mesaje lungi
Tabelul 2.20: Modele ale paralelismului
Model An Primitive Sinc. Retea Lat. Surp. Banda
PRAM '78 C/E-R,C/E-W sinc memorie 1 - .
MPC '84 EREW sinc memorie 1 - .
Phase '89 EREW asinc memorie 1 - .
Delay '88 CREW sinc memorie L - .
BPRAM '89 CREW (bloc) sinc memorie timp de transfer bloc
LPRAM '90 CREW sinc memorie g - g
Scan '87 EREW, scan sinc memorie 1 - -
Retea mesaje s./as. explicit hop - leg.
CTA '86 mesaje asinc explicit hop - g
BSP '90 mesaje, sinc asinc relatie h L - g
LogP '93 mesaje asinc total con. L o g
PMH '93 transf.bloc asinc arbore timp de transfer bloc
de unde si denumirea modelului, LogGP=LogP+G. 1=G re ecta latimea de
banda pentru mesaje lungi, pe c^and 1=g re ecta latimea de banda pentru
mesaje scurte. Adesea G  g (Figura 2.36).
Alte modele de paralelism. Numeroase alte modele au fost propuse.
Tabelul 2.20 prezinta c^ateva dintre acestea.
2.4 Memorie partajata
Toate procesoarele din sistem pot accesa direct toate locatiile de memorie din
sistem oferind astfel un mecanism rapid pentru procesoare de a comunica. Mul-
tiprocesoarele cu memorie partajata pot avea acces uniform la memorie (UMA)
sau acces neuniform la memorie (NUMA). Masinile SIMD cu memorie parta-
jata sunt nerealiste datorita costului si aranjarii accesului e cient la memoria
partajata pentru mai multe procesoare. Astfel nu exista masini SIMD cu me-
morie partajata. Masinile MIMD utilizeaza procesoare mai puternice si masini
cu memorie partajata exista pentru un numar mic de procesoare (p^ana la 64).
Multiprocesoarele simetrice (SMP) ce permit accesul simetric la toata
memoria principala de la un procesor domina piata serverelor. Utilizeaza
mecanisme uniprocesor pentru accesarea datelor, cheia ind extensia ierarhiilor
de memorii pentru a suporta procesoare multiple (Figura 2.37).
125
Figura 2.37: Extensii ale memoriei: (a) Cache partajat; (b) Memorie partajata
bazata pe bus; (c) Sala de dans; (d) Memorie distribuita
2.4.1 Accesul simultan la locatii de memorie partajata
Abordarea memorie partajata este simpla ^nsa poate conduce la probleme c^and
procesoarele acceseaza simultan aceeasi locatie de memorie. De exemplu, se
presupune ca memoria partajata detine initial o variabila x cu valoarea 0.
Procesorul P aduna 1 la x si procesorul P aduna 2 la x. Urmatoarele scenarii
sunt posibile. Daca P executa si termina x = x + 1 ^nainte ca P sa citeasca
1 2

valoarea x din memorie, atunci x va 3. In mod similar, daca P executa


1 2

si termina x = x + 2 ^nainte ca P sa citeasca valoarea lui x din memorie,


2

atunci x va 3. Daca P sau P citesc x din memorie ^nainte ca celelalalt sa


1

scrie rezultatul, atunci valoarea nala a lui x depinde de cine nalizeaza ultimul
1 2

(daca P este ultimul, valoarea lui x este 1, iar daca P este ultimul, valoarea lui
x este 2). Acesta este un exemplu de non-determinism sau non-determinanta.
1 2

Non-determinanta este cauzata de conditiile de concurenta. O conditie


de concurenta apare c^and doua instructiuni ^n sarcini concurente acceseaza
aceeasi locatie de memorie, cel putin una dintre ele este o scriere, si nu exista
nici o ordonare garantata ^n executie ^ntre accesuri. Accesul poate ordonat
prin ordinea program sau ordinea dependentelor (Figura 2.38). Problema non-
determinantei se poate rezolva si prin sincronizarea utilizarii datelor partajate;
astfel daca x = x + 1 si x = x + 2 se exclud mutual atunci valoarea nala a lui
x va ^ntotdeauna 3. Blocajele (locks) implementeaza excluderea mutuala:
// Procesor 1 // Procesor 2
LOCK (x) LOCK (x)
x:= x + 1 x:= x + 2
UNLOCK (x) UNLOCK (x)
1 Rezumat: Punctul erbinte ^n programarea sistemelor cu memorie partajat a este moda-
litatea de acordare a accesului la scrierea la o adresa din memoria partajata de procesoare.

126
Figura 2.38: Solut
ionarea unei conditii de concurenta prin ordinea program si
ordinea dependentelor

Figura 2.39: Multiprocesoare cu magistrala: (a) Cu cache; (b) Fara cache

Portiunile programelor paralele care necesita sincronizare pentru a evita


non-determinanta sunt numite sectiuni critice.
2.4.2 Problema corectitudinii la multiprocesoare bazate
pe magistrala
Multiprocesoarele bazate pe magistrala sunt extensii evidente ale designului
mini-calculator (Figura 2.39). Temele principale ^n design sunt viteza magis-
tralei, arbitrarea pe magistrala, sistemul de operare, I/O (^ntreruperi). Tema
principala ^n implementare este corectitudinea.
Exista patru conditii de corectitudine: coerenta-consistenta, ne-blocarea
pe viata (non-livelock), non-impas (non-deadlock), ne-^nfometare (non-
starvation). Coerenta-consistenta presupune ^ndeplinirea unor conditii pre-
cum propagarea scrierii, serializarea, atomicitatea. A doua presupune contin-
uarea progresului desi anumite tranzactii se efectueaza la nivel hardware (de
exemplu, la scrierile simultane, ^n protocolul bazat pe invalidare, ecare cerere
este a unui proprietar, put^and invalida alte cereri care sunt pierdute ^nainte de
a c^astiga arbitrarea pentru bus). Intr-un impas nici un procesor nu progreseaza
si toate activitatile sistemului cedeaza. Intr-o ^nfometare, unul sau mai multe
procesoare nu progreseaza pe c^and altele da.
Coerenta
Cele doua teme principale legate de cache sunt coerenta si consistenta.
Coerenta de neste un mecanism de propagare a unui valori noi (ce valoare
poate returna o citire a unei variabile). Se aplica la accesul asupra unei singure
variabile. Coerenta cache este construita ^n controlerele cache si procesoare.
Consistenta de neste o politica care plaseaza margini asupra c^and o valoare nou
2 Rezumat: Coerenta se refer a la vizibilitatea, de catre toate procesoarele, la un moment
dat, a aceleiasi valori la o adresa de memorie partajata.

127
scrisa poate propagata la un procesor dat (c^and o valoare scrisa va retur-
nata de catre o citire). Se aplica accesului la o variabila respect^and accesurile
la celelalte variabile.
Memorie de accelerare. Memoriile de accelerare (cache) joaca un rol cheie
^n reducerea timpul mediu de acces la date si a solicitarilor pe latimea de
banda ^ntr-o interconectare partajata. Cacheurile sunt utilizate din cel putin
trei motive: reduc latenta accesului la data partajata alocata la distanta, reduc
latenta si competitia pentru citirea datelor partajate si reduc latenta pentru
date partajate adiacente multiple.
Cache-urile partajate pot utilizate pentru un numar mic de procesoare,
cu latenta scazuta ^n partajare si apelul prealabil (prefetch) ^ntre procesoare
ce partajeaza multimile de lucru. Nu exista problema coerentei, dar pot apare
con icte. Cacheuri partajate sunt utilizate de exemplu la Alliant FX-8 (anii
'80, cu 8 procesoare interconectate printr-un x-bar la 512 KB cache^ntretesut),
Encore & Sequent (doua procesoare pe o placa cu un cache partajat). O
asemenea abordare are avantajele urmatoare: plasamentul cache-ului este iden-
tic cu cel din cazul uniprocesor, partajarea are granulatie na, exista un ^nalt
potential pentru interferenta pozitiva (date de la un proces la altul prin cache),
o stocare totala mica (o copie a codului/datelor utilizata de mai multe proce-
soare) si o partajare a datelor fara falsa partajare. Dezavantajele sunt limitarea
latimii de banda, cresterea latentei tuturor accesurilor si un^nalt potential pen-
tru interferenta negativa (un proces sterge datele necesare altuia).
Cache-urile private creaza o alta problema: copii ale unei variabile pot
prezente^n cacheuri multiple si o scriere de catre un procesor poate sa nu devina
vizibila la altele.
Coerenta cache. Intuitiv, la citirea unei locatii de memorie se va returna
ultima valoare scrisa de orice proces. Acest principiu este simplu, dar greu
de aplicat. Atributul "ultim" nu este bine de nit (^n multiprocesare se poate
stabili doar o ordine partiala nu una totala). "Ultimul" trebuie de nit ^n ter-
meni de ordine program, nu timp precum ^n programele secventiale (ordinea
operatiilor de nita de limbajul masina). "Urmator" trebuie de nit^n mod ana-
log. In cazul paralel, ordinea program este de nita ^n cadrul unui proces, si
trebuie rede nita de-a lungul proceselor.
Problema coerentei cache este critica ^n cazul multiprocesoarelor. In exem-
plul din Fig. 2.40, procesoarele vad valori diferite pentru u dupa evenimentul 3.
Sa ne imaginam o singura memorie partajata fara cache. Fiecare citire si
scriere la o locatie acceseaza aceeasi locatie zica. Memoria impune o ordine
seriala sau totala asupra operatiilor la locatie. Operatiile datorate unui proce-
sor dat sunt ^n ordinea program. Ordinea operatiilor la locatie de la procesoare
diferite este ^ntr-un fel ^ntretesuta dar pastr^and ordinele program individuale.
"Ultim" ^nseamna cel mai recent ^ntr-o ordine ipotetic seriala care mentine
aceste proprietati. Pentru ca ordinea seriala sa e consistenta, toate proce-
soarele trebuie sa vada scrierile, dar programul trebuie sa se comporte ca si
cum este fortata o anumita ordine seriala (ordine care apare sa se ^nt^ample,
dar nu care se ^nt^ampla actual).
Conditiile pentru coerenta sunt urmatoarele:
1. O citire de catre un procesor P a unei locatii X care urmeaza dupa o
128
Figura 2.40: Un exemplu pentru problema coerentei cache
scriere de catre P a unei valori la X , fara alte scrieri a lui X de catre
alte procesoare ^ntre scrierea si citirea de catre P , ^ntotdeauna retuneaza
valoarea scrisa de P (mentine ordinea programului).
2. O citire de catre un procesor a unei locatii X care urmeaza unei scrieri de
catre un alt procesor a unei valori la X returneaza valoarea scrisa daca
citirea si scrierea sunt separate si nici o alta scriere a lui X nu apare^ntre
cele doua accesuri (nu se poate citi timp inde nit valoarea veche).
3. Scrierile la aceeasi locatie sunt serializate: doua scrieri la aceeasi locatie
de catre doua procesoare sunt vazute ^n aceeasi ordine de catre toate
procesoarele.
De exemplu:
// In programe // Ordinea v
azut
a de procesoare
P1: write(X) P3: P1, P2
P2: write(X) P4: P2, P1
violeaza ultima conditie.
Un sistem multiprocesor este coerent daca este posibila serializarea tuturor
operatiilor la o locatie (adica se pot pune citirile/scrierile de catre toate proce-
soarele ^ntr-o ordine totala) astfel ^nc^at, operatiile efectuate de orice procesor
dat apar ^n ordinea program (adica ^n ordinea ^n care au fost executate de seg-
mentul de cod ce ruleaza pe acel procesor) si valoarea returnata de o operatie
de citire este valoarea scrisa de ultima scriere, ^n ordinea mai sus mentionata,
la acea locatie.
Un sistem de memorie este coerent daca rezultatele oricarei executii a unui
program sunt astfel ^nc^at, pentru ecare locatie, este posibila constructia unei
ordini seriale ipotetice a tuturor operatiilor la acea locatie care este consistenta
cu rezultatele executiei si ^n care operatiile ^naintate de orice proces particular
apar ^n ordinea ^naintata de acel proces, iar valoarea returnata de o citire este
valoarea scrisa de ultima citire la acea locatie ^n ordine seriala.
Doua carateristici necesare pentru coerenta sunt propagarea scrierii (valorile
scrise trebuie sa devina vizibile la celelalte) si serializarea scrierii (scrierile la
locatie se vad ^n aceeasi ordine de toate procesele).
Coerenta este mentinuta urmarind starea de partajare a blocurilor de date
129
Figura 2.41: (a) Spionare pe magistrala; (b) Controlorul de cache primeste
intrari din doua directii
(centralizat, bazat pe directoare sau distribuit prin spionaj), sau mentin^and in-
varianta citirea-multipla scrierea-singulara (MRWS, prin invalidare-actualizare).
Protocoalele de coerenta urmaresc tranzactiile pe magistrala si diagrama de
tranzitii a starilor ^n cache. O tranzactie pe magistrala are trei faze: arbitrare,
comanda/adresa, transfer date. Toate dispozitivele observa adresele, dar numai
una este responsabila. Fiecare bloc cache este o privit ca o masina cu stare
nita. Starile pot : efectiv, scriere-directa valida, scriere-directa invalida,
cache modi cat ("murdar").
Coerenta bazata pe spionaj (snooping). Tranzactiile pe magistrala
sunt vizibile de catre toate procesoarele. Procesoarele sau reprezentatii ai
acestora monitorizeaza (spioneaza snoop) magistrala si actioneaza la eveni-
mente relevante (de exemplu stare cache). Controlorul de cache primeste ^n
acest caz intrari din ambele parti (Figura 2.41.b): cereri de la procesor si
cereri/raspunsuri de pe magistrala de la spion (snooper). In ecare caz vor
rezulta zero sau mai multe actiuni: actualizarea starii, raspunde prin date,
genereaza noi tranzactii pe magistrala. Protocolul este un algoritm distribuit:
masini cu stari cooperante (multime de stari, diagrama de tranzactie a starilor,
actiuni). Granularitatea coerentei este tipic legata de blocul cache precum
transferul la si de la cache.
Fiecare controlor de cache spioneaza toate tranzactiile de pe magistrala par-
tajata si actioneaza pentru a asigura coerenta (invalidare, actualizare, furnizare
valoare), dependent de starea blocului (o tranzactie este relevanta datorita unui
bloc pe care-l contine) si de protocolul dispozitivelor I/O. Controlorul actual-
izeaza starea blocurilor ca raspuns la evenimentele generate de procesor sau
spion si genereaza tranzactii pe magistrala.
Variantele protocolului spion sunt: scrierea-directa sau scrierea-^napoi
(Figura 2.42), si invalidare sau actualizare. Protocolul scriere-directa este sim-
plu: ecare scriere este observabila si o singura scriere de catre un procesor
poate avea loc la un moment dat (se utilizeaza o latime mare de banda). La
invalidare sau actualizare ^ntrebarea de baza este legata de comportarea pro-
gramului: un bloc scris de un procesor este sau nu citit mai t^arziu de altele
^nainte de a rescris. La invalidare, daca raspunsul este da, cititorii se vor
confrunta cu o eroare cache (miss), iar daca raspunsul este nu, atunci sunt
posibile scrieri multiple fara adaugare de tra c. La actualizare, daca raspunsul
este da, se evita erorile cache pe referinte ulterioare, iar daca raspunsul este nu,
se fac actualizari multiple inutile. In Figura 2.42, starile sunt notate astfel: I
invalid, S partajat de unul sau mai multe procesoare, D murdar la unul. Eveni-
130
Figura 2.42: (a) Protocol scriere-direct a/invalidare; (b) Protocol de scriere-
^napoi/invalidare cu 3-stari de baza (MSI)
Tabelul 2.21: O solutie a problemei cache din Figura 2.40
Actiune proc. Stare Stare Stare Actiune Data fur-
^n P1 ^n P2 ^n P3 magistrala nizata de
1 P1 citeste u S { { BusRd Memorie
2 P3 citeste u S { S BusRd Memorie
3 P3 scrie u I { D BusRdX Memorie
4 P1 citeste u S { S BusRd Cache P3
5 P2 citeste u S S S BusRd Memorie

Figura 2.43: Ierarhie cache multi-nivele; (a) Ierarhie convent ionala; (b) Caz
multiprocesor
mentele procesor sunt PrRd pentru citire, PrWr pentru scriere. Tranzactiile pe
magistrala sunt: cererea unei copii fara intentia de a o modi ca BusRd, cererea
unei copii exclusive cu intentia de a o modi ca BusRdX si BusWr actualizarea
memoriei. Actiunile sunt: actualizarea starii (efectueaza tranzactii pe magis-
trala), sau expedierea unei valori la magistrala. Utiliz^and aceste notatii, o
solutie pentru problema cache din Figura 2.40 este prezentata ^n Tabelul 2.21.
Ierarhii cache multi-nivele. Un exemplu de ierarhie cache multi-nivele este
prezentata ^n Figura 2.43. Nivelele joase sunt mari si complexe. Nu exista
hardware spion pentru ecare nivel. Pentru arhitectura din Figura 2.44.a,
131
Figura 2.44: (a) Mentinerea includerii; (b) Spion numai la nivel de L 2

spionul apare doar la L si propaga tranzactii relevante. Este respectata pro-
prietatea de includere: continului lui L este o submultime a lui L (toate
2

tranzactiile relevante pentru L sunt relevante si pentru L ), si ecare bloc ^n
1 2

starea modi cata (D; S D)^n L este^n starea modi cata ^n L (la BusRd, L
1 2

informeaza L ). Cazul comun care functioneaza este urmatorul (notatiile din


1 2 2

Figura 2.44.a): a = 1; a  1; b = b ; n  n , si orice politica de ^nlocuire


1

astfel ^nc^at un nou bloc este plasat at^at ^n L c^at si ^n L . Cazurile comune
1 2 1 2 1 2

care nu functioneaza sunt: a = a = 2; b = b ; n = Kn ; iar succesele L


1 2

schimba ordinea multimii scrierilor, sau a = a = 1; b = 1; b = 2.


1 2 1 2 2 1 1

Raspunsurile procesor sau cererile de invalidare sunt datorate unor BusWr


1 2 1 2

sau BusRdX. Procesorul cere si L raspunde: protocolul transmite cererile ^n jos
p^ana apare un succes cache cu blocul ^n starea adecvata (S sau D pentru citire,
1

D pentru scriere sau citire exclusiva). Raspunsurile partajate sunt ^ncarcate


^n ecare cache ^n starea partajat (S). Raspunsurile la citirea exclusiva sunt
^ncarcate ^n cele mai interne nivele ^n starea D ^n L . Inaintarile externe,
copierile ^napoi, cererile de invalidare se propaga ^n sus schimb^and stari, iar
1

raspunsurile se scurg ^napoi ^n jos.


Ierarhii de magistrale. Coerenta cache ^n masinile scalabile este realizata
e prin directoare, e prin spionaj ierarhic. In cazul secund se extinde abor-
darea prin spionaj: se creaza arbori de magistrale sau inele, procesoarele din
multiprocesorul bazat pe magistrala sau inel se a a pe frunzele arborelui, iar
parintii si i sunt conectati prin interfete spioni ^n doua directii, iar memoria
principala poate centralizata la radacina sau distribuita la frunze. Problema
principala este latenta mare (nivele multiple, spion la ecare nivel, g^atuirea
latimii de banda la radacina) { asemenea sisteme nu sunt astazi populare.
Figura 2.45.a prezinta o ierarhie de magistrale. Protocolul cache spion pe
B se comporta fata de L precum cu memoria. Protocolul cache snoopy pe B
se comporta cu L precum cu un procesor. Figura 2.45.b prezinta schematic
1 2 2

o ierarhie bazata pe grup care se ^nt^alneste la Gigamax sau Sparc Center.


2

Cache-ul L este ^nlocuit cu un comutator ce asigura coerenta ruterului. O


ierarhie bazata pe inel (Figura 2.45.c) se ^nt^alneste de exemplu la KSR. Tabelul
2

2.22 caracterizeaza pe scurt arhitecturile descrise.


Coerenta bazata pe directoare. O abordare acceptata pentru coerenta
cache a multiprocesoarele este utilizarea directoarelor (Figura 2.46.a). Fiecare
bloc de memorie are asociata o informatie director ce tine evidenta copiilor
blocurilor cache si a starilor lor. La o eroare cache, se cauta intrarea director,
aceasta este analizata si se comunica numai cu nodurile care au copii daca este
132
Figura 2.45: (a) Ierarhie de magistrale; (b) Ierarhie bazat
a pe grup (cluster);
(c) Coerenta cache bazata pe inel

Figura 2.46: (a) Multiprocesor cu coerenta cache prin directoare; (b) Director
distribuit
Tabelul 2.22: Ierarhii de magistrale
Tema Magistrala unica Ierarhie de Ierarhie baza- Ierarhie baza-
magistrale ta pe grup ta pe inel
Nr. mic limitat de ^m- limitat de ^m- mare
procesoare pachetare pachetare
Latenta acce- scazuta, xa singura cale la multiple, acces liniara ^n nr.
sului la memo- radacina local rapid proc.
rie si latimea
de banda
Latimea de 1 multe B , un multe B , un difuzare medie
banda a proto- (fara serializa-
1 1
B B
colului coeren-
2 2
re)
tei
Localitate uniform uniform pen- importanta la fel pe inel
tru memorie
133
necesar. In retelele scalabile comunicarea cu directorul si copiile este realizata
prin tranzactii pe retea. Conceptual, la o eroare cache la citire se genereaza
o cerere de tranzactie pe retea la intrarea director obtin^and locatia datei si se
cere tranzactia de la detinatorul datei ce va replica cu data ceruta. La o eroare
cache la scriere (sau actualizare) se efectueaza o cerere de tranzactie la intrarea
director, obtin^andu-se identitatea celor ce o partajeaza si cereri de invalidare
la acestia ce vor replica cu o ^nstiintare indic^and terminarea.
In cazul protocolului spion, starea unui bloc este distribuita ^ntre proce-
soarele ce-l partajeaza, arbitrarea magistralei este utilizata pentru serializarea
scrierii, iar sistemul nu este scalabil deoarece difuzarea este ceruta pentru in-
validare. In cazul protocolului director, directorul tine starea ecarui bloc
care poate ^n cacheuri. Directorul poate distribuit (static) pentru a
evita ca accesul la director sa devina sursa de g^atuire (Figura 2.46.b); inter-
conectarea scalabila bazata pe mesaje ^nlocuieste magistrala centrala orientata
pe tranzactii. Daca schemele spion nu permit scalarea deoarece se bazeaza
pe difuzare, schemele bazate pe directoare permit aceasta, evit^and difuzarea
prin tinerea evidentei tuturor elementelor de procesare care detin ^n cache un
bloc de memorie si utiliz^and mesaje punct-la-punct pentru a mentine coerenta
( exibilitate ^n utilizarea oricarei retele scalabile punct-la-punct).
In cazul tehnicii vector bit (Figura 2.46.a), la o citire din memoria principala
de catre elementul de procesare i, daca bitul-murdar este nesetat citirea se face
din memorie si se seteaza bitul de prezenta pi, altfel se reaminteste elementul de
procesare care a "murdarit", se actualizeaza memoria, se sterge bitul-murdar,
se seteaza bitul de prezenta pi si se furnizeaza data la elementul de procesare
i. La o scriere ^n memoria principala, daca bitul-murdar este nesetat atunci
se furnizeaza data la elementul de procesare i, se expediaza invalidari la toate
elementele de procesare care au ^n cache blocul, se seteaza bitul-murdar si pi .
Starile unui bloc de date pot : U invalid sau inexistent ^n cache c^and
nici un procesor nu detine o copie a blocului ^n cache, S partajat daca unul
sau mai multe procesoare au blocul ^n cache si valoarea ^n memorie este core-
spunzatoare, si E exclusiv daca exact un procesor are blocul^n cache si valoarea
^n memorie nu este cea actuala. Se produce H succes sau M eroare, la R citire
sau W scriere. O serie de variante sunt prezentate ^n Figurile 2.47 si 2.48.
In cazul memoriei distribuite exista doua tipuri de scheme: plate sau ier-
arhice. In primul caz, directorul este distribuit cu memoria si localizarea este
bazata pe adrese. In cazul al doilea, directorul este organizat ca o structura de
date ierarhica: frunzele sunt nodurile de procesare, iar nodurile interne sunt
stari director (Figura 2.50). O intrare director a unui nod spune daca ecare
subarbore are blocul ^n cache. Pentru a gasi o informatie director se expediaza
un mesaj "cauta" la parinte (care este rutat mai departe), precum spioneaza,
dar prin mesaje punct-la-punct ^ntre parinte si i ( ecare director are de ex-
emplu biti de prezenta pentru i sai si un bit-murdar). Ierarhia este logica, nu
^n mod necesar zica (poate incoporata ^n reteaua generala). La radacina se
poate ajunge la o g^atuire a latimii de banda (se pot utiliza directoare multi-
radacina). Tra cul si latenta depind de localitatea ^n ierarhie.
Exista mai multe alternative pentru organizarea informatiei directorului
(Figura 2.49). De exemplu Convex Exemplar este de tipul director-director,
iar Sequent, Data General, HAL de tipul director-spion.
134
Figura 2.47: (a) Eroare cache la citire, cazul invalid/partajat; (b) Eroare la
citire, cazul exclusiv; (c) Eroare la scriere, invalid; (d) Eroare la scriere, parta-
jat; (e) Eroare la scriere, exclusiv; (f) Scriere ^napoi, exclusiv;

Figura 2.48: Tranzitii de stare la: (a) Blocul cache; (b) Director

Figura 2.49: Organizarea directoarelor

135
Figura 2.50: O structura ierahica de directoare

Figura 2.51: Scheme director distribuite plate bazate pe: (a) Memorie;
(b) Cache
Organizarea directoarelor poate prin scheme bazate pe memorie (la DASH,
Alewife, Flash) sau prin scheme bazate pe cache (la Aurora, SCI). Un sis-
tem de primul tip opereaza la viteza memoriei { informatiile despre copii sunt
stocate ^n acelasi loc cu blocul de memorie (la fel ca ^ntr-o schema centrala,
^nsa ^n acest caz distribuit); surplusul stocarii se scaleaza cu cantitatea totala
de memorie multiplicata cu numarul de elemente de procesare care este posibil
s-o partajeze. In al doilea tip informatiile despre copii sunt distribuite cu copi-
ile ^nsusi (Figura 2.51), ecare copie point^and la urmatoarea; este construit pe
baza de SRAM (citire nedistructiva; la DRAM citirea este distructiva si exista
o scriere ^napoi). La o citire, un pointer este adaugat la lista, iar la scriere se
propaga o invalidare pe lista.
Directoarele consuma 8-10% din memoria principala. Deoarece numarul
total de blocuri cache din masina este mult mai mic dec^at numarul total de
blocuri de memorie, majoritatea intrarilor director sunt inactive majoritatea
timpului (la 256 Kb cache pentru o memorie 16Mb, > 98% inactive). Direc-
toarele rare reduc cerintele de memorie utiliz^and intrari unice pentru blocuri
multiple de memorie.
136
Figura 2.52: (a) Fire multiple de control; (b) Reordonare
Consistenta
Problemele care se pun sunt: c^and un procesor vede o valoare care este actual-
izata de alt procesor, ^n ce ordine trebuie un procesor sa observe datele scrise
la alt procesor si ce proprietati trebuie fortate printre citiri si scrieri la diferite
locatii de diferite procesoare. Coerenta nu este su cienta pentru a raspunde la
aceste ^ntrebari, deoarece se refera la o locatie singulara.
La ordonarea ^ntre o scriere si o citire de catre procesoare diferite ^n mod
tipic se utilizeaza sincronizarea pe baza unei locatii (de exemplu prin flag
din Figura 2.52): Totusi majoritatea tehnicilor care fac hardware-ul mai rapid
sunt ^n contradictie cu modelul intuitiv al programatorului a ceea ce memoria
ar trebui sa faca. Este su cient a avea (Figura 2.52.b): scrieri executate ^n
ordine, fara cache si ordonare punct-la-punct ^n retea.
Modelul de consistenta a memoriei pentru multiprocesoare cu memorie par-
tajata speci ca cum operatiile la memorie ale unui program trebuie sa apara
programatorului ca ind executate, adica constr^angerile asupra ordinii ^n care
operatiile pe memorie (de la ecare proces) apar a executate una fata de
alta. Astfel data ind o instructiune de ^ncarcare ^naintata de un procesor, se
speci ca care sunt valorile legale care trebuie returnate pentru acea ^ncarcare
d^andu-se o istorie a executiei anterioare a acelui program (trebuie returnata
"ultima" valoare scrisa la acea locatie). Implicatia asupra programatorului este
aceea ca trebuie sa rationeze asupra corectitudinii si rezultatelor posibile, iar
asupra designerului de sistem, aceea ca constr^ange numarul accesurilor ce pot
reordonate de catre compilator si hardware.
Determinarea ordonarilor. O operatie la memorie M urmeaza unei
operatii M (M ! M ) daca operatiile sunt ^naintate de acelasi procesor
2

si M urmeaza lui M ^n ordinea programului. O citire urmeaza unei scrieri
1 1 2

W daca citirea genereaza tranzactii pe magistrala ce urmeaza cele pentru W .


2 1

O scriere urmeaza unei citiri sau scrieri M daca M genereaza tranzactii pe


magistrala si tranzactiile pentru scriere urmeaza acelea pentru M . O scriere
urmeaza o citire daca citirea nu genereaza o tranzactie pe magistrala si nu este
deja separata de scriere printr-o alta tranzactie pe magistrala (se suprapun).
Ordonarea citirilor. Erorile cache la citire apar pe magistrala si se va utiliza
ultima valoare scrisa ^n ordinea magistralei. Succesele citirii nu apar pe magis-
trala (cea mai recenta valoare scrisa de procesor, sau cea mai recenta eroare de
cache, ambele tranzactii apar^and pe magistrala). Succesele la citire vad valorile
137
Figura 2.53: Consistenta secventiala: (a) Stare initiala; (b) Stare ulterioara;
(c) Imposibil daca se respecta consistenta secventiala

Figura 2.54: Intercalarea accesurilor


ca ind produse ^n ordinea consistenta a magistralei.
Ordonarea scrierilor. Scrierile stabilesc o ordine partiala. Nu constr^ang
ordinea citirilor, desi magistrala va ordona erorile cache la citire; orice ordine
^ntre citiri si scriere este permisa at^ata timp c^at este ^n ordinea programului.
Fiecare scriere este expediata la magistrala partajata si memorie. Scrierea-
^napoi este un succes cache, iar succesele la scriere nu sunt expediate spre
magistrala.
Consistenta secventiala. Un sistem multiprocesor este consistent secven-
tial (SC) daca rezultatul oricarei executii este acelasi ca si ^n cazul ^n care
operatiile tuturor procesoarelor sunt executate ^n ordine secventiala (operatiile
pe memorie apar atomice) si operatiile pe ecare procesor individual apar ^n
aceasta secventa ^n ordinea speci cata de programul sau (mentinerea ordinii
secventiale a programului). Un contraexemplu este prezentat ^n Figura 2.53.
Ordinea totala poate atinsa prin intercalarea accesurilor de la diferite
procesoare (Figura 2.54).
Ordinea programului este intuitiv ordinea ^n care operatiile apar ^n codul
sursa (o translatare directa a codului sursa la asamblare cu cel mult o operatie
cu memoria per instructiune); acesta ordine este adesea violata de compilatoare.
Formal, ordinea program a ecarui proces impune o relatie de ordine
partiala pe multimea tuturor operatiilor. Intercalarea acestor ordini partiale
de neste ordinea totala pe toate operatiile. O ordine totala poate SC (SC nu
de neste o intercalare particulara). O executie a unui program este consistent
secventiala daca rezultatele sunt aceleasi ca cele produse de catre o anumita
ordine totala posibila (intercalare). Un sistem este SC daca orice executie
posibila pe acel sistem este o executie SC.
138
O executie a unui program este SC daca exista cel putin o executie pe un
sistem SC conceptual care ofera acelasi rezultat. De exemplu, se considera:
// P1 // P2
A:= 1 (a) B:= 1 (c)
x:= B (b) y:= A (d)
Toate locatiile sunt initializate cu 0. Variante nale posibile pentru (x; y) sunt
(0; 1); (1; 0); (1; 1), pe c^and (x; y) = (0; 0) nu este posibil deoarece a ! b si
c ! d din ordinea programului, x = 0 implica b ! c care implica a ! d ceea ce
ne spune y = 1, ajung^and astfel la o contradictie; ^n mod similar y = 0 implica
x = 1 de asemenea o contradictie. Un alt exemplu este urmatorul:
// P1 // P2
// initial A este 0
x:= A; (a.1) A:= 1; (b)
A:= x+2; (a.2) y:= A; (c)
Variante nale posibile pentru (x; y) : sunt (0,1) (corespunzator la a ! b ! c),
(1,1) (corespunzator la b ! c ! a), (1,3) (corespunzator la b ! a ! c).
Varianta (x; y) = (0; 2) nu este posibila: a:1 ! b ! a:2 ! c. In cazul
// P1 // P2
// valorile initiale ale lui A si B sunt 0
A:= 1; (1a) print B; (2a)
B:= 2; (1b) print A; (2b)
Variatele nale posibile pentru (A; B) sunt (0,0), (1,0), (1,2). In conditiile
SC (A; B) = (0; 2) este imposibil: stim ca 1a ! 1b si 2a ! 2b din ordinea
program, iar A = 0 implica 2b ! 1a, care la r^andul sau implica 2a ! 1b
si B = 2 implica 1b ! 2a, care conduce la o contradictie. Pe de alta parte
executia 1b ! 1a ! 2b ! 2a este SC, desi nu ^n ordinea program (apare
precum 1a ! 1b ! 2a ! 2b dupa cum este vizibila din punct de vedere al
rezultatelor). Executia 1b ! 2a ! 2b ! 1a nu este SC. In cazul
// P1 // P2 // P3
A:=1; while (A=0); while (B=0);
B:=1; print A;
tranzitivitatea implica A trebuie sa e tiparit drept 1^n conditiile SC. Probleme
apar daca P paraseste ciclul, scrie B, si P vede valoarea noua B dar vechea
valoare A (de exemplu din cache-ul sau).
2 3

Implementarea SC. Exista doua tipuri de cerinte: ordinea program si


atomicitatea. Operatiile cu memoria ^naintate de un proces trebuie sa apara
vizibile (altora si sine ^nsusi) ^n ordinea programului. Atomicitatea se refera
la faptul ca operatia pe memorie trebuie sa apara ca ind nalizata tuturor
proceselor ^nainte ca urmatoarea operatie sa e ^naintata (necesar a se garanta
ca ordinea totala este consistenta de-a lungul proceselor).
Problema cea mai di cila este atomicitatea scrierii. Pozitia^n ordinea totala
^n care apare o scriere trebuie sa e aceeasi pentru toate procesele. Un proces
139
Figura 2.55: Consistenta slaba: (a) Un exemplu; (b) Bariera introdusa
nu face nimic dupa ce vede noua valoare produsa de o scriere W p^ana c^and
toate celelalte procese vad W .
SC nu necesita ^n mod implicit sincronizare deoarece nu grupeaza operatii.
Conditii su ciente (dar nu si necesare { contraexemplu oferit de compi-
latoare si hardware) pentru SC sunt urmatoarele. Cererile sunt ^naintate
de ecare proces ^n ordinea speci cata de program. Dupa ce este ^naintata
o scriere, procesul care a ^naintat-o asteapta terminarea scrierii ^nainte de
^naintarea urmatoarei operatii. Dupa ce este ^naintata o citire, procesul care a
^naintat-o asteapta ca citirea sa e terminata si ca scrierea a carei valoare este
returnata prin citire sa e terminata, ^nainte de a ^nainta urmatoarea operatie
(confera atomicitatea scrierii). Ultima conditie asigura faptul ca stocarea apare
atomica ^ncarcarilor. O ^ncarcare/stocare este ^naintata c^and paraseste mediul
intern al procesorului si este ^n tranzit spre sistemul memorie (operatia devine
potential vizibila de catre alte procesoare). O ^ncarcare este terminata c^and
stocari ^naintate de alte procesoare dupa terminarea unei ^ncarcari de catre
un procesor nu mai pot afecta valoarea returnata. O stocare este terminata
c^and toate copiile locatiei referite au fost actualizate (memoria principala este
actualizata si toate copiile cache sunt invalidate sau actualizate).
Modele de memorie relaxate. Conditiile enumerate mai sus ^n imple-
mentarea SC pot relaxate. Pot relaxate ordinea program sau atomici-
tatea scrierii. In primul caz, se pot neglija ordonarile R ! R; R ! W; W !
R; W ! W speci ce programului ^ntre perechi de operatii pe un procesor,
prin dependenta datelor sau de control (W ! R daca nu exista o dependenta
adevarata, W ! W daca nu exista o dependenta la iesire, R ! R=W daca
nu exista o anti-dependenta). In cazul a doilea, unei citiri i se permite sa re-
turneze valoarea scrisa unui alt procesor ^nainte ca scrierea sa e vizibila la
toate procesoarele (din cache).
Modelele relaxate pot centrate pe software sau pe hardware. In primul
caz se speci ca o metodologie pentru a scrie programe "sigure". In cazul al
doilea se speci ca ordinea mentinuta (sau nu) de catre hardware. Exista mai
multe variante: consistenta procesor (la Dash), ordonarea totala a stocarilor (la
Sparc), ordonare partiala a stocarilor (la Sparc), ordonare slaba (la PowerPC),
sau consistenta eliberata (la Alpha, MIPS). Consistenta slaba de exemplu in-
troduce "bariere": toate accesurile ^naintate ^nainte de bariere sunt vazute de
catre toate accesurile ^naintate dupa bariera (Figura 2.55).
Apelul prealabil ca tehnica de toleranta a latentei memoriei.
Cresterea vitezei procesorului este mai rapida dec^at cresterea memoriei si a
vitezei de interconectare. Pentru a reduce aceasta diferenta se utilizeaza cache-
uri, memorii locale, retele cu latenta scazuta, interfete rapide (optimizarea
140
localitatii). Toleranta latentei utilizeaza concurenta ^n exces pentru a ascunde
latenta. Pentru a tolera latenta sunt utilizate urmatoarele tehnici: modele
de consistenta ale memoriei relaxate, apel prealabil, comutarea multithrea-
ding/context si transferul ^n bloc. Modelele de consistenta ale memoriei relax-
ate permit acccesuri urmatoare^nainte ca cele anterioare sa e terminate (scrieri
pipeline). Apelul prealabil muta data mai aproape de procesor ^nainte ca
acesta sa aiba nevoie de ea (citiri pipeline). Comutarea multithreading/context
schimba contextele operatiilor cu latenta mare. Transferul ^n bloc muta datele
^n bucati mari ^n loc de cuvinte sau linii cache (octeti pipeline).
Apelul prealabil este posibil numai c^and adresele pot determinate^n avans.
Factorul de acoperire este o fractie a erorilor de cache. Apelul este nenecesar
daca data este deja ^n cache.
Apelul prealabil poate clasi cat astfel: legat sau nelegat, controlat hard-
ware sau software. In cazul legarii valoarea unei referinte reale este legata c^and
este efectuat apelul prealabil (este necesara o capacitate de stocare aditionala
de viteza mare). In cazul nelegarii, valoarea nu este legata p^ana la atingerea
referintei reale (data ram^ane vizibila protocolului de coerenta). Apelul preal-
abil controlat hardware se refera la blocuri cache multi-cuvinte (majoritatea
masinilor exploateaza un asemenea apel prealabil util pentru coduri cu acces
cu pasi unitari, problemele ind cresterea tra cului si falsa partajare), tam-
poane de date (apel al liniei de cache urmatoare c^and cea curenta este atinsa;
utila ^n cazul accesului^n pasi unitari) sau instructiuni si detectarea pasilor. In
cazul controlului software (instructiuni explicite), apelul prealabil este inserat
de catre programator, sau de catre compilator, exist^and astfel doua categorii:
controlat de programator sau de compilator (automat, necesit^and un compila-
tor so sticat). Urmatoarea secventa este un exemplu de apel prealabil controlat
software de catre programator:
// ciclul initial //apel prealabil a 5 iteratii (pipeline)
for i:=0 to 99 by 1 for i:=0 to 4 by 1 //prolog
a[i]:= 0; prefetch(&a[i])
for i:=0 to 94 by 1 { //stare stabila
prefetch(&a[i+5])
a[i]:= 0 }
for i:=95 to 99 by 1 //epilog
a[i]:= 0

2.4.3 Programarea sistemelor cu memorie partajata


Programarea memoriei partajate necesita trei tipuri de primitive: pentru alo-
carea variabilelor partajate, pentru excludere mutuala si sincronizare, si pentru
crearea proceselor.
Primitive pentru alocarea variabilelor partajate. Exista doua tipuri de vari-
abile: partajate (accesibile tuturor proceselor) si private (accesibile numai pro-
cesului ce le declara). Urmatoarea secventa declara de exemplu o matrice
partajata b si un ^ntreg privat i:
3 Rezumat: Programarea sistemelor multi-procesor cu memorie partajat a se bazeaza pe
utilizarea semafoarelor (variabile binare) si monitoarelor (^n stilul programarii orientate
obiect).

141
shared int b[1000]; private int i;
Primitive pentru excludere mutuala si sincronizare. Daca mai multe pro-
cese partajeaza variabile, este importanta evitarea operatiilor con ictuale.
Sectiunile critice (CS) contin cod care trebuie executat de un singur proces
la un moment dat. Blocajele (lock) sunt oferite pentru a forta excluderea
mutuala la executia unei CS. Blocajele sunt implementate printr-un tip special
de variabile partajate, manipulate numai prin operatii atomice. Fiecare blocaj
poate detinut de cel mult un proces la un moment dat. Procesul care detine
blocajul executa CS corespunzatoare si elibereaza blocajul c^and paraseste CS.
Daca un proces ^ncearca sa obtina un blocaj care este detinut curent de alt
proces, intra ^ntr-un ciclu ocupat ^n asteptare sau suspenda executia. In prima
varianta procesul continua sa veri ce blocajul, astept^and ca acesta sa e elib-
erat. La supendarea executiei se alatura la o coada asociata cu blocajul pe
care ^ncearca sa-l obtina si devine activ din nou c^and blocajul este eliberat si
procesul este ^n capul cozii. Sincronizarea este atinsa prin primitiva bariera de
sincronizare.
Primitive pentru crearea proceselor. Sunt asemanatoare cu fork-join din
Unix. Apelurile la sistem creaza subprocese identice cu parintele ce partajeaza
blocaje si variabile declarate partajate. Subprocesele sunt capabile de executii
independente { un singur r de executie este^mpartit^n mai multe re (thread)
cu acces la date partajate. Procesele parinte continua dupa crearea subproce-
selor. Procesul parinte este numit principal (stap^an, proprietar, master). C^and
procesul principal necesita efectuarea unor sarcini ^n paralel, creaza un numar
prede nit de alte procese numite subordonate (dependent, rob, sclav, slave).
C^and subordonatii termina, controlul este returnat la procesul principal, care
poate crea noi procese dependente pentru a efectua alte calcule.
Semafoare
Un semafor S este o variabila ^ntreaga nenegativa care are exact doua operatii
de nite P si V : la P (S ) daca S > 0 atunci S = S 1, altfel se suspenda
procesul; la V (S ), daca exista procese suspendate la acest semafor este trezit
unul dintre acestea, altfel S = S + 1. Asa cum este de nit V , nu speci ca
procesele suspendate care vor trezite. Urmatoarele relatii sunt valabile:
S  0; S = S + N (V ) N (P )
0

unde S este valoarea initiala a semaforului, si N se refera la numarul de apeluri


la operatia argument.
0

Un semafor binar este un semafor care ia numai valori 0 si 1.


Excluderea mutuala poate realizata astfel cu ajutorul semaforului:
semafor mutex := 1
proces p (i:= 1 to P) {
do true {
Non_critical_Section
P(mutex)
Critical_Section
V(mutex) } }

142
Pentru a demonstra faptul ca excluderea mutuala este satisfacuta, e N (CS)
numarul de procese ^n sectiunea critica. Cum N (CS)= N (P ) N (V ) din
structura programului, mutex= 1+N (V ) N (P ) din faptul ca este un invariant,
deci mutex= 1 N (CS), si astfel N (CS) + mutex = 1. De asemenea programul
nu poate ajunge ^n impas. Pentru a demonstra aceasta a rmatie se presupune
contrarul, respectiv ca toate procesele se opresc la P(mutex); atunci mutex = 0
si N (CS) = 0 deoarece nici un proces nu este^n sectiunea scritica; adica 0+0=1
ceea ce este imposibil.
Alegerea procesului suspendat care sa e trezit conduce la urmatoarele
de nitii. Un semafor cu multime de blocare trezeste oricare dintre procesele
suspendate. La un semafor cu coada de blocare procesele suspendate sunt
retinute ^n stil FIFO si sunt trezite ^n aceeasi ordine ^n care sunt suspendate.
La un semafor ocupat-^n-asteptare valoarea semaforului este testata ^ntr-un
ciclu, testul ind atomic.
In cazul semafoarelor cu ocupat-^n-asteptare este posibila ^nfometarea. Pen-
tru a demonstra aceasta a rmatie, se considera secventa de mai sus pentru doua
procese. Presupunem ca P executa P(mutex) si intra ^n sectiunea critica.
P executa P(mutex), gaseste mutex= 0 si cicleaza. P termina sectiunea
1

critica, executa V(mutex), re^ncepe ciclul si executa P(mutex) si intra din nou
2 1

^n sectiunea critica. P testeaza mutex, gaseste mutex= 0, si cicleaza.


Utiliz^and semafoare cu multime de blocare,^nfometarea este posibila pentru
2

cazul P  3. Intr-adevar, daca exista 3 procese este posibila construirea unei


secvente de executie astfel ^nc^at exista ^ntotdeauna 2 procese blocate la un
semafor. V(mutex) este cerut pentru a trezi numai unul dintre ele, astfel ^nc^at
va ignora ^ntotdeauna unul si va lasa acel proces sa e ^nfometat.
Utiliz^and semafoare cu coada de blocare, ^nfometarea este imposibila. Intr-
adevar, daca P este blocat pe mutex si exista cel mult N 1 procese^n fata lui
P ^n coada, atunci dupa N 1 ori V(mutex), P va intra ^n sectiunea critica.
1
1 1

Problema producator-consumator. Exista doua tipuri de procese: pro-


ducatori si consumatori. Producatorii sunt procese care datorita anumitor
activitati interne produc date care vor expediate la consumatori. Consuma-
tori sunt procese care la receptionarea unui element de date consuma data ^n
anumite calcule interne.
Putem conecta aceste procese ^ntr-o maniera sincrona, astfel ^nc^at data
este transmisa numai c^and un producator este pregatit pentru a o trimite si
un consumator este gata pentru a o receptiona. O metoda mai exibila este
conectarea producatorilor si consumatorilor printr-un tampon tip coada. Se
considera urmatoarele proceduri:
int buffer [?]
int in_pointer:= 0, out_pointer:= 0
semafor elemente:= 0
process producator { process consumator { int i
do true { do true {
buffer[in_pointer]:= produce() P (elemente)
in_pointer:= in_pointer + 1 i:=buffer [out_pointer]
V(elemente) }} out_pointer:=out_pointer+1
consume (i) }}

143
Figura 2.56: Masa lozo lor
Daca tamponul este in nit, atunci N (elemente)  0 si N (elemente)= 0+
in_pointer out_pointer, din de nitia semaforului elemente, cu valoarea
initiala 0. Procedurile de mai sus pot modi cate pentru tampoane reale
circulare prin utilizarea altui semafor ce contorizeaza locurile goale din tampon:
int N:=100 //de exemplu
int buffer[N]
int in_ptr:= 0, out_ptr:= 0
semafor elemente:= 0, spaces:= N
process producator{ int i process consumator{ int i
do true { do true {
i := produce () P (elemente)
P (spaces) i:=buffer [out_ptr]
buffer [in_ptr] := i out_ptr:=(out_ptr+1)mod N
in_ptr:=(in_ptr+1)mod N V (spaces)
V (elemente) }} consume (i) }}
Procesele nu pot intra ^n impas, nici un proces nu este ^nfometat si programul
nu elimina date dintr-un tampon gol si nici nu adauga date la un tampon plin.
Problema cinei lozo lor. O institutie angajeaza cinci lozo pentru a
rezolva o problema foarte di cila. Fiecare lozof este angajat ^n doua ac-
tivitati { a g^andi si a m^anca. M^ancarea este servita ^n sala de mese care are o
masa cu cinci farfurii si cinci furculite (Figura 2.56). In centrul mesei este un
bol cu spagheti care este umplut fara sf^arsit. Filozo i, ne ind dintre cei mai
^ndem^anatici oameni, necesita doua furculite pentru a m^anca si pot lua numai
furculitele a ate ^n imediata apropiere, la st^anga si la dreapta.
Aceasta situatie este similara problemei accesului multiplelor procesoare
la o multime de resurse partajate, de exemplu, o retea de calculatoare care
acceseaza o banca de imprimante.
Pentru ca sistemul sa opereze corect este necesar ca un lozof sa man^ance
numai daca are doua furculite ^n conditiile ^n care doi lozo nu pot detine
aceasi furculita simultan, sa nu existe impas si ^nfometare individuala, iar com-
portarea sa e e cienta ^n absenta competitiei.
O prima ^ncercare de solutionare a problemei este urmatoarea. Se mod-
eleaza ecare furculita printr-un semafor. Fiecare lozof trebuie sa astepte
(executa o operatie P ) ambele furculite ^nainte de a m^anca.
semafor fork [5] := (1,1,1,1,1)
process filozof (i := 1 to 5) {
do true {

144
Think ( )
P(fork [i]); P(fork [(i+1) mod 5]
Eat ( )
V(fork [i]); V(fork [(i+1) mod 5] } }
Aceasta este numita solutia simetrica pentru ca sarcinile sunt identice. Solutiile
simetrice au mai multe avantaje, ^n mod particular echilibrarea ^ncarcarii. Eat
este sectiunea critica a ecarei furculite. Se poate demonstra ca nici o furculita
nu este detinuta de catre doi lozo : daca N (Pi ) este numarul de lozo care
detin furculita i atunci avem Fork(i) +N (Pi)=1. Deoarece un semafor este
ne-negativ, N (Pi)  1.
Totusi aceasta varianta poate conduce la impas^ntr-o intercalare^n care toti
cei cinci lozo iau furculitele din st^anga deodata; adica toate procesele execua
P (fork[i]) ^nainte de P (fork[(i + 1)mod5]. Exista doua solutii. Una dintre
acestea este aceea de a obliga un lozof sa ia furculita din dreapta ^naintea
celei din st^anga (solutie asimetrica); cealalta este aceea de a permite doar la 4
lozo sa ^ntre ^n camera la un moment dat. In cazul a doilea:
semafor Room := 4, fork [5] := (1,1,1,1,1)
process filozof (i := 1 to 5) {
do true {
Think ( )
P(Room)
P(fork [i]); P(fork [(i+1) mod 5]
Eat ( )
V(fork [i]); V(fork [(i+1) mod 5]
V(Room) } }
Aceasta rezolva problema impasului. Infometarea individuala nu poate aparea.
Intr-adevar ca un un proces sa e ^nfometat trebuie sa e blocat pentru tot-
deauna pe unul dintre cele trei semafoare Room, fork[i] sau fork[(i+1)mod5]).
Daca semaforul Room este de tip coada de blocare, atunci procesul i este blocat
daca Room=0 inde nit. Aceasta implica faptul ca ceilalti patru lozo sunt
blocati pe furculitele din st^anga lor, deoarece daca unul dintre ei obtine doua
furculite, va termina, va pune jos furculitele, si va semnala V(Room); acest caz
urmeaza din cazul fork[i]. Daca lozoful i este blocat pe furculita din st^anga,
atunci lozoful i 1 trebuie sa detina furculita din dreapta sa. De aceea e
man^anca, e semnalizeaza eliberarea furculitei din st^anga, si eventual va pune
jos furculita dreapta care este cea din st^anga lozofului i. Daca lozoful i este
blocat pe furculita din dreapta, ^nseamna ca lozoful i + 1 a luat furculita sa
din st^anga si nu a mai eliberat-o. Deoarece m^ancatul si semnalizarea nu pot
bloca, lozoful i + 1 trebuie sa astepte furculita sa din dreapta, si asa fac toti
lozo i prin inductie: i + j; 0  j  4: Deoarece semaforul Room permite numai
4 lozo ^n camera, lozoful i nu poate blocat pe furculita sa din dreapta.
Problema scriitorilor si cititorilor. Doua tipuri de procese, cititori si scri-
itori, partajeaza o baza de date. Cititorii executa tranzactii care examineaza
baza de date, scriitorii executa tranzactii care examineaza si actualizeaza baza
de date. Presupun^and ca baza de date este initial consistenta, pentru a asigura
faptul ca baza de date ram^ane consistenta, un proces scriitor trebuie sa aiba
145
un acces exclusiv la baza de date. In ceea ce priveste un proces scriitor, actu-
alizarea bazei de date este o sectiune critica care nu poate intercalata cu alte
procese. Orice numar de cititori pot examina concurent baza de date. Una
dintre solutii este urmatoarea:
int M:=20, N:=5 //de exemplu
int nr:=0
semafor mutexR:= 1, rw := 1
process cititor (i:=1 to M) { process scriitor (i:=1 to N) {
do true { do true {
P (mutexR) P (rw)
nr := nr + 1 Update_Database ( )
if nr = 1 then P (rw) V (rw) } }
V (mutexR)
Read_Database ( )
P (mutexR)
nr := nr - 1
if nr = 0 then V (rw)
V (mutexR) } }
Aceasta este numita solutia preferentiala a cititorilor deoarece daca un proces
cititor acceseaza baza de date si un nou proces cititor si unul scriitor ajung la
protocolurile de intrare atunci procesul cititor va ^ntotdeauna preferat fata de
procesul scriitor. Aceasta nu este o solutie corecta deoarece o secventa continua
de cititori va bloca orice proces scriitor.
Pentru ^mbunatatirea solutiei se utilizeaza un semafor binar divizat, adica
mai multe semafoare care ^mpreuna au proprietatea ca suma lor este 0 sau 1.
Se numara procesele cititoare suspendate si a procesele scriitoare suspendate.
Tehnica urmatoare este numita pasarea bastonului:
int M:= 20, N:= 5 //de exemplu
int nr:=0, nw:= 0, sr:= 0, sw:= 0 // contorizeaza suspendarile
semafor e := 1, r := 0, w := 0 // 0 <= (e+r+w) <= 1
process cititor (i:=1 to M) { process scriitor (i:=1 to N){
do true { do true {
P(e) P(e)
if nw > 0 then { if nr > 0 or nw > 0 then {
sr:= sr + 1; V(e); P(r)} sw := sw + 1; V(e); P(w)}
nr := nr + 1 nw := nw + 1
if sr > 0 then { V(e)
sr := sr - 1; V(r) } Update_Database ( )
else if sr = 0 then V(e) P(e)
Read_Database ( ) nw := nw - 1
P(e) if sr > 0
nr := nr - 1 then { sr := sr -1; V(r) }
if nr = 0 and sw > 0 then { else if sw > 0 then
sw := sw - 1; V(w); then { sw := sw - 1; V(w)}
if nr >0 or sw = 0 else if sr = 0 and sw = 0}
then V(e) } } } then V(e) } }

146
Monitoare
Principalul dezavantaj al semafoarelor este acela ca sunt constructii de nivel
scazut. Intr-un proiect mare, cu multi programatori, daca unul dintre program-
atori uita sa faca operatia V() dupa o sectiune critica, ^ntregul sistem va intra
^n impas.
Monitorul este o constructie de nivel ^nalt ce grupeaza responsabilitatile
corectitudinii. Incapsuleaza o multime de proceduri si date pe care opereaza,
si garanteaza ca numai un proces poate executa o procedura ^n monitor la
ecare timp dat (excludere mutuala). Procese diferite pot executa monitoare
diferite ^n acelasi timp.
Sincronizarea este atinsa prin utilizarea variabilelor de conditie. Acestea
sunt structuri de date pe care sunt de nite trei operatii: asteptare, semnalare
si ne-vid. La wait(C ), procesul care apeleaza monitorul contin^and aceasta
operatie este suspendat ^n coada FIFO asociata cu conditia C (este realizata
excluderea mutuala a monitorului). La signal(C ), daca coada asociata cu
C nu este vida, atunci trezeste procesul din capul cozii. La non-empty(C )
returneaza adevarat daca coada asociata lui C nu este vida.
Daca un proces utilizeaza operatia signal si trezeste un alt proces ^n mon-
itor, exista doua procese ^n acelasi timp ^n monitor. Pentru a rezolva aceasta
problema, pot implementate mai multe mecanisme de semnalizare, cel mai
simplu ind mecanimul de semnalizare si continuare: procedurii din moni-
tor care semnalizeaza o variabila de conditie i se permite sa continue p^ana la
terminare, astfel ^nc^at operatia signal trebuie sa e la sf^arsitul procedurii;
procesul care a fost suspendat de o variabila de conditie, dar care este acum
trezit, este plani cat sa ^nceapa imediata procedura existenta care semnaleaza
variabila de conditie.
Problema cititori/scriitori. Se reia drept exemplu pentru monitoare pro-
blema cititori/scriitori. Monitorul este descris astfel:
monitor (RW_controller)
op request_read ( ), release_read ( )
op request_write ( ), release_write ( )
{ int nr:= 0, nw:= 0
condvar (ok_to_read)
condvar (ok_to_write)
proc (request_read ( )) {
do nw > 0 { wait (ok_to_read) }
nr := nr + 1 }
proc (release_read ( )) {
nr := nr - 1
if nr = 0 then signal (ok_to_write) }
proc (request_write ( )) {
do nr > 0 or nw > 0 { wait (ok_to_write)}
nw := nw + 1 }
proc (release_write ( )) {
nw := nw -1
signal (ok_to_write)
signal_all (ok_to_read) } }

147
Scriitorii/cititorii sunt descrisi astfel:
resource main ( ) {
import RW_controller
process cititor (i:=1 to 20){ process scriitor (i:=1 to 5){
RW_controller.request_read() RW_controller.request_write()
Read_Database ( ) Update_Database ( )
RW_controller.release_read()} RW_controller.release_write()}}
Emularea monitoarelor prin semafoare. Semafoarele si monitoarele sunt
primitive de programare concurenta de putere egala, ^nsa monitoarele sunt
constructii de nivel mai ^nalt. Un semafor poate astfel simulat printr-un
monitor:
monitor semafor
op p ( ), v ( )
{ int s:= 0
condvar (not_zero)
proc (p ( )) {
if s=0 then wait (not_zero)
s := s - 1 }
proc (v ( )) {
if not_empty (not_zero) = true
then signal (not_zero)
else s := s + 1 } }

Emularea monitoarelor prin semafoare. Sunt necesare semafoare cu


coada de blocare si este necesara implementarea mecanismului de semnalare
si continuare. Se utilizeaza o variabila c_count si un semafor, s, pentru a
asigura excluderea mutuala si un alt semafor c_semaphore care sa se comporte
ca variabila de conditie. Atunci se poate translata wait(s) astfel:
c_count := c_count + 1
V (s)
P (c_semaphore)
c_count := c_count - 1
si signal(s) prin:
if c_count > 0 then V(c_semaphore)
else V(s)
Problema cinei lozo lor utiliz^and monitoare. Utiliz^and monitoarele se
poate obtine usor o solutie (folosind semafoare nu se pot testa doua semafoare
simultan). Solutia monitor mentine o matrice fork care contorizeaza numarul
de furculite disponibile pentru ecare lozof:
monitor (fork_monitor)
op take_fork (int i), release_fork (int i)
{ int fork [5]:=(2,2,2,2,2)

148
condvarl (ok_to_eat, 5) //matrice de variabile de conditie
proc (take_fork (i)) {
if fork [i] != 2 then _wait (ok_to_eat [i])
fork [(i-1) mod 5] := fork [(i-1) mod 5] - 1
fork [(i+1) mod 5] := fork [(i+1) mod 5] - 1 }
proc (release_fork (i)) {
fork [(i-1) mod 5] := fork [(i-1) mod 5] - 1
fork [(i+1) mod 5] := fork [(i+1) mod 5] - 1
if fork [(i+1) mod 5] = 2 then
_signal (ok_to_eat [(i+1) mod 5] )
if fork [(i-1) mod 5] = 2 then
_signal (ok_to_eat [(i-1) mod 5] ) }
resource main ( ) {
import fork_monitor
process philosopher (i:= 1 to 5) {
do true {
Think ( )
fork_monitor.take_fork (i)
Eat ( )
fork_monitor.release_fork (i) }}}
Infometare individuala poate sa apara dar solutia nu conduce la impas. Pentru
a demonstra acest lucru e N (E) numarul lozo lor care man^anca si de aceea
au
P
ambele furculite. Deoarece non-empty(ok_to_eat[i]), fork[i] < 2. Atunci
i fork[i] = 10 2N (E). Impasul implica N (E)=0 si toti lozo i sunt P ^n
5

coad
=1
a la ok_to_eat. Daca toti sunt ^n coada, atunci prima ecuatie implica
P [i]  5 si dac
fork a nici un lozof nu man^anca, atunci a doua ecuatie implica
fork[i]=10, ajung^andu-se astfel la contradictia 10  5.
Problema barbierului adormit. Pravalia mica a unui barbier are doua usi,
o intrare si o iesire (Figura 2.57). Inauntru este un barbier care^si petrece viata
servind clientii, unul la un moment dat. C^and nu exista nimeni ^n pravalie,
doarme ^n scaunul sau. Daca apare un client si gaseste barbierul adormit, ^l
trezeste, sta ^n scaunul clientului si doarme p^ana c^and parul sau este taiat. Daca
un client soseste si gaseste barbierul ocupat taind parul unui client, clientul se
aseaza pe unul dintre cele doua scaune de asteptare si adoarme. C^and barbierul
termina taierea parului clientului, trezeste clientul tuns si tine usa deschisa
pentru el. Daca exista clienti ^n asteptare, trezeste unul si asteapta ca noul
client sa se aseze ^n scaunul clientului, altfel se pune sa doarma.
Aceasta este o generalizare a sincronizarii tip rendez-vous ^n arhitecturile
client/server. C^and mai multe procese diferite au un rendez-vous, solutia este
utilizarea unui monitor pentru a crea un "mediu" ^n care procesele se pot
^nt^alni.
Barbierul si clientii sunt procese ce interactioneaza, iar pravalia barbierului
este monitorul ^n care ele reactioneaza. O solutie este urmatoarea:
monitor (barber_shop)
op get_haircut ( ), get_next_customer ( )
op finish_cut ( )
{ int barber:= 0, chair:= 0, open:= 0

149
Figura 2.57: Problema barbierului adormit
condvar (barber_available) //cand barber > 0
condvar (chair_occupied) //cand chair > 0
condvar (door_open) //cand open > 0
condvar (customer_left) //cand open = 0
proc (get_haircut ( )) { // apelat de clienti
do barber = 0 {wait (barber_available)}
barber := barber -1
chair := chair + 1
signal (chair_occupied)
do open = 0 {wait (door_open)}
open := open - 1
signal (customer_left) }
proc (get_next_customer ( )) { // apelat de barbier
barber := barber + 1
signal (barber_available)
do chair = 0 { wait (chair_occupied) }
chair := chair - 1 }
proc (finished_cut ( )) { // apelat de barbire
open := open + 1
signal (door_open)
do open > 0 {wait (customer_left)} } }
Bariere
Se refera de obicei la algoritmi software implementati utiliz^and blocaje, steaguri
si contoare. Exista si bariere hardware (linii AND) care reunesc mai multe re,
^n practica ind utile ^n cazul ^n care barierele sunt globale si foarte frecvente.
Di cultatea consta ^n suportarea unei submultimi arbitrare de procesoare (de
aceea nu sunt utilizate astazi ^n masinile comune bazate pe magistrala).
O bariera simpla centralizata. Un contor partajat mentine numarul de
procese care sosesc (se incrementeaza la sosire si se veri ca atingerea unui
numar numprocs):
struct bar_type {int counter; struct lock_type lock;
int flag = 0;} bar_name;
BARRIER (bar_name, p) {
LOCK(bar_name.lock)
if bar_name.counter = 0 //reset flag daca este primul sosit
then bar_name.flag:= 0

150
bar_name.counter:= bar_name.counter+1
mycount:= bar_name.counter //mycount este privat
UNLOCK(bar_name.lock)
if mycount = p then { //ultimul care ajunge
bar_name.counter:= 0 //reseteaza pt.urmatoarea bariera
bar_name.flag:= 1 } //elibereaza pe cei ce asteapta
else while(bar_name.flag=0){}}//ocupat-^n-a
steptare pt.eliber.
Apelul consecutiv al barierei nu este e cient. Trebuie prevenita intrarea ^n
bariera ^nainte ca celelalte procese sa paraseasca instanta anterioara. Se poate
utiliza un alt contor^nsa se creste latenta si competitia. O solutie este utilizarea
schimbarii sensului:
BARRIER (bar_name, p) {
local_sense:=!(local_sense); //schimbare sens, var. privata
LOCK(bar_name.lock);
bar_name.counter:= bar_name.counter+1
mycount:= bar_name.counter //mycount este privat
if bar_name.counter = p then{
UNLOCK(bar_name.lock)
bar_name.flag:=local_sense} //elibereaza pe cei ce asteapta
else {
UNLOCK(bar_name.lock)
while(bar_name.flag!=local_sense){};}}
Problemele cheie ^n barierele centralizate sunt latenta si tra cul.
2.5 Retea de interconectare
O retea este o colectie de comutatoare conectate prin canale de comunicare.
Un procesor sau un modul de memorie are unul sau mai multe porturi de co-
municare ce sunt conectate la aceste comutatoare prin canale de comunicare.
Sablonul intercomunicarii dintre comutatoare este numita topologia retelei.
Aceasta are o in uenta mare asupra performantei, costului si di cultatii de
construire a retelei.
Exista trei tipuri de retele: de arie larga (wide-area network, WAN; de
exemplu reteaua telefonica sau Internetul, Arapanet, World Wide Web), de arie
locala (local-area network, LAN; de exemplu Ethernet cu variantele FDDI
sau ATM) si de interconectare (la multiprocesoare cu memorie distribuita pre-
cum IBM SP-2, Cray T3D si T3E, Cosmic Cube, Intel iPSC, Paragon, iWarp,
Thinking Machines CM-1, CM-2 si CM-5, IBM SP-1 si SP-2, etc). Principala
diferenta ^ntre aceste clase este gradul de cuplare ^ntre procesoare, marimea
si frecventa mesajelor, performanta si cerintele de abilitate. Aceste diferente
se manifesta ^n termeni de topologii de retea, de protocoale de comunicare si
mecanisme de rutare si de control a uxului.
Retele de interconectare pot asemanate cu strazile (sau caile ferate).
O legatura este o strada, un comutator este o intersectie, distanta (hopuri)
este numarul de intersectii traversate, iar algoritmul de rutare este un plan de
calatorie (pentru oricine). Proprietatile sunt latenta, latimea de banda (latimea
de banda a legaturilor, suma legaturilor, bisectie).
151
2.58: O retea simpla
Figura

Organizarea spatiului de adresare al masinii paralele este independenta de


reteaua sa de interconectare. O retea de interconectare poate utilizata pentru
a implementa ambele abstractizari: memorie partajata sau privata. Majori-
tatea multiprocesoarelor cu memorie partajata incorporeaza un anumit tip de
retea de interconectare.
2.5.1 Mesaje
Pasul fundamental ^n calculul concurent este ^ntotdeauna trecerea de la unul la
doi. Astfel sa analizam cea mai simpla retea posibila, una care conecteaza doua
calculatoare A si B care trebuie sa schimbe un mesaj ce contine informatia care
doresc sa o schimbe. Reteaua cu doua componente (Figura 2.58) are canale si
tampoane. Canalele grupeaza re de date si control ce conecteaza calculatoarele
care realizeaza zic transferul mesajului. Tampoanele sunt cozi care tin mesaje
^n calculator. Atributul major al unui canal este latimea sa care este numarul
de biti pe care poate sa-i transmita ^ntr-un singur ciclu de ceas. Atributul
major al unui tampon este ad^ancimea sa care este numarul de mesaje care
poate sa-l contina fara depasire.
Mesajele contin bitii utili ai informatiei (o adresa de data sau o valoare
de data), desemnati drept ^ncarcarea platii (payload) sau corpul mesajului.
Pentru ca A sa obtina valoarea unei date de la B, trebuie ^n prealabil sa ex-
pedieze lui B un mesaj prin care cere data, contin^and adresa de memorie a
carei valoare se doreste a obtinuta. B raspunde apoi lui A cu un mesaj ce
contine data ceruta. Astfel avem nevoie de anumita informatie ^n mesaj alta
dec^at corpul mesajului pentru a distinge aceste doua tipuri de mesaje. Un sin-
gur bit este su cient ^n situatia curenta. Aceasta informatie este numita antet
de mesaj, si ^n mod uzual precede corpul mesajului ^n transmiterea mesaju-
lui. Satisfacerea cererii aplicatiei utilizator si raspunsul dispozitivelor zice
este sarcina software-ului de retea. Adaugarea si eliminarea informatiei din
antet este prima si cea mai evidenta sarcina. O alta sarcina importanta este
garantarea livrarii abile (sigure, de ^ncredere), care are doua aspecte: asigu-
rarea faptului ca mesajele nu sunt corupte si ca nu sunt pierdute ^n tranzit.
Problema coruperii mesajelor poate tratata prin anumite forme de coduri de
corectie a erorii (precum sumele de veri care), care vor urma corpul mesajului
^n forma unui marcaj de sf^arsit al mesajului (trailer). Problema pierderii
mesajelor poate tratata utiliz^and un mecanism de depasire a timpului limita
(time-out), implic^and existenta unui mecanism de con rmare (acknowledge)
a receptionarii cu succes a mesajelor de catre receptor. Aceasta expandeaza
tipul de mesaje de la doi la patru (antetul de mesaj de la unul la doi biti).
1 Rezumat: Mesajele sunt transmise ^ntre procesoare pe canale. Pot corupte sau pierdute.
Drumul de la sursa mesajului la destinatia sa este stabilit printr-un algoritm de rutare.

152
Cea mai simpla topologie de retea este magistrala care poate utilizata at^at
de masinile cu memorie locala c^at si cele cu module de memorie. In ecare pas
cel mult o data este scrisa pe magistrala. Aceasta data poate o cerere a unui
procesor pentru a citi sau scrie o valoare din si^n memorie sau poate raspunsul
de la un procesor sau un modul de memorie care detine data. In practica,
avantajele utilizarii magistralelor sunt urmatoarele: sunt usor de construit, este
relativ usor sa e dezvoltate protocoale care permit procesoarelor sa stocheze
local valori din memorie, deoarece toate procesoarele si modulele de memorie
pot observa tra cul pe magistrala. Dezavantajul utilizarii magistralei este acela
ca procesoarele trebuie sa-si astepte r^andul pentru a accesa magistrala. Deci,
timpul mediu pentru a efectua un acces la memorie creste proportional cu
numarul procesoarelor adaugate la o magistrala.
2.5.2 Criterii de clasi care a retelor de interconectare
Exista trei aspecte foarte importante legate de retelele de interconectare:
topologia (statica), rutarea (statica/dinamica), si controlul uxului (dinamic).
In designul retelelor de interconectare se iau ^n considerare si alti factori: ana-
liza performantei, abilitatea sau toleranta la esecuri (erori, pene, defecte,
fault), design VLSI, maparea algoritmilor pe arhitecturi.
Odata cu apropierea de limitele zice ^n ceea ce priveste viteza pro-
cesoarelor, designul masinilor a ^nceput sa se concentreze asupra cresterii
numarului de procesoare. Doi factori con ictuali limiteaza numarul de pro-
cesoare. In primul r^and performanta calculatorului bazat pe transmitere de
mesaje este determinata ^n parte de distanta pe care un mesaj trebuie sa o
parcurga de la un procesor dat la altul din masina. Aceasta sugereaza ca ar
necesar ca oricare procesor sa e conectat la oricare alt procesor direct. Intr-o
asemenea masina, un mesaj va calatori ^ntotdeauna direct de la procesorul ex-
peditor la procesorul receptor fara transfer prin procesoare intermediare. Odata
cu adaugarea a mai multe procesoare, o masina complet conectata va ^nt^alni
al doilea factor de limitare: numarul maxim de procesoare posibil este limitat
de numarul de conectari de procesoare ( re zice) cerute. O masina com-
plet conectata cu p procesoare necesita p 1 conectari per procesor, adica un
total de p(p 1)=2 re de conectare. De exemplu, ^n cazul p = 1024 sunt
necesare 523776 re bidirectionale si 1023 pini pentru interconectare pe placa
ecarui procesor. Astfel se utilizeaza ^n mod obisnuit retele de interconectare
necomplete; pentru a avea un numar mare de transferuri de date ^n acelasi
timp, trebuie totusi sa exista un numar mare de legaturi distincte. O topologie
xa corespunde unei retele statice cu legaturi punct-la-punct care conecteaza
nodurile. Legaturile de interconectare nu sunt comutate dinamic.
Intr-o strategie de control, principala problema este rutarea datelor de la
sursa la destinatie. Fiecare nod se presupune ca are un unic identi cator de
nod (adresa nodului, de exemplu adresa IP). In tehnica comutarii circuitului
este stabilit un traseu zic sau comutat ^ntre sursa si destinatie. In tehnica
comutarii pachetului, data este formatata ^n pachete, iar pachetele sunt rutate
2 Rezumat: Clasi carea retelelor de interconectare dintre procesoare se face pe baza topolo-
giei multitudinii canalelor de comunicare, capacitatea de transmitere simultana a mesajelor,
organizarea hardware.

153
fara a stabili un drum zic, adica sunt rutate de la un nod la altul utiliz^and un
drum care poate stabilit aprioric, sau determinat ^n timpul rutarii.
Metricele de performanta includ costul, numarul de porturi I/O, abilitatea,
latimea de banda, densitatea mesajelor, latenta, rutarea scurta si maparea
(transpunerea) algoritmilor paraleli.
Fiabilitatea si toleranta erorilor. Cu c^at reteaua este mai mare cu at^at
problemele pot mai mari si probabilitatea ca ceva sa nu mearga este mai mare.
Retelele mari au multe noduri si legaturi susceptibile sa esueze. Toleranta
la esecuri a retelei presupune redistribuirea ^ncarcarii lucrului. Metricele de
performanta includ drumuri disjuncte, diametru la esec, partitionabilitate.
Design VLSI. Se pune problema realizarii hardware a retelei. Metricele de
performanta includ: aria cipului, ^nt^arzierile ^n comunicare ( re inter-cipuri si
intra-cipuri), decalarea ceasului care poate tolerata. Constructia este limitata
de densitatea de re, iar viteza masinii este limitata de ^nt^arzierile datorate
relor. Cantitatea de re necesare si pini pentru I/O pentru legaturi trebuie
sa e minimizati.
Maparea algoritmilor pe arhitecturi. Se cauta reducerea suprasarcinii
(suplus paralel), o buna potrivire ind necesara ^ntre graful programului (algo-
ritm) si topologia retelei (arhitectura). Maparea se ocupa de partitionarea si
asignarea modulelor programului la resurse precum memorie si procesoare cu
obiectivul de a minimiza timpul total de executie. Exista mai multe abordari
variate. Metricele de performanta includ dilatarea, expansiunea, ^ncarcarea si
congestia legaturilor.
Notiunea de scalabilitate este importanta ^n caracterizarea calculatoarelor
paralele. Daca un calculator este astfel construit ^nc^at viteza sa creste cel
putin proportional cu numarul de procesoare si complexitatea ^n termeni de
numar de re de interconectare creste de asemenea ^n proportie cu numarul de
procesoare, spunem ca calculatorul este scalabil.
Retele statice. Sunt numite si retele directe. Nodurile sunt procesoare,
canalele sunt legaturi directe, punct-la-punct ^ntre procesoare. Sunt utilizate
pentru a implementa WANuri si masini cu memorie distribuita. Sabloanele
de interconectare la alte procesoare sunt docile la cresterea numarului de pro-
cesoare. Intr-o interconectare de tip inel, de exemplu, ecare procesor este
conectat numai la altele doua desi numarul de procesoare conectate ^n inel
poate arbitrar de mare; procesoarele diametric opuse ^ntr-un inel cu p proce-
soare trebuie sa paseze mesaje la aproximativ p=2 procesoare pentru a comu-
nica. Anumite multiprocesoare utilizeaza o schema de interconectare cunoscuta
drept hipercub: la p procesoare ecare are log p re de interconectare si unui
mesaj ^i este necesar nu mai mult de log p re de parcurs p^ana la destinatie;
dezavantajul hipercubului este cresterea numarului de re cu numarul de pro-
cesoare. Alte multiprocesoare conecteaza procesoarele ^n grila (plasa, mesh)
bidimensionala: la p = m procesoare, plasa are m linii si m coloane, numarul
2

de re de conectare la un procesor este maxim 4 (nu creste cu p), dar lungimea


drumului unui mesaj creste cu m, astfel ^nc^at drumul este mai lung dec^at ^ntr-
un hipercub. Int^arzierile sugerate de cai lungi pot diminuate prin tehnici de
rutare, precum cea a gaurii de vierme (un mesaj antet este expediat primul
si seteaza un comutator la ecare procesor de-a lungul drumului permit^and
corpului mesajului sa treaca fara ^nt^arziere).
154
Figura 2.59: Retea de comutatoare cu bare transversale (crossbar)
Retelele dinamice. Sunt numite si indirecte (sau multietape, multietaj),
nodurile ind conectate indirect printr-o retea de comutatoare. Nodurile sunt
procesoare, module de memorie sau elemente de comutare. Sunt adesea uti-
lizate pentru implementarea masinilor cu memorie partajata. De exemplu un
crossbar (retea de comutatoare cu bare transversale, Figura 2.59) are costul
proportional cu patratul numarului de procesoare, performanta proportionala
cu numarul de procesoare si nu permite blocarea (^n opozitie fata de o magis-
trala care are costul proportional cu numarul de procesoare si performanta
aproape constanta). Intr-adevar, presupun^and ca avem un model EREW
PRAM cu p procesoare si o memorie globala de m cuvinte, avem nevoie de
o retea de interconectare cu O(mp) comutatoare, ceea ce este foarte costisitor
de realizat. Forma de EREW PRAM poate slabita daca memoria globala este
organizata ^n blocuri; daca avem b blocuri, complexitatea retelei de comuta-
toare este O(bp). Daca b este aproximativ egal cu p, nu putem utiliza crossbar
pentru a implementa un sistem mare deoarece numarul comutatoarelor va
O(p ). Astfel crossbar este scalabil ^n performanta, dar nu si ^n cost.
2

Retelele multietape conecteaza p procesoare la p module de memorie prin


O(p log p) comutatoare: O(log p) etape de O(p) comutatoare ecare (retele cu
blocare). Exista numeroase asemenea retele: Omega (retea cu amestecare
perfecta), uture, Benes, cub generalizat, etc. Retelele indirecte multietape
^ncearca sa atinga scalabilitatea at^at^n termenii costului c^at si al performantei.
2.5.3 Topologia retelei
Topologia poate stea (pentru telefoane de exemplu conectarile se ^ndreapta
spre un comutator partajat), magistrala (mediu de difuzare), inel ( ecare statie
participa si vede ecare mesaj), hub/arbore (aparent o topologie stea ^nsa este
3 Rezumat: Modalit atile de interconectare a procesoarelor sunt numeroase. Inter-
conectarea ideala este cea care leaga ecare procesor de toate celelalte { zic o asemenea
retea este di cil de construit si se apeleaza la variante cu interconectare partiala ale caror
caracteristici sunt diferite.

155
Figura 2.60: Retea de interconecate multietape

Figura 2.61: Topologii simple: grila, hipercub, arbore gras, omega, uture
o magistrala sau un inel prabusit ^ntr-o unitate centrala), si multe alte tipuri
(Figura 2.61).
Topologia retelei este descrisa printr-un graf G = (N; C ) unde N este
multimea de noduri (v^arfuri, elemente de procesare, unitati functionale), iar
C este multimea de canale (muchii, arce, legaturi de comunicare, magistrale,
etc). O tranzactie pe retea este un drum ^n G. O retea bidirectionala este
modelat printr-un graf neorientat. O retea unidirectionala este modelata de un
graf orientat. Majoritatea retelelor sunt bidirectionale.
O autociclare este o muchie (u; v) pentru care u = v. Muchiile paralele
sunt identi cate prin aceleasi v^arfuri la capat dar si de o alta caracteristica
care le distinge. Un graf simplu este un graf care nu contine autociclari sau
muchii paralele (precum arborii grasi). Un graf multiplu este un graf cu muchii
paralele dar fara autociclari. Intr-un graf complet ecare pereche de v^arfuri
distincte de neste o muchie. Un graf complet cu n v^arfuri este notat Kn.
Intr-un graf regulat, ecare v^arf din graf are acelasi grad (numarul de muchii
la care este capat). Un graf k-regulat este un graf ^n care ecare v^arf are
gradul k. Graful este simetric c^and topologia arata la fel din ecare nod.
Regularitatea faciliteaza algoritmii de rutare, dezvoltarea tolerantei la esecuri,
modularitatea etc. Simetria permite ecarui nod sa aiba acelasi algoritm de
rutare. Simetria implica regularitate, dar reciproca nu este neaparat necesara.
Majoritatea retelelor statice sunt simetrice.
156
Metrici ale retelei
Criteriile de evaluare ale retelelor de interconectare directe (statice) sunt costul,
diametrul si latimea de banda.
Pentru evaluarea costului se pot utiliza diferite criterii; cel mai comun este
numarul de legaturi cerute de retea. Numarul de legaturi este o masura pentru
rele si spatiul necesar pentru a conecta reteaua. Retelele cu numar mai mic
de legaturi sunt preferate din punct de vedere al costului.
Doua noduri care nu sunt direct conectate trebuie sa comunice via alte
noduri. Lungimea sau distanta drumului de comunicare ^ntre doua noduri este
numarul de muchii a celui mai scurt drum. Distanta medie este o masura
des utilizata. Diametrul unei retele este de nit ca ind maximul lungimilor
(distantei) celor mai scurte drumuri ^ntre toate perechile de noduri posibile,
adica numarul maxim de legaturi care trebuie traversate pentru a transmite
un mesaj ^ntre oricare doua noduri pe calea cea mai scurta. Astfel diametrul
este cea mai joasa margine asupra ^nt^arzierii ^n comunicare ^ntre oricare doua
noduri (afecteaza timpul de comunicare). Se prefera diametrele mai scazute
ceea ce presupune un grad de nod mai mare, conduc^and la un cost mai ridicat.
Formal, diametrul D(G) a unei topologii de retea G = (N; C ) este lungimea
celui mai scurt drum ^ntre oricare pereche de noduri, adica
D(G) = i;jmax
2N
d(i; j ) unde d(i; j ) = pmin
= i!j
jpj:
O masura a latentei medii ^n reteaua de interconectare este distanta pe care
trebuie s-o parcurga un mesaj mediu (^n termeni de hopuri). La orice moment
de timp potPexista mai multe mesaje^n sistem. Distanta medie inter-nodala este
de nita ca dj jp(j ), unde d este diametrul si p(j ) este proportia de mesaje
care trebuie sa calatoreasca pe o distanta de j ; depinde de sablonul tra cului
=0

actual generat de aplicatiile care ruleaza pe retea si pentru a estimat aprioric
se presupune o distributie uniforma a tra cului.
O retea este partitionabila daca poate divizata ^n subretele disjuncte cu
aceleasi proprietati topologice precum reteaua originala. Aceasta este dezirabil
datorita mai multor ratiuni: executia paralela a sarcinilor, detectia esecurilor
(mai multe partitii pot rula acelasi program si compara rezultatele), utilizatori
multiplii simultan si dezvoltarea programului (^n loc de depanarea programului
pe un numar mare de noduri), e cienta prin alocare optimala.
Conectivitatea este o masura a multiplicitatii drumurilor ^ntre oricare doua
procesoare din retea. Conectivitatea unui graf este de nita ca ind numarul
minim de drumuri disjuncte ^ntre doua v^arfuri. Un graf k-conectat este un
graf ^n care exista k drumuri distincte ^ntre oricare doua v^arfuri. Conectivi-
tatea arcelor sau a retelei este numarul minim de arce care trebuie eliminat din
graful retelei pentru a o rupe ^n doua sau mai multe retele deconectate, dis-
juncte. Conectivitatea masoara exibilitatea retelei, abilitatea sa de a continua
operatia ^n ciuda componentelor dezafectate (continuare la capacitate redusa).
Retelele cu conectivitatea mai mare sunt mai bune.
Latimea bisectiei este numarul minim de legaturi care trebuie eliminate
pentru a rupe reteaua ^n doua jumatati egale. Latimea de banda a unui canal
este rata de comunicare maxima ^ntre doua capete ale unei legaturi. Latimea
de banda a bisectiei este volumul maxim de comunicare permis ^ntre doua

157
Figura 2.62: Ingustimea retelei
jumatati ale retelei. Latimea de banda a bisectiei determina latimea de banda
a comunicarii pentru mutarea datelor de-a lungul unei retele. Retelele cu o
latime de banda a bisectiei mai mare sunt mai bune. Latimea de banda a
bisectiei este latimea bisectiei multiplicata cu rata de transfer a datelor pe
ecare legatura. Fie G = (N; C ) o topologie de retea, si e P jQ o partitie a lui
N cu jP j  jQj  jN j=2. Formal, latimea bisectiei B (G) a lui G este numarul
minim de muchii, peste toate posibilitatile de alegere a lui P si Q, cu un capat
^n P si cu altul ^n Q. Astfel,
B (G) = min jf(u; v) 2 C : u 2 P ; v 2 Qg:
= N P jQ
Algoritmi variati au fost construiti pentru a rula e cient pe topologii de
retea particulare precum grila sau hipercubul. Desi aceasta abordare conduce
la algoritmi foarte buni pentru retele particulare, dezavantajul abordarii este
acela ca algoritmii sunt complicati si cu scop special. Pentru a depasi aceasta
problema dar a re ecta totusi parametrii retelei este posibila descrierea unei
retele numai ^n termenii a doua proprietati: latimea de banda si latenta.
Latenta unei retele este timpul necesar unui mesaj ca sa traverseze reteaua;
^n retelele actuale acest timp depinde de topologia retelei care poarta mesajul si
congestia mesajelor pe retea. Latenta poate utila ^n modelarea celui mai prost
caz pentru timpul de rulare presupun^and ca reteaua nu este tare congestionata.
Latimea de banda a ecarui portal al retelei indica c^at de rapid poate in-
jecta un procesor date pe retea; ^n retelele actuale depinde de topologia retelei,
de largimea canalelor de comunicare si din nou de congestia mesajelor^n retea.
Aceasta masura poate utilizata ca rata maxima la care procesoarele pot
injecta date fara a cauza congestionarea retelei, presupun^and o distributie uni-
forma a destinatiilor mesajelor.
Ingustimea retelei masoara congestia ^ntr-o retea. Se partitioneaza reteaua
precum ^n Figura 2.62 ^n doua grupuri A si B, contin^and NA si NB noduri,
cu NB  NA. Fie I numarul de conectari ^ntre nodurile din A si din B.
Ingustimea retelei este valoarea maxima a lui NB =I pentru toate partitionarile
retelei. Daca ^ngustimea este mare (NB > I ), atunci c^and nodurile din grupul
B doresc sa comunice cu nodurile din grupul A, congestia ^n retea va mare.
Flexibilitatea ^n expandare este masurata prin numarul minim de noduri
care sunt necesare a adaugate pentru a creste marimea retelei (un inel poate
expandat prin adaugarea unui nod la un moment dat, hipercubul necesita
o dublare ^n marime, iar grila bidimensionala poate expandata adaug^and o
linie si o coloana). Incrementul de expandare al retelei este numarul minim de
noduri cu care reteaua poate expandata. O retea trebuie sa e expandabila
158
Tabelul 2.23: Metrice pentru retele CC p procesoare si inel
Retea CC Inel simplu Inel cordal
Conectivitatea retelei p 1 2 3
Diametrul retelei 1 bp=2c bp=4c
Ingustimea retelei 1/(p bp=2c) p=4 p=(p + 4)
Latimea bisectiei p =2
2
2 2+p=2
Incrementul de expansiune 1 1 2
Muchii per nod p 1 2 3

Figura 2.63: (a) Retea complet conectata (CC); (b) Stea


pentru a crea sisteme paralele mai mari si mai puternice prin adaugarea simpla
a mai multe noduri la retea. Din motive de cost este preferata o retea care
necesita un increment mic.
Retele statice
Retele complet conectate (CC). Fiecare nod este conectat la ecare alt
nod. Aceasta este cea mai generala si puternica retea de interconectare, dar
poate implementata numai pentru un numar mic de noduri. Metricile retelei
sunt prezentate ^n Tabelul 2.23. Graful asociat este complet (Figura 2.63.a):
jC j = p(p 1)=2 pentru p noduri cu o conectivitate a arcelor de p 1.
Stea. Graful asociat cu o retea tip stea cu p procesoare (Figura 2.63.b) are
jC j = (p 1), diametrul este 2, conectivitatea arcelor este 1 si latimea bisectiei
este (p 1)=2.
Structura liniara. Este caracterizata (Figura 2.64.a) de un graf G = (N; C )
cu N = f0; 1; 2; :::; p 1g; C = f(i; i + 1)j0  i < p 1g, cu jC j = (p 1),
diametrul p 1, numarul de legaturi p 1, latimea bisectiei 1 si conectivitatea
arcelor 1.
Inel. Este caracterizat (Figure 2.64.b) printr-un graf (N; C ) : N =
f0; 1; 2; :::; p 1g; C = f(i; (i + 1)mod p)j0  i < pg; numarul de legaturi ind
p, diametrul bp=2c, latimea bisectiei de 2 si conectivitatea arcelor de 2. Metri-
cile caracteristice sunt prezentate ^n Tabelul 2.23. Fiecare nod este conectat
cu nodurile i 1mod p si i + 1mod p. Este o retea simetrica planara cu grad
x 2. De exemplu CDC Cyberplus sau KSR utilizeaza o asemenea retea de
interconectare. O retea inel simpla este o grila (plasa) unidimensionala peri-
odica. Costul este proportional cu numarul de procesoare, dar are o latime
de banda a bisectiei scazuta, latenta proportionala cu numarul de procesoare,
o partitionare slaba si toleranta foarte slaba la esecuri (problema principala a
unui inel simplu este diametrul mare). Un inel cordal (Figura 2.65) utilizeaza
159
Figura 2.64: (a) Structura liniara; (b) Inel; (c) Grila (plasa); (d) Tor; (e)
Grila (latice, plasa) 3-dimensionala; (f) Arbore binar pentru conectarea proce-
soarelor; (g) Arbore binar de comutatoare

Figura 2.65: Inele cu 6 noduri: (a) Simplu; (b) Cordal cu leaturi diametrice
legaturi cordale suplimentare pentru a reduce diametrul (de obicei legaturi pe
diametru). Intr-un graf de putere, ecare nod este conectat la un anumit numar
de vecini ^n formatie inel.
Grila. O grila bidimensionala (plasa, matrice, mesh) este o retea care se poate
^ntinde ^ntr-o maniera dreptunghiulara (Figura 2.64.c). Fiecare comutator
dintr-o grila are o eticheta distincta (x; y) unde 0  x  X 1 si 0  y  Y 1.
Valorile X si Y determina lungimile grilei. Numarul de comutatoare^ntr-o grila
este XY . Fiecare comutator except^and cele de pe marginea grilei este conectat
la patru vecini, unul la nord, altul la sud, altul la est si altul la vest. Astfel
un comutator etichetat (x; y), unde 0 < x < X si 0 < y < Y este conectat la
comutatoarele (x; y +1); (x; y 1); (x +1; y) si (x 1; y) (Figura 2.66.c). Aceasta
retea apare ^n mod tipic ^n masina cu memorie locala, adica la ecare comu-
tator este conectat un procesor cu memoria sa locala si accesul la memoria la
distanta este realizat prin rutarea mesajelor prin grila. O grila bidimensionala
este utilizata la Intel Paragon.
O grila d-dimensionala (Figura 2.64.e) este produsul cartezian a d structuri
liniare cu p =d noduri ecare. Astfel jC j  dp, diametrul este dp =d, conec-
1 1

tivitatea arcelor este d si latimea bisectiei de 2p =d . Nodurile sunt asezate


(1 1 )

^ntr-o latice q-dimensionala si comunicarile sunt permise numai ^ntre noduri
vecine. Metricile caracteristice sunt prezentate ^n Tabelul 2.24.
Tor (plasa toroidala sau grila periodica). Intr-o structura de tip tor
bidimensional (de exemplu la DAP, Paragon XP/S, Cray T3D) ecare procesor
are 4 vecini (Figura 2.64.d). Un tor este o grila ^n care comutatoarele de la
margini au fost conectate cu comutatoarele de la marginile opuse (Tabelul
2.25). In cazul bidimensional ecare comutator (x; y) este conectat la patru
alte comutatoare: (x; y + 1mod Y ); (x; y 1mod Y ); (x + 1mod X; y), si (x
160
Figura2.66: Numerotarea procesoarelor: (a) Structura liniara; (b) Inel; (c) Tor;
(d) Arbore binar de comutatoare; (e) Arbore binar de procesoare
Tabelul 2.24: Metrice pentru laticea q-dimensionala neperiodica cu kq noduri
si hipercubul cu 2k noduri
Latice cu kq noduri Hipercub cu 2k noduri
Conectivitatea retelei q k
Diametrul retelei q(k 1) k
Ingustimea retelei k=2 1
Latimea bisectiei kq 1
2k 1

Incrementul expansiunii k q 1
2k
Muchii per nod 2q k

Tabelul 2.25: Diferente ^ntre grila si torul bidimensionale


Grila pp hopuri jumTor
Latenta dist.medie 2 atate
Latimea de banda a bisectiei pp dubla
Toleranta la esecuri slaba putin ^mbunatatita
Partitionare usoara grea
Constructie usoara tot usoara
1mod X; y). Torul este regulat, dar nu este planar. Un tor bidimensional
(Figura 2.66.c) este de nit
p de graful p(N; G) : N = f(i; j )j0  i;pj < ppg; G =
f((i; j ); (i; (j +1)mod p))j0  i;pj < pg[f((i; j )p; ((i +1)mod p; j )j0  i; jp<
p pg: Numarul de legaturi este 2 p, diametrul 2b p=2c, latimea bisectiei 2 p
si conectivitatea arcelor 4.
Arbore. Un arbore binar (Figura 2.66.d) este caracterizat de un graf (N; G) :
N = fij0  i < pg; unde p = 2d 1, G = f(i; 2i+1)j0  i; j < 2d 1g[f(i; 2i+1

2)j0  i; j < 2d 1g; numarul de legaturi ind p 1, diametrul 2 log((p+1)=2);


1

latimea bisectiei de 1 si conectivitatea arcelor de 1. Costul este proportional cu


numarul de procesoare, latenta cu log p. Procesoarele sunt frunzele arborelui^n
cazul unei retele de comutatoare, dar pot si noduri interne (Figura 2.64.e,f).
Un arbore de comutatoare (de exemplu H-arbore) poate usor reprezentat^ntr-
un plan (Figura 2.67.b). Rutarea se face ^n sus si jos pe structura de arbore.
161
Figura 2.67: Arbori: (a) Reprezentarea clasica a unui arbore gras; (b) H-arbore
(binar, de comutatoare); (c) Reprezentare similara pentru arbore gras de co-
mutatoate; (d) Numerotarea comutatoarelor
Este permisa o partitionare buna ^n subarbori. Radacina ^nsa poate produce
g^atuire. Pentru a evita acest lucru sunt utilizati adesea arborii grasi (Figure
2.67.a; utilizat^n CM-5), ^n care canalele devin mai late odata cu apropierea de
radacina. Un arbore gras este ^n principiu o structura de arbore ^n care ecare
muchie a arborelui poate reprezenta mai multe canale de comunicare, si ecare
nod poate reprezenta mai multe comutatoare de retea (de unde denumirea
de gras). In mod tipic capacitatile muchiilor mai apropiate de radacina sunt
mult mai mari dec^at cele ale frunzelor. In cazul dublarii legaturilor la ecare
nod ^nspreddrlog
adaicinae , precum ^n gurile considerate, numarul de legaturi este
w(i; j ) = 2 ( +2) 1
. O modalitate de constructie a unei masini cu memorie
locala este conectarea procesoarelor^mpreuna cu memoriile lor locale la ecare
frunza a arborelui gras. CM-5 si CS-2 folosesc asemenea arbori grasi.
Un hiperarbore mentine diametrul scazut al arborilor binari, ^nsa creste
latimea bisectiei. Un k-hiperarbore de ^naltime h este o compunere a unui k-
arbore complet si un arbore binar inversat (cu radacina ^n jos) de ^naltime h.
Un 4-hiperarbore de ad^ancime h are 4h frunze, 2h(2h 1) noduri, diametru
+1

2h, latimea bisectiei 2h . +1

O piramida de marime k este un 4-arbore de ^naltime log k cu legaturi


2

aditionale astfel ^nc^at procesoarele de la ecare nivel formeaza o grila bidimen-


sionala. Numarul total de noduri este (4k 1)=3. Fiecare procesor intern are
2

cel mult 9 vecini. Diametrul este 2 log k si latimea bisectiei este 2k.
Hipercub. Poate vazut ca o grila multidimensionala cu 2 procesoare per
dimensiune (Figura 2.68). Este de asemenea numit d-cub binar daca numarul
de noduri este p = 2d (sau k-cub 2-ar). Are o buna latime de banda a bisectiei,
gradul unui nod este O(log p), necesita (p log p)=2 legaturi, diametrul este de
log p; latimea bisectiei este p=2; iar conectivitatea arcelor de log p: Structura de
hipercub este populara printre primele calculatoare cu transmitere de mesaje
(de exemplu Intel iPSC, nCube). Este regulat si simetric.
Fie B si B doua siruri binare de d-biti. Distanta Hamming a lui B si B ,
H (B ; B ), este numarul de pozitii binare ^n care bitii corespunzatori difera,
1 2 1 2

adica H (B ; B )=Nr de Unu(B  B ) (formal este egal cu numarul de unu


1 2

din B  B , sau-ul exclusiv ^ntre B si B ). De exemplu, pentru 011 si 101,
1 2 1 2

distanta Hamming este 2.


1 2 1 2

Hipercubul are proprietatea ca doua noduri care sunt conectate au distanta
162
Figura 2.68: Hipercuburi: (a) 1-dimensional; (b) 2-dimensional; (c) 3-
dimensional; (d) 4-dimensional; (e) 5-dimensional; (f) 6-dimensional transpus
^n plan

Figura 2.69: Construirea recursiva a unui hipercub

Figura 2.70: Trei partitionari distincte ale unui hipercub 3-dimensional ^n doua
hipercuburi 2-dimensionale
Hamming a reprezentarii identi catorilor nodurilor egala cu 1. Un hipercub
binar Hd este un graf neorientat cu p = 2d v^afuri, ecare reprezentat printr-
un numar binar distinct de d-biti. Fie Bi reprezentarea binara a nodului i a
hipercubului. Un hipercub d-dimensional este caracterizat de graful (N; C ) :
N = fij0  i < pg; p = 2d , C = f(i; j )j0  i; j < p and H (Bi ; Bj ) = 1g (doua
noduri sunt conectate printr-o muchie daca distanta Hamming este 1).
Constructia unui hipercub d +1 dimensional se face prin combinarea a doua
structuri de hipercub d dimensionale (Figura 2.69). Daca alegem orice pozitie
binara putem partitiona hipercubul d dimensional ^n doua hipercuburi (d 1)-
dimensionale (Figura 2.70). Deoarece sunt d biti, exista d asemenea partitii.
Mai mult, x^and oricare k biti din cei d posibili, procesoarele care difera ^n cele
(d k) pozitii ramase formeaza un subcub (d k)-dimensional. Deoarece cei
k biti pot xati ^n 2k moduri diferite, exista 2k asemenea subcuburi.
Intr-un hipercub d-dimensional, ecare procesor este conectat direct la alte
d procesoare. Deoarece reprezentarea binara B B poate contine cel mult d de
1, cea mai scurta cale^ntre oricare doua procesoare din hipercub nu poate avea
1 2

163
Figura 2.71: O retea CCC (3)

mai mult de d legaturi. Numarul total de pozitii binare ^n care difera adresele
expeditorului unui mesaj si receptorului de mesaj (distanta Hamming) indica
numarul de legaturi de comunicare care trebuie traversate pe drumul cel mai
scurt ^ntre doua procesoare.
Cub cu conectari ciclice. In cazul unei dimensiuni d este un hipercub Hd
^n care ecare nod a fost ^nlocuit cu un inel de d noduri (notat CCC d ; Figura
( )

2.71). Are n2n noduri si 3d2d muchii, latenta (numarul de hopuri) este
1

5d=2 1, diametrul retelei este 2d, latimea bisectiei este 2d , si numarul de
1

muchii per nod de 3. Avantajul fata de un hipercub este acela ca numarul de
muchii per nod este constant. Dezavantajul este un diametru0 0dublu si o latime
de banda mai scazuta. Exista o muchie ^ntre (w; i) si (w ; i ) daca si numai
daca w = w0 si i i0 = 0mod d sau i = i0, si w si w0 difera ^n exact al i-lea bit.
d-cub k-ar. At^at hipercuburile c^at si grilele bidimensionale apartin unei clase
mai generale de retele d-cub k-ar. O asemenea structura cu dimensiunea d si
raza k (numarul de procesoare de-a lungul unei dimensiuni) are p = kd noduri,
organizate ^ntr-o grila cu k noduri ^n ecare dimensiune.
Un d cub k-ar este o generalizare a unui hipercub, av^and k noduri ^n ecare
dimensiune (hipercubul Hd este un caz special cu k = 2). Un inel cu p proce-
soare este un caz particular pentru care d = 1 si k = p. O grila bidimensionala
cu p procesoare este de asemenea un caz particular pentru d = 2 si d = pp.
Grilele d-dimensionale si retelele Omega se ^ncadreaza ^n aceasta clasa. CCC
nu este o asemenea structura.
Un d-cub k-ar poate construit recursiv din k (d 1)-cuburi k-are prin
conectarea procesoarelor care ocupa pozitii identice ^n cuburi ^n inele. Struc-
tura retelei poate de nita prin inductie dupa d, dupa cum urmeaza. Un 1-cub
k-ar este un inel cu k procesoare. Fie T = (N ; C ) p^ana la Tk = (Nk ; Ck )
d-cuburi k-are. Atunci T = (N; C ) este un (d + 1)-cub k-ar, unde N = f(i; j ) :
1 1 1

j 2 Ni g si C = f((i; u); (i; v)) : (u; v) 2 Ci g [ f((i; j ); ((i + 1)mod k; j )) : 0 


i < k; j 2 Ni g.
Numarul de muchii este jC j = dkd, diametrul dbk=2c, conectivitatea arcelor
2d si latimea bisectiei 2kd , gradul unui nod este 2d, reteaua este regulata.
1

Daca k > 2 reduce numarul de canale ale bisectiei (fata de cazul hipercubului),
astfel permit^and canale mai late (dar mai multe hopuri). Nodurile periferice
pot inteconectate ca la tor (structura este numita conectata-^n-tor).
Pentru o latime de banda a bisectiei xata, d-cuburile k-are de dimensiune
mai scazuta sunt mai bune, adica mai putine re groase scurte sunt mai bune
dec^at multe re lungi si subtiri.
164
Figura 2.72: Element de comutare: (a) Stare trece-prin; (b) Stare cruce; (c)
Con gurarea comutatoarelor

Figura 2.73: Element de comutare cu 4-linii


Retele de interconectare multietapa
Punctele extreme ale retelelor dinamice sunt crossbar si magistrala. In primul
caz sunt suportate simultan O(p) accesuri la memorie (o asemenea retea este
numita fara blocare). Costul unei magistrale este O(p), dar performanta este
esential O(1). Nici una dintre aceste extreme nu este preferabila: crossbar costa
prea mult si perfomanta magistralei este prea saraca. Retelele de interconectare
multietape (MIN, multietaj) construiesc un pod ^ntre pret si performanta.
O retea multietape este utilizata pentru a conecta o multime de comutatoate
numite comutatoare de intrare la o alta multime numita a comutatoarelor de
iesire printr-o secventa de etape de comutatoare. Etapele sunt numerotate de
la 1 la L, unde L este ad^ancimea retelei. Comutatoarele de intrare formeaza
etapa 1 si cele de iesire, etapa L. In majoritatea retelelor de interconectare,
este posibila expedierea unui mesaj de la orice comutator de intrare la orice
comutator de iesire de-a lungul unui drum care traverseaza etapele retelei ^n
ordinea de la 1 la L.
Retelele multietape sunt frecvent utilizate ^n calculatoarele cu memorie
modulara; ^n mod tipic procesoarele sunt atasate la comutatoarele de intrare,
si modulele de memorie la comutatoarele de iesire.
Un element de comutare poate (Figura 2.72)^n starea trece-prin (mentine
valorile bit), sau ^n starea cruce (complementeaza valoarea bitului). In
IBM SP-1 este de exemplu utilizata o retea de comutatoare. O k -linie de co-
mutatoare (Figura 2.73) este un crossbar de k linii de intrare si k de iesire.
Un MIN logaritmic conecteaza p procesoare la p blocuri de memorie uti-
liz^and O(p log p) comutatoare organizate^n O(log p) etape de O(p) comutatoare
ecare. Totusi ele nu ofera simultan drumuri^ntre ecare pereche procesor-bloc
de memorie, si de aceea sunt retele cu blocare. Liniile ^ntre doua etape adi-
acente sunt conectate printr-o functie de permutare. Modulele de memorie
sunt conectate la iesirile etapei log p utiliz^and permutarea identitate. Cos-
tul este O(p log p); latenta de O(log p); debitul de O(p). Exista multe vari-
165
Figura 2.74: Un truc de amestecare
ante: Omega, uture, Benes, etc si sunt utilizate ^n multe masini precum
BBN Butterfly, IBM SP3, etc.
Retele cu schimb-amestecare. Originea denumirii este urmatoarea. Se
considera un pachet de 8 carti numerotate 0, 1, 2, . .. , 7. Pachetul este^mpartit
^n doua jumatati si sunt amestecate perfect, ajung^andu-se la ordinea 0, 4,
1, 5, 2, 6, 3, 7. Pozitia nala a cartii i poate gasita urmarind legatura
de amestecare a nodului i din reteaua cu schimb-amestecare. Daca Bi este
reprezentarea binara a lui i, o permutare de amestecare perfecta (sau intercalare
perfecta) roteste cu o pozitie Bi:

perm(i) = 22ii + 1 p dac daca 0  i  p=2 1
a p=2  i  p 1
Fie ak ak : : : a a adresa unui nod ^n reteaua cu schimb-amestec ^n binar.
O data a acestui nod va la nodul de adresa ak : : : a a ak dupa o operatie
1 2 1 0

de amestecare. Aceasta corespunde la o deplasare ciclica la st^anga ^n adresa


2 1 0 1

binara. Dupa k operatii de amestecare ne ^ntoarcem ^napoi la nodul de la care


am pornit si nodurile prin carer trec constituie un asa-numit sirag.
Dat ind un pachet de 2 carti, si u; v doua carti, 0  u; v  2r 1,
presupunem ca prin mutarea de amestecare se muta cartea u la pozitia v.
Amestecarea perfecta este intercalarea jumatatii superioare si jumatatii infe-
rioare ale pachetului unul dupa altul. In amestecarea out a i-a carte este ^n
jumatatea de jos ^ntre a i-a si a (i + 1) carte din jumatatea de sus. In ameste-
carea in, rolurile celor doua jumatati se schimba (Figura 2.74). Actiunea unei
amestecari out este: u : : : ur ! u : : : ur u : Actiunearunui amestecari in este:
u : : : ur ! u : : : ur u : Muchiile de amestecare^n SE sunt directionale astfel
1 2 1
( )

^nc^at corespund la deplasarile ciclice la st^anga.


1 2 1

O retea cu schimb-amestecare consista din n = 2r noduri numerotate


0; 1; : : : ; n 1. Reteaua r-dimensionala cu schimb-amestecare este notata SE r .( )

Exista doua tipuri de conectare, numite amestecare si schimb. Nodurile sunt
etichetate unic prin numere de r-biti. Conectarile de tip schimb conecteaza
perechi de noduri a caror numar difera ^n cel mai putin semni cativ bit.
Conectarile prin amestecare perfecta (Figura 2.75) leaga nodul i cu nodul
2i mod(n 1) cu exceptia nodul n 1 care este conectat la sine ^nsusi. In
Figura 2.76 este prezentata o retea cu 8-noduri cu schimb-amestecare, ^n care
legaturile de amestecare sunt indicate prin linii solide, si legaturile de schimb
cu linii punctate. Doua noduri u si v sunt adiacente daca si numai daca e
u  v = 0r 1 sau v este o deplasare ciclica a lui u. Muchiile corespunzatoare la
1

deplasarile ciclice sunt numite muchii de amestecare, iar celelalte sunt numite
166
Figura 2.75: O amestecare perfecta: (a) 8 elemente; (b) 16 elemente

Figura 2.76: Retea cu 8-noduri cu schimb-amestecare ^n doua reprezentari


muchii de schimb. SE r are 3 r 2r muchii daca r este par si 3  2r 1
( ) 1 1

muchii altfel. Diametrul lui SE este 2r 1. Un drum de la u = u    ur la


( )

v = v : : : vr este: u    ur ! u : : : ur v ! u    ur v v ! u    ur v v
1

!    ! ur v    vr ! v    vr ur ! v    vr : Marginea inferioara este


1 1 1 1 1 2 1 1 2 2 1 1 2
1 1 1 1 1 1
atinsa c^and u = 0r si v = 1r . Latimea de banda a lui SE r este O(2r =r).
( )

Grafuri DeBruijn. Se pune problema gasirii unei secvente binara de 2r -biti


a carui subsiruri de lungime r ^n numar de 2r (umplute golurile prin deplasare
ciclica) sunt distincte ^n perechi (legat de un alt truc cu cartile). O asemenea
secventa poate gasita prin concatenarea ultimul bit numelui nodurilor unui
ciclu Euler din graful de Brujin (r 1)-dimensional (cu 2r noduri). Retele 1

DeBruijn sunt probabil cele mai proeminente ^ntre retelele de grad xat dupa
inele sau grile, deoarece au cerinte de grad mai mic dec^at hipercuburile de
aceeasi marime si diametru. Grafurile sunt aproape regulate (exact 2 noduri au
gradul 3, toate celelate noduri au gradul 4). Diametrul este r, adica logaritmic
^n numarul de noduri.
Un graf de Bruijn r-dimensional consista din 2r noduri si 2r muchii di- +1

recte. Exista o muchie directa de la ecare u r: : : ur la u : : : ur 0 si la u : : :rur 1.


Diametrul si latimea de banda a unui DB sunt O(r), respectiv O(2 =r).
1 2 2
( )

Fiecare muchie este bidirectionala. DB r poate construit din SE r prin


( ) ( +1)

colapsul ecarei perechi de noduri cu aceiasi r biti conducatori (Figura 2.77.b).


167
Figura 2.77: Graf de Bruijn graph: (a) 8-dimensional; (b) Constructia dintr-un
graf schimb-amestecare

Figura 2.78: Retea Omega pentru: (a) p = 8; (b) p = 16


Omega. O asemenea retea este des utilizata pentru interconectare si con-
sista din log p etape. Fiecare etapa consista dintr-un sablon de interconectare
a amestecarii perfecte (rotire la st^anga). Fiecare etapa consista din p=2 co-
mutatoate care au doua moduri: trecere-prin si cruce. Conectarea unei surse
s la o destinatie d este simpla, la ecare moment parcurg^andu-se o etapa:
daca bitul cel mai semni cativ este acelasi, se utilizeaza modul trece-prin, al-
tfel modul cruce. Dupa parasirea unei etape, cel mai semni cativ bit este
sters. Complexitatea comutatoarelor este O(p log p). O retea Omega poate
utilizata pentru interconectarea procesoarelor la memorii pe baza a log p + 2
etape: etapa 0 la se refera la cele p noduri procesor, etapele 1 la log p se re-
fera la comutatoare, iar etapa nala la p banci de memorie. Comutatoarele
sunt 2  2 cu intrarile In[0..1] si iesirile Out[0..1]. Un comutator poate
con gurat e ^n modul trece prin (Out[0] = In[0], Out[1] = In[1]) e
^n modul cruce (Out[0] = In[1], Out[1] = In[0]). Elementul de comutare
(Figura 2.78) la ecare etapa actioneaza pe cel mai putin semni cativ bit al
liniilor de intrare ale etapei. Comutatorul la etapa i actioneaza asupra al i-lea
cel mai semni cativ bit al liniilor de intrare ale retelei. Este usor de observat
ca reteaua Omega este o retea cu blocare. Un sablon de comunicare ^n care
ecare procesor adreseaza un modul diferit de memorie va cauza blocarea.
168
Figura 2.79: (a) Retea uture pentru r = 3; (b) Fluture si hipercub

Figura 2.80: Fluture: (a) Obisnuit; (b) Toroidal


Fluture. Este apropiat de reteaua Omega (izomorf), hipercub (izomorf) si
reteaua cu schimb-amestecare. Numarul de noduri este p = (r + 1)2r divizate
^n r +1 linii (sau ranguri) consist^and din 2 noduri ecare. Fie nodul (i; j ) unde
r
i este ^n [0; r] referindu-se la al j -lea nod de pe r^andul i. Atunci pentru i > 0
nodul (i; j ) este conectat la 2 noduri pe r^andul i 1, nodul (i 1; j ) si nodul
(i 1; m), unde m este ^ntregul gasit prin invertirea a i cei mai semni cativi
biti ^n reprezentarea binara a lui j . Astfel, un uture r-dimensional BF r ( )

consista din0 noduri (w; i) cu w 2 f0; 1gr si 0  i  r. Exista o muchie ^ntre
(w; i) si (w ; i0) daca si numai daca i = i0 + 1 si e w = w0 sau w si w0 difera
numai ^n al i-lea bit. Fiecare etapa este ^mpartita ^n doua: "sus" si "jos".
Figura 2.79.a prezinta reteauar uture pentru r = 3. Diametrul retelei este
2r, iar latimea bisectiei este 2 . Nu este toleranta la esecuri si este usor de
partitionat. Relatia cu hipercubul este prezentata ^n Figura 2.79.b: reler sunt
izomorfe except^and faptul ca uturele necesita ^ntotdeauna r pasi. BF este( )

un Hr ^n care ecare nod este ^ntins ^n r + 1 noduri, astfel ^nc^at BF r poate
( )

simula Hr cu o ^nt^arziere O(r). Un uture toroidal are mai putine muchii si o
toleranta mai mare la esecuri (Figure 2.80). Un uture r-dimensional toroidal
este un BF r ^n care (w; 0) si (w; r) sunt identice pentru toti w. Un BF r
( ) ( )

simplu poate simula un BF r toroidal cu un factor de ^ncetinire de 2.


( )

Benes. Retelele Benes bi-dimensionale din clasa BN r consista din doi u-


( )

turi r-dimensionali (Figura 2.81) spate la spate. Poate ruta orice permutare
fara blocare. Prima jumatate randomizeaza, a doua ruteaza. Randomizarea
este invovatia cheie a acestei retele.
169
Figura 2.81: Retea Benes: (a) Modalitate de constructie; (b) Structura generala

Figura 2.82: (a) Stelute; (b) Clatita


Stelute si clatite. Fiecare nod din asemenea grafuri (Figura 2.82), core-
spunde la o permutare distincta a k simboluri, f1; 2; :::; kg. Astfel p = k!.
Intr-o steluta Sk , procesorul u este conectat cu v prin schimbarea primului
simbol cu al i-lea simbol, pentru anume i, 2  i  k (de exemplu 3421 si 2431
sunt vecini). Intr-o clatita Pk , procesorul u este conectat la v prin imaginea ^n
oglinda a primelor i simboluri, pentru anume i, 2  i  k (de exemplu 3142 si
2413 sunt vecini).
Factori de scalare ai retelei
Tabelele 2.26-2.29 analizeaza diferitele caracteristici ale retelelor amintite ^n
paragrafele anterioare.
Cea mai simpla problema a modelarii performantei este determinarea
topologiei retelei cu latenta minima ^ntr-o retea ne^ncarcata. Pentru aceasta
este necesara de nirea unor termeni. Se presupune ca nodurile injecteaza
mesaje de lungime medie L ^n retea la rata medie de  biti/ciclu. Cantitatea
 este numit factor randament. Se de neste latenta T (; L) ca timpul mediu
necesar pentru livrarea unui mesaj de lungime L la un factor randament dat .
Acesta este timpul de c^and primul bit intra ^n retea de la nodul sursa si p^ana
c^and ultimul bit paraseste reteaua la nodul destinatie. Se de neste debitul  ca
ind factorul maxim randament  astfel ^nc^at T (; L) este nit. Presupunem
ca se da o latime a bisectiei B a retelei (reprezent^and o constr^angere asupra
densitatii relor), numarul de noduri n din retea, si marimea medie a mesaju-
lui L. Intrebarea care se pune este care topologie minimizeaza T (0; L), adica
170
Tabelul2.26: Caracteristicile unor anumite topologii de retea
Retea Comutatoare Legaturi Dist.max. Dist.medie Bisectie
Static
Inel -(sau p) p p ? 2
Grila 2D - 2p 2p = 1 2
2/3p = 1 2
p= 1 2

Tor 2D - 2p 1/2p = 1 2
1/2p = 1 2
2p = 1 2

Grila 3D - 3p 2p =1 3
p = 1 3
p= 2 3

Hipercub - p log p log p (log p)/2 p/2


Dinamic
Magistrala p p 1 ? 1
Omega p log p p log p log p log p 3p/2
Arbore gras 2p log p p log p 2log p 4log p 2/3 p
Crossbar 1 ?
4
p 2
p p

Tabelul 2.27: Evaluarea retelelor statice de interconectare


Retea Diametru Latimea Conect. Cost
bisectiei arcelor (nr.legaturi)
Complet-conectata 1 2
p =4 p 1 p(p 1)=2
Stea 2 1 1 p 1
Arbore binar complet 2 log[(p + 1)=2] 1 1 p 1
Structura liniara p 1 1 1 p 1
Inel bp=p2c 2p 2 p
Grila 2D 2( pp 1) pp 2 2(p pp)
Tor 2D 2b p=2c 2 p 4 2p
Hipercub log p p=2 log p (p log p)=2
d-cub k-ar toroidal dbk=2c 2kd 1
2d dkd

2.28: Comparatie rapida


Tabelul

Topologie Grad Dist.medie D (D mediu) la p = 1024


Liniar 1D  2 p/3 huge
Inel 1D 2 p/4 p huge
Grila 2D  4 2/3 p 63 (21)
Tor 2D 4 1/2p = 32 (16)
1 2

d-cub k-ar 2d dk=4 15 (7.5) d = 3


Hipercub log p log p=2 10 (5)

171
2.29: Hopuri
Tabelul

Retea Hopuri ^n medie la p = 1024


Hipercub 5
Fluture 10
Arbore 4-gras 9.3
Tor 3D 7.5
Grila 2D 21
latenta mesajului ^ntr-o retea ne^ncarcata, pentru valori date ale lui B; n si L.
De exemplu pentru un n-cub k-ar: T (0; L) = (k 1)d=2 + 2L=k:
Concluzia unui asemenea studiu de modelare a performantei este acela ca
retelele cu dimensiune scazuta sunt preferate celor de dimensionalitate mare din
mai multe motive. In primul r^and restrictiile de ^mpachetare interzic scalarea
liniara a latimii de banda a bisectiei B cu numarul de noduri n. Aceasta
deplaseaza punctul de latenta minim ^nspre retele de dimensiune mica, ^n pre-
supunerea ca toate canalele au aceeasi viteza. In realitate retelele cu dimensi-
une scazuta au re mai scurte si de aceea opereaza mai repede si disipeaza
mai putina putere. Retelele cu dimensionalitate scazuta pot exploata mai
bine sabloanele de comunicare locale precum comunicari ^ntre vecini apropiati
(retelele de dimensionalitate mare pot bene cia foarte putin de localitate).
In plus, complexitatea rutarii este proportionala cu numarul de dimensiuni
deoarece logica controlului este duplicata pentru ecare dimensiune.
2.5.4 Rutare
In analogia cu plimbarea pe strada, topologia este harta si rutarea este alegerea
unei rute de la sursa la destinatie (un drum bazat pe identitatile nodurilor
sursa si destinatie). Un mecanism de rutare calculeaza un drum pentru un
mesaj prin retea care sa ajunga de la procesorul sursa, S , la cel destinatie,
D. Informatiile necesare calcului drumului sunt identi catorii nodurilor sursa
si destinatie, topologia retelei, starea retelei (de exemplu sablonul tra cului,
hopuri erbinti, etc). O de nitie formala a rutarii este ^n termenii relatiei
de rutare R  C  N  C (in canal  dest nod  out canal) care descrie
multimea de drumuri posibile si o functie de rutare  : 2C  ! C care d^andu-
se o multime posibila de urmatoare canale si anumite informatii asupra starii
retelei (din ) alege urmatorul canal de parcurs.
Primele masini au fost construite drept colectii de microprocesoare
bidirectionale FIFO ^ntre vecini. Mesajele ^ntre doua noduri au fost forwar-
date de-a lungul hopurilor multiple.
Unitatile ^n trasmisie (Figura 2.83) sunt mesajul ca unitate logica de comu-
nicare, pachetul ca unitate zica de comunicare (unitate minimala cu informatie
de rutare), flit (mutare) ca unitate de control a uxului (unitatea minimala
a alocarii resurselor) si phit ca unitate de transfer zic.
4 Rezumat: Alegerea unei rute pe canalele de comunicare ^ntre sursa unui mesaj si
destinatia acestuia este realizata prin aplicarea unui algoritm de rutare. Strategiile de rutare
sunt variate. Se cauta evitarea impasului, c^and procesoarele ram^an de nitiv ^n inactivitate.

172
Figura 2.83: (a) Descompunerea unui mesaj; (a) Mesaj, pachet, mutari
Un expeditor poate transfera de exemplu o matrice de 100 numere^n virgula
otanta ^nspre receptor. Deoarece acest transfer necesita calatoria mesajului,
la diferite nivele se adauga antete si informatii la sf^arsit la cantitatea efec-
tiva a mesajului. Mesajul astfel construit este unitatea logica a comunicarii
^ntre expeditor si receptor. Inainte ca mesajul sa e transmis efectiv pe retea
este ^n mod tipic fragmentat ^n unitati de dimensiune xa mai mici, pachete.
Un pachet este unitatea rutarii. Fiecare pachet contine adresa destinatiei
si o informatie ce speci ca pozitia sa ^n mesajul complet. Pachetele pot
rutate independent si pot urma diferite rute ^nspre destinatie si sa ajunga
^n alta ordine dec^at cea initiala. Mai mult, reteaua poate intercala pachete
de la mesaje diferite, deoarece ele poarta su cienta informatie pentru a
reasamblate la receptor. Pachetele pot la r^andul lor sa e impartite ^n ituri
(flow control digits) care sunt unitati ale controlului uxului. Canalele
si tampoanele sunt alocate pe baze it-cu- it. Fliturile nu contin informatii
de rutare; numai itul conducator al pachetului cunoaste destinatia. Astfel
iturile de la pachete diferite nu pot intercalate. In nal, iturile pot
transmise de-a lungul canalelor ^n mai multe cicluri de ceas. Unitatea actuala
de transfer este numita phit (physical digit). La capatul receptor, interfata
de retea receptioneaza pachetele si le reasambleaza ^n mesaje. Aceste mesaje
apoi ajung la stiva protocol iar informatiile din antet si coada sunt eliminate.
In nal cele 100 de numere apar ^n spatiul de adresare a receptorului.
Controlul uxului este metoda utilizata pentru a regla tra cul de retea si
determina c^and si cum va avansa ^n retea un mesaj sau o parte a unui mesaj.
Controlul uxului este o problema de alocare a resurselor ^n timpul rularii:
resursele sunt canale si tampoane si acestea trebuie alocate pentru a mentine o
anumita siguranta si proprietati de progres ale retelei. O politica de control a
uxului se refera la doua aspecte: alocara resurselor si rezolvarea con ictelor.
Alegeri pentru alocarea resurselor
Resursele retea pentru care concureaza iturile sunt canale zice si tampoanele
sursei si destinatiei. Acestea sunt alocate pe baze it-cu- it tin^and seama sa nu
se multiplexeze tampoane^ntre ituri a unor pachete diferite. Aceasta problema
de alocare a resurselor este tratata prin gruparea unui tampon sursa, a unui
tampon destinatie si anumite stari de canal (necesare pentru a aminti calea)
^ntr-un canal virtual. Un canal virtual este o resursa de rutare alocata pe baza
173
Figura 2.84: Canale virtuale
de pachet si este o resursa care ^ncapsuleaza numai resurse tampon nu si canale
zice (Figura 2.84). Canalele zice si tampoanele it sunt resurse de control a
uxului alocate it-cu- it. Fliturile pot intra ^n competitie pentru canale zice
cu alte ituri. Flituri ale aceluiasi pachet pot concura pentru tampoane.
Secventa operatiilor pentru alocarea resurselor este urmatoarea. C^and un
it antet a unui canal ajunge la un canal, el cere un canal virtual. Odata ce
acest canal este alocat, ram^ane alocat pachetului p^ana c^and este ^nt^alnit itul
coada. Fiecare it intra ^n competitie pentru resursele tampon si canal pentru
a avansa. Pentru ca un it sa avanseze sunt necesare trei conditii: trebuie sa
e rezident ^n tamponul sursa, tamponul destinatie al canalului virtual trebuie
sa e vid (tamponul nu poate gol daca pachetul este blocat ^n tranzit si un
it anterior al acestui pachet ^l ocupa) si trebuie sa foloseasca un canal zic.
Daca aceste conditii sunt ^ndeplinite, itul avanseaza de la tamponul sursa a
unui nod la tamponul sursa a nodului succesiv.
Modelul costului de comunicare
Pentru a oferi o baza comparativa pentru diferite scheme de rutare este nece-
sara stabilirea unui model de cost pentru operatiile de comunicare. In plus
fata de proprietatile de graf ale topologie retelei, ecare canal are o latime a
canalului W si un timp al ciclului canal tc. Aceasta ^nseamna ca pe canal
se pot transfera W biti de informatie la ecare tc secunde. Timpul pentru
operatia de comunicare a unui mesaj poate descompus ^n timpul necesar
formarii mesajului si timpul necesar pentru expedierea mesajului. Timpul de
start ts , timpul necesar pentru a forma mesajul, contorizeaza orice r^anduire a
argumentelor, orice decizie de rutare realizata la sursa si timpul necesar pentru
a interactiona cu interfata de retea (acesta este costul platit o singura data per
mesaj). Latenta nodului sau timpul per-hop th, este timpul necesar antetului
mesajului pentru a calatori de-a lungul canalului. Timpul de transfer per bit
este tw = tc=W . Daca latimea de banda a canalului este de b cuvinte per
secunda, atunci tw = 1=b. Timpul actual necesar pentru a expedia un mesaj
de m biti lungime depinde de acesti parametrii precum si de ruta aleasa, de
strategia uxului de control si de congestia retelei.
Latenta comunicarii este timpul necesar pentru comunicarea unui mesaj
^ntre doua procesoare. Latenta este suma surplusului, a ^nt^arzierii ^n rutare,
a ocupantei canalului si a ^nt^arzierii datorate competitiei. Surplusul se refera
la obtinerea mesajului de la/la stratul zic. Int^arzierea rutarii este data de
174
Figura 2.85: (a) Comutare mesaj; (b) Comutare simpl a a circuitului; (c) Co-
mutare dinamica a circuitului
tipul rutarii utilizate. Ocupanta canalului este in uentata de latimea canalului,
de cantitatea de informatie de control (care este la r^andul ei in uentata de
topologie, protocol, algoritm de rutare). Pentru un mesaj de m biti ocupanta
canalului este (m + nE )=b unde nE este marimea anvelopei (adica bitii de
surplus) si b latimea de banda a bisectiei.
Clasi carea algoritmilor de rutare
Rutele alese de un ruter ^ntr-o retea statica pot minimale sau neminimale.
O ruta minimala este una care utilizeaza cea mai scurta cale ^ntre sursa si
destinatie. O ruta este minimala daca ecare pas conduce la o apropiere mai
mare de destinatie. O ruta neminimala este o ruta mai lunga care este selectata
adesea pentru evitarea congestionarii retelei.
Un algoritm de rutare poate deterministic, uitator sau adaptiv. Un algo-
ritm deterministic este unul ^n care drumul depinde numai de nodurile sursa si
destinatie: exista un unic drum pentru un mesaj de la o sursa S la o destinatie
particulara D: R este o functie si  o constanta. Un algoritm uitator poate
alege drumuri diferite pentru mesaje ^ntre aceleasi perechi de noduri, dar nu
utilizeaza informatii despre starea retelei: R este o relatie, si  poate aleator,
o functie de timp sau o functie de continutul mesajului, dar nu depinde de
starea retelei. Rutarea aleatoare este un caz special de rutare cu uitare. Cel
mai general caz de rutare este un ruter adaptiv care utilizeaza informatii despre
starea retelei pentru a alege o ruta: ^n acest caz R este o relatie si  este o
functie arbitrara ce poate implica starea retelei.
Strategiile de comutare de baza sunt: comutarea circuitului si comutatea
pachetului. Comutarea circuitului stabileste un circuit de la sursa la destinatie
(retrage si re^ncearca pe bloc); transmite mesaje de-a lungul unui circuit. Co-
mutarea pachetelor are trei variante: stocare si avans (comutare mesaj; mem-
oreaza-si-^nainteaza), sectionare virtuala, gaura de vierme (comutare dinamica
a circuitului). In primul caz ^ntregul mesaj este mutat un hop ^nspre destinatie
si este mentinut ^n bu er p^ana c^and urmatorul hop este permis. In cazul al
doilea hopurile sunt organizate ^ntr-un pipeline. In al treilea caz, mesajul este
^mprastiat ^n ^ntreaga retea (Figurile 2.85 si 2.86).
Strategii de rutare
Rutare stocare-si-avans (memoreaza-si-^nainteaza). Este un mecanism
de control al uxului ^n care ecare pachet ce traverseaza un drum cu legaturi
175
Figura 2.86: Transmiterea unui mesaj de la P la P : (a) Un singur mesaj este
1 4
stocat-si-avansat; (b) Acelasi mesaj este rup ^n doua parti si este expediat ^n
retea; (c) Acelasi mesaj este ^mpartit ^n patru parti
multiple este tratat ca un singur it. Fiecare procesor intermediar expediaza
mesajul la urmatorul procesor dupa ce a receptionat si stocat ^ntregul mesaj
(Figura 2.86.a). Aceasta metoda este utilizata ^n retelele de comunicare si ^n
primele generatii de retele de interconectare. Fie l numarul de legaturi pe care
pachetul ^l traverseaza. Se cere determinarea timpului de comunicare al unui
pachet de m biti ^n cazul unei retele ne^ncarcate. Mesajul are un cost th pentru
antet si mtw pentru mesaj. Atunci:
tSF = ts + (th + mtw )l
La majoritatea calculatoarelor paralele th este nesemni cativ comparat cu alte
componente chiar si pentru m mic. Problemele legate de aceasta tehnica sunt:
ecare nod trebuie sa retina ecare pachet ce soseste, iar latenta retelei creste
cu distanta dintre noduri.
Rutarea prin sectionare (divizarea mesajului). Mesajul este partitionat
^n piese mai mici, ^n ituri. Marimea itului depinde de parametrii de sistem,
^n particular de latimea canalului. Rutarea prin sectionare este un mecanism
de control al uxului ^n care dimensiunea itului este mai mica dec^at cea a
pachetului (Figurile 2.86.b,c), iar transferul are loc ^ntr-o maniera pipeline.
Fliturile sunt^mprastiate^n toata reteaua. Timpul de comunicare a unui pachet
de m biti ^ntr-o retea ne^ncarcata este
tCT = ts + lth + mtw :
Exista doua variante, sectionare virtuala si gaura-de-vierme, care difera ^n
cerintele de resurse tampon si strategiile pentru rezolvarea con ictelor.
In cazul sectionarii virtuale (virtual cut-through) se bobineaza pachetul
ce soseste ^ntr-un bu er astfel ^nc^at comportarea ^n cazul competitiei se de-
gradeaza la cea a rutarii stocheaza-si-avanseaza.
In cazul rutarii gaura-de-vierme (serpuire; Figurile 2.85.c si 2.87) se pun
^n tampon numai c^ateva ituri ^n comutator si se lasa coada mesajului de-
a lungul rutei (rutare prin sectionare cu pipeline pe retea). Un procesor va
avansa mesajul de ^ndata ce este receptionat un it. Antetul de pachet este
176
Figura 2.87: Rutare gaura de sarpe
2.30: Topologie si latenta comunicarii
Tabelul

Topologie h (medie) b = 1=tw Th Latenta (medie)


Plasa 2D 21 16 4 50 + 64 + 84 = 198
Cub 3D 8 8 4 50 + 128 + 32 = 210
Cub n-ar 5 1 10 50 + 1024 + 50 = 1124
avansat direct de la canalele de intrare la cele de iesire. Odata ce un nod
analizeaza itul antet, selecteaza urmatorul canal al rutei si ^ncepe sa avanseze
pe canal (mai putina capacitate de stocare la ecare nod intermediar).
Masinile care utilizeaza tehnica gaurii-de-vierme, cele mai cunoscute sunt:
Ametek 2010 (numita si Symult 2010, prima masina comerciala bazata pe
aceasta tehnica, cu o grila 2D), nCube-2 (hipercub), Paragon XP/S, J-Machine
(grila 3D cu 18 biti per it), Intel/CMU iWARP, Transputer IMS. Pentru com-
pararea e cientei metodei gaura-de-vierme pe diferite arhitecturi se considera
cazul a p = 1024 procesoare, m = 128 octeti, ts = 50 cicluri. Tabelul 2.30
realizeaza aceasta comparatie.
Avantajele utilizarii rutarii gaura-de-vierme sunt urmatoarele: un nod in-
termediar nu trebuie sa astepte sosirea unui ^ntreg mesaj, utilizeaza spatiu mai
putin si este rapida (ignor^and timpul de start, costul comunicarii este O(m + l)
pentru sectionare si O(ml) pentru stocare-si-avans; daca l = 1 sau daca m este
foarte mic, nu exista diferente). Problema principala a rutarii gaura-de-vierme
este posibilitatea impasului. Impasul poate sa apara c^and nici un mesaj nu
poate avansa ^nspre destinatie deorece cozile din sistem sunt pline si exista o
asteptare circulara.
Rutare minimala. Se cauta drumul minim de la o sursa la o destinatie. Ex-
ista doua modalitati de a realiza expedierea: drumul complet, calculat de nodul
sursa, este codat ^n mesaj astfel ^nc^at nodurile intermediare cunosc imediat
unde trebuie sa avanseze mesajul, sau ecare nod (sursa sau releu) calculeaza
urmatorul nod pentru ecare mesaj utiliz^and algoritmul minimal de rutare.
Rutarea minimala ^n hipercub de exemplu se face astfel. Fiecare nod din
Hd are o eticheta de d-biti si distanta dintre nodurile A si B este egala cu
distanta Hamming dintre A si B, adica H (A; B), numarul de biti care difera
^ntre A si B. Se analizeaza la ecare pas un bit, schimb^andu-se corespunzator
subcubul. Pot exista mai multe cai scurte depinz^and de secventa ^n care sunt
abordati bitii diferiti.
Rutarea minimala ^ntr-o grila 2D se face astfel. Fiecare nod are o coor-
donata (x; y) si distanta dintre nodurile A(x ; y ) si B(x ; y ) este data de
1 1 2 2

177
Figura 2.88: (a) Rutare XY; (b) Rutare E-cub

Figura 2.89: (a) G^ atuire ^n cazul rutarii XY; (b) O posibilitate de solutionare
(adaptiva)
jx x j + jy y j. Algoritmul porneste de la A ^nspre B increment^and
(decrement^and) e coordonata x e coordonata y astfel ^nc^at la ecare pas
1 2 1 2

distanta sa descreasca cu 1. Se pot obtine mai multe rute minimale depinz^and
de secventa ^n care alegem incrementarea/decrementarea coordonatelor x=y.
Intr-un graf DeBruijn se poate obtine un drum de la u u : : : uk la
v v : : : vk printr-o secventa de k deplasari dupa cum urmeaza: u u : : : uk !
1 2

u u : : : uk v ! u u : : : uk v v ! : : : ! u k v v : : : vk ! v v : : : vk .
1 2 1 2
2 3 1 2 3 1 2 1 2 1 1 2

Rutarea deterministica si rutarea ^n ordinea dimensiunii. Este adesea


numita si rutare neadaptiva. Ruta considerata este determinata numai de sursa
si destinatie fara a considera tra cul retelei si este xa.
Cel mai comun exemplu de rutare deterministica este rutarea ^n ordinea
dimensiunii (Figura 2.88) utilizata pentru grile d-dimesnionale si hipercuburi.
De exemplu^n rutarea XY pentru cazul unei grile bidimensionale prima data se
considera dimensiunea X, apoi Y, si drumul minimal; ^n rutarea E-cub ^n cazul
hipercubului se considera prima data cea mai joasa dimensiune, apoi celalalte,
pe drumul minimal.
Rutarea XY este rutarea ^n ordinea dimensiunii pentru o grila bidimen-
sionala. Daca mesajul trebuie sa ajunga de la procesorul P (Sx; Sy ) la pro-
cesorul P (Dx; Dy ), lungimea drumului minimal este jSx Dxj + jSy Dy j.
Drumul mesajului ^n cazul Dx > Sx si Dy > Sy este: (Sx + 1; Sy ); (Sx +
2; Sy ; ); : : : ; (Dx; Sy ); (Dx; Sy + 1); (Dx; Sy + 2); : : : ; (Dx; Dy ). Mesajul este ex-
pediat de-a lungul dimensiunii X p^ana c^and coloana destinatiei este atinsa,
apoi de-a lungul dimensiunii Y p^ana c^and este atinsa destinatia (pe un drum
minimal). Figura 2.89 prezinta un exemplu pentru care rutarea XY conduce
la g^atuirea tra cului.
Rutarea E-cub este rutarea ^n ordinea dimensiunii pentru un hipercub. Se
presupune ca eticheta sursei este PS si cea a destinatie este PD . Lungimea
etichetelor este de d biti, unde d este dimensiunea hipercubului. Distanta
178
Figura 2.90: (a) Rutare adaptiva planara; (b) Modelul cu schimbare pentru
rutarea adaptiva
minima dintre cele doua noduri este numarul de biti din PS  PD , unde  este
sau exclusiv. Algoritmul este urmatorul. Procesorul PS calculeaza PS
PD
si expediaza mesajul de-a lungul dimensiunii k, unde k este pozitia celui mai
putin semni cativ bit nenul din PS
PD (mesajul este rutat^n dimensiunea k a
cubului). La ecare pas intermediar, Pi calculeaza Pi
PD si ruteaza mesajul ca
mai sus p^ana atinge destinatia. Aceasta tehnica este utilizata ^n hipercuburile
nCube, Paragon, Cal Tech Torus Routing Chip, J-Machine, etc. Rutarea
E-cub nu conduce la impas. Intr-adevar, daca nodul nk are n canale de iesire
notate C k ; : : : ; C n k , un mesaj ce soseste ce la nodul nk destinat nodului nl
este rutat spre canalul Cik , unde i este cea mai putin semni cativa pozitie ^n
0 ( 1)

care l si k difera, si deoarece mesajele sunt rutate ^n ordinea crescatoare a di-
mensiunii (cresc^and indicile de canal), nu exista cicluri ^n graful de dependenta
al canalului.
Rutare adaptiva. Ruta unui pachet este in uentata de tra c si statutul
legaturilor (posibile cai diferite ale pachetelor unui mesaj; Figura 2.89.b). Im-
plementeaza toleranta la esecuri si permite o distributie mai buna a tra cului,
adica evitarea punctelor erbinti. Exista o serie de variante precum rutarea
adaptiva minimala (de-a lungul celor mai scurte drumuri), rutarea adaptiva
completa, rutarea adaptiva partiala, rutarea adaptiva planara (Figura 2.90.a),
rutarea adaptiva cu schimbare de sens (Figura 2.90.b). Rutarea adaptiva nu
este avantajoasa ^n cazul unui tra c uniform.
Rutare bazata pe tabel. Problema rutarii se poate reduce la problema
selectarii unei muchii adecvate care poate conectata la destinatie sau poate
conduce la aceasta. Fiecare comutator contine un tabel de rutare R, iar an-
tetul de pachet contine un c^amp de rutare i; nodul urmator este determinat
prin i0 = R(i). O asemenea tehnica este utilizata ^n comutatoare HIPPI si
ATM, pentru LAN si WAN (de exemplu comanda Unix arp arata tabelul lo-
cal). Dezavantajul este necesitatea unui suport hardware si software pentru a
mentine tabelul.
In anumite situatii legaturile se schimba rar si nu se cere ca un nod sa retina
o cale ^ntreaga la ecare destinatie. Pentru a ruta un mesaj, un nod alege un
vecin despre care stie ca are informatia de rutare ceruta pentru a livra mesajul.
O asemenea retea (cu rutare statica) are proprietatea ca anumite noduri au
un grad mai mare de cunoastere a topologiei retelei (reduce cerintele spatiului
tabelei de rutare).
Daca x doreste sa expedieze un mesaj la y, x trebuie sa cunoasca vecinii
pentru a avansa mesajul. Un tabel de rutare mapeaza o destinatie la un drum
de la expeditor (Figura 2.91). Destinatiile din acest tabel ar trebui sa e
179
Figura 2.91: Tabel de rutare: (a) Pe baza de surse; (b) Pe baza de destinatii
cele mai scurte drumuri. Aceasta poate realizat prin constructia arborelui
de acoperire. Algoritmul Dikjstra pentru determinarea celui mai scurt drum
ruleaza ^n timp O(n ) pentru o tabla de rutare ^n cazul a n noduri ^n graf (^n
2

total O(n ) calcule). Un asemenea algoritm poate ^mbunatatit observ^and ca


3

daca avem cel mai scurt drum de la A la B, cunoastem si cel mai scurt drum
de la B la A. Se poate construi un algoritm= pentru cele mai scurte drumuri ce
considera toate perechile si ruleaza ^n O(n ).
5 2

Fiecare drum necesita intrari^n tabel^n numar de log(max(grad(G))), astfel


^nc^at costul total este O(n log(max(grad(G))). O alternativa este stocarea
2

destinatiilor care se aplica la acea legatura obtin^and un tabel precum ^n Figura
2.91.b; ^n acest caz, spatiul necesar este O(n max(grad(G)log(maxgrad(G))).
Construirea unui tabel de rutare nu este su cient, el trebuie ^ntretinut
(datorita unor schimbari de cost sau esecuri de legaturi). Pentru a realiza
aceasta e cient, toate nodurile trebuie noti cate asupra noii informatii topo-
logice (informatii de cost nou al unei muchii) printr-o difuzare (mai ieftina dec^at
actualizarea tabelului). Un protocol de stabilizare este un protocol care per-
mite tuturor nodurilor sa mentina tabelele lor de rutare re ect^and schimbarile
topologiei retelei. Un protocol de autostabilizare este bazat pe un algoritm ce
garanteaza ca tabelul de rutare va ^n starea corecta dupa un timp nit.
Rutare bazata pe drum. Utilizeaza receptionari intermediare pentru a
^mbunatati performanta. O receptionare intermediara permite unui ruter sa
copieze, ^n memoria locala a procesorului, iturile unui mesaj care sosesc ^n
timp ce simultan le avanseaza. Mesajele multi-destinatie pot pre xate cu
o lista a nodurilor destinatie. Odata ce antetul de mesaj a ajuns la prima
destinatie din lista, ruterul la acel nod extrage adresa proprie din anterul listei
si avanseaza restul mesajului la urmatoarea destinatie.
Rutare bazata pe sursa. Sursele construiesc antete ce contin un numar de
port de iesire al ecarui comutator de-a lungul drumului. Fiecare comutator
extrage numarul de port din cap. De exemplu Myrinet are un crossbar 8  8
fara blocare, gaura-de-vierme si rutare bazata pe sursa.
Rutare de sus-^n-jos. Se poate restrictiona rutarea astfel ^nc^at sa se pro te
de avantajul arborilor (^ntr-un arbore se poate merge doar ^n sus si ^n jos
si etichetarea se poate face de la radacina ^ntr-o maniera ramura prima data).
Daca topologia este vazuta ca un arbore logic de acoperire, atunci prin de nitie
nu exista cicluri si impasul nu este posibil (un drum^n jos^ntotdeauna merge la
noduri cu numar mai mic). Aceasta abordare a fost adoptata pentru Autonet;
ecare comutator contine un procesor care poate rula un algoritm distribuit
pentru a determina topologia retelei si a calcula arborele de acoperire.
180
Figura 2.92: Rutarea compacta
Rutarea compacta (rutarea interval). In aceasta schema numele
nodurilor nu sunt arbitrare. Se utilizeaza o topologie arbore. Fiecarui nod
^i este asignat un identi cator crescator ^n post-ordine. Nodurile parinte vor
avea ^ntotdeauna o valoare mai mare dec^at valorile ilor. Nodurile expediaza
cel mai mic identi cator al lor ^n sus. C^and un nod receptioneaza un mesaj
care trebuie sa e rutat la alt nod utilizeaza numele de legatura ca margini
superioare pentru nodurile continute sub el (Figura 2.92).
Rutare booleana. Fiecare nod are asociate predicate booleane la legaturile
sale. Predicatul ecarei legaturi este aplicat la o anumita intrare (mesaj),
return^and e adevarat e fals. Orice legatura care este evaluata cu "adevarat"
este o ruta valida pentru mesajul particular. Pot exista mai multe rute valide.
Rutarea ^ntr-o grila pp  pp. Algoritmul greedy de baza (BGA) presupune
rutarea bazata pe linie urmata de rutare pe coloana, ^n care competitia per
muchie este rezolvata prin permiterea pachetului ce merge la cea mai^ ndeparata
celula sa treaca primul (Figura 2.93). Algoritmul are cel mult 2pp 2 pasi.
Pentru reducerea marimii cozii, poate utilizat urmatorul algoritm. In
faza 1 se sorteaz a toate pachetele ^n ordinea sarpelui pe coloane, utiliz^and
aproximativ 3pp pasi de sortare: destinatia (a; b) este mai mica ^n aceasta
ordine dec^at destinatia (c; d) daca si numai daca e b < d e a < c si b = d. In
faza a doua are loc rutarea spre coloana destinatiei, iar ^n faza a treia rutarea
spre liniapdestinatiei. Timpul de rutare este aproximativ 6pp. Deoarece mai
putin de p au aceeasi coloana destinatie, nu exista disputa pentru muchie si
dimensiunea cozii este 1.
Un alt algoritm este cel care divide ^n prima faza grila ^n q blocuri de
marime pp=q  pp=q, unde q divide pp, apoi sorteaza pachetele din cadrul
2

ecarui bloc asez^and elementele sortate pe coloane. In faza a doua se ruteaz a


pachetele utiliz^and BGA. Timpul de rulare este de aproximativ (2 + 4=q)pp,
iar dimensiunea stivei este mai mica dec^at 2q. Dimensiunea cozii oricarei
muchii linie este ^ntotdeauna 1. In ceea ce priveste muchiile pe coloana di-
meniunea maxima a cozii este cel mult M , numarul maxim de pachete cu
aceeasi destinatie coloana ^n aceeasi linie la sf^arsitul primei faze, respectiv
M  q + (pp q)=pp=q < 2q.
In algoritmul ^n-afara-liniei (Figura 2.94), ecare celula are un pachet la
181
Figura 2.93: Exemplu pentru algoritmului BGA si mesaje multiple ^n retea
(etichetate prin destinatie)

Figura 2.94: Algoritmul ^n-afara-liniei (o -line)


^nceput. In faza 0, se determina pp permutari astfel ^nc^at nici o linie sa nu
aiba doua pachete cu aceeasi destinatie coloana dupa aplicarea a i-a permutari
la a i-a coloana pentru toate i; 1  i  pp. In faza a doua se aplica permutarile.
In faza a treia se ruteaza de-a lungulpcoloanei, iar ^n faza a treia de-a lungul
liniilor. Ultimele trei faze necesita 3( p 1) pasi.
In algoritmul de rutare aleator, se asigneaza o origine intermediara pentru
ecare pachet, se ruteaza pachetele la noile lor origini si apoi la destinatiile
nale. Astfel se divide ecare coloana ^n blocuri de pp= log p noduri consecutive
si se ruteaza ecare pachet la un nod aleator din blocul sau. Apoi are loc o
rutare la coloana corecta si ^n nal la linia corecta. Cu o probabilitate 1
182
Figura 2.95: Rezolvarea con ictelor: (a) Blocare; (b) Metoda tamponului; (c)
Stergere; (d) Rutare eronata
O(1=p), algoritmul ruleaza ^n 2pp pasi cu dimensiunea maxima a cozii de
O(log p):
Rezolvarea con ictelor
In rutarea pachetelor, la ^nceputul unui calcul, ecare procesor are cel mult
un pachet. Cel mult un pachet poate pe o legatura de comunicare ^n ecare
directie. Fiecare nod are o coada de pachete pentru ecare din muchiile inci-
dente la el. C^and cel putin doua pachete ajung simultan la ruter si concureaza
pentru un canal virtual numai una poate satisfacuta la un moment dat. Ex-
ista patru politici care pot adoptate de catre sistem ^n mod tipic: tehnica
tampoanelor, blocare, abandonare sau rutare eronata (Figura 2.95).
In metoda tampoanelor pachetului i se permite sa avansaze ^n afara
retelei si este retinut ^ntr-un tampon pachet ^n ruter sau ^n nodurile sale de
procesare asociate. Aceasta tehnica este cunoscuta drept sectionare virtuala
(virtual cut-through), propusa initial pentru retelele cu transport mare si
care se comporta ca si tehnica stocare-si-avans ^n prezenta competitiei. Proble-
mele asociate cu aceasta tehnica sunt urmatoarele: necesita o cantitate mare
de capacitate de stocare pentru tampoane, iar acestea trebuie sa e alocate
aciclic pentru a evita impasul.
In metoda blocarii, un pachet este stopat^n locul tamponului nodului prece-
dent. Aceasta metoda necesita o capacitate de stocare foarte mica la ruter, dar
leaga resursele retea. Tehnica este numita si gaura de vierme (wormhole).
Un pachet poate rezident ^n mai multe tampoane de-a lungul retelei, si se
poate ^nt^ampla ca itul antet sa ajunga la destinatie ^aninte ca itul coada sa
paraseasca nodul sursa. O asemenea strategie poate conduce la impas. Majori-
tatea calculatoarelor paralele din generatia curenta folosesc aceasta politica.
In metoda abandonarii (dropping), un pachet este eliminat din retea, adica
i se permite sa avanseze ^n afara retelei ^ntr-o galeata de biti, ceea ce nu este
^ntotdeauna un lucru bun din mai multe motive: necesita o ^nstiintare pe baze
pachet-la-pachet care complica protocolul de transmitere, necesita un protocol
de retransmitere a mesajelor pierdute, si poate produce o pierdere severa a
resurselor (c^and tra cul creste nu este utilizata capacitatea retelei si multe
dintre resursele retelei sunt concentrate asupra abondanarii si retransmiterii
mesajelor). BBN Butterfly utilizeaza aceasta politica.
In metoda rutarii eronate (misrouting), numita si rutare disperata, un
pachet este rutat la un canal activ dar incorect. Aceasta poate crea o situatie
de blocare^n viata (livelock)^n care un pachet poate continuu rutat eronat
si sa se plimbe ^n cercuri fara sa atinga destinatia ^n cazul ^n care nu se iau
precautii suplimentare. Denelcor HEP utilizeaza aceasta politica.
183
2.31: Exemple de rutare
Tabelul

Masina Topologie Cicluri Latime Hopuri Canale Rutare


ns biti cicluri virt.
nCUBE/2 hipercub 50 1 40 1 det.,vierme
CM-5 arbore gras 25 4 8 (2) adapt.,sectionare
CS-2 arbore gras 20 8 7 (2) uit.,vierme
Delta plasa 2D 30 16 2 (2) det.,vierme
J-Machine plasa 3D 33 8 2 2 det.,vierme
Monsoon uture 20 16 5 1 uit.,sectionare
SP-1 multietape 25 8 5 1 uit.,sectionare
Tera tor 3D 2 128 1 ? adapt., eronat

Figura 2.96: Impas indus de tampoane


Tabelul 2.31 prezinta c^ateva calculatoare paralele si strategiile adoptate.
Impas. Impasul (deadlock) este o dependenta ciclica pentru anumite
resurse, ^n cazul dat pentru tampoane si canale. At^at schema de stocare-si-
avans c^at si cea de sectionare pot conduce la impas e datorita tampoanelor
(^ntr-un inel cu 4 procesoare prin stocare-si-avans, ciclu tampon, Figura 2.96),
e datorita canalelor (^ntr-un 2-cub, cu gaura-de-vierme, prin ciclu canal) .
Deoarece un impas conduce la oprirea sistemului, este un fenomen indezirabil
si trebuie evitat. Modalitatea de a trece peste un impas este ^ntr-un fel aceea
de rupere a unui ciclu (graf de resurse aciclic). Exista doua modalitati de a
realiza aceasta: rezerva tampon structurata si canal virtual.
Graful de dependenta al canalelor (Figura 2.97) este un graf orientat ^n
care nodurile corespund la canale unidirectionale. Fiecare muchie conecteaza
un canal de intrare si un canal de iesire. Relatia de rutare R  C  N  C
returneaza multimea de canale posibile urmatoare d^andu-se canalul curent si
nodul destinatie. Relatia de dependenta Æ  C  C este o proiectie simpla a
relatiei de rutare (a; b) 2 Æ , 9n 2 N; (a; n; b) 2 R. Graful orientat (C; Æ) este
numit graf de dependenta a canalelor.
Rutarea nu produce impas daca si nu mai daca nu exista cicluri ^n graful de
dependenta a canalelor (teorema Dally). Topologia grila este populara datorita
simplicitatii ^n rutare. Graful de dependenta al rutarii dimensionale pe o grila
184
Figura 2.97: Graf de dependenta al canalelor
2D k-are nu produce impasuri (previne impasul impun^and o ordine asupra
achizitiei canalelor). In n-cuburi k-are cu k > 4 nu este posibila ^nsa o rutare
minimala deterministica care sa nu produca impasuri (chiar si pentru n = 1).
Rezerva tampon structurata ajuta la evitarea impasurilor datorita
dependentelor de alocare a tampoanelor (at^at pentru stocare-si-avans c^at si
pentru sectionare): se structureaza rezervele tampoane astfel ^nc^at sa formeze
o ordine partiala prin restrictionarea tampoanelor ^n care pachetul sau itul
poate avansat. Spunem ca exista o dependenta tampon de la tamponul A
la tamponul B daca B 2 S (A), multimea de tampoane a nodului B care pot
primi date de la A. Multimile S () sunt de nite astfel ^nc^at graful direct de nit
de dependentele tampon este aciclic. Un exemplu de asemenea schema este
aceea care aloca tampoane baz^andu-se pe distanta pachetelor p^ana la nodurile
destinatie: un pachet care are h hopuri p^ana la destinatie poate rutat nu-
mai la al h-lea tampon de la urmatorul nod (algoritm de rutare deterministic).
Schema mentionata este des utilizata ^n LANuri si WANuri. Necesarul mare
de stocare si latenta ale acestei scheme o face improprie pentru utilizarea ^n
calculatoarele paralele.
Canal virtual. Se reaminteste faptul ca un canal virtual ^ncapsuleaza doua
tampoane si o anumita stare canal, dar nu canalul zic pe care sunt datele
transmise. Canale virtuale multiple pot arbitra un canal zic comun si sunt
divizate ^n grupuri de canale virtuale (de exemplu un tampon diferit pentru
"nord-la-vest"). Relatia de rutare este restrictionata pentru a obtine un graf
de dependenta a canalelor aciclic; o asemenea strategie nu creste numarul de
legaturi, dar indca reteaua poate deconectata prin restrictionare, se adauga
canale noi virtuale.
Desi canalele virtuale au fost introduse initial pentru a evita impasul, un
bene ciu colateral este ^mbunatatirea performantei. O analogie este utila ^n
acest sens: pe o strada cu doua sensuri, o masina care^ncearca sa ^ntoarca poate
tine pe loc mai multe masini care vor sa mearga drept; adaugarea de locuri de

185
Figura 2.98: Rutare gaur a de vierme: (a) Impas; (b) Utilizarea canalelor vir-
tuale (2 tampoane)
^ntoarcere la intersectii este ^n general o idee fericita (echivalenta cu adaugarea
de canale virtuale) ce ^mbunatateste substantial performanta tra cului. In
retea, distribuirea tampoanelor de-a lungul unor canale virtuale multiple este
mai e cienta dec^at utilizarea unei singure cozi mai ad^anci de tampoane.
De exemplu se considera a retea cu patru noduri G = (N; C ) care este un
4-ciclu orientat (Figura 2.98). Astfel, N = f0; 1; 2; 3g, si C = fa = (0; 1); b =
(1; 2); c = (2; 3); d = (3; 0)g. Prin canal ^ntelegem un canal virtual. Relatia de
rutare este urmatoarea:
R = f(a; 2; b); (a; 3; b); (b; 3; c); (b; 0; c); (c; 0; d); (c; 1; d); (d; 1; a); (d; 2; a)g:
Graful de dependenta al relatiei R este (fa; b; c; dg; f(a; b); (b; c); (c; d); (d; a)g):
In mod evident graful de dependenta al canalelor este ciclic. Pentru a-l face
aciclic, se elimina tripletele (d; 1; a) si (d; 2; a) din relatia de rutare (se rupe
ciclul din graful de dependenta a canalelor dar se deconecteaza graful, adica nu
mai exista o cale de rutare a mesajului de la nodul 3 la nodul0 2). 0Pentru a evita
acest fenomen, se adauga0 doua canale virtuale aditionale a si b si de neste o
noua relatie de rutare R dupa cum urmeaza:
f(a; 2; b); (a; 3; b); (b; 3; c); (b; 0; c); (c; 0; d); (c; 1; d); (d; 1; a0); (d; 2; a0 ); (a0 ; 2; b0)g:
Graful de dependenta al canalelor asociat acestei relatii este
(fa; b; c; d; a0; b0; g; f (a; b); (b; c); (c; d); (d; a0); (a0 ; b0)g)
care este aciclic (Figura 2.99). Avem un efect de convertire a unui tra c ^n cerc
^ntr-o spirala pentru a evita impasul.
2.6 Transfer de mesaje
Un sistem cu transfer de mesaje este similar, ^n digrama de reprezentare a
legaturilor dintre componente, cu un sistem cu spatiu de adresare partajat
186
Figura 2.99: Exemplu de utilizare a canalelor virtuale: (a) Canalele virtuale;
(b) Graf de dependenta a canalelor; (c) Canale virtuale modi cate; (d) Noul
graf de dependenta a canalelor
(SAS) cu memorie distribuita, ^nsa comunicatiile sunt integrate la nivel I/O si
nu ^n sisteme de memorie precum ^n NUMA. Este asemanatoar cu o retea de
statii (clustere), dar au o integrare mai ermetica. Sunt mai usor de construit
dec^at SAS scalabile. Procesoarele pot accesa direct numai memoria locala si
toate comunicatiile si sincronizarile au loc via mesaje.
2.6.1 Arhitecturi cu transfer de mesaje
Transferul de mesaje este necesar ^n sistemele cu memorie distribuita, memoria
unui nod ind accesibila numai de catre procesorul acelui nod; daca un proce-
sor de la un nod necesita accesarea informatiei stocate ^n alt nod, informatia
trebuie trimisa explicit ca mesaj de la un nod la celalalt. Exemple de sisteme
bazate pe transferul de mesaje sunt IBM SP-2, Intel Paragon, Cray T3D/E,
nCube-3, Thinking Machines CM-5. Primele masini utilizau FIFO pe ecare
legatura; FIFO mici conduc la transfer de mesaje sincron. O alta solutie este
utilizarea transferului DMA (direct memory access) care poate ne-blocant {
procesorul ce initiaza transferul nu asteapta receptionarea, ci continua executia
(mesaj retinut ^ntr-un tampon de sistem la destinatie p^ana la receptionare).
Rolul topologiei este diminuat (nu si la rutarea stocare-si-avans) prin introduc-
erea rutarii tip pipeline (cost ^n interfata nodului din retea, simpli ca progra-
marea). De exemplu IBM SP-2 este bazat pe statii de lucru RS6000 complete,
cu placa de interfata cu reteaua cu motor DMA si procesor i860 ca interfata
de retea a memoriei cu conectare uture 88 si 40MB/s ^n ecare directie.
Teme ^n tranzactii. O tranzactie pe retea (Figura 2.100) este un transfer
^ntr-un sens al informatiei de la tamponul de iesire a nodului sursa la tamponul
de intrare al nodului destinatie. Diferentele dintre tranzactiile pe magistrale
si cele pe retea sunt speci cate ^n Tabelele 2.32 si 2.33).
Asistentul comunicarii. Se pune problema balantei dintre operatiile efec-
tuate de un procesor la aparitia unui mesaj (interpretare: format, tampoane,
actiune) si cele efectuate de un asistent ^n comunicare (Figura 2.101.a). In
mod uzual, procesorul citeste mesaje de la retea, iar asistentul ^n comunicare
veri ca destinatia, arbitreaza media si insereaza tipul mesajului.
Tranzactiile de retea pot realizate la nivel de sistem sau utilizator. In
primul caz nucleul sistemului suporta transferul de mesaje. In cazul al doilea
1 Rezumat: Asistentul ^n comunicarea mesajelor permite eliberarea procesoarelor de o serie
de sarcini necesare tranzactiilor pe reteaua de interconectare.

187
Figura 2.100: Tranzactie ^n retea

Tabelul 2.32: Tranzactii pe magistrala


Tema Translatarea de la virtual la zic si veri carea protectiei
Format re zice magistrala ( xe); (cmd, adresa, data)
Tampon de iesire oferit de registrii
Arbitrarea mediului centralizata, ^naintare cerere si asteptare
Destinatie implicit ^n adresa (difuzeaza, dest. raspunde)
Tampon de intrare registrii pregatiti pentru orice cerere
Actiune acces la stocare simpla + tranzitie stare
Ordonare cereri ordonate/raspuns
Completare sursa si destinatia sunt informate simultan (magistrala)
Impas evitat prin protocol
Livrarea garantata

Figura 2.101: (a) Cerintele unui mesaj; (b) Handler de tranzactie

188
Tabelul 2.33: Tranzactii pe retea
Tema Translatarea de la virtual la zic si veri carea protectiei
Format linii apropiate (serializare si exibilitate); ^n envelopa
informatiei, destinatia si rutarea
Tampon de iesire registrii, FIFO/DMA, memorie, cozi
Mediu de arbitrare nu exista arbitrare globala; mai multe tranzactii ^n sis-
tem ce revendica mai multe resurse ale retelei; sursa
controleaza admiterea; arbitrarea resurselor partajate
este incrementala
Speci carea destinatiei explicita, sistemul translateaza numele logice ^n adrese
zice
Tampon de intrare cerut la sosire, registrii, cozi, memorie, registrii DMA
Orodonare tranzactii garanteaza sau nu ordine punct-la-punct, nu exista o
ordine globala naturala, ordonarea impusa prin lanturi
de tranzactii pe retea
Actiune simpla (acces memorie, spion) sau complexa (pe baza
de calcule); poate implica raspuns
Completare sursa cunoaste faptul ca a expediat, destinatia ca a
receptionat, nu si viceversa (necesare ^nstiintari)
Impas evitat prin protocoale
Livrare fara pierderi datorita erorilor de mediu

Figura 2.102: (a) Port la nivel utilizator; (b) Handler la nivel utilizator
utilizatorul injecteaza mesajele direct^n retea. Procesorul poate initia un trans-
fer la nivel de utilizator (Figura 2.102) scriind destinatia si informatia ^n retea.
Un mic program de tratare (handler) este asociat cu ecare mesaj (Figura
2.101.b); acesta se executa imediat la sosirea unui mesaj, extrag^and mesajul
din retea si integr^andu-l ^n calculul ce urmeaza.
Spectrul abordarilor arhitecturale cuprinde: nici un asistent (siruri bit z-
ice prin DMA la nCube, iPSC), utilizator/sistem (port la nivel utilizator la
CM-5, *T; handler la nivel utilizator la J-Machine, Monsoon), adrese virtuale
la distanta (translatare la Paragon, Meiko CS2), adresa zica globala (proce-
sor si controlor de memorie la RP3, BBN, T3D), sau cache-la-cache (prin con-
trolor cache la Dash, KSR, Flash).
In cazul unui DMA zic (Figura 2.103), transferul se face la nivel de sistem
189
Figura 2.103: (a) DMA zic; (b) Implicatii

Figura 2.104: (a) Procesor dedicat pentru mesaje; (b) DMA virtual
(o translatare de la virtual la zic, arbitrare pentru mediu si destinatie). Un
procesor solicita transferul, iar procesorul receptor poate accepta transferul de
la retea la memorie (nu se poate uita la data). De exemplu la un nCube-2,
mesajele sunt constituite dintr-un numar arbitrar de cuvinte pe 32-biti, primul
cuv^ant ind adresa nodului destinatie. Toate mesajele sunt initial ^ntr-un tam-
pon de memorie al sursei. Mesajele sunt injectate ^n retea de un motor DMA
si sunt rutate prin retea la nodul destinatie dupa care sunt transferate ^ntr-un
tampon de memorie de catre un alt motor DMA. Accesul DMA este rezervat
sistemului de operare. O expediere seteaza motorul DMA de iesire pe adresa
mesajului si lungimea sa. C^and acest lucru este realizat, DMA genereaza o
^ntrerupere. La receptionare, motorul DMA de intrare este setat (orb) la o
adresa de baza. Nu exista o limita fortata de hardware a lungimii mesaju-
lui. Mesajele pot ^mpartite ^n segmente, ecare segment ind asociat cu o
operatie DMA separata.
In sistemele cu design specializat cu DMA virtual (Figura 2.104.b), procesele
de expediere a unei cereri, de tratare a cererii, si de receptionare a cererii sunt
independente. De exemplu la Meiko CS-2 se ^nt^alneste aceasta strategie.
In sistemele cu procesor dedicat pentru mesaje (Figura 2.104.a), procesorul
utilizator si cel dedicat partajeaza memoria (prin care comunica, iar proce-
soarele dedicate comunica ^ntre ele via tranzactii pe retea. Procesorul uti-
lizatorului stocheaza comenzile/mesajele/datele ^n coada de iesire partajata
(veri ca daca coada de iesire nu este plina). Asistentul ^n comunicare veri ca,
translateaza, plani ca, initiaza transportul si interpreteaza (protocolul este di-
vizat astfel pe doua nivele). De exemplu la Intel Paragon se^nt^alneste aceasta
strategie.
190
Figura 2.105: Alcatuirea unui mesaj
2.6.2 Abstractizarea transferului de mesaje
Transferul de mesaje este o metoda de comunicare ^ntre procesoare c^and aces-
tea nu partajeaza memoria. Taskurile si procesele comunica via operatii de
expediere si receptionare a unor date. Datele pot transferate ^ntre procese
de pe aceeasi masina sau ^ntre procese de pe masini diferite. Procesele care
compun programul concurent sunt legate prin canale. Daca doua procese care
interactioneaza sunt localizate pe acelasi procesor, atunci canalul va memoria
locala a procesorului. Daca cele doua procese ce interactioneaza sunt localizate
pe procesoare diferite, atunci canalul ^ntre doua procese este mapat pe un
mediu de comunicatie zic ^ntre cele doua procesoare corespunzatoare.
Transferul este utilizat din mai multe motive precum urmatoarele. Proble-
mele pot ^mpartite ^n bucati mai mici pentru performante mai rapide. In
cazul serverelor multiple permite toleranta la esecuri. Transmiterea de mesaje
poate standardizata pentru a permite aplicatii portabile, poate implemen-
tata peste resurse partajate si evita competitia asupra resurselor.
Istoria transferului de mesaje este una dintre cele mai vechi (^nainte de
retele, prin copierea de date) si a fost impulsionata puternic de protocoale
precum IP. E-mailul este un sistem de transfer de mesaje. Totusi ne vom
concentra asura versiunilor "adevarate" pentru calcul paralel. Un sistem de
trasfer de mesaje este similar cu cutia postala, liniile telefonice, masina de fax.
Mesajele sunt pachete de date ce sunt mutate ^ntre sub-programe. Sis-
temului care face transferul mesajului trebuie sa i se furnizeze urmatoarele
informatii: procesorul expeditor, locatia sursei, tipul datei, lungimea datei,
procesorul receptor, locatia destinatiei, marimea datei la destinatie (Figura
2.105). Tipul mesajului este un identi cator asociat cu ecare mesaj si utilizat
pentru a selecta un mesaj particular la receptionare precum ^n exemplul:
//Proces 0 // Proces 1
p= ...
send("presiune",p,1) receive ("presiune",p)
Bibliotecile generice pentru transferul mesajelor contin operatii de identi-
care a proceselor, operatii de expediere/receptionare, difuzare, operatii arit-
metice globale, rutine de informare, sincronizare. De exemplu:
integer myid() // returneaz a numarul de procese
integer nprocs() // returneaz
a identificatorul de proces

2 Rezumat: Transmiterea de mesaje se face "dup a str^angerea m^ainilor" ^ntre expeditor si
receptor (sincron), sau similar postei (asincron).

191
Urmatorul program generic a seaza identi catorul de proces si numarul de
procese:
// program // iesire
program hello eu=0 nr.procese=4
print *,"eu=",myid()," nr.procese=",nprocs() eu=1 nr.procese=4
stop eu=2 nr.procese=4
end eu=3 nr.procese=4
Comunicarea punct-la-punct. Este cea mai simpla forma de transfer de
mesaje. Un proces expediaza un mesaj la altul. Exista doua primitive de
baza, expedierea care transmite un mesaj (data) pe un canal speci c de la
un proces la altul, si primitiva de receptionare care receptioneaza un mesaj
pe un canal speci c de la alt proces. Primitiva de expediere are o semantica
ce depinde de tipul transferului, sincron sau asincron. De exemplu daca un
procesor cere o data ce este detinuta de un alt procesor, atunci aceasta trebuie
explicit transferata ustiliz^and instructiunile de comunicare:
// Proces P1 // Proces P2
receive (x, P2) send (x, P1)
Valoarea x este explicit transferata de la P2 la P1. Expeditorul initiaza trans-
ferul printr-un send(data,unde,argumente). Receptorul o primeste daca o
cere printr-o receptionare de mesaj: receive(tampon,argumente). La ex-
pediere (Figura 2.11.b) se speci ca tamponul care va transmis (numirea
datei locale de catre procesul utilizator). La receptionare se speci ca pro-
cesul expeditor si tamponul ^n care va stocata informatia. Optional mesajul
este etichetat la expediere si se aplica o regula de potrivire la receptie. In
forma cea mai simpla, prin potrivire se poate ajunge la un eveniment de sin-
cronizare. Suprasarcina introdusa ^n timp este cea necesara copierii, man-
agementului tampoanelor si protectiei. Sursa cunoaste adresa datei expedi-
ate si destinatia cunoaste adresa datei receptionate (dupa str^angerea m^ainilor,
am^andoua cunosc ambele).
La expediere si receptionare protocolul este diferit (Tabelul 2.34). Notiunile
de comunicare cu blocare sau fara blocare au legatura cu timpul de interactiune
dintre aplicatia utilizator, biblioteca de transfer de mesaje si software-ul de
retea. Structura protocoalelor este orientativa pentru ca si alte probleme, mai
detaliate trebuie sa e abordate de acestea(precum depasirea tamponului la
receptor, congestia pe retea, imprevizibilitatea ^nt^arzierilor etc). Problemelor
designului retelelor si protocoalelor sunt probleme de alocare a resurselor.
Transfer sincron sau asincron. Un exemplu de transfer asincron ni-l ofera
Internetul { mesaje precum e-mail-urile pot dura ore p^ana c^and ajung la
destinatie. Un exemplu de transfer sincron ni-l ofera o operatie cu blocaj,
la care executia este partitionata ^n runde.
In transferul de mesaje sincron (Figura 2.106) expedierea se termina
dupa potrivirea cu receptionarea si dupa ce data sursa a fost expediata, iar
receptionarea este terminata dupa transferul complet al datei de la expeditor.
Sa presupunem ca procesul A expediaza o data la procesul B. C^and proce-
sul A executa primitiva de expediere asteapta (blocare) p^ana c^and procesul B
192
Tabelul 2.34: Structura protocolului de expediere si a celui de receptioare
Expediere Receptionare
Pas Actiune Pas Actiune
1 aplicatia utilizator invoca o operatie 1 software-ul de retea copiaza datele
de transfer de mesaje de la hardware-ul interfata de retea
^ntr-un tampon mesaj
2 biblioteca de transfer a mesajelor 2 software-ul de retea calculeaza suma
construieste ^ntr-un tampon soft- de veri care a datei receptionate
ware de retea un mesaj contin^and
antetul si data
3 software-ul de retea calculeaza suma 3 daca suma calculata este egala
de veri care a datei si o adauga la cu suma de veri care a datei
mesaj recptionate
4 software-ul de retea porneste un 4 atunci expediaza o ^nstiintare
contor de timp, expediaza data la expeditorului
hardware-ul de interfatare cu retea-
ua si ^ncepe transmiterea mesajului
5 ciclare pana la sosirea^nstiintarii de 5 altfel elibereaza tamponul mesajului
livrare sau depasire timp si termina
6 daca a aparut ^nstiintarea atunci 6 biblioteca de transfer de mesaje
elibereaza tamponul mesajului si restabileste mesajul din tamponul
termina software-ului de retea
7 daca s-a depasit timpul treci ^napoi 7 biblioteca de transfer de mesaje in-
la 4 terpreteaza informatia din antet
8 biblioteca de transfer de mesaje re-
turneaza data aplicatiei utilizator
executa primitiva sa de receptionare. Inainte ca data sa e transmisa ambele
procese trebuie sa e pregatite sa participe la schimb. In mod similar prim-
itiva de receptionare ^ntr-un proces va bloca procesul p^ana c^and primitiva de
expediere de la celalalt proces va executata.
In transferul de mesaje asincron expedierea se termina dupa ce tamponul
sursei a fost eliberat (cu blocare) sau dupa ce comanda a fost acceptata (fara
blocare). Protocoalele optimiste (1-faza) presupun ca destinatia poate scrie ^n
tampon data expediata fara cerere de potrivire. Protocoalele sigure (^n 3-faze)
asteapta o con rmare a receptionarii. Primitiva de receptionare are aceeasi
semantica (^nteles/comportare) ca ^n cazul sincron. Primitiva de expediere are
^nsa o semantica diferita. In acest caz canalul^ntre procese nu este o legatura di-
recta ^ntre doua procese, ci o coada de mesaje. De aceea c^and procesul A expe-
diaza un mesaj la procesul B, mesajul este adaugat la coada de mesaje asociata
cu canalul asincron si procesul A continua sa e executat. Pentru a receptiona
un mesaj de la un canal, procesul B executa primitiva de receptionare care
extrage mesajul din capul cozii de mesaje asociat cu canalul si continua. Daca
nu exista mesaje ^n canal, primitiva de receptionare blocheaza procesul p^ana
c^and un proces adauga un mesaj la canal. Anumite sisteme implementeaza
o primitiva care testeaza daca canalul are un mesaj oarecare si returneaza o
193
Figura 2.106: Realizarea transferului de mesaje ^ n faze, 1 { initiere expediere, 2
{ translatare adresa destinatie, 3 { expediere cerere data, 4 { veri care etichete
si: (a) Asincron, la 4 si alocare tampon de date; (b) Sincron, 5 { raspuns la
tranzactie, 6 { transfer date; (c) Asicron-sigur, 5 { cerere receptionare pregatita,
6 { transfer date
valoare de adevar (utilizata pentru a preveni blocarea la receptionarea prim-
itivei c^and exista un lucru util de realizat ^n absenta mesajelor pe un canal).
Majoritatea sistemelor de transfer de mesaje implementeaza transferul pe baza
unor dimensiuni xe ale cozilor de mesaje { ^n asemenea sisteme primitiva de
expediere blocheaza procesul la scrierea pe un canal plin.
In sistemele sincrone, de-a lungul unei runde un procesor poate face
urmatoarele: asteapta receptionarea unui mesaj, calcule locale, expediere de
mesaje, schimbare stare. Pasii ^n timp pentru comunicare ^ntre procesoare
sunt e aceiasi adica comunica ^n acelasi timp, e comunica la un pas diferenta
^n timp. In sistemele asincrone procesoarele considera pasi individuali care
includ expedierea de mesaje si calcule locale la receptionarea de mesaje. Nu
exista o garantie asupra timpului necesar atingerii destinatiei de catre un mesaj.
In general, daca doua mesaje sunt expediate, mesajul expediat mai devreme
poate receptionat mai t^arziu. Intr-un sistem sincron, calculul se efectueaza ^n
runde, pe c^and ^ntr-un sistem asincron, procesoarele opereaza la rate arbitrare
care pot varia mult ^n timp.

194
Graf de comunicare. Un sistem de transfer de mesaje este descris printr-un
graf de comunicare ^n care nodurile grafului reprezinta procesoarele si muchiile
(neorientate) reprezinta canale de comunicare ^n ambele sensuri ^ntre proce-
soare. Fiecare procesor este o unitate independenta care ruleaza un program
local. Programele locale contin operatii interne, expediere de mesaje (pe anu-
mite muchii) si asteptarea unor mesaje (pe anumite muchii). Un algoritm este
o colectie de programe locale pentru procesoare diferite. O executie a unui al-
goritm este o executie intercalata a programelor locale (cu anumite restrictii).
Starea canalului de comunicare este modelata e printr-o multime, e printr-o
secventa, functie de existenta unei ordonari a mesajele din canal. De exemplu,
canalul va modelat ca o secventa daca mesajele din el sunt ^n ordinea FIFO
sau LIFO si ca multime daca mesajele nu respecta o ordine speci ca.
Diferite tipuri de grafuri pot utilizate pentru modelare: grafuri complete
(toate nodurile sunt conectate la toate celelalte, adica exista canale de comu-
nicare ^ntre toate nodurile), ^n forma de inel, arbore, graf arbitrar, etc.
De nirea formala a modelului. Calculele ^ntr-un sistem cu transfer de
mesaje trec printr-o secventa de con guratii. In con guratia initiala, proce-
soarele sunt ^n starea initiala si toate muchiile grafului de comunicare sunt
vide. Executia unui algoritm consista din evenimente; evenimentele posibile
sunt executia de catre procesor a unei operatii interne, un mesaj este expediat
pe o anume muchie (combinate ^ntr-un eveniment calculeaza-si-expediaza, con-
trolat de procesoare), sau un mesaj este receptionat la destinatia sa (eveniment
de livrare, initiat de un canal de comunicare). Fiecare eveniment e schimba
starea unui procesor, e schimba starea unei anumite muchii, si astfel schimba
con guratia sistemului.
In detaliu, un algoritm se bazeaza pe n procesoare p ; : : : ; pn, ecare pro-
cesor pi ind modelat ca o masina cu stari cu multimea de stari Qi (posibil
1

in nita) ce contine o stare initiala distincta q ;i. Presupunem ca starea unui
procesor pi contine o componenta speciala, buffi,^n care sunt retinute mesajele
0

ce sosesc. Procesoarele comunica prin expedierea mesajelor considerate pe baza


unui alfabet M .
O con guratie a sistemului de neste informatia completa despre sistem in-
cluz^and starea ecarui procesor (incluz^and tamponul sau) si starea ecarui
canal de comunicare. Aceasta consista dintr-o secventa sau o multime de
mesaje. O con guratie este un vector C = (q ; : : : ; qn) unde qi este starea
locala a a lui pi. Fiecare procesor porneste dintr-o stare initiala care poate
1

speci cata printr-o conditie particulara a memoriei sale locale, de exemplu


ca tampoanele interne sunt goale; ecare canal de comunicare initial contine o
secventa/multime vida de mesaje. Con guratia initiala a sistemului este no-
tata cu C = (q ; ; : : : ; q ;n). Con guratia sistemului se schimba datorita unui
eveniment care este un pas atomic.
0 01 0

O actiune consta dintr-o expediere a unui mesaj (parte a evenimentului


calculeaza-si-expediaza). Notatia send(i; j; m) se refera la un mesaj m expediat
de la procesorul i la procesorul j cu m 2 M , o multime de cuvinte dintr-un
alfabet prede nit M . Pentru oricare i, 1  i  n, e Si multimea tuturor
actiunilor de expediere send(i; j; m) pentru toti m 2 M si toti j , 1  j  n.
Un eveniment de calcul-si-expediere, comp(i; S ), se refera la un eveniment de
calcul a procesorului i, cu S o submultime nita a lui Si , pe c^and un eveniment
195
de livrare, del(i; j; m), se refera la un mesaj m 2 M livrat de la procesorul i la
procesorul j . In pasul de calcul asociat cu evenimentul comp(i; S ), procesorul
pi , baz^andu-se pe starea sa locala, efectueaza actiuni de expediere din S si ^si
schimba posibil starea sa locala. In pasul de livrare asociat cu evenimentul
del(i; j; m) mesajul m de la pi este adaugat la buffj .
C^and apare un eveniment de calcul-si-expediere, au loc urmatoarele. Pro-
cesorul i cerceteaza tamponul sau, elimina toate mesajele din el, efectueaz a
calcule pe informatiile receptionate si starea sa se schimba de la qi la q0i de-
pinz^and de functia de tranzitie i. Procesorul i efectueaza un numar de actiuni
de expediere de forma send(i; j; m). Pentru ecare send(i; j; m), starea muchiei
(i; j ) se schimba pentru a re ecta adaugarea mesajului m.
C^and are loc un eveniment de livrare se ^nt^ampla urmatoarele. Starea
muchiei (i; j ) se schimba pentru a re ecta ^nlaturarea mesajului m. Com-
ponenta tampon a starii procesorului receptor j , buffj , se schimba pentru a
re ecta adaugarea mesajului m. Tamponul stocheaza mesaje pentru urmatorul
eveniment calculeaza-si-expediaza. buffj este o componenta a starii lui Pj ce
contine mesaje care au fost livrate dar nu au fost ^nca procesate.
O executie a unui algoritm este o secventa nita sau in nita de forma
C ; e ; C ; e ; C ; e : : : unde Ck sunt con guratii si ek sunt evenimente. La
aplicarea evenimentului ek la con guratia Ck rezulta con guratia Ck . Adica,
0 0 1 1 2 2

daca ek este un eveniment de calcul local la procesorul pi , atunci starea lui pi


+1

^n Ck si evenimentele sale de expediere de mesaje sunt rezultatul aplicarii


functiei de tranzitie a lui pi la starea lui pi ^n Ck , iar daca ek este un eveniment
+1

de expediere sau receptionare de mesaje atunci starea muchiei ^n cauza se


schimba corespunzator. Se adopta conventia ca un segment de executie nit
se termina cu o con guratie. Daca este un segment de executie nit, atunci
Cend ( ) indica ultima con guratie ^n .
Un plani cator este de nit ca o secventa de evenimente, e ; e ; e ; : : :,
ce au aparut de-a lungul cursului executiei C ; e ; C ; e ; C ; e ; : : :. Pentru
0 1 2

ecare plani cator exista o executie corespunzatoare. De asemenea, aplicarea


0 0 1 1 2 2

unui plani cator, e ; e ; e ; : : : ; ek , la con guratie initiala, C , va conduce la


con guratia Ck a sistemului.
0 1 2 0

Intr-un model asincron, o executie este admisibila daca ecare procesor are
+1

un numar in nit de evenimente de calcul si exista o mapare unu-la-unu de la


actiunile de expediere la evenimente de livrare mai t^arzii (aceasta garanteaza
ca ecare mesaj expediat este livrat la un punct ulterior ^n executie). Intr-un
model sincron, executia procesoarelor se desfasoara ^n pasi si o executie este
admisibila daca, ^n plus pentru contr^angerile admisibile asincrone mentionate
anterior, evenimentele de calcul apar ^n runde. Fiecare procesor are exact un
eveniment de calcul ^n ecare runda si ca evenimentele de calcul din runda r
apar dupa toate evenimentele de calcul din runda r 1; toate mesajele expediate
^n runda r sunt livrate ^nainte de evenimentele de calcul din runda r + 1.
2.6.3 Programarea pe baza transferului de mesaje
Managementul datelor, a distributiei datelor si a comunicarile sunt lasate pe
seama programatorului. Modelul de transfer de mesaje ofera totusi porta-
3 Rezumat: Procesele cu transfer de mesaje sunt de tip ltre, clienti, servere, perechi.

196
Tabelul 2.35: Monitor contra transfer de mesaje
Programe bazate pe monitoare Programe bazate pe mesaje
variabile permanente variabile server locale
identi catori de procedura necesita canale si tipuri de operatii
apel de procedura cerere de expediere; receptionare ^n replica
intrare monitor cerere receptionare
returnare din procedura expediere ^nstiintare
asteptare cerere nedecisa
semnal reabilitare si procesare
corp procedura rami care pe tipuri de operatii
bilitatea cea mai buna. Sunt disponibile numeroase biblioteci de functii de
transfer a mesajelor suportate de multiprocesoare: APPL, PVM, P4, Express.
MPI (Message Passing Interface) este un asemenea standard ^n dezvoltare.
O alta abordare este cea din punctul de vedere al modelelor orientate obiect
{ obiecte cu date locale si metode ce comunica ^ntre ele via mesaje (de exem-
plu C++ cu clase de date paralele). A treia abordare este cea a modelului de
programare functional, paralelism usor de detectat de catre compilator) { de
exemplu, SISAL. Deoarece transferul de mesaje este o abordare a problemei
procesarii concurente, exista o relatie ^ntre monitoare si transferul de mesaje,
relatie sintetizata ^n Tabelul 2.35.
Procese ^n programe cu transfer de mesaje
Existe mai multe tipuri de procese ^n programele cu transfer de mesaje, pre-
cum ltrele, clientii, serverele, perechi. In cazul unor ltre, se receptioneaza
date ^n ux pe canalele de intrare, se efectueaza anumite calcule pe datele
receptionate si se expediaza rezultatele pe canalele de iesire. Clientii fac cereri
la procesele server si asteapta reactii de la servere; clientii initiaza activitatea
si adesea ^nt^arzie p^ana c^and cererea a fost servita. Serverele sunt procese re-
active: asteapta p^ana c^and apar cereri si reactioneaza la cerere, actiunea spe-
ci ca depinz^and de cerere, parametrii cererii si starea serverului. Serverul poate
raspunde imediat sau salveaza cererea si raspunde la ea mai t^arziu. Serverul
este un proces care nu se termina si care, ^n mod obisnuit, ofera servicii la mai
multi clienti. Perechile sunt procese identice care interactioneaza pentru a oferi
un serviciu sau rezolva o problema. Se considera doua exemple pentru perechi
de procese.
Exemplul 1: algoritm sincron de sortare ^n paralel. Pentru a sorta
un vector de n valori ^n paralel utiliz^and un algoritm sincron pulsatoriu, avem
nevoie de partitionarea celor n valori egal ^ntre procese. Presupunem ca avem
doua procese, P si P , si ca n este par. Fiecare proces are initial n=2 val-
ori si sorteaza valori ^n ordine crescatoare utiliz^and un algoritm de sortare
1 2

secvential. Apoi la ecare iteratie P schimba cea mai mare valoare a sa


cu cea mai mica valoare a lui P si ambele procese plaseaza noile valori ^n
1

pozitiile corecte ^n listele proprii de numere sortate. Deoarece expedierea si
2

receptionarea sunt cu blocare ^n sistemele sincrone, P si P nu pot executa


expedierea si receptionarea ^n aceeasi ordine (precum ^n cazul asincron):
1 2

197
op channel_1(int x), channel_2(int x)
process P1 {
int a[N/2], new, largest:=N/2
... //sortare ^n ordine ne-descrescatoare
send channel_2(a[largest])
receive channel_1(new)
while a[largest] > new {
a[largest] := new
for i:= largest downto 2 do
if a[i] > a[i-1] then a[i] := a[i-1]
send channel_2(a[largest])
receive channel_1(new) } }
process P2 {
int a[N/2], new, largest:=N/2;
... //sortare ^n ordine ne-descrescatoare
receive channel_2(new)
send channel_1(a[1])
while a[1] < new {
a[1] := new
for i:= 2 to largest do
if a[i] < a[i-1] then a[i] := a[i-1]
receive channel_2(new)
send channel_1 (a[1]) } }

Putem extinde acest algoritm pentru k procese prin ^mpartirea initiala a vec-
torului astfel ^nc^at ecare proces are n=k valori care sunt sortate utiliz^and un
algoritm secvential. Apoi se sorteaza cele n elemente prin aplicare repetata
a algoritmului de comparare si schimb ^ntre doua procese. Pentru k impar,
ecare proces numerotat cu un numar impar se comporta precum P , si ecare
proces numerotat par se comporta precum P . Fiecare proces numerotat impar
1

Pi schimba date cu procesul Pi . Pk nu face nimic. Pentru k par, procesele


2

numerotate par actioneaza precum P , si procesele numerotate impar se com-


+1

porta precum P . P si Pk nu fac nimic. chiar daca k este par. Algoritmul de
1

sortare este numit algoritmul cu schimbare par/impar si poate extins p^ana la
2 1

k = n. Algoritmul se poate termina ^n mai multe moduri. Doua dintre acestea
sunt urmatoarele. Prima varianta este aceea de a considera un proces de con-
trol separat informat de ecare proces, ^n ecare runda, daca au modi cat cele
n=k valori; daca nici un proces nu a modi cat lista sa atunci controlorul cen-
tral replica printr-un mesaj de terminare. A doua varianta este executia unui
numar su cient de iteratii pentru a garanta ca lista va sortata (k iteratii).
Exemplu 2: problema cinei lozo lor prin transfer sincron de mesaje.
Deoarece at^at expedierea c^at si receptionarea^ntr-un transfer sincron de mesaje
blocheaza, este^n general dezirabil sa nu e apelate daca exista alte lucruri utile
care sa e efectuate. Un exemplu este problema cinei lozo lor descentralizata
^n care ecare lozof are un proces de asteptare. Procesele de asteptare sin-
cronizeaza accesul la resursele partajate (furculite). C^and o resursa a fost
utilizata este marcata ca ind murdara. C^and un proces de asteptare cere o
furculita, veri ca daca nu a fost utilizata si este murdara. Protocolul curata
198
furculita, o da la procesul care o cere si previne ^nfometarea lozo lor de catre
procesele de asteptare care elimina o furculita ^nainte ca cealalta furculita sa
apara. Acest algoritm este numit algoritmul igienic al lozo lor.
process asteptare (i:= 1 to 5) {
boolean eating:= false, hungry:= false, haveL, haveR
boolean dirtyL:=false, dirtyR:=false
if i = 1 then { haveL := true; haveR := true }
else if i >1 and i < 5 then { haveL := false; haveR := true }
else if i = 5 then { haveL := false; haveR := false }
do true {
if reveive phil_hungry [i] then {
hungry := true
if receive fork [(i-1) mod 5] then
if haveL and not eating and dirtyL then
{ haveL := false; dirtyL := false }
else if receive fork [(i+1) mod 5] then
if haveR and not eating and dirtyR then
{ haveR := false; dirtyR := false }
else if receive phil_full [i] then
eating := false
else
if hungry and haveL and haveR then {
hungry := false; eating := true
dirtyL := true; dirtyR := true
send phil_eat [i]
if hungry and not haveL then
send fork [(i-1)mod 5]
haveL := true
if hungry and not haveR then
send fork [(i+1) mode 5]
haveR := true } } } }
process filozof (i:= 1 to 5) {
do true {
send phil_hungry [i]
receive phil_eat [i]
send phil_full [i] } }

2.6.4 Primitive pentru paradigma transfer de mesaje


Stilul de comunicare expediere si receptionare ^ntre perechi de procesoare este
numit comunicare punct-la-punct. Aceasta este distincta de comunicarea colec-
tiva ^n care mai multe procese sunt implicate ^n sarcina de coordonare a comu-
nicarii (precum difuzarea unei date { un proces cunoscut ca radacina expediaza
aceeasi data la toate procesele { si reducerea datelor { datele de la toate proce-
4 Rezumat: Exista mai multe variante pentru functiile utilizate ^n bibliotecile pentru trans-
fer de mesaje (cu blocare completa, partiala, sau fara blocare). Functiile de baza sunt cele de
expediere, de receptionare, de difuzare si operatii pe grupuri de procese. Timpul de difuzare
depinde de topologia retelei de interconectare si algoritmul de rutare.

199
Figura 2.107: Variante send/receive
Tabelul 2.36: Perfomantele send si receive pe diferite arhitecturi
surplus op ops/ timp
masina an send+recv cost (send+recv) ciclu
nCube/10 87 400s 6.5s 62 100ns
iPSC/2 88 700s 3.1s 226 62ns
nCube/2 90 150s 0.45s 333 50ns
iPSC/860 91 160s 0.05s 3200 25ns
Delta 91 55s 0.05s 1100 25ns
CM-5 92 95s 0.31s 306 30ns
CS-2 93 38s 0.05s 760 25ns
sele sunt combinate utiliz^and o functie de reducere pentru a produce un singur
rezultat care poate sa se a e ^ntr-un singur proces sau la toate).
O operatie de comunicare este completa local pe un proces daca procesul
a completat partea sa din operatie. Este completa global daca toate procesele
implicate au terminat partea lor din operatie. O operatie de comunicare este
completa global daca si numai daca este completa local pentru toate procesele.
Primitivele de expediere si receptionare
Primitiva send transmite mesaje de la un procesor la altul, iar receive citeste
un mesaj de la alt procesor. Exista mai multe variante ale acestor primitive care
sunt schematizate ^n Figura 2.107. Performantele send si receive pe diferite
arhitecturi sunt prezentate ^n Tabelul 2.36. Cele doua tipuri de protocoale
de transfer de mesaje sunt sincrone sau asincrone. In primul caz rutinele de
expediere si receptionare se suprapun ^n timp si expedierea nu este terminata
p^ana c^and receptionarea nu a pornit (protocol rendez-vous). In cazul al doilea
suprapunerea ^n timp a rutinelor nu este neaparat necesara. Daca un proces
expediaza un mesaj, atunci un altul trebuie sa-l receptioneze:
// proces surs
a // proces destinatie
send(data,lungime,destinat
ie) receive(data,lungime-maxim
a,sursa)
Prototipul general al primitivei de expediere este urmatorul
send(mesaj, lungime, tinta, tip, steag)
unde mesaj este data care urmeaza a transmisa, lungimea este marimea
mesajului ^n octeti, tinta este eticheta procesorului destinatie, tip distinge
200
Figura 2.108: Analogii pentru variantele la expedierea mesajelor: (a) Sincron
{ masina de fax; (b) Asincron { posta; (c) Operatie fara-blocare: sarcina
^ndeplinita de expeditor p^ana la receptionarea con rmarii

Figura 2.109: Variante la expediere: (a) Expediere cu blocare partiala; (b)


Expediere cu blocare totala; (c) Expediere fara blocare
diferite tipuri de mesaje, steag indica modul blocare sau neblocare. In expe-
dierea sincrona (Figura 2.108.a) se returneaza o informatie despre completarea
mesajului, iar^n cazul asincron, numai o con rmare ca mesajul a plecat. Intr-o
operatie cu blocare returnarea din subrutina se face c^and operatia a fost termi-
nata. In operatiile fara blocare (Figura 2.108.c), se permite procesului apelant
sa continue efectuarea de lucru util, iar procesul poate testa sau astepta ulterior
terminarea operatiei. La operatia de expediere, hardware-ul specializat copiaza
mesajul^n tamponul de comunicare, adauga un antet care include tipul, steagul
si informatia de rutare si expediaza mesajul.
Variantele diverse ale unei expedieri sunt tratate si ^n Figura 2.109: expe-
diere cu blocare completa, partiala sau fara blocare. La o expediere cu blocare
procesorul suspenda procesarea p^ana c^and data nu a parasit aplicatia adica
mesajul este receptionat de destinatie sau mesajul a fost copiat de catre sis-
201
Figura 2.110: (a) Receptionare cu blocare; (b) Receptionare fara blocare;
(c) Cuplarea ^ntre send-receive
temul de transfer a mesajelor. La ^ntoarcere din rutina de expediere tamponul
data poate utilizat fara coruperea mesajului. La o expediere fara blocare,
la returnarea din rutina de expediere data din tampon este volatila. Aceasta
^nseamna ca pentru data care va expediata nu se garanteaza ca a parasit
aplicatia si daca tamponul de date este schimbat mesajul poate corupt. Ideea
este aceea ca ^ntoarcerea din rutina de expediere se face c^at mai cur^and ast-
fel ^nc^at procesul poate continua. Un apel ulterior poate utilizat pentru a
veri ca terminarea expedierii.
Prototipul general al primitivei de receptionare este
receive(mesaj, lungime, sursa, tip, steag)
unde mesaj este locatia unde va stocata data receptionata, av^and o lungime
cel putin lungime, sursa este eticheta procesorului de la care mesajul este
expediat, tip este tipul mesajului de receptionat (se poate selectiona un numar
de mesaje ce asteapta a receptionate). Dupa receptionare tip stocheaza tipul
mesajului receptionat. In plus steag se refera la modul de comunicare.
Exista mai multe variante a operatiilor de receptionare: cu blocare sau fara
blocare (Figura 2.110). La receptionarea cu blocare, procesul receptor poate
continua numai c^and data expediata intra ^n aplicatie. Acesta ^nseamna ca
mesajul a fost copiat ^n zona tampon si poate utilizat de aplicatia procesului
receptor. In cazul unei receptionari fara blocare, la returnare din rutina de
receptionare starea zonei tampon este nedeterminata. Aceasta ^nseamna ca nu
se garanteaza faptul ca mesajul a fost deja receptionat ^n tamponul de date.
Spunem ca o receptionare a fost postata ^n asteptarea mesajului. Se permite
astfel ca rutina de receptionare sa se termine c^at mai cur^and posibil pentru ca
procesul receptor sa continue cu lucrul util. Un apel ulterior poate utilizat
pentru a veri ca teminarea receptionarii.
Exemplu de comunicare pe o structura de inel utiliz^and primitivele
expediere/receptionare (cazul a 4 procesoare ^n Figura 2.111).

202
Figura 2.111: Expediere/receptionare ^ntr-un inel
2.37: Operatii de informare
Tabelul

int info pid() returneaza identi catorul procesului expeditor


int info len() returneaza lungimea mesajului ^n octeti
int info type() returneaza tipul mesajului de nit de utilizator
constant int SIZE=32768
process ring (i:=1 to N) {
char buf[SIZE]
int DATA:=10, SIZE, next
next:= (myid()+1) mod nprocs()
time1:= time()
for i:=1 to 100 do
if myid()=0
then { send(DATA,buf,SIZE,next); receive(DATA,buf,SIZE) }
else { receive(DATA,buf,SIZE); send(DATA,buf,SIZE,next) }
time2:= time()
if myid()=0 then {
print(" Necesar timp ",(time2time1)/100," secunde")
print(" pentru a expedia ",SIZE," octeti")
print(" de ",nprocs()," procese") } }
Primitivele de informare
In cazul unei probe, se determina existenta ^n coada de mesaje a unui nod
pentru un tip particular de mesaj; se returneaza 1 daca un asemnea mesaj
exista, si 0 daca nu. Aceasta este o operatie fara blocare:
integer probe (tipmesaj)
O operatie de informare returneaza o serie de informatii (Tabel 2.37) relative
la ultimul mesaj receptionat si cel pentru care se face proba. De exemplu:
if probe(-1)
then print "exista mesaj de tip=",info_type(),
"lungime=",info_len(), " de la proces=",info_pid()
else print "nu exista mesaj"

203
Figura 2.112: (a) Difuzare; (b) Comunicare unul-la-mai-multi

Figura 2.113: Difuzare pe baza de arbore


Difuzare
O comunicare colectiva este o operatie de comunicare ^n care procesoare mul-
tiple coopereaza pentru a atinge un rezultat; de exemplu, difuzare unul-la-
toti/acumulare la un nod singular, difuzare toti-la-toti/acumulare multi-nod,
comunicare personalizata unul-la-toti sau toti-la-toti.
Se presupune existenta canalelor bidirectionale, a comunicarii pe un sin-
gur port, ca procesorul poate simultan expedia pe o legatura si receptiona pe
o alta legatura si se utilizeaza rutare deterministica a mesajelor. Variabilele
independente sunt topologia retelei (hipecub, inel, tor, etc), controlul ux-
ului (stocare-si-avansare notata SF sau sectionare notata CT). De exemplu
pentru un transfer simplu ^ntre doua procesoare utiliz^and rutarea SF, limita
superiora pentru costul de comunicare, ^pntr-o retea ne^ncarcata, este ^n inel
ts + tw m(bp=2c), ^ntr-o grila ts + tw m(2b p=2c), ^n hipercub ts + tw m(log p).
Cea mai simpla varianta de difuzare este cea care expediaza un mesaj de la
un proces la toate procesele (Figura 2.112): toate procesele trebuie sa execute
operatia sau va aparea un impas. Prototipul primitivei de difuzare este:
bcast (tipmesaj, mesaj, lungime, radacina)
O forma comuna de algoritm de difuzare este bazat pe un arbore de difuzare.
Se presupune ca nodul 0 este radacina difuzarii (^n general, arborele trebuie sa
aibe radacina ^n nodul care difuzeaza mesajul). Radacina expediaza mesajul
la i sai si termina difuzarea. Un nod care receptioneaza un mesaj ^l expediaza
la i sai (daca are) si termina difuzarea. Complexitatea mesajelor este O(n)
daca n este numarul de noduri si complexitatea timpului este O(d) unde d este
ad^ancimea arborelui. Se considera arborele din Figura 2.113; un arbore de
difuzare utilizeaza legaturi zice directe si daca din punct de vedere hardware
204
Figura 2.114: Aplicatie a difuzarii: multiplicarea matrice-vector

Figura 2.115: Solutie pentru difuzare unul-la-toti pentru (inel, SF)


este posibila expedierea pe mai multe legaturi simultan, atunci ^n pasul 1, 0
expediaza la 1,2 si 4, ^n pasul 2, 1 expediaza la 3 si 5, 2 la 6, iar ^n pasul 3,
nodul 3 expediaza mesajul la 7. Daca din punct de vedere hardware se poate
face expedierea pe o singura legatura la un moment dat, atunci ^n primul pas,
0 expediaza la 1, ^n al doilea 0 la 2 si 1 la 3, iar ^n pasul al treilea, 0 la 4, 1 la 5,
2 la 6, 3 la 7 (algoritmul descris poate modi cat pentru a construi un arbore
de la radacina data, algoritmul BFS (Breadth-First-Spanning-tree).
Se considera urmatoarele variante de difuzare: difuzare unul-la-toti, c^and
un procesor expediaza un mesaj identic la toate celelalte procesoare, difuzare
toti-la-toti, c^and ecare procesor efectueaza o difuzare unul-la-toti, comunicare
personalizata unul-la-toti, c^and un procesor expediaza un mesaj unic la ecare
dintre celelalte procesoare si comunicare personalizata toti-la-toti, c^and ecare
procesor efectueaza o comunicare personalizata unul-la-toti.
Difuzare unul-la-toti. Exista un singur expeditor, un mesaj comun, recep-
tori multiplii. Dualul operatiei este acumularea la un singur nod. Una dintre
aplicatiile comune ale acestui tip de difuzare este ^n multiplicarea matrice-
vector (Figura 2.114). O problema importanta este costul comunicatiei.
Difuzare unul-la-toti ^n inel. In cazul rutarii stocheaza-si-avanseaza (Figura
2.115), procesorul sursa expediaza doua mesaje la cei doi vecini ^n primii doi
pasi. Fiecare procesor receptioneaza un mesaj de la un vecin si expediaza
acelasi mesaj la celalalt vecin (o singura data). Algoritmul are loc ^n dp=2e
pasi si la ecare pas un mesaj de m cuvinte este transmis pe o legatura, adica
p
la toti bc = (ts + tw m)d 2 e:
inel;SF
Tunul
( )

In cazul rutarii prin sectionare se utilizeaza un algoritm similar cazului hiper-


cubului: la ecare pas i, toate procesoarele ce detin mesajul de difuzat expe-
205
Figura 2.116: Soluttie pentru difuzare unul-la-toti pentru (inel, CT)
diaza acel mesaj la procesoarele care sunt la p=2i hopuri departare (^n sens
antiorar, Figura 2.116). Algoritmul are loc ^n log p pasi, iar costul de comuni-
care este
Xp
log

la toti bc = (ts + tw m + thp=2i) = (ts + tw m) log p + th(p 1)


(inel;CT )
Tunul
i=1

Difuzare unul-la-toti ^n tor. In cazul rutarii stocheaza-si-avanseaza se ex-


tinde solutia cuplului (inel, SF) dimensiune cu dimensiune. Astfel, pentru
un tor bidimensional cu p procesoare se efectueaza difuzare unul-la-tot i de
la sursa de-ap lungul liniei ca inel de p = procesoare ^ntr-un timp Tlinie
1 2 SF =
(ts + tw m)d p=2e si apoi simultan difuzare unul-la-toti de-a lungul coloanelor
(Figura 2.117), ^n timpul
SF
Tcoloana = (ts + tw m)dpp=2e:
Costul total de comunicatie este astfel
pp
tor2D;SF )
Tunul
(
= 2(ts + tw m)d 2 e;
la toti bc

iar pentru un tor tridimenional cu p procesoare, este


p3 p
la toti bc = 3(ts + tw m)d
(tor 3D;SF )
Tunul
2 e:
In cazul rutarii CT, CT se face o rutare pe linie pe baza algoritmului cuplului
(inel, CT) ^n timpul Tlinie =p(ts + tw mp) log pp + th(pp 1), si apoi pe coloane
^n Tcoloana
CT = (ts + tw m) log p + th( p 1), costul total de comunicare ind:
p p
la toti bc = (ts + tw m) log p + 2th ( p 1);
( tor D;CT
Tunul
2 )

iar ^n cazul tri-dimensional,


p p3
la toti bc = (ts + tw m) log p + 3th ( p 1):
tor D;CT
Tunul
( 3 )

Difuzare unul-la-toti ^n grila. Este asemanatoare cazului tor (Fig. 2.118).

206
Figura 2.117: Difuzare unul-la-tot
i ^n tor bidimenional cu p = 16 procesoare:
(a) SF; (b) CT

Figura 2.118: Difuzare unul-la-toti ^n plasa cu p = 16 procesoare si rutare CT

Figura 2.119: Difuzare unul-la-toti ^ntr-un 3-hipercub, rutare SF


Difuzare unul-la-toti ^n hipercub. In loc de doua faze ^ntr-o grila bi-
dimensionala, ^n hipercub, putem comunica ^n d faze corespunzator ecarei
dimensiuni (Figura 2.119). Pentru rutarea SF,
la toti bc = (ts + tw m + th ) log p:
hipercub;SF
Tunul
( )

Comunicarea porneste de la cel mai semni cativ bit. In total sunt log p pasi de
comunicare. La pasul i, nodurile cu cel mai semni cativ bit i expediaza mesaje
la nodurile cu bitul i complementat.
Rutarea CT nu^mbunatateste viteza de comunicare pentru difuzare unul-la-
toti ^n hipercub, desi map^and un inel ^ntr-un hipercub, se ajunge la algoritmul
descris mai sus pentru cuplul (inel, CT) ce ofera o reducere a timpului de
comunicare cu un factor de p= log p fata de cuplul (inel, SF). O reducere similara
se observa ^n cazul maparii unui tor bi-dimensional. Un arbore binar balansat,
cu toate procesoarele^n noduri si comutatoare ca noduri intermediare, poate
207
Figura 2.120: Difuzare unul-la-toti ^ntr-un arbore cu p = 8 procesoare

Figura2.121: Comunicare personalizata unu-la-toti ^ntr-un (inel, SF)


transpus pe un hipercub (Figura 2.120). Costul de comunicare este:
la toti bc = (ts + tw m + th (log p + 1)) log p:
arbore;CT
Tunul ( )

Comunicare personalizata unu-la-toti (dispersie de la un nod singu-


lar). Procesorul sursa are p mesaje unice pentru toate cele p procesoare din
sistem. Dualul este operatia de str^angere a informatiilor la un singur nod.
Diferenta dintre difuzarea unul-la-toti si dispersie se refera la continutul si
marimea mesajelor.
Comunicare personalizata unu-la-toti ^ntr-un inel. In rutarea SF (Figura
2.121) la ecare pas, procesorul sursa expediaza jumatate din mesaje la unul
dintre procesoarele sale vecine. In pasii urmatori, toate procesoarele av^and
mai mult dec^at un mesaj pastreaza mesajul destinat lor si avanseaza celelalte
mesaje la procesoarele vecine. Algoritmul necesita dp=2e pasi. La pasul 1,
procesorul sursa transmite p=2 mesaje de m cuvinte ecare. Apoi la pasul i,
1 < i  dp=2e; p=2 i + 1 mesaje de m cuvinte sunt transmise pe legaturi.
Comunicare personalizata unu-la-toti ^ntr-un tor. In rutarea SF (Figura
2.122), se face o rutare pe linie, apoi pe coloane, utiliz^ and structura de
inel. Fiecare mesaj trasmis pe linie este un grup de pp mesaje pentru
toate procesoarelep coloana coresepunz
p atoare
p unui procesor linie, astfel ^nc^at
( tor D;SF
Tlinie
2
= ts p=2 + tw m p(p=8 + p=4): In etapa a doua se aplica al-
)

goritmul comunicarii personalizate unu-la-tot


p i ^n inelele dep pe coloana pentru
toate coloanele, deci T tor D;SF
(
= ts p=2 + tw m(p=8 + p=4). Costul total
2 )

de comunicare este coloana


p p p
la toti pc = ts p + tw m( p + 1)(p=8 + p=4);
tor D;SF
Tunul( 2 )

208
Figura 2.122: Comunicare personalizata unu-la-toti ^ntr-un (tor,SF): (a)
Distributia initiala a datelor; (b) Distributia dupa comunicarea pe linii

Figura 2.123: Comunicare personalizata unu-la-toti ^ntr-un (hipercub,SF): (a)


Distributia initiala a mesajelor; (b) Distributia ^nainte de al doilea pas; (c)
Distributia ^nainte de al treilea pas; (d) Distributia nala a mesajelor
iar ^n cazul unui tor tri-dimensional
p3 p p3 p p3
la toti pc = 3ts ( p 1)=2 + tw m( p + p + 1)( p =8 + p=4):
tor D;SF 3 3
Tunul
( 3 ) 2 2

Comunicare personalizata unu-la-toti ^ntr-un hipercub. In rutarea SF


(Figura 2.123) complexitatea comunicarii este aceeasi ca si^n cazul comunicarii
toti-la-toti. In acest al doilea caz, ecare procesor receptioneaza m(p 1) cu-
vinte. In comunicarea personalizata unu-la-toti, procesorul sursa expediaza
m(p 1) cuvinte. Algoritmul are loc ^n log p pasi si dupa ecare pas, lungimea
mesajului este ^njumatatita. La pasul i, pnumai 2i procesoare expediaza
1

mesaje si ecare mesaj este de lungime 2 i m cuvinte. In total


log

Xp
log

la toti pc = (ts + 2 ) = ts log p + tw m(p 1):


(hipercub;SF ) p it m
Tunul log
w
i=1

Difuzare toti-la-toti (difuzare multi-nod). Toate p procesoarele initiaza


simultan o difuzare cu un mesaj diferit la ecare procesor. Dualul operatiei este
acumularea multi-nod. Metoda naiva pentru a efectua difuzarea toti-la-toti este
efectuarea de difuzari unul-la-toti de p ori. Fiecare procesor are informatii care
sunt expediate la toate celelalte procesoare. Exista p expeditori, p mesaje, p 1
receptori ai ecarui mesaj.
209
Figura 2.124: Difuzare tot i-la-toti ^n (inel, SF): (a) Schematic, pasii de la 1 la
5; (b) Pasul 1, 2 si 7
Exista mai multe aplicatii printre care operatiile matriceale, reducere, sume
pre xate. De exemplu, la multiplicarea matriceala C = AB presupunem ca
P (i; j ) detine A[i; j ]; B [i; j ]; C [i; j ]. Putem construi un algoritm naiv ^n care
P (i; j ) necesita A[i; :] si B [:; j ] pentru a calcula C [i; j ] si se face o difuzare
toti-la-toti a lui A pe linii si o difuzare toti-la-toti a lui B pe coloane.
Difuzare toti-la-toti ^n inel. In rutarea SF, un algoritm imediat este cel care
efectueaza p difuzari unul-la-toti independente, ce costa de p ori mai mult dec^at
o singura difuzare unul-la-toti. O solutie mai buna este aceea de a introduce
difuzarile ^ntr-un pipeline si efectuarea a p 1 runde de comunicatii cu vecinii
apropiati (Figura 2.124.a). La primul pas toate procesoarele expediaza propriile
mesaje la procesoarele vecine. In pasii urmatori, toate procesoarele vor avansa
mesajul receptionat la procesoarele vecine. Algoritmul are loc ^n p 1 pasi, iar
^n ecare pas un mesaj de m cuvinte este transmis pe legatura. Algoritmul nu
necesita legaturi bidirectionale. Toate legaturile ^ntr-o directie sunt ocupate la
ecare pas. In Figura 2.124.b, i(j ) eticheteaza al ilea pas si mesajul sursei j .
Timpul de comunicare este
la toti = (ts + tw m)(p 1):
inel;SF
(
Ttoti )

Difuzare toti-la-toti ^n tor. Utilizeaza algoritmul pentru inel pentru ecare
dimensiune (Figura 2.125). In cazul particular a unui tor bidimensional, exist p a
doua faze, una pentru linie, alta pentru coloana Tlinie ( 2tor D;SF
)
= (ts + tw m)( p
( tor D;SF = (t + t mpp)(pp 1), timpul total pentru operatie ind
1); Tcoloana
2 )
s w
p
la toti = 2ts ( p 1) + tw m(p 1);
(tor 2D;SF )
Ttoti
210
Figura 2.125: Difuzare toti-la-toti^n tor cu rutare SF pentru cazul 33: (a) Dis-
tributia initiala a datelor; (b) Distributia dupa difuzarea pe linii
iar ^n cazul tri-dimensional:
tor D;SF = 3t ( p
Ttoti s 3 p 1) + tw m(p 1):
( 3 )
la toti
Difuzare toti-la-toti ^n hipercub. Pentru rutarea SF se extinde algorit-
mul pentru tor ^n log p dimeniuni cu doua procesoare ^n ecare dimensiune.
Procedura necesita log p pasi. Fiecare comunicare are loc de-a lungul unei di-
mensiuni diferite a hipercubului ^n ecare pas (c^and lungimea mesajului este
dublata). La pasul i, se transmite un mesaj de lungime 2i m cuvinte. Costul
1

de comunicatie este:
Xp
log

la toti = (ts + tw m2i ) = ts log p + tw m(p 1):


(hipercub;SF )
Ttoti 1

i=1
Drept aplicatie se considera calculul sumei pre xate (Figura 2.126). Se pre-
supune ca cele p procesoare detin ecare numarul ni pentru i = 0; 1; : : : ; p 1.
La sf^arsitul algoritmului, al ilea procesor trebuie sa detina si = Pik nk .
Trecerea la rutarea prin sectionare ^n cazul hipercubului nu aduce =1

^mbunatatiri. O explicatie este aceea ca (p 1)mtw este o margine inferioara


(a problemei relativ la con gurarea retelei si algoritmul de rutare), deoarece
ecare procesor trebuie sa receptioneze (p 1)m cuvinte. In plus se observa ca
maparea algoritmului pentru hipercub la un inel cauzeaza congestia legaturilor
(Figura 2.127). Astfel nu exista algoritmi de difuzare toti-la-toti pentru inel si
tor care sunt mai buni cu rutarea CT dec^at SF (algoritmii de rutare SF pot
utilizati si pentru cazul rutarii CT).
Comunicare personalizata toti-la-toti (schimb total). Exista p expe-
ditori, p receptori, si p(p 1) mesaje distincte. O aplicatie imediata este
traspunerea matriceala.
Comunicare personalizata toti-la-toti ^n inel. In rutarea SF ecare procesor
expediaza p 1 mesaje la vecini. Figura 2.128 ilustreaza pasii schimbului total.
Algoritmul are p 1 pasi. La ecare pas, toate procesoarele retin un mesaj
destinat lor si avanseaza celelalte mesaje la procesoarele vecine. La pasul i,
p i mesaje de m cuvinte ecare sunt transmise pe o legatura. In primul pas
211
Figura 2.126: Suma pre xat a pe baza difuzarii toti-la-toti^n hipercub cu rutare
SF: (a) Distributia initiala; (b) Dupa primul pas; (c) Dupa al doilea pas;
(d) Distributia nala

Figura 2.127: Congestionarea canalului c^and pasul de comunicare din Figura


2.126.c este mapat pe un inel
se expediaza m(p 1) mesaje, ^n pasul doi, m(p 2) mesaje si asa mai departe.
Costul total al comunicarii este
p 1 
X p
la toti pc = (ts + tw m(p i)) = ts + tw m
2 (p 1):
(inel;SF )
Ttoti
i=1
Se considera varianta pentru rutarea CT. Intr-un schimb total, ecare pro-
cesor expediaza p 1 mesaje de m cuvinte ecare. Distanta medie pe care o
traverseaza un mesaj este (1+2+ : : : + p 1)=(p 1) = p=2. Tra cul total pen-
tru toate cele p procesoare pentru a efectua toate comunicarile toti-la-toti este
(p 1)m  p=2  p. Numarul total de canale de comunicare pentru un inel este p.
Deci, minimul timpului de transmitere pentru operatie este tw m(p 1)p=2 care
este timpul transmisiei pentru rutarea SF. Astfel algoritmul pentru rutarea SF
efectueaza cele p 1 expedieri ^n timpul minim. De aceea rutarea CT nu poate
aduce ^mbunatatiri.
Comunicare personalizata toti-la-toti ^n tor. Ca de obicei, ^n rutarea SF se
extinde schimbul total pentru cuplul (inel, SF) asupra ecarei dimeniuni. Este
necesar un pas de sortare ^ntre doua runde pentru organizarea datelor care
212
Figura 2.128: Comunicare personalizata toti-la-toti ^n (inel, SF)

Figura 2.129: Comunicare personalizata toti-la-toti ^n (tor2D, SF): (a) Prima
faza (b) A doua faza
necesita ^n mod uzual un timp mai mic dec^at timpul de comunicare. Figura
2.129 ilustreaza schimbul total. Exista doua faze, ecare incluz^and o sortare
si o difuzare ^n linie (sau coloan
a). Fiecare mesaj ^n algoritmul pentru inel ^n
fazele 1 si 2 este un grup de pp mesaje. In ambele faze, timpul de comunicare
este Tlinie=coloana
tor D;SF
( 2
= (ts + tw mp=2)(pp 1); ^n total
)

p
la toti pc = (2ts + tw mp)( p 1);
(tor 2D;SF )
Ttoti
iar ^n cazul unui tor tri-dimensional
p3
la toti pc = 3(ts + tw mp=2)( p 1):
tor D;SF
Ttoti ( 3 )

Observatia referitoare la rutarea CT pentru inel este valabila si ^n cazul
torului, adica rutarea prin sectionare pe un tor nu se poate efectua mai rapid
dec^at ^n cazul utilizarii rutarii stocheaza-si-avanseaza.
213
Figura 2.130: Comunicare personalizata toti-la-toti ^n (hipercub, SF):
(a) Distributia initiala a mesajelor; (b) Distributia ^nainte de al doilea pas;
(c) Distributia ^nainte de al treilea pas; (d) Distributia nala a mesajelor
Comunicare personalizata toti-la-toti ^n hipercub. In cazul rutarii SF
(Figura 2.130), algoritmul necesita log p pasi. Perechi de procesoare schimba
mesaje ^ntr-o dimensiune diferita la ecare pas. La orice pas, ecare procesor
detine p mesaje de m cuvinte ecare si p=2 mesaje sunt transmise pe o legatura.
Mesajele expediate de un procesor sunt mesajele destinate la procesoare de la
alte subcuburi conectate prin legaturi ^n dimensiunea curenta. Astfel,
la toti pc = log p(ts + tw mp=2)
hipercub;SF
Ttoti
( )

timpul de transmitere ne ind minimal, tw m(p 1).


Un algoritm mai rapid este cel oferit de rutarea CT. Se fac p 1 runde de
comunicare cu parteneri alesi pentru a garanta drumul liber de congestionari.
Nu exista rearanjari locale si nu este util pentru mesaje scurte. Algoritmul
pentru cazul rutarii prin sectionare (Figura 2.131) utilizeaza un algoritm de
schimb total pe perechi. La pasul i, procesoarele r si r  i schimba mesaje
destinate la ecare celalalt. La ecare pas, un procesor expediaza un mesaje
de m cuvinte. Astfel
la toti pc = (ts + tw m)(p 1):
hipercub;CT
Ttoti
( )

Deplasare circulara
Fiecare procesor expediaza un mesaj de marime m la un procesor unic. Un
exemplu este q-deplasarea circulara ^n care procesorul i expediaza un mesaj la
214
Figura 2.131: Comunicare personalizata toti-la-toti ^n (hipercub, CT)
procesorul (i + q)mod d unde 0 < q < p ^ntr-o masina cu p procesoare. Aplicatii
ale deplasarii circulare se gasesc de exemplu ^n operatiile matriceale.
In cazul unui inel, q-deplasarea circulara este intuitiva: este efectuata prin
minfq; p qg comunicari vecin-la-vecin.
Deplasare circulara ^n tor. Se considera un tor cu p procesoare cu identi-
catori numerotati pe linii si rutarea SF. Deplasarea ciclica poate realizata
^n doua etape.p Prima data ^ntreaga multime de date este deplasat a simul-
tan cu (qmod p) pasi de-a lungul liniilor, apoi deplasata cu bq=ppc pasi de-a
lungul coloanelor. La deplasarea pe linii, anumite date traverseaza legatura
care conecteaza procesoarele cu cea mai mica si cea mai mare eticheta de
pe linie. Aceste date trebuie deplasate printr-un pas aditional de-a lungul
coloanelor pentru a compensa distanta pp care au pierdut-o travers^and muchia
mentionata. In Figura 2.132 se considera exemplul unei 5-deplasari pe un tor
cu 16 procesoare. Se poate alege directia at^at pe linii c^at si pe coloane pentru
apminimiza numarul de pasi. De aceea, numarul de deplasari este marginit prin
b p=2c, la care corespunde
p
max = (ts + tw m)(2b p=2c + 1):
(tor 2D;SF )
Tdeplare

Deplasare circulara ^n hipercub. Consideram cazul rutarii SF. Se poate


mapa un inel cu 2d procesoare ^ntr-un hipercub d-dimensional: de exemplu, se
mapeaza procesorul i al inelului la procesorul j a hipercubului astfel ^nc^at j
este^n binar codul de d-biti Gray re ectat (GRC) a lui i; o proprietate a acestei
mapari este aceea ca oricare doua procesoare a ate la distanta 2i ^n inel sunt
separate de exact doua legaturi ^n hipercub, daca i > 0. Pentru a efectua o
q-deplasare, se reprezinta q ca suma de puteri distincte ale lui 2 unde numarul
de termeni din suma este egal cu numarul de unu din reprezentarea binara. De
exemplu, q = 5 = 2 + 2 . Deplasarea q-shift este realizata ^n s faze unde s
2 0

este numarul de puteri distincte ale lui 2. De exemplu o 5-deplasare poate


efectuata printr-o 4-deplasare si o 1-deplasare. Fiecare faza consta ^n doi pasi
de comunicare (except^and 1-deplasarea). Marginea superioara a costului de
215
Figura 2.132: O 5-deplasare pe un tor cu 16-procesoare: (a) Distributia initiala
a datelor; (b) Pas compensatoriu; (c) Deplasare pe coloane ^n al treilea pas;
(d) Distributia nala a datelor

Figura 2.133: Deplasare circular a ^n hipercub { exemplu pentru o 5-deplasare:


(a) Primul pas de comunicare; (b) Al doilea pas de comunicare; (c) Faza secunda
(1-deplasare); (d) Distributia nala a datelor
comunicare este:
hipercub;SF = (t + t m)(2 log p 1):
Tdeplare
( )
max s w
Operatii de sincronizare
Toate procesele ajung la un punct de sincronizare si apoi executia poate con-
tinua (Figura 2.134). Aceasta rutina cere ca toate procesele sa execute operatia,
sau altfel va apare un impas. Barierele sincronizeaza procesele:
barrier()

Operatii aritmetice globale


Calculeaza o valoare (sau un vector de valori) utiliz^and intrari de la toate proce-
soarele (de exemplu, suma globala, produsul global, maximul, minimul). Sunt
operatii cu tip (double, real, integer). Aceste rutine necesita ca toate pro-
cesele sa execute operatia, sau va apare un impas (Figura 2.135). De exemplu:
dgsum (x, n_element, lucru)

Operatiile de reducere combina datele de la mai multe procese pentru a


produce un singur rezultat. Reducerea poate reprezentata printr-un algo-
ritm pe un arbore. De exemplu, daca dorim ^nsumarea numerelor de la toate
216
Figura 2.134: (a) Bariere; (b) O analogie

Figura 2.135: (a) Insumare; (b) Operatii de reducere

Figura 2.136: Reducere: (a) La nodul 0; (b) La toate nodurile


nodurile la un nod se foloseste o structura ca cea din Figura 2.136.a (reducere
la nodul 0). Daca dorim sa efectuam suma astfel ^nc^at toate nodurile sa ter-
mine cu un rezultat, atunci fenomenul este asemanator celui din Figura 2.136.b
(reducere la toate nodurile). Alte forme de reducere includ gasirea maximului
sau minimului unei multimi de numere peste toate procesele. Aceste reduceri
sunt logaritmice ^n numarul de noduri, adica, timpul de rulare este aproxima-
tiv proportional cu log n. Pe hipecuburi, algoritmii logaritmici implica numai
comunicatii ^ntre procesele vecine.
217
218
3. Algoritmi paraleli
3.1 Constructia algoritmilor paraleli
O problema poate de nita a ind paralelizabila daca poate rezolvata cu
at^at mai rapid cu c^at numarul de procesoare care o rezolva este crescut. O
problem a este paralelizabila daca poate rezolvata ^ntr-un timp polilogaritmic
O(logk n) unde n este dimensiunea problemei, iar k este un numar natural, cu
un numar polinomial de procesoare (problema apartine clasei NC).
Gradul de paralelism este teoretic numarul maxim de operatii aritmetice
ce sunt independente si pot executate concurent. In implementarea pe un
procesor vectorial, pentru care operanzii sunt de niti ca vectori, este lungimea
liniei de procesare. In implementarea pe un masiv de procesoare, este egal cu
numarul de operanzi prelucrati ^n paralel.
3.1.1 Reteta unui program paralel
Se alege paradigma care este cea mai naturala pentru problema. Se scrie un
program utiliz^and metoda cea mai naturala pentru acea paradigma. Daca
rezulta un program care nu este acceptabil ^n e cienta, acesta este transfor-
mat metodic ^ntr-o versiune mai e cienta prin comutarea de la o metoda mai
naturala la una mai e cienta. In dezvoltarea unui cod paralel mai performant
dec^at un cod secvential dat se pot utiliza comenzile de tip pro l (din Unix de
exemplu) pentru a identi ca portiunile de calcul intensiv ale codului secvential
si trebuie pornit de la un cod paralel simplu usor de comparat cu codul serial.
Rezolvarea unei probleme poate avea mai multe solutii de paralelizare; solutiile
paralele cele mai bune pot sa difere de cele mai bune secventiale.
Atributele unui algoritm sau software paralel bun sunt concurenta, scala-
bilitatea, localitatea si modularitatea. Concurenta este abilitatea de a efectua
mai multe sarcini simultan. Scalabilitatea se refera la elasticitatea la cresterea
numarului de procesoare. Localitatea se exprima printr-o rata ^nalta a ac-
cesurilor la memoria locala fata de cele la distanta. Modularitatea se refera la
abilitatea de descompunere a unor sarcini complexe^n unele mai simple. Temele
^n metodologia de design sunt independente de masina, precum concurenta, sau
speci ce masina, precum localitatea.
Trei aspecte trebuie considerate la designul unui algoritm paralel: de-
scompunerea (divizarea aplicatiei ^ntr-o multime de procese si date), ma-
pare (punerea aplicatiei pe o multime de procesoare), reglare (obtinerea
performantei). Incarcarea calculului trebuie echilibrata, rata dintre comunicare
si calcul trebuie minimizata, fractia secventiala a programului trebuie redusa
si scalabilitatea este dezirabila.
Pregatirea aplicatiilor pentru procesarea paralela presupune analiza algo-
1 Rezumat: Un program paralel trebuie s a e e cient, scalabil, modular, cu o ^ncarcare
echilibrata si comunicari reduse. Conditiile de ^ndepliniere a acestor cerinte sunt adesea
contradictorii.

218
Figura 3.1: Atingerea performant ei ^n calculul paralel: perspectiva centrata pe
procesor (dreapta) si perspectiva centrata pe software (st^anga)
ritmilor, adoptarea unei strategii I/O (sistem de siere comun sau distribuit),
maparea pe arhitectura paralela (alocare structurata precum ^n mentinerea
vecinilor apropiati, sau aleatoare), echilibrarea ^ncarcarii (statica sau di-
namica). Analiza algoritmului presupune exploatarea paralelismului functional
pe c^at posibil (structura bloc, proceduri decuplate), identi carea operatiilor
globale care exploateaza arhitectura paralela (schimb global, suma, minim,
maxim) si considerarea de algoritmi alternativi (rezolvitori iterativi sau directi).
Adesea cerintele primordiale asupra unui program, precum echilibrarea
^ncarcarii, comunicarile reduse, sau surplus indus de paralelism c^at mai mic,
intra ^n con ict (Figura 3.1). Astfel ^ncarcarea balansata necesita sarcini cu
granulatie na si asignare dinamica sau aleatoare. Reducerea comunicarii pre-
supune utilizarea unei granulatii grosiere de sarcini si o descompunere astfel
^nc^at sa e posibila exploatarea localitatii (de preferat nu dinamic sau aleator).
Transferurile mari amortizeaza surplusul indus de paralelism si latenta. Elimi-
narea pe c^at posibil a surplusului indus de paralelism presupune de asemenea
o granulatie grosiera si o asignare simpla.
Exprimarea paralelismului poate implicita (compilatorul extrage parale-
lismul din cod ^n limbajele bazate pe uxul de date), sau explicita (utilizatorul
speci ca paralelismul; ^n Fortran prin doall, ^n Linda prin in si out, ^n PVM
prin transfer de mesaje).
3.1.2 Paralelism ^n rezultate, agenda sau specialist
Paralelism ^n rezultate. Se ia ^n considerare produsul nal (rezultatele).
Paralelismul este obtinut de nind procesele care calculeaza toate elementele
rezultatului simultan. Daca elementele structurii de date rezultat sunt inde-
pendente, atunci toate calculele pornesc simultan si sunt efectuate ^n paralel.
Este posibil ca anumite elemente sa nu poata calculate p^ana alte valori nu
sunt cunoscute { sunt pornite calcule pe toate elementele, dar unele calcule
2 Rezumat: Paralelismul poate exploatat ^n cazul unor operatii pe o cantitate mare de
date sau ^n cazul nor sarcini numeroase, similare sau speciale.

219
sunt blocate p^ana valorile necesare sunt disponibile. Aceasta este o abordare
buna ^n cazul problemelor cu organizare predictibila si inter-dependenta.
Un exemplu pentru abordarea paralelismului din punctul de vedere al rezul-
tatelor este gasirea tuturor numerelor prime de la 2 la n, av^and ca rezultat o
colectie de perechi [numar, valoare de adevarat la ^ntrebarea "este prim?"]. Se
poate crea un proces pentru ecare pereche, ce testeaza daca numarul nu este
divizibil cu unul mai mic dec^at radacina sa patrata. Programul principal doar
seteaza un proces pentru ecare numar si colectioneaza rezultatele.
Paralelism ^n agenda. Este descris ^n termenii agendei de activitati care
trebuie completate pentru rezolvarea problemei. Exista o colectie de sarcini
posibil inter-dependente ce sunt executate de o colectie de procese lucratori,
ecare trat^and o sarcina. Sarcinile se a a ^ntr-o rezerva din care lucratorii
extrag noi sarcini p^ana c^and problema este rezolvata, precum ^ntr-o ferma cu
sarcini, ^nsa cu dependente de date ^ntre sarcini.
Un exemplu pentru abordarea din punctul de vedere al paralelismului ^n
agenda este umplerea unui vector cu numere prime ^n ordine crescatoare { va
realizata de un proces principal; o sarcina a unui proces lucrator consta ^n a de-
termina daca numarul este prim, iar ecare lucrator executa mai multe sarcini,
rezultatele ind returnate la programul principal sub forma unor perechi ca
mai sus. Deoarece descoperirea numerelor prime mari depinde de cunoasterea
numerelor prime mai mici, sarcinile sunt asignate ^ntr-o ordine crescatoare.
Paralelism specializat. Se refera la cooperarea dintre colectii de lucratori
specializati care rezolva ^n colectiv o problema. Fiecare lucrator efectueaza
operatiile sale specializate pe date partajate. Toti lucratorii pornesc simultan,
dar unii pot sa astepte, depinz^and de restrictiile naturale impuse de problema.
Este indicat pentru strategia banda-rulanta.
Un exemplu pentru abordarea paralelismului specializat este implementarea
ciurului lui Eratosthenes drept pipeline. Ficare proces este un specialist
^n scoaterea multiplilor unui numar prim particular. In plus, un specialist
genereaza numerele de la 2 la n. Se genereaza specialisti ai ciurului, dinamic,
la cerere. Se genereaza ca rezultat perechi de forma [i,al i-lea numar prim].
Transferul de mesaje ^ntre vecini se face prin mesaje de tipul [dest,seq_no],
unde dest este pozitia ciurului receptor ^n pipeline, iar seq_no este pozitia ^n
secventa de mesaje la acel ciur. De exemplu, al 4-lea ciur va receptiona mesaje
de forma [4, 1], [4, 2], ^n aceasta ordine si va pasa mesaje [5, 1], [5, 2], etc.
3.1.3 Tehnici algoritmice
Un avans major^n algoritmii paraleli^n ultimele doua decenii a fost identi carea
tehnicilor algoritmice fundamentale. Unele tehnici sunt de asemenea utilizate
la algoritmii secventiali, dar joaca un rol proeminent ^n algoritmii paraleli, pe
c^and altele sunt unice pentru paralelism.
Cele mai importante tehnici sunt divide-et-impera (dezbina-si-domina), ma-
nipularea pointerilor ^n paralel si randomizarea. Alte tehnici utile sunt cele
pentru partitionarea datelor ^ntre procesoare, pentru reducerea comunicarilor,
pentru dispersare, pentru echilibrarea ^ncarcarii ^ntre procesoare si maparea
3 Rezumat: Cele mai importante tehnici ^n elaborarea algoritmilor paraleli sunt divide-et-
impera, manipularea pointerilor ^n paralel, alegerea aleatoare si programarea dinamica.

220
Tabelul3.1: Exemple pentru tehnica divide-et-impera
Sortare prin intercla- Sortare rapida Multiplicare
sare matriceala
Trivial: lung.lista=1 lung.lista=1 matrice 1  1
Easy Solve: nimic nimic multiplicare scalara
Divide: ^mparte lista ^n doua partitionare ^n liste 8 blocuri de multipli-
de nr. mai mici/mari care
fata de primul elem.
Combine: interclaseaza sublis- concatenarea 4 adunari matriceale
tele sortate sublistelor
adreselor la memorie, sau tehnici iterative precum cele pentru rezolvarea sis-
temelor liniare (^n locul metodelor directe).
Divide-et-impera. Este o paradigma naturala pentru algoritmii paraleli.
Divizarea produce un arbore al problemei. Dupa divizarea problemei ^n doua
sau mai multe subprobleme, subproblemele sunt rezolvate ^n paralel. In mod
tipic subproblemele sunt rezolvate recursiv si astfel urmatorul pas de divizare
conduce la mai multe sub-probleme de rezolvat ^n paralel. De exemplu, sa
presupunem ca dorim sa rezolvam problema ^nvelitorii convexe a unei multimi
de n puncte din plan (adica cel mai mic poligon convex care ^nchide ^n interior
toate punctele). Aceasta problema poate rezolvata prin ^mpartirea punctelor
^n n=2 cele mai din st^anga si n=2 cele mai din dreapta, gasirea recursiva a
^nchiderilor convexe a ecarei submultimi ^n paralel, si combinarea celor doua
^nchideri. Divide-et-impera s-a dovedit a una dintre tehnicile cele mai puter-
nice pentru rezolvarea problemelor^n paralel cu aplicatii de la sisteme liniare la
gra ca pe calculator si de la factorizarea numerelor mari la simularea miscarii
corpurilor ceresti.
In cazul unei aplicari secventiale a tehnicii, structura programului cores-
punzatoare este asemanatoare urmatoarei secvente:
Solve(P:problema) return rezultat {
if Trivial(P) then
return(Easy_Solve(P))
sub_probs := Divide(P);
for i := 1 to |sub_probs| do
sub_solution[i] := Solve(sub_probs[i]);
return(Combine(sub_solution)) }
Rezolvarea unor probleme diferite este realizata prin utilizarea de de nitii
speci ce pentru Trivial, Easy_Solve, Divide, Combine. Se considera ^n
Tabelul 3.1 c^ateva exemple: sortare cu interclasare, sortare rapida, multipli-
care matriceala. In cazul multiplicarii a doua matrice A  ; B  rezulta
(2 2) (2 2)
C  (8 multiplicari si 4 adunari):
(2 2)

C =A B +A B ; C = A B +A B
11 11 11 12 21 12 11 12 12 22
C =A B +A B ; C = A B +A B
21 21 11 22 21 22 21 12 22 22

221
Presupun^and ca ecare divizare produce a probleme de dimensiune 1=b din
original, si cac divizarea si combinarea pe o problema de marime n necesita
un timp O(n ), atunci performanta secvent iala este dat de timpul secvential
de nit recursiv TS (n) = aTS (n=b) + nc. Solutia ecuatiei recursive este
O(n b a ); daca logb a > c
( log

TS (n) = O(nc ); daca c > logb a


O(nc log n); daca c = logb a
De exemplu, ^n cazul sortarii prin interclasare a = 2; b = 2; c = 1, deci TS (n) =
O(n log n), iar^n cazul multiplicarii matriceale a = 8; b = 2; c = 1, deci TS (n) =
O(n ) (impracticabil ^n cazul sortarii rapide).
3

Timpul paralel este dominat de drumul comunicarilor la ecare miscare de


la radacina la frunze (pe arborele problemei) si ^napoi:
n n n
TP (n) = D(n) + Tp ( ) + D( ) + Tp ( ) +    + E (1)+
b b 2 b
+TR(1) + C (1) +    + TR(b) + C (b) + : : : + C ( nb );
unde D(n) este timpul pentru divizare a problemei de marime n, Tp(n) este
timpul pentru transmiterea problemei de marime n, TR(n) este timpul de
transmitere a rezultatelor problemei de marime n, C (n) este timpul de com-
binare a rezultatelor problemei de marime n, iar E (1) este timpul de re-
zolvare a procedurii Easy-solve. Raportul crucial este cel dintre Tp; TR si
timpul de calcul secvential (nu mai are sens pierderea timpului pentru dis-
tribuirea unei probleme ^n locul rezolvarii directe). La sortarea prin inter-
clasare, D(n) = O(1); C (n) = O(n); Tp(n); TR (n) = O(n) iar TP (n) = O(n)
(versus O(n log n) secvential), adica o ^mbunatatire redusa. La multipli-
carea matriceala, D(n) = O(1); C (n) = O(n ); Tp(n); TR(n) = O(n ); deci
2 2

TP (n) = O(n ) (versus n secvential), adica o ^mbunatatire substantiala.


2 3

Factorii care complica aplicarea tehnicii divide-et-impera sunt arborii


neregulati ai problemei (de exemplu la sortare rapida), D si C neregulate,
raportul real calcul/comunicare, comportarea reala timp/dimensiune mesaj.
In asemenea conditii o predictie a performantei devine imposibila, iar alocarea
optimala este greu de calculat, chiar daca sunt su ciente detalii.
Tehnica este asemanatoare fermei de sarcini.
Randomizare (aleator). Utilizarea numerelor aleatoare este ambigua ^n al-
goritmii paraleli. Intuitiv, alegerea aleatoate este utila deoarece permite proce-
selor sa ia decizii locale, care cu o probabilitate mare conduc la decizii globale
bune. De exemplu, sa presupunem ca se sorteaza o colectie de chei ^ntregi.
Acest deziderat poate realizat prin gruparea cheilor pe intervale de ^ntregi
care nu se suprapun, grupurile contin^and aproximativ acelasi numar de chei,
si sortarea ^ntr-o prima faza pe grupuri. Alegerea aleatoare este utilizata pen-
tru determinarea marginilor intervalelor. Fiecare proces selecteaza o mostra
aleatoare dintre cheile sale. Apoi toate cheile selectate sunt sortate, ^n nal
ind utilizate drept margini de intervale. Asemenea mostre aleatoare sunt des
utilizate ^n algoritmi pentru geometria computationala, grafuri si compararea
sirurilor. Alte utilizari ale alegerii aleatoare includ ruperea simetriei, echili-
brarea ^ncarcarii si algoritmii de rutare.
222
Figura 3.2: (a) Problema celui mai scurt drum; (b) Cazul general
Manipularea pointerilor ^n paralel. Majoritatea tehnicilor secventiale
pentru tratarea listelor, arborilor si grafurilor nu se translateaza usor ^n
tehnici paralele. De exemplu tehnici precum traversarea elementelor unei liste
^nlantuite, vizitarea nodurilor unui arbore ^n postordine, sau efectuarea unei
traversari prima data ^n ad^ancime a unui graf par a inerent secventiale. Din
fericire ecare dintre aceste tehnici pot ^nlocuite cu tehnici paralele e ciente.
Aceste tehnici paralele includ: saritura pointerilor, tehnica turului Euler, de-
scompunerea ^n spic, sau contractia grafului. De exemplu, o modalitate de
etichetare a ecarui nod a unei liste de noduri (sau arbore) cu eticheta ultimu-
lui nod (sau radacina), este aceea de a utiliza saritura pointerului (cu aplicatii
de exemplu ^n maparea mai multor procese la procesoare). In ecare pas de
salt a pointerului, ecare nod, ^n paralel, ^nlocuieste pointerul sau cu acela al
succesorului sau (sau parinte). Daca n este numarul de noduri, dupa log n pasi,
ecare nod pointeaza la acelasi nod, capatul listei (sau radacina arborelui).
Programarea paralela dinamica. Programarea dinamica (DP) este o
tehnica comuna pentru rezolvarea unei varietati mari de probleme precum plan-
i care, editarea sirurilor sau controlul inventarului. DP vede o problema ca
o colectie de subprobleme independente. Rezolva subproblemele si utilizeaza
rezultatele pentru a rezolva subprobleme mai mari p^ana c^and problema^ntreaga
este rezolvata. Solutia unei subprobleme este exprimata ca o functie de solutiile
uneia sau mai multor subprobleme de la nivelul precedent.
Exemplul 1: problema drumului celui mai scurt drum ^ntr-un graf cu pon-
deri. Nodurile sunt numerotate 0; : : : ; n 1. Fie c(i; j ) costul ^ntre nodul
i si nodul j . Daca nu exista o muchie ^ntre cele doua noduri se considera
c(i; j ) = 1. Fie f (x) costul drumului de cost minim de la nodul 0 la nodul x.
In formularea DP este:

f (x) = 0min; daca x = 0
0 jx ff (j ) + c(j; x)g; daca 1  x  n 1
Problema este rezolvata c^and calculam f (n 1). Se considera cazul din Figura
3.2.a. Pentru a gasi f (4), trebuie calculate mai ^nt^ai f (3) si f (2): f (4) =
minff (3)+ c(3; 4); f (2)+ c(2; 4)g. Mai departe solutia lui f (3) depinde de f (1)
223
Figura 3.3: (a) De nirea pro tului maximal ^n problema rucsacului; (b) Exem-
plu pentru problema LCS
si f (2), solutiile lui f (1) si f (2) depind de f (0), solutia lui f (0) este cunoscuta,
deci solutiile lui f (1); f (2) si f (3) pot gasite.
In general, daca r este solutia unei probleme care este compusa din sub-
problemele x ; x ; : : : ; xl , atunci
1 2

r = g(f (x ); f (x ); : : : ; f (xl ))
1 2

g ind functia de compunere a carei natura depinde de problema (Fig. 3.2.b).


Exemplu 2: problema rucsacului. Se considera un rucsac de capacitate c si
o multime de obiecte numerotate 1; 2; : : : ; n. Fiecare obiect i are o greutate wi
(^ntreg) si un pro t pi (^ntreg). Se cauta un vector de control V = (v ; : : : ; vn )
astfel^
Pn nc^ at vi este 1 daca obiectulPni trebuie pus^n rucsac si 0 altfel, si astfel^nc^
at
1

i wi vi  c si P = max V i pi vi . O abordare posibila este ^ncercarea


tuturor posibilitatilor cu 2n evaluari. In formularea DP a problemei se de neste
=1 =1

F (i; x) pro tul maxim pentru un rucsac de capacitate x ce utilizeaza numai


obiectele f1; 2; : : : ; ig (Figura 3.3.a). Se cere calculul lui F (n; c). Putem formula
F (i; x) astfel:
(
0; daca x  0; i = 0
F (i; x) = 1; daca x < 0; i = 0
maxfF (i 1; x); F (i 1; x wi ) + pig; 1  i  n.
In cazul calculelor secventiale, complexitatea este O(nc). In formularea pa-
ralela pe un PRAM CREW cu c procesoare prin asignarea ecarei coloane
la un proces si timp constant ^n citire si adunare, complexitatea este O(n);
deci formularea este cost-optimala. In cazul unei implementari pe un hipercub
cu c procesoare, se distribuie ecare coloana a tabelului la c^ate un procesor.
Fiecare procesor stocheaza local greutatile si pro turile pentru toate obiectele.
Procesorul Pr trebuie sa calculeze F (j; r) ^n a j a iteratie: F (j 1; r) este
disponibil, dar F (j 1; r wj ) trebuie ^naintat de la alt procesor. Aceasta
1

corespunde la o operatie de wj -deplasare. Timpul operatiei de deplasare este


O(ts + tw + th log c). Daca timpul de ^nsumare si maximizare este tc , atunci
ecare iteratie necesita O(tc + ts + tw + th log c). Deoarece sunt necesare n
iteratii, timpul paralel este O(n log c).
224
Figura 3.4: Linie de asamblare: (a) Cazul secvential; (b) Cazul pipeline
Exemplul 3: problema celei mai lungi subsecvente comune. O subsecventa
a unei structuri este formata prin eliminarea unor intrari din structura. De
exemplu daca A = (c; a; d; b; r; z), atunci (a; b; z) este o subsecventa a lui A, pe
c^and (a; c; z) si (a; d; l) nu sunt.
Problema celor mai lungi subsecvente comune (LCS) este urmatoarea: date
doua secvente A = (a ; : : : ; an) si B = (b ; : : : ; bm), se cere determinarea celei
mai lungi subsecvente care este subsecventa at^at pentru A c^at si pentru B. De
1 1

exemplu, daca A = (c; a; d; b; r; z) si B = (a; s; b; z), atunci LCS=(a; b; z).


Fie F (i; j ) lungimea LCS a primelor i elemente ale lui A si primele j ele-
mente ale lui B. Obiectivul problemei este calculul F (n; m). Utiliz^and formu-
larea DP, se poate exprima F (i; j ) astfel:
(
0; daca i = 0 sau y = 0
F (i; j ) = F (i 1; j 1) + 1 daca i; j > 0 si xi = yj
maxfF (i; j 1); F (i 1; j )g daca i; j > 0 si xi 6= yj
In algoritmul secvential se calculeaza toate intrarile ^n O(nm). Pentru for-
mularea paralela, presupunem ca se foloseste un PRAM CREW cu n proce-
soare astfel ^nc^at ecarui procesor ^i este asignata o coloana din tabelul lui F .
Intrarile ^n tabel sunt calculate ^n ordinea diagonalelor: ^n reprezentarea din
Figura 3.3.b din coltul st^anga-sus ^nspre coltul dreapta jos. Fiecare diagonala
poate calculata ^n timp constant; cum exista n + m 1 diagonale, timpul
paralel este estimat la O(n + m).
3.1.4 Clasi carea algoritmilor
Cheia atingerii performantei este^ntelegerea interactiunii^ntre algoritm si arhi-
tectura. Astfel o ^mbunatatire semni cativa ^n performanta poate obtinuta
prin potrivirea algoritmului la arhitectura si viceversa.
Algoritmii paraleli pentru masinile MIMD pot divizati ^n 3 categorii:
algoritmi pipeline, algoritmi asincroni sau relaxati, si algoritmi partitionati sau
paraleli ^n date.
Algoritmi pipeline. Un algoritm pipeline implica o multime ordonata de
procese^n care iesirea unui proces este intrarea altuia. Intrarea primului proces
este intrarea algoritmului. Iesirea ultimului proces este iesirea algoritmului.
Datele se scurg prin linia de procesare, efectu^andu-se operatii asupra lor de
catre ecare proces. Acesta este un exemplu de paralelism algoritmic.
De exemplu se considera o linie de procesare de 3 pasi, A, B si C , ecare de
timp unitar, pentru asamblarea unui obiect (Figura 3.4). Pentru producerea a
n obiecte este necesar un timp de 3n unitati. In cazul banda rulanta, ^n primul
4 Rezumat: Algoritmii pentru sistemele multi-procesoare ce pot executa simultan
instructiuni distincte sunt clasi cati ^n algoritmi tip linie de procesare, asincroni sau
partitionati.

225
Figura 3.5: Descompunere ^ n cazul metodei Newton-Raphson de rezolvare a
ecuatiei neliniare f (x) = 0
pas ^n timp A opereaza asupra lui w , ^n pasul doi, A asupra lui w si B asupra
lui w , ^n pasul trei A asupra lui w , Basupra lui w , C asupra lui w , etc.
1 2

Astfel n produse sunt asamblate pe linie ^n n pasi unitari ^n timp. In general,
1 3 2 1

daca m este numarul de pasi, ecare necesit^and un timp T , iar n este numarul
de obiecte ce trebuie produse, atunci complexitatea secventiala este O(mnT ),
iar ^n cazul paralel O((n + m 1)T ). Daca T = 1; m = 100 si n = 10 , atunci 6

timpul secvential este aproximativ 10 , iar cel pipeline 1000099, iar accelerarea
8

Tsec =Tpipe  100 = m.


Paralelism relaxat. Apare c^and nu exista dependente explicite ^ntre pro-
cese. Algoritmii relaxati nu asteapta intrari de date, ci utilizeaza datele cele
mai recente.
De exemplu, se presupune ca avem 2 procese, A si B. A produce o secventa
de numere ai; i = 1; 2; : : :, iar B citeste ai si efectueaza anumite calcule pentru
a produce Fi . Sa presupunem ca B ruleaza mai repede dec^at A. In modul
sincron, A produce a si ^l paseaza lui B, care calculeaza F , A produce a si
^l paseaza lui B, care calculeaza F etc. In modul asincron, A produce a si-l
1 1 2

paseaza lui B, care calculeaza F , A calculeaza a si-l paseaza lui B, ^nsa B nu


2 1

asteapta asa ca este posibil sa utilizeaze a pentru a calcula F , adica F = F .
1 2

Algoritmii asincroni tin procesoarele ocupate. Problema principala este


1 2 1 2

di cultatea analizei algoritmului (de exemplu un algoritm care este cunoscut


ca ofera iteratii convergente,^n modul asincron poate avea iteratii neconvergte).
De exemplu, metoda Newton-Raphson este o metoda iterativa pentru a
rezolva ecuatii neliniare f (x) = 0, formula iterativa ind
f (xn )
xn = xn
+1
f 0 (xn )
Se genereaza o secventa de aproximatii ale solutiei, pornind de la o val-
oare initiala x . Sa presupunem ca descompunerea se face ^n 3 procese care
efectueaza urmatoarele: dat x, procesul P calculeaza f (x) ^n timp t , si ex-
0

pediaza aceasta valoare lui P , dat y, P calculeaza f 0(y) ^n t si expediaza
1 1

aceasta valoare lui P , iar, date a, b, si c, P calculeaza d = a b=c si daca
3 2 2

jd aj > ", nivelul de eroare admis, atunci d este expediat lui P si P , altfel
3 3

d este iesirea algoritmului (Figura 3.5).


1 2

In modul serial, P calculeaza f (xn ), apoi P calculeaza f 0(xn ), apoi P


calculeaza xn . Timpul necesar unei iteratii este t + t + t . Daca sunt
1 2 3

necesare k iteratii, atunci timpul total secvential este k(t + t + t ).


+1 1 2 3
1 2 3

226
Tabelul 3.2: O executie asincrona a metodei Newton-Raphson relaxate
Timp P 1 P P 2 3
1 C0 C0 {
2 f (x ) C0 0 {
3 { f 0 (x ) { 0
4 { { x = x f (x )=f 0(x )1 0 0 0
5 C1 C1 {
6 f (x ) C1 1 {
7 { f 0 (x ) x = x f (x )=f 0(x )
1 2 1 1 0
8 C2 C2 x = x f (x )=f 0(x )3 2 1 1
9 f (x ) C2 2 {
10 C3 f 0(x ) x = x f (x )=f 0(x )
2 4 3 2 1
11 f (x ) C4 3 x = x f (x )=f 0(x )5 4 2 2
12 C5 C4 x = x f (x )=f 0(x )6 5 3 2

In modul paralel sincron, P si P calculeaz a f (xn) si f 0(xn ) simultan, si
c^and ambele termina, valorile lui f (xn) si f (xn ) sunt utilizate de P pentru a
0
1 2

gasi xn . Timpul per iteratie este max(t ; t ) + t , iar daca sunt necesare k
3

iteratii, atunci timpul total este k(max(t ; t ) + t ).


+1 1 2 3

In modul paralel asincron, P si P ^ncep calculele de^ndata ce receptioneaza


1 2 3

o noua valoare de intrare de la P . P calculeaza o noua valoare de ^ndata ce


1 2

receptioneaza o noua intrare de la e P e P . De exemplu daca t = 2; t = 3


3 3

si t = 1, atunci este posibila o derulare a calculelor conforma cu Tabelul 3.2.


1 2 1 2

Ci indica faptul ca procesorul utilizeaza xi ^n calculele sale. Timpul per iteratie
3

este de cel mult min(t ; t ) + t , dar se poate apropia de limita inferioara t .


Nu se poate totusi estima numarul de pasi, pentru ca metoda este schimbata
1 2 3 3

^ntr-una mai lenta (este posibil chiar ca iteratiile sa nu e convergente).


3.1.5 Etapele crearii unui program paralel
Se presupune date o problema si un algoritm secvential de rezolvare. Proble-
mele sunt identi carea sarcinilor care pot realizate ^n paralel, partitionarea
sarcinilor si eventual a datelor ^ntre procese, managementul accesului la date,
comunicare si sincronizare. Sarcinile implica calcule, acces la date si I/O. Se
cauta obtinerea unei acceleratii c^at mai mari.
O sarcina (sau task), unitatea de baza a concurentei, este o piesa arbi-
trara de lucru nedescompus ^n calcul paralel care este executata secvential,
concurenta ind ^ntre taskuri (de exemplu ^ntre particule din modelul Barnes-
Hut sau o raza dintr-un grup de raze ^n metoda drumului optic).
Un proces (sau thread, r de control) este o entitate abstracta care
efectueaza sarcinile asignate lui printr-un mecanism de asignare. Procesele
5 Rezumat: Un program paralel este creat urm arind urmatoarele etape: descompunerea re-
zolvarii problemei date ^n sarcini si gruparea acestora ^n procese, determinarea dependentelor
dintre procese si analiza optimalitatii partitionarii, atribuirea proceselor la procesoarele unui
calculator paralel.

227
Figura 3.6: Pasi ^n crearea unui program paralel: descompunerea, asignare,
orchestrare si mapare
comunica si se sincronizeaza pentru a-si efectua sarcinile.
Procesorul este un motor zic pe care sunt executate procesele. Procesele
virtualizeaza masina pentru programator (prima data se scriu programe ^n
termenii proceselor, apoi acestea sunt mapate la procesoare).
Etapele care se disting ^n designul unui algoritm paralel (Figura 3.6) sunt:
P: partitionare, etapa ^n care problema este divizata ^n sarcini, se recunosc
oportunitatile pentru executie paralela, se ignora detaliile speci ce masi-
nii si se stabilesc procesele ce efectueaza sarcinile; subetapele sunt:
D: identi carea concurentei si descompunerea problemei ^n sarcini con-
sistente,
A: de nirea asignarii sarcinilor (si datelor) la procese.
O: orchestrarea dependentelor prin:
C: identi carea comunicarilor pentru a coordona executia sarcinilor,
G: controlul granularitatii, evaluarea costului programului paralel bazat
pe designul (P) si (C) cu eventuala revenire la etapele anterioare
pentru alte combinari ale sarcinilor ^n procese pentru a ^mbunatati
performanta.
M: maparea statica sau dinamica a proceselor la procesoare cu maximizarea
utilizarii procesoarelor.
Designul nu este ^n mod necesar un proces secvential ind posibile ^ntoarceri
la etapele anterioare. Scopurile ecarei etape sunt detaliate ^n Tabelul 3.3.
Descompunere. Calculule (sau datele) sunt^mpartite^n bucati mici, sarcini;
de exemplu ^n problema evolutiei unui grup de obiecte ceresti, o sarcina poate
reprezenta calcul fortei de atractie datorate unei obiect asupra altui obiect. Se
identi ca concurenta si se decide la ce nivel va exploatata. Concurenta poate
de nita static sau poate varia dinamic. Poate sa depinda de dimensiunea
problemei sau de datele particulare de intrare. Numarul de sarcini trebuie sa
e su cient pentru a mentine un rang de procesoare ocupat, dar nu prea multe
228
Tabelul 3.3: Scopurile pasilor ^n procesul de paralelizare
Pas Depinde Scopuri ^n atingerea performantei
arhitect.?
Decompunere nu expune concurenta su cienta dar nu prea multa
Asignare nu echilibrarea ^ncarcarii, reduce volumul comuni-
carii
Orchestrare da reduce comunicarile via localitatea datelor, re-
duce costurile de comunicare si sincronizare, re-
duce serializarea la resursele partajate, plani-
ca procesele pentru satisfacerea dependentelor
Mapare da pune procesele^nrudite pe acelasi procesor daca
este necesar si exploateaza localitatea si topolo-
gia retelei
(se stabileste si o limita superioara a numarului de procesoare utile).
Asignare. Se speci ca mecanismul de divizare al sarcinilor ^ntre procese; de
exemplu, calcul tuturor fortelor ce actioneaza asupra unui obiect ceresc.
Mecanismul de divizare ^n procese poate o partitionare functionala, un
mecanism structural, sau o descompunere a datelor. In primul caz se asigneaza
aspecte logice distincte ale sarcinilor la diferite procese (de exemplu, pipeline).
In cazul al doilea se asigneaza iteratii ale unor cicluri paralele conform unor
reguli simple (de exemplu un proces primeste iteratiile de la jn=p la (j +1)n=p
1); de obicei taskurile se a a ^ntr-o coada (sau bol, piscina) din care se hranesc
procesele. In cazul al treilea, datele problemei au o descompunere naturala
astfel ^nc^at se asigneaza sarcini la regiuni ale datei (de exemplu parti ale unui
sistem zic care este simulat). Scopul este echilibrarea ^ncarcarii sarcinilor ce
permite ulterior o orchestrare e cienta.
Partitionarea (descompunerea si asignarea) este uzual independenta de arhi-
tectura sau modelul de programare.
Se considera exemplul simpli cat al unui rezolvitor al problemei simularii
oceanice pe baza unor iteratii Jacobi:
ai;jk = 0:25  (ai;jk + ai;jk + aik ;j + ai;jk + aik ;j ):
( +1) ( ) ( )
1
( )
1
( )
+1
( )
+1

La descompunere se identi ca concurenta { ^n cadrul ciclului de actualizare a


valorilor lui a. Daca dimensiunea initiala a lui a este n  n, atunci gradul de
concurenta maxim este n . Daca asignarea se face pe linii, gradul maxim de
2

concurenta este n. Intr-o asignare statica de tip bloc, linia i este asignata la
procesul bi=pc, unde p este numarul de procese, pe c^and ^ntr-o asignare statica
ciclica procesului i i se asigneaza liniile i; i + p si asa mai departe. Se observa
ca asignarea statica reduce concurenta. O varianta de asignare dinamica este
cea ^n care un proces primeste o linie, lucreaza asupra ei, obtine o alta, etc.
Orchestrare. Ofera o modalitate de numire si accesare a datelor parta-
jate, comunicare si coordonare (sincronizare) ^ntre rele de control, precum
si plani carea ^n timp a proceselor. Este o etapa apropiata de arhitectura, iar
alegerile pot depinde de abstractizarea comunicarilor si e cienta primitivelor.
229
Tabelul 3.4: Comparare
Memorie partajata Transfer de mesaje
Structura globala de date explicita implicita
Descompunerea lucrului independent de date dependente de date
Comunicarea implicita explicita
Sincronizare explicita implicita
Paradigma de paralelism aleasa restrictioneaza variantele de constructie a algo-
ritmilor (Tabelul 3.4). La orchestrarea ^ntr-un spatiu de adresare partajat, se
de nesc variabilele partajate si structurile de date (structuri globale explicite,
comunicare implicita), nu este necesara veri carea corectitudinii distributiei
datelor, iar excluderea mutuala si evenimentele se realizeaza prin operatii ato-
mice asupra variabilelor partajate. In transferul de mesaje, datele program
sunt distribuite la spatiile de adresare locale (structurile globale sunt implicite,
comunicarea este explicita), excluderea mutuala se face prin autorizare, iar sin-
cronizarea eveniment este inerenta ^n comunicare; dependentele sunt fortate
prin evenimente punct-la-punct si bariere.
Partitionarile bazate pe descompunerea domeniilor pot avea structuri de
comunicare complexe. Partitionarile bazate pe descompunere functionala au
^n mod uzual structuri de comunicare directe. Comunicarile pot locale sau
globale (^ntre vecini sau generale), structurate sau nestructurate (pot forma
o structura regulata precum arbore, grila sau grafuri arbitrare), statice sau
dinamice (partenerii nu se schimba ^n timp sau partenerii ^n comunicare de-
pind de valorile datelor calculate ^n timp), sincrone sau asincrone (expedi-
torul/receptorul poate sau nu coopera).
Atributele unui design bun pentru etapa de comunicare sunt urmatoarele:
toate procesele efectueaza aproximativ aceeasi cantitate de comunicare, exista
mai multe comunicari locale dec^at globale, operatii de comunicare concurenta.
Scopurile sunt corectitudinea solutiei paralele (respectarea dependentelor
inerente ^n algoritm), reducerea costului de comunicare si sincronizare, precum
si mentinerea localitatii referintelor la date, plani carea proceselor si reducerea
surplusului datorat managementului paralelismului.
Exista mai multe modalitati de reducere a costurilor de comunicare: prin
coordonarea plasarii lucrului si datelor pentru a elimina comunicarile nenece-
sare (daca o multime de sarcini nu pot executate concurent datorita co-
municarilor, se combina), prin replicarea datelor (se reduc comunicarile prin
replicarea datelor pe taskuri diferite), prin lucru redundant, prin efectuarea e -
cienta a comunicarilor cerute (de exemplu prin studierea dimensiunii mesajelor
sau optimizari speci ce masinii), prin descresterea efectelor suprafata-la-volum
(raportul comunicari/calcule descreste cu cresterea marimii taskului). Flexibili-
tatea^n acest context se refera la combinarea sarcinilor astfel^nc^at comunicarile
pot suprapuse cu calcule.
In cazul rezolvitorului simplu pentru simularea oceanica, daca n=p este
mare, atunci raportul dintre comunicari si calcule este mic, se poate obtine o
localitate spatiala buna cu linii de cache mari,^nsa si falsa partajare si multimile
de lucru care nu se potrivesc^n cache. Daca n=p este mic, atunci raportul dintre
230
Figura 3.7: Diferent a dintre accesul la datele locale sau la distanta ^n cazul unui
sistem cu memorie distribuita
comunicari si calcule este mare, localitatea spatiala este saraca, partajarea falsa
ram^ane o problema, dar multimile de lucru se potrivesc ^n cache.
Mapare. In aceasta etapa procesele sunt legate la procesoare zice: se spe-
ci ca procesorul pe care este executat ecare proces (aceasta problema nu apare
^n masinile cu memorie partajata).
Procesele pot mapate la procesoare zice ^n diferite moduri, fara a afecta
semantica programului. In particular procese multiple pot mapate la un sin-
gur procesor. Modelul tranfer de mesaje ofera mecanismul necesar discutiei
localitatii: datele continute ^n memoria locala ale unui proces sunt "apropi-
ate", celealte ind "la distanta". Se presupune ca timpul atingerii unui pro-
cesor de-a lungul retelei nu depinde de locatia procesorului (o conditie bru-
tala, deoarece relatia reala este cea din Figura 3.7). Tema principala ^n cazul
transferului de mesaje este numarul de accesuri la distanta. Cum calculele
si comunicarile efectuate de procese sunt independente de locatia proceselor,
rezultatul unui program nu depinde unde sunt executate procesele. Deci algo-
ritmii pot construiti si implementati fara a avea grija numarului de procesoare
pe care vor executati. De obicei ^n design numarul de procese este mai mare
dec^at numarul de procesoare (mod direct de a atinge scalabilitatea). Odata
cu cresterea numarul de procesoare, numarul de procese per procesor este re-
dus, dar algoritmul ^nsusi nu trebuie modi cat. Crearea mai multor procese
dec^at procesoare poate de asemenea servi la mascarea ^nt^arzierilor ^n comuni-
care prin oferirea altor calcule care vor efectuate simultan cu comunicarea
pentru accesul datelor la distanta.
Cele doua probleme ^n mapare sunt urmatoarele: care procese vor rula pe
acelasi procesor (daca mai multe dec^at unul, precum ^n cazul grupurilor de
sarcini care comunica frecvent), si care proces va rula pe care procesor.
O solutie extrema este cea ^n care procesele sunt tintuite la procesoare.
Cealalta extrema este aceea ^n care managementul resurselor este complet sub
controlul sistemului de operare, acesta utiliz^and tehnici de performanta. Lumea
reala este ^ntre aceste doua extreme.
In cazul descompunerii pe baza de date, se aplica regula proprietarului:
proprietarul unei date efectueaza calculele asupra ei.
Exemplu: ^nsumare. Se considera problema calculului sumei s = f (a ) +
   + f (an), unde a este un vector si f este o functie reala.
1

Descompunere. Se calculeaza ecare f (aj ) separat (grad de concurenta n;


n poate mult mai mare dec^at numarul de procesoare), apoi se calculeaza s.
231
Figura 3.8: Modelarea costului si a performantei dupa partitionare: (a) Iden-
ti carea concurentei (pro lul paralelismului) { aria este lucrul total; calculele
f (ai ) se fac ^n paralel, iar suma este secventiala; (b) Asignarea la p procese nu-
mai a calculelor f (ai ); (c) Asignarea la p procese a calculelor f (ai) si a sumelor
partiale; (d) Insumarea sumelor partiale se face ^n paralel
Asignare. Dupa calculul a n=p valori f , unde p divide n, procesul k , cu
1  k  p, eventual ^nsumeaza sk = f (akn=p ) +    + f (a k n=p ). In nal
procesul 1 determina suma s, eventual constituita numai din s = s +    + sp.
( +1) 1

Orchestrare. Toate procesele sunt pornite simultan pentru calculul sumei.


1

Pro lul paralelismului pentru cazul ^nsumarii de catre procesul 1 a tuturor


termenilor este realizat ^n Figura 3.8.b, iar pentru cazul ^n care ecare proces
efectueaza suma partiala pro lul este cel din Figura 3.8.c. Insumarea sumelor
partiale este mai rapida daca se face pe o structura arborescenta (Figura 3.8.d)
si nu secvential de catre procesul 1.
Mapare. Procesorul j ruleaza procesul j .
Exista mai multe modalitati prin care o aplicatie poate suboptimala: al-
goritmic, inechilibrul ^ncarcarii structurilor majore de date, sau orchestrare.
Figura 3.9 sugereaza motivele limitatarile performantei ^n executie: paralelis-
mul disponibil (de fractia secventiala a programului conform legii lui Amdahl;
legea se aplica la orice surplus, nu numai concurenta limitata), echilibrarea
^ncarcarii (de exemplu ^n simularea oceanica ^n modelul SAS unele procesoare
pot sa e active ^n timp ce altele asteapta), surplusul paralel (managemen-
tul paralelismului si calcule redundante), comunicari (competitie, mesaje prea
lungi sau prea scurte). Concurenta insu cienta, utilizarea unor structuri de
date mari, asignarea slaba a sarcinilor si asteptarile pentru sincronizare sunt
surse ale inechilibrului ^ncarcarii.
3.1.6 Descompunerea problemei
Atributele unei partitionari bune sunt: un ordin de marime a numarului de
sarcini mai mare dec^at cel al procesoarelor, sarcini de marimi comparabile
6 Rezumat: Descompunerea rezolv
arii problemei date ^n sarcini se face functie de calcule
necesare sau de date.

232
Figura 3.9: Cre sterea timpului de executie datorat: (a) Fractiei seriale a algo-
ritmului; (b) Concurentei insu cienta; (c) Lucru suplimentar; (d) Comunicari
si sincronizare; (e) Reducerea comunicarilor prin coordonare; (f) Reducerea
comunicarilor prin calcul redundant
si scalabilitate (cresterea dimensiunii problemei trebuie sa duca la cresterea
numarului de sarcinilor si nu a marimii sarcinilor). Atentia este concentrata
asupra descompunerii la o granulatie na a problemei. Exista doua tehnici: de-
scompunere functionala (descompunerea controlului, a calculelor, apoi tratarea
datelor) si descompunerea domeniului (descompunerea uxului de date; prima
data se partitioneaza datele si apoi se asociaza calcule la date).
Descompunere functionala. Se divide calculul ^n sarcini disjuncte si apoi
se veri ca care calcule ce parti de date necesita. Daca partitionarea datelor se
poate face disjunct (nici o comunicare nu este ceruta), partitionarea este ter-
minata. Daca exista o suprapunere semni cativa si sunt necesare comunicatii
^nsemnate este recomandata trecerea la metoda descompunerii pe domeniu.
Descompunerea domeniului. O forma comuna de paralelism la nivel de
program provine din divizarea datelor pentru a prelucrate ^n submultimi.
Aceasta divizare este numita descompunerea domeniului. Se descompun datele
^n parti mai mici de dimensiuni aproximativ egale. Apoi se partitioneaza calcu-
lul si se asociaza ecare cu datele pe care opereaza. Rezultatul este un numar
de sarcini, unele dintre ele necesit^and date de la altele (implic^and comunicari).
Aceasta tehnica este utilizata de majoritatea algoritmilor paraleli. Asignarea
submultimilor de date la diferite procese de calcul este numita distributia
datelor. Procesele sunt ulterior asignate la procesoare hardware prin program
sau prin rutine de sistem (pot exista mai multe procese pe un procesor).
Aplicatiile majore ale descompunerii domeniului sunt de natura stiinti ca
sau inginereasca. Se exploateaza natura locala a diferitelor probleme zice.
Descompunerea domeniilor este operativa mai ales pentru probleme ^n care
233
Figura 3.10: Descompunerea domeniului matriceal
structura datelor este statica sau domeniul este x. Daca structura datelor
este legata de o singura entitate, precum^n cazul problemei atractiei corpurilor,
poate de asemenea aplicata aceasta tehnica.
Un exemplu de descompunere tipica pentru problemele^n care se fac calcule
^ntre elementele vecine ale unei structuri matriceale este prezentat ^n Figura
3.10. Raportul comunicari per calcule depinde de alegerea raportului ^ntre n
si p. De exemplu pentru comunicarea cu vecinii pe orizontala si verticala, ^n
cazul unei descompuneri pe blocuri, raportul mentionat este 4p=n, iar ^n cazul
descompunerii pe benzi, 2p=n (precum la scurgerea particulelor ^ntr-un tunel).
Gasirea unei descompuneri a domeniului poate relizata static, prin
inspectie (predictibila precum ^n cazul simularii oceanice), sau dependent de
intrare (necesita analiza structurii de intrare, de exemplu la calculele cu matrice
rare). O descompunere semi-statica este una care realizeaza o repartitionare
periodica, daca caracteriticile datelor se schimba lent ^n timp (de exemplu la
modelul Barnes-Hut). O alta varianta este furtul dinamic de sarcini (sau de-
scompunere dispersata, scatter) pentru care exista o varianta initiala de de-
scompunere, dar evolutia ulterioara este imprevizibila (de exemplu la metoda
drumului optic); furtul se realizeaza din motive de marime diferita a sarcinilor.
Se considera exemplul unei placi de otel de 20cm  20cm (Figura 3.11).
Daca una dintre muchii este tinuta la 100Æ C, si celelalte la 0Æ C, se pune
problema care este temperatura punctelor de interior. Placa este divizata cu
ajutorul unei grile ne, ecare punct al grilei ind caracterizat de coordonate
(i; j ). Pentru un asemenea punct temperatura poate estimata aproximativ
printr-un proces iterativ (p^ana la convergenta):
Ti t ;j + Ti t ;j + Ti;jt + Ti;jt
( ) ( ) ( ) ( )

Ti;j =
t
( +1) +1 1 +1 1
4
Se presupune ca temperatura este stocata ^ntr-o matrice t cu r linii si c coloane.
Daca grila este ^mpartita ^n f^asii verticale egale de catre p procese, precum ^n
Figura 3.11.c, atunci ecare proces va avea o matrice proprie t cu r linii si pc
coloane unde pc = (c 2)=p + 2. In exemplul din gura, daca r = c = 38, si
p = 4, atunci pc = 11. Desigur, exista mai multe modalitati de partitionare
a datelor matriceale la procese; de exemplu nu pe blocuri de coloane, ci pe
coloane, sau blocuri dreptunghiulare.
Se considera un alt exemplu, al unei imagini digitizate stocate ca o matrice
de pixeli pe care dorim sa-i procesam, de exemplu ^nlocuind valoarea ecarui
pixel cu media vecinilor sai. Domeniul problemei este^n acest caz matricea bidi-
234
Figura 3.11: (a) Placa de otel si conditiile la frontiera; (b) Grila de puncte
interioare; (c) Impartirea domeniului ^ntre 4 procese

Figura 3.12: O imagine digitizata: (a) Matrice de pixeli; (b) 16 subdomenii


mensionala a pixelilor. Se cere aplicarea unei descompuneri ^n 16 subdomenii
precum ^n Figura 3.12. Data poate distribuita prin asignarea ecarui sub-
domeniu la un proces. Se observa ca matricea de pixeli este un domeniu regu-
lat deoarece geometria este simpla si ^n plus problema este omogena deoarece
ecare pixel necesita (aproximativ) aceeasi cantitate de calcul.
Cele doua exemple fac parte din categoria partitionarilor spatiale (numita
si bisectie recursiva ortogonala ^n cazul problemei particulelor) este similara
cu paritionarea grafurilor: spatiul este partitionat ^n volume sau suprafete de
aproximativ aceeasi complexitate a calculelor (elementele spatiale sunt ulterior
asignate la procese si procesoare).
In partitionarea pe arbore (calcule "de coasta" ^n memoria partajata sau
bazate pe octo-arbori ^n memoria distribuita), se asociaza sarcini la ecare
frunza a arborelui.
Paralelism ^n date (paralelism geometric). Paralelismul care este atins
prin descompunerea domeniului este numit paralelism ^n date sau paralelism
geometric. In modelul de programare bazat pe paralelismul ^n date operatiile
(aritmetice sau transferuri globale de date) sunt efectuate pe ecare element al
unei structuri de date mari (regulate) ^ntr-un singur pas. Modelul de progra-
mare este ^n esenta SPMD (single program multiple data): logic exista un
singur r de control ce efectueaza pasi secventiali sau pasi paraleli. Conceptual,
235
Figura 3.13: Distribuirea unui vector 18-dimensional la 4 procese: (a) Bloc; (b)
Ciclic; (c) Bloc-Ciclic
un procesor este asociat la ecare element al datei.
Se considera, de exemplu, un sintem ^n care ecare element de procesare
contine ^n memoria locala o ^nregistrare angajat, cu un c^amp ce denota salariul
sau. Atunci, logic, operatia
if salariu > 1000000
then salariu = salariu *1.05
else salariu = salariu *1.10
poate efectuata ^ntr-un singur pas. Alte exemple sunt cele enumerate mai
sus (aplicarea diferentelor nite, gra ca, procesare de imagini), cautarea ^ntr-
un document, altele din algebra liniara, etc.
Distribuirea structurilor de date standard. Structurile de date stan-
dard sunt colectii de elemente. Exemplele clasice sunt matricele, stivele sau
cozile. Operatiile speci ce sunt crearea structurii, inserarea unui element nou,
selectarea unei submultimi etc. In cazul structurile de date distribuite pro-
blemele principale sunt modalitatea de distribuire la procese sau procesoare, si
modul^n care distributia afecteaza operatiile asupra structurilor (corectitudine,
performanta). Exemplele clasice sunt matricele (distribuite pe linii, coloane,
bloc, ciclic sau bloc ciclic), cozile de sarcini (centralizat sau distribuit), arborii
cuadrici sau octali.
Distribuirea unui vector. In cazul ^n care distribuirea se face ^n bloc, vec-
torul n-dimesnional este partitionat ^n p blocuri de marime b = dn=pe (ex-
cept^and ultimul bloc), iar ecare bloc este distribuit la un proces de calcul.
Daca p este numarul de procese, i este indexul global al unui element, iar l este
indexul local ^n procesul local de index j , atunci
Proces(i) = bi=pc; Locat ie(i) = i mod p; Index_global(l; j ) = j  b + l:

De exemplu, un vector A(0 : 17) este distribuit ^n bloc peste 4 procese astfel:
trei blocuri de 5 elemente sunt distribuite la procesele p , p si p si ultimul
bloc de trei elemente la procesul p (Figura 3.13).
0 1 2

In cazul ^n care distribuirea se face ciclic, elementele vectorului de dimen-


3

siune n sunt distribuite la p procese ciclic astfel ^nc^at elemente adiacente sunt
236
Figura 3.14: Distribuirea unei matrice: (a) Pe coloane; (b) In tabla de sah
distribuite la procese diferite. In notatiile de mai sus, caracteristicile acestei
distributii sunt:
Proces(i) = i mod p; Locat ie(i) = bi=pc; Index_global(l; j ) = l  p + j:
De exemplu A(0 : 17) este distribuit la 4 procese astfel ^nc^at doua grupuri de
cinci elemente sunt distribuite la procesele p si p si doua grupuri de patru
elemente sunt distribuite la procesele p si p .
0 1

In cazul ^n care distribuirea se face ciclic pe blocuri, elementele vectorului


2 3

de marime n sunt partitionate ^n dn=be blocuri, iar blocurile sunt distribuite
ciclic la p procesoare ciclic. Caracteristicile sunt:
Proces(i) = bi=bcmod p; Locat ie(i) = bi=(pb)cb + imod b;
Index_global(l; j ) = bl=bcpb + lmod b:
De exemplu A(0:17) este distribuit la 4 procese astfel ^nc^at un grup de trei
blocuri este distribuit la procesul p si trei grupuri de doua blocuri sunt dis-
tribuite la procesele p , p si p .
0

Distribuirea unei matrice. Exista mai multe variante: distribuite pe coloane,


1 2 3

pe linii, pe blocuri de coloane, pe blocuri de linii, ciclic pe coloane, ciclic pe


linii, ciclic pe blocuri de coloane, ciclic pe blocuri de linii, distributie ^n forma
de tabla de sah etc. Doua dintre aceste variante sunt sugerate ^n Figura 3.14.
La distribuirea datelor, localitatea datelor este ^nteleasa diferit fata de cazul
nedistribuit (Figura 3.15).
Arborii cuadrici si octali. Sunt generalizari ale arborilor binari si sunt
utilizati la partitionarea spatiului bidimensional (cuadrici) sau tri-dimensional
(octali). Arborii pot adaptivi sau neadaptivi (Figura 3.16). Aplicatiile ime-
diate sunt ^n simularea comportarii corpurilor ceresti, metoda drumului optic,
procesare de imagini.
3.1.7 Gruparea sarcinilor ^n procese
Exista doua modele predominante de reprezentare a unui program concurent
(Figura 3.17): graful de sarcini static (STG) sau graful aciclic orientat (DAG).
In modelul STG, un program concurent este reprezentat de un graf de conectare
neorientat, cu v^arfurile drept sarcini si muchiile indic^and care sunt sarcinile ce
7 Rezumat: Sarcinile sunt grupate ^n procese astfel ^nc^
at sa e obtinut un optim al e cientei
programului paralel ca multitudine de procese. Exista doua cerinte contradictorii: reducerea
comunicarilor ^ntre procese si un numar mare de procese.

237
Figura 3.15: Distribuirea unei matrice pe blocuri

Figura 3.16: Arbori cuadrici: (a) Ne-adaptiv; (b) Adaptiv

Figura 3.17: Reprezentari ale sistemelor de taskuri: (a) Sarcina pe nod;


(b) Sarcina pe arc; (c) Diagrama Gantt corespunzatoare unei plani cari

238
comunica. Nodurile sursa reprezinta punctele de start la care programele^ncep
executia, pe c^and nodurile de scufundare reprezinta terminarea. Intre cele doua
tipuri avem o multime de noduri de interior conectate cu muchii ponderate
care corespund ^nt^arzierilor ^n comunicare. Intr-un model DAG, nodurile sunt
sarcini, pe c^and muchiile directionale ofera at^at precedenta c^at si comunicarea
^ntre procese. O reprezentare hibrida care integreaza cele doua scheme este
graful de comunicare temporal (TCG), ce permite identi carea fazelor sincrone
logic de comunicare si calcul.
Granularitatea unei sarcini este de nita ca raportul dintre timpul de calcul
al sarcinii si cel de comunicare. O granulatie na a sarcinii corespunde la un
raport mic si o granulatie grosiera la un raport mare. Deoarece nu exista o core-
lare directa ^ntre e cienta programului si granularitate, tehnica de optimizare
este cea de grupare a unui multimi de sarcini cu granulatie na ^n procese cu
granulatie grosiera.
In algoritmii de asignare, scopul este eliminarea surplusului cauzat de co-
municarile intersarcini dar mentinearea ^n acelasi timp a unui grad ^nalt de
paralelism. Exista trei clase generice: pe baza drumului critic, a eliminarii
^nt^arzierilor ^n comunicare sau duplicarea sarcinilor.
Asignarea pe baza drumului critic. Ideea este aceea de identi care a
nodurilor unui drum critic ^ntre sarcini (care trebuie executate ^ntr-o modali-
tate secventiala) si grupeaza acestea^ntr-un proces care va asignat ulterior la
un element de procesare pentru executie. Metoda numita asignare pe straturi
verticale porneste de la graf orientat DAG de sarcini, n-granulat, si sorteaza
acest graf pe straturi orizontale disjuncte ^n care nodurile din aceste straturi
pot executate ^n paralel (^n timp ce se mentine precedenta ^ntre noduri). Se
identi ca drumurile critice din DAG si nodurile corespunzatoare sunt grupate
^ntr-un strat vertical si se marcheaza nodurile ca procesate. Se repeta acest pas
p^ana c^and nu mai exista noduri neprocesate.
Asignarea prin eliminarea ^nt^arzierilor ^n comunicare. Se utilizeaza
supra^ncarcarea (surplusul) de comunicare drept criteriu de grupare a sarcinilor
^n procese. Abordarea consta ^n gruparea nodurilor unui graf a sarcinilor si a
succesorilor sai cu conditia ca surplusul de comunicare sa nu e prelungit.
Concurenta ^ntre succesorii unui nod este pierduta datorita gruparii. Astfel
este adoptata aceasta tehnica numai daca reducerea surplusului de comunicare
depaseste serializarea taskurilor paralele. Avantajul acestei scheme este acela
ca ofera o margine superioara asupra numarului de procesoare alocate.
Asignare prin duplicarea taskurilor. Se permite eliminarea costurilor de
comunicare prin duplicarea sarcinilor^ntre elementele de procesare. Aceasta nu
elimina numai costurile de comunicare dar mentine si paralelismul programului
original. Dezavantajele se datoreaza cresterii cerintelor de spatiu si surplusul
crescator necesar sincronizarii.
3.1.8 Mapare prin ^nglobare
La mapare o structura de comunicare a unui algoritm trebuie adaptata la o
retea de interconectare a unei retele zice. Este astfel posibila dezvoltarea unui
8 Rezumat: In mod ideal, prin asignarea de procese la procesoarele unui sistem de calcul,
legaturile pentru comunicare directa ^ntre procesele programului paralel sunt transpuse pe
legaturi zice directe ^ntre procesoarele care ruleaza procesele.

239
algoritm presupun^and o topologie particulara de interconectare si^n nal o ma-
pare pe o alta topologie (de exemplu dezvoltarea unui program orientat spre
o arhitectura grila si implementarea pe un hipercub). Inglobarile pot utile
si ca unelte de dezvoltare a programelor. Anumite programe aplicative au o
structura de date evidenta; de exemplu, metoda bisectiei pentru calculul valo-
rilor proprii, metodele divide-et-impera sunt descrise prin arbori. O modalitate
de a implementa aceste metode ^ntr-un multiprocesor hipercub este ^nglobarea
structurii de date arborescente ^n arhitectura hipercub, arborele servind ca
arhitectura virtuala a problemei.
Terminologie pentru ^nglobarea grafurilor (embedding, ^ncorporare,
^ncapsulare). Data o topologie de retea G = (N; C ) si o topologie secundara
de retea G0 = (N 0; C 0 ), suntem interesati de ^nglobarea lui G ^n G0. Se noteaza
cu jN j cardinalul multimii N si cu 2N multimea tuturor 0submultinilor lui N .
Formal, o ^nglobare consta ^n doua functii  : N ! 2N ce mapeaz a ecare
nod a lui G la o multime de noduri0 a lui G0, si  : C > 2C0 ce mapeaza
ecare canal a lui G la un drum ^n G . Graful gazda este graful ^n care are loc
^nglobarea, G0, si graful oaspete este cel care este ^nglobat, G. O ^nglobare este
caraterizata prin congestie, dilatare, expansiune si ^ncarcare.
Congestia unei ^nglobari (;  ) este numarul maxim de canale ale lui G
mapate la orice canal a lui G0 , adica, maxe0 2C0fe : e0 2 (e)g. Congestia este
numarul maxim de muchii ale grafului oaspete care sunt realizate utiliz^and
aceeasi muchie a grafului gazda.
Dilatarea unei ^nglobari (;  ) este lungimea maxima a unui drum ^n G0 la
care un canal din G este mapat, adica maxe2C j(e)j. Dilatarea este cel mai
mare numar m pentru care o muchie a grafului oaspete este realizata de exact
m muchii ale grafului gazda.
Expansiunea unei ^nglobari (;  ) raportul dintre jN 0 j si jN j, adica raportul
dintre numarul de noduri a grafului gazda si a grafului oaspete.
Incarcarea este numarul maxim de noduri ale grafului oaspete care este
mapat pe acelasi nod al grafului gazda.
Cazul ideal este cel al ^nglobarii cu congestia, dilatarea, expansiunea si
^ncarcarea egale cu 1.
Utilizarea codurilor Gray pentru ^nglobarea ideala a inelelor si
grilelor ^n hipercub. Fie G(i) numarul nodului ^n hipercub a procesoru-
lui din pozitia i a unui inel, unde 0  i < n. Maparea G trebuie sa satisfaca
urmatoarele cerinte: sa e unica, adica G(i) = G(j ) ) i = j , G(i) si G(i 1)
sa difere ^n exact un bit pentru toti i; 0  i < n 1, iar G(n 1) si G(0)
sa difere exact ^ntr-un bit. O clasa de Guri care satisfac aceste cerinte sunt
codurile binare Gray uni-dimensionale.
Codurile binare Gray sunt de nte recursiv astfel: dat un cod Gray de d-biti,
codul Gray de (d +1)-biti poate construit prin listarea codului Gray pe d-biti
pre xat de 0, urmat de codul Gray pe d-biti ^n ordine inversa pre xat de 1.
Se porneste de exemplu cu G(0) = 0; G(1) = 1; atunci codurile Gray pe 2-biti,
respectiv pe 3-biti sunt cele din Tabelul 3.5.
Pe baza codului Gray un inel cu 8 procesoare este^nglobat^ntr-un hipercub
tridimensional precum ^n Figura 3.18.a.
Codurile Gray multidimensionale sunt utilizate la maparea unei grile mul-
240
Tabelul 3.5: Coduri Gray binare: (a) 2-biti; (b) 3-biti
i (G(i)) G(i) 2
0 000 0
i (G(i)) G(i)
2 1 001 1
0 00 0 2 011 3
1 01 1 3 010 2
2 11 3 4 110 6
3 10 2 5 111 7
6 101 5
7 100 4

Figura 3.18: (a) Un inel cu 8 procesoare ^ nglobat ^ntr-un hipercub tridimen-


sional; (b) Modalitatea de repartizare a nodurilor hipercubului ^n care se ma-
peaza o plasa 2  4
tidimensionale la un hipercub. Se cere ca numarul de procesoare ^n ecare
directie a grilei sa e o putere a lui 2. Astfel daca 2dr 1  2dr 2      2d0
este o grila r-dimensionala si daca d este dimensiunea hipercubului, atunci d
minimal este d + d +    + dr = d: Se partitioneaza bitii numerelor nodurilor:
asignarea la ecare dimensiune a grilei depinde de rezultatul partitionarii.
0 1 1

Primii d vor corespunde dimensiunii 0, urmatorii d biti la dimensiunea 1,


si asa mai departe. Se aplica separat maparea Gray inversa la ecare grup de
0 1

biti. De exemplu, pentru a mapa o plasa 2  4 la un hipercub, se utilizeaza


codurile Gray precum ^n Tabelul 3.6 si Figura 3.18.b.
De exemplu, ^ntr-un nCube-2, rutinele care ofera maparea grilelor la hiper-
cuburi si viceversa utilizeaza codurile Gray.
Inglobarea ^ntr-un hipercub. Proprietatile speciale ale unui hipercub fac
mai usoara sarcina de a construi programe care nu produc competitie pentru
procesoarele hipercubului. Structurile liniare, inelele, grilele si arborii binari
pot ^nglobati ^n hipercuburi cu expansiune si congestie unitare. Cele mai
simple grafuri care poate ^nglobate ^ntr-un hipercub utiliz^and conectarile
^ntre vecinii apropiati sunt structura liniara si inelul.
In cazul unei structuri liniare, presupunem ca avem p = 2d procesoare ^n
structura liniara si ^n cea a hipercubului. Se mapeaza procesorul i a structurii
liniare la nodul hipercubului G(i), unde G este codul Gray pe d-biti. Deoarece
G(i) si G(i  1) difera ^n exact un bit, ecare muchie a unei structuri liniare (sau
inel) se mapeaza pe o muchie a hipercubului cu o dilatare unitara. Anumite
241
Tabelul3.6: Utilizarea codurilor Gray la maparea unei grile 24 pe un hipercub
tridimensional
k (k ) ; (k ) (G (k )) ; (G (k )) (i; j )
1 2 0 2
1
1 2
1
0 2
0 0,00 0,00 (0,0)
1 0,01 0,01 (0,1)
2 0,10 0,11 (0,3)
3 0,11 0,10 (0,2)
4 1,00 1,00 (1,0)
5 1,01 1,01 (1,1)
6 1,10 1,11 (1,3)
7 1,11 1,10 (1,2)

Figura 3.19: Inglobarea unui tor 3  5^ntr-un hipercub 4-dimensional: (a) Tipul
legaturilor; (b) Inglobare cu dilatare 2
muchii ale hipercubului rarm^anc neutilizate.
Inglobarea unei grile 2  2 ^ntr-un hipercub (r + c)-dimensional este bazata
pe ^nglobarea structurii liniare. Nodul (i; j ) al grilei este mapat la nodul hiper-
cubului G(i; r)kG(j; c) unde k reprezinta concatenare de biti. Fiecare linie si
ecare coloana a plasei este mapata la un subcub diferit al hipercubului (pre-
cum ^n exemplul din paragraful anterior).
O ^nglobare a unui tor 4  4 ^ntr-un 4-cub este urmatoarea
00 01 11 10
00 0000 0001 0011 0010
01 0100 0101 0111 0110
11 1100 1100 1100 1110
10 1000 1001 1011 1010
Un tor 3  5 nu poate ^nglobat^ntr-un hipercub 4-dimensional cu congestie
si dilatare unitare. Fiecare 4-ciclu al torului trebuie sa e mapat la o fata
bidimensionala a hipercubului. Un nod are 4 muchii si dimensiunile acestor
muchii sunt toate diferite. Astfel avem situatia din Figura 3.19.a, ^n care (1, 1)
si (1, 5) devin acelasi nod. Exista o modalitate de a ^ngloba torul ^n hipercubul
4-dimensional daca permitem ca mai multe muchii ale torului sa e realizate
242
Figura 3.20: Exemple de mapari prin ^nglobare: (a) O schema simpli cata a
unui SE ; (b) SE pe un tor 3  4; (c) SE pe un tor 4  4; (d) Un arbore
(3) (3) (3)

B pe grila 7  7; (e) Un arbore B pe un H ; (f) Un 12-inel pe grila 3  4,


5 3
(3)

^n ordinea numerotarii nodurilor; (g) Un 12-inel pe grila 3  4, optim


de mai mult dec^at o muchie a hipercubului (Figura 3.19.c).
In cazul unui arbore binar, presupunem ca avem p = 2d procesoare la frun-
zele unui arbore complet binar (precum cel utilizat ^n operatiile de reducere).
Se poate realiza o mapare ^ntr-un hipercub d-dimensional dupa cum urmeaza.
Se mapeaza radacina arborelui la un nod arbitrar al hipercubului. Se noteaza
i nodului m cu L(m) cel st^ang si R(m) cel drept. La ad^ancimea j ^n arbore,
 (L(m)) =  (m),  (R(m)) =  (m)  2j unde  este sau exclusiv pe biti.
1

Putem identi ca un arbore de acoperire ^ntr-un hipercub prin numirea


vecinilor apropiati ^n hipercub. Un arbore de acoperired a hipercubului d-
dimensional este un arbore care include toate cele p = 2 noduri ale hiper-
cubului. In cazul unui hipercub 4-dimensional, nodul 0 are i 1 = (0001) , 2
= (0010) , 4 = (0100) , si 8 = (1000) ^n arbore. Identi catorii ilor difera de
2

cel al parintelui ^n exact un bit. In mod similar, nodul 1 = (0001) are i 3 =
2 2 2

(0011) , 5 = (0101) , si 9 = (1001) si asa mai departe.


2
2 2 2

Alte exemple. Se considera exemplele din Figura 3.20. In cazul transpunerii


unui graf SE pe un tor, nu este posibila atingerea variantei ideale 1:1. Acelasi
lucru se ^nt^ampla si ^n cazul arborilor binari proiectati pe o grila: arborii binari
de ordin 2, 3, 4 si 5 pot proiectati 1:1 pe grile patratice de ordin 2, 3, 5,
respectiv 7, dar arborii de ordin mai mare sau egal cu 6 nu pot proiectati 1:1
pe grila, oricare ar ordinul acesteia (demonstratia se bazeaza pe faptul ca un
243
arbore cu ordin cel putin 6 are 63 de noduri la distanta de cel mult 5 muchii
de nodul radacina, iar orice grila contine cel mult 61 de asemenea puncte). De
asemenea maparea 1:1 a unui inel cu numar impar de noduri este imposibila
pe o grila sau un hipercub.
Inglobarea ^n retele de interconectare multietape. Exista mai multe
rezultate referitoare la aceasta tema pe care doar le mentionam aici. Un u-
ture toroidal cu p-noduri poate simula orice retea cu p-noduri de grad maxim
d, cu o dilatare (^nt^arziere) de cel mult 3d log p si un hipercub cu n-noduri cu
o ^nt^arziere de O(log p). Un cub conectat ciclic r-dimensional poate simula
2

algoritmi descrisi pe un hipercub (r + log r)-dimensional cu o ^nt^arziere cons-


tanta. Un inel cu p-noduri poate ^nglobat cu o dilatare 3 ^n orice retea de
p-noduri conectata. Pentru ecare r  0, un algoritm ^n T -pasi pe un hipercub
r-dimensional poate simulat de o retea schimb-amestecare r-dimensionala ^n
2T 1 pasi.
3.1.9 Echilibrarea ^ncarcarii
Pentru a atinge acceleratii ^nalte trebuie utilizata o asignare e cienta a diferi-
telor procese concurente ale unui program concurent pe procesoarele disponi-
bile. Aceasta este numita echilibrarea ^ncarcarii sau balansarea sarcinii
(load balancing). Echilibrarea ^ncarcarii este un caz special al problemei mai
generale de alocare a resurselor ^ntr-un sistem paralel sau distribuit. Resursele
sunt procesoarele.
Metodele utilizate sunt: statice, dinamice prin rezerve (pool) de sarcini
sau dinamice prin coordonare. In cazul static, problema este divizata si
sarcinile sunt asignate la procesoare o singura data. Numarul sau marimea
sarcinilor poate varia functie de puterea de calcul a masinilor. Cazul dinamic
cu rezerva de sarcini este ^n mod tipic utilizat ^n schemele principal/secundar
(master/slave): programul principal tine o coada de sarcini si le expediaza
la programele secundare inactive p^ana c^and coada este vida. Astfel masinile
mai rapide vor primi mai multe taskuri. Cazul dinamic prin coordonare este
utilizat ^n mod tipic ^n schema SPMD. Toate taskurile sincronizeaza si redis-
tribuie lucrul lor la timpi xi sau daca apar anumite conditii (precum cazul
c^and inechilibrul depaseste o anumita limita).
Terminologie
Graful proceselor si graful procesoarelor. In cele ce urmeaza consideram
un graf al proceselor (Figura 3.21) ca ind un graf aciclic orientat ^n care
nodurile reprezinta procese concurente care formeaza programul concurent si
muchiile ^ntre noduri reprezinta comunicatiile si sincronizarea ^ntre procese.
Greutatea unui nod este ^ncarcarea de calcul a procesului pe care-l reprezinta
nodul si greutatea unei muchii ^ntre doua noduri este cantitatea de comunicari
^ntre cele doua procese reprezentate de nodurile de capat.
Graful procesoarelor de neste con guratia sistemului paralel sau distribuit.
9 Rezumat: Inc arcarea aproximativ egala a procesoarelor cu sarcini sau procese este cheia
e cientei unui algoritm paralel. Acest deziderat nu este usor de realizat daca sarcinile necesita
cantitati diferite de resurse de calcul. Incarcarea dinamica (^n timpul executiei unui program)
este solutia optima, dar este di cil a programata.

244
Figura 3.21: (a) Graful proceselor; (b) Graful procesoarelor
Fiecare nod reprezinta un procesor si greutatea ecarui nod este viteza de calcul
a procesorului reprezentat de nod. Muchiile ^ntre noduri reprezinta legaturi de
comunicare ^ntre procesoare. Greutatea unei muchii este viteza unei legaturi
de comunicare pe care o reprezinta muchia.
Se cauta o mapare optima a grafului proceselor pe graful procesoarelor.
De nirea problemei. Se partitioneaza o multime de sarcini sau procese
interactive la o multime de procesoare interconectate care sa maximizeze
performanta (care sa permita de exemplu progresul sarcinilor pe toate pro-
cesoarele la aceeasi rata). Formal, maximizarea performantei poate de nita
astfel: minimizarea timpului maxim de terminare a tuturor proceselor, min-
imizarea timpului de raspuns, minimizarea timpului total de inactivitate sau
orice alt scop rezonabil.
O presupunere generala care este facuta este aceea ca comunicarile ^ntre
sarcini pe acelasi procesor sunt mai rapide dec^at comunicarile ^ntre procese
a ate pe procesoare diferite (comunicarile intra-procesoare sunt aproximativ
instantanee).
Echilibrarea ^ncarcarii are doua aspecte: alocarea proceselor la procesoare
si plani carea proceselor alocate la un procesor. Imaginea curenta este aceea ca
alocarea este mai importanta dec^at plani carea, ^n particular pentru anumite
con guratii multiprocesor precum hipercuburile. De aceea anumiti algoritmi
de echilibrare a ^ncarcarii adreseaza numai problema alocarii.
Problema determinarii existentei unei alocari a n procese arbitrare cu in-
tercomunicare, constr^anse de relatii de precedenta, la o retea de interconectare
de m noduri de procesare, care ^ndeplineste un termen de nalizare dat, este o
problema NP-completa.
Politica informatiei, a transferului si a plasarii. Tehnicile de echilibrare
a ^ncarcarii nu presupun practic informatii sau cunostiinte la timpul compilarii
asupra parametrilor de rulare ai unei aplicatii, precum timpul de executie a
taskului sau ^nt^arzierile ^n comunicare. In principal se bazeaza pe distribuirea
proceselor la timpul rularii^ntre elementele de procesare pentru a atinge scopuri
de nite legate de performanta. Pe c^and echilibrarea ^ncarcarii se refera la
distribuire prin asignare de procese la elemente de procesare diferite, partajarea
^ncarcarii se refera la partajarea puterii de procesare a sistemelor ^ntre procese.
De nirea unui algoritm tipic pentru echilibrarea ^ncarcarii are trei politici
245
inerente: politica de informare ce speci ca cantitatea de informatii de^ncarcare
disponibila proceselor de decizie a plasamentului, politica de transfer ce spe-
ci ca conditiile ^n care un proces este transferat (^ncarcarea curenta a gazdei,
marimea procesului, migrarea sarcinilor), si politica de plasament care implica
alocarea proceselor la diferite elemente de procesare.
Politica informatiei speci ca informatia de ^ncarcare care este disponibila
procesului de decizie a plasamentului sarcinilor. Aceasta informatie consista
din: informatia de ^ncarcare a tuturor sau a unei submultimi de elemente de
procesare, distribuita periodic sau la cerere^n timpul echilibrarii, si modalitatea
de colectare a informatiei de ^ncarcare (la un element de procesare central sau
distribuit ^ntre procesele participante la decizia de plasare a proceselor).
Politica transferului determina necesitatea realocarii proceselor. Marimea
unui proces poate cuanti cata prin timpul de executie al procesului. Astfel
parametrii sunt urmatorii: ^ncarcarea gazdei, dimensiunea procesului si nece-
sitatile de resurse ale procesului. Un proces este eligibil pentru un transfer
numai daca ^ncarcarea gazdei este mai mare dec^at o valoare prag. Se veri ca si
dimensiunea procesului daca nu este mai mare dec^at o valoare prag, implic^and
faptul ca realocarea proceselor este mai indicata dec^at transferul. In ceea ce
priveste necesitatile de resurse ale procesului este necesara o asemenea optiune
deoarece un proces poate sa nu e executabil pe toate masinile posibile sau
timpul sau de executie poate varia.
Politica de plasare determina elementul de procesare la care un proces este
asignat, selectia ind realizata e prin selectia elementului de procesare cu
^ncarcarea minima sau a celui cu ^ncarcare scazuta (primul cu ^ncarcarea mai
mica dec^at valoarea de prag).
O alta tema este cea a indicelui de ^ncarcare care este o masura a ^ncarcarii
unui element de procesare bazat pe marimea cozii asociate elementului, uti-
lizarea elementului de procesare si timpul de raspuns.
Migrarea unui proces presupune suspendarea executiei procesului pe un
element de procesare, transferul sau pe un alt element de procesare si relu-
area executiei. Instabilitatea apare c^and mai multe elemente de procesare
supra^ncarcate transfera procesele lor la elemente de procesare ne^ncarcate
cauz^and o supra^ncarcare a lor ceea ce duce la o noua pasare de procese la alte
elemente de procesare. Acest fenomen poate rezolvat select^and elementele de
procesare usor^ncarcate pentru transfer de procese^ntr-o modalitate aleatoare,
^n locul alegerii elementelor de procesare cu ^ncarcare minima.
Algoritmi si tehnici
In cazul unei mediu de calcul omogen, toate procesoarele au putere de cal-
cul identica. Situatia ideala este aceea ^n care toate procesele produc aceeasi
^ncarcare, astfel ^nc^at taskurile sunt distribuite ciclic la procesoare.
In cazul unui mediu de calcul heterogen static, heterogeneitatea este cauzata
de procesoarele de putere de calcul diferita, raporturile dintre aceste puteri
ram^an^and neschimbate. In acest caz raportul distributiei proceselor pe doua
procesoare trebuie sa e proportional cu raportul puterilor de calcul.
In cazul unui mediu de calcul heterogen dinamic, heterogeneitatea este
cauzata de^ncarcarea sistemului de calcul si aceasta ^ncarcare se poate schimba
dinamic. Este necesara o plani care dinamica si o migrare a proceselor.
246
Figura 3.22: Clasi carea Casavant-Kuhl a algoritmilor de echilibrare a^ncarcarii
Clasi carea metodelor de echilibrare a ^ncarcarii. Taxonomia Casa-
vant-Kuhl a algoritmilor de echilibrare a ^ncarcarii este prezentata ^n Fig. 3.22.
In cazul unui algoritm static politicile de transfer si plasare sunt bazate pe
informatii asupra comportarii medii a sistemului si depind de starea curenta a
sistemului la momentul luarii unei decizii. Politicile de plasare aleatoare sau
rotatie ciclica sunt exemple de procese de decizie statica. Schemele adaptive
reactioneaza la schimbari^n starea sistem. Complexitatea acestor scheme este o
problema deoarece necesita informatii de^ncarcare^n timpul rularii si activitati
de colectare a starilor. Un exemplu este plani carea pe baza de prag.
Intr-o plani care statica, asignarea proceselor este realizata ^nainte de
^nceperea executiei programului. Informatiile privind timpii de executie si
resursele se presupun a cunoscute la timpul compilarii. Aceste metode nu per-
mit eliminarea proceselor. Se cauta minimizarea timpului de executie a progra-
mului concurent si minimizarea simultana a ^nt^arzierii datorate comunicarilor.
Executia programului este prezisa la timpul compilarii. Unul dintre inconve-
nientele acestei abordari este aceea ca generarea unei plani cari optimale este o
problema NP-completa, deci se pot oferi numai solutii restrictionate. Metodele
euristice se bazeaza pe reguli empirice pentru ghidarea procesului de plani -
care cu scopul apropierii de o solutie aproape ideala. De exemplu, lungimea
drumului critic pentru un proces este lungimea unuia dintre mai multe drumuri
cele mai lungi posibile de la startarea primei sarcini la sf^arsitul ultimei sarcini.
Astfel se poate acorda o prioritate procesului cu drumul critic cel mai lung, iar
celelalte sunt plani cate pe l^anga acesta.
Plani carea listei este cea mai populara tehnica suboptimala ^n ciuda
performantei sale slabe ^n situatii de ^nt^arzieri mari datorate comunicarilor.
Se ofera o lista de prioritati a proceselor de asignat la elementele de proce-
sare si se elimina repetat procesul din capul listei prin alocare la elemente de
procesare pentru executie. Se pot utiliza diverse euristici pentru a prioritiza
taskurile: relatiile de precedenta si timpul de executie a procesului, lungimea

247
Figura 3.23: Coada de sarcini: (a) Centralizata; (b) Distribuita (una per proces)
drumului critic si numarul de procese succesoare.
Plani carea optimala ^n cazuri speciale poate produsa prin solutii opti-
male locale sau metode suboptimale. Metodele de plani care cu solutiile locale
optimale se bazeaza pe tehnici de cautare e ciente utiliz^and metode de calire
simulata, metode de programare matematica si metode de cautare ^n spatiu de
stari. Metodele de calire simulata efectueaza urmatorii pasi: fa mici schimbari
aleatoare la plani carea initiala, evalueaza noua plani care, continua procesul
interctiv p^ana c^and nu mai sunt obtinute ^mbunatatiri. Programarea matema-
tica utilizeaza metode de programare liniara, pe ^ntregi sau ne-liniara pentru a
rezolva probleme de plani care; procesul consta ^n de nirea unei functii obiec-
tiv care trebuie minimizata, de exemplu timpul de executie al programului si
^nt^arzierile ^n comunicare, apoi de nirea unei multimi de constr^angeri pentru
a prezerva proprietati precum relatiile de precedenta ale taskurilor sau cele ce
garanteaza ca ecare sarcina este asignata o singura data, iar apoi se aplica o
metoda de rezolvare a unor probleme de optimizare complexe de constr^angeri,
precum programarea dinamica sau tehnicile euristice. Metodele de cautare ^n
spatiul de stari se bazeaza pe tehnici de cautare prin rami care si limitare
pentru a conduce o cautare a unei solutii de plani care pe o arhitectura data;
aceasta este realizata prin construirea unui arbore de cautare a plani carilor
posibile, de nind o functie de evaluare a costului si cautarea arborelui pentru
cea mai buna plani care. Toate aceste metode sunt consumatoare de timp si
computational intensive.
Un algoritm dinamic este bazat pe redistribuirea proceselor la timpul
executiei, prin transferarea proceselor de la procesoarele foarte ^ncarcate la
cele usor^ncarcate (proces de echilibrare a ^ncarcarii). Operatiile de echilibrare
a ^ncarcarii pot centralizate la un singur procesor (Figura 3.23) sau dis-
tribuite ^ntre elementele de procesare.Intr-un mediu distribuit, ecare element
de procesare are o imagine proprie asupra ^ncarcarii sistemului. Aranjamentul
de plani care este cooperativ sau necooperativ (plani care aleatoare).
Intr-o politica centralizata, un element de procesare este desemnat drept
plani cator central, receptioneaza informatiile de ^ncarcare actualizate de la
toate gazdele si le asambleaza ^ntr-un vector de ^ncarcare. Pentru o politica
248
centralizata de plasare, c^and o gazda decide transferul unui proces, expediaza
o cerere la plani catorul central care selecteaza gazda destinatie utiliz^and vec-
torul de ^ncarcare si informeaza gazda sursa asupra alegerii sale. Astfel cazul
unei rezerve de procese sau sarcini (task pool), centralizate sau distribuite,
noi procese sau sarcini sunt adaugate si apoi alocate la procesoare; un mana-
ger (fermier) are responsibilitatea alocarii sarcinilor, lucratorii cer sarcini de
la manager, iar g^atuirea la manager poate o problema. In cazul unei struc-
turi ierarhice sunt utilizati sub-manageri, lucratorii comunic^and cu acestia, iar
submanagerii cu managerul.
In cazul unor politici distribuite, ecare gazda construieste autonom pro-
priul vector de ^ncarcare local colect^and informatiile de ^ncarcare de la cele-
lalte elemente de procesare. Deciziile de plasare sunt luate local. Aceste
politici accelereaza procesul dar genereaza surplus mare de comunicare datorat
distributiei informatiilor de ^ncarcare. Astfel ^n cazul rezervelor de procese ^n
scheme descentralizare, nu exista un manager central si rezervele de procese
sunt mentinute separat de ecare procesor; procesoarele inactive cer lucru de
la altele. Detectia terminarii este o problema.
O politica mixta este o combinare ^ntre politicile centrale si distribuite. De
exemplu se poate utiliza o politica centralizata de informare asupra ^ncarcarii
si o politica distribuita de plasare.
Avantajul principal al abordarii dinamice fata de cea statica este exibil-
itatea ce permite adaptarea la cerintele imprevizibile ale aplicatiei la timpul
de rulare. Dezavantajul este surplusul introdus pentru comunicarea starilor,
transferului de procese si de luare a deciziilor.
Algoritmii dinamic pot clasi cati ^n: algoritmi la initiativa sursei c^and
procesorul ce genereaza sarcina decide care procesor va servi sarcina si al-
goritmi initiati de server c^and ecare procesor determina ce sarcini va servi.
Exemple de algoritmi initiati de sursa sunt divizarea aleatoare, divizarea ciclica
si coada cea mai scurta de alaturare. Exemple de algoritmi initiati de server
sunt serviciile aleatoare, servirea ciclica, coada cea mai lunga de servire si jobul
cel mai scurt primul. Algoritmii din categoria secunda sunt mai performanti
dec^at cei din prima categorie daca costul de comunicare nu este dominant sau
^n medii ^ncarcate.
Un algoritm este initiat de expeditor daca o gazda a unui proces determina
unde va executat procesul detinut sau unul care soseste. Sunt formate cozi
de procese pregatite pentru executie la elementele de procesare destinatie si de-
ciziile de transfer sunt realizate la momentul sosirii unui proces. Intr-un proces
initiat de receptor, un server sau elementul de procesare destinar determina
care procese de la diferite surse le va procesa. Procesele tind sa formeze cozi la
sursele elementelor de procesare.
In cazul algoritmilor locali nu este ceruta o cunoastere globala a starii de
calcul. Fiecare procesor compara periodic ^ncarcarea sa de calcul cu c^ativa
vecini apropiati. Calculul este transferat daca diferenta ^n ^ncarcare este mai
mare dec^at un prag. Aceasta tehnica este necostisitoare si utila c^and^ncarcarea
se schimba constant.
Nu toate caracteristicile algoritmilor de echilibrare a ^ncarcarii se potrivesc
^n ierarhia Casavant-Kuhl. Astfel o clasi care neierarhica este cea a algoritmilor
adaptivi sau neadaptivi: un algoritm este adaptiv daca parametrii algoritmu-
249
Figura 3.24: Exemplu pentru algoritmul lui Co man
lui se schimba corespunzator comportarii curente sau anterioare a sistemului
(diferiti de algoritmii dinamici). Asignarea se poate face la un moment dat sau
are loc o reasignare dinamica.
Metodele aleatoare aloca aleator procese la procesoare. Sunt utile c^and
numarul de procese este mult mai mare fata de numarul de procesoare si exista
putine comunicari ^ntre procese (nu se optimizeaza costurile de comunicare).
Exemplu de algoritm static optimal: algoritmul Co man. Lucreaza
pe grafuri arbitrare de procese, si presupune urmatoarele: toate procesele au
acelasi timp de executie si comunicatiile sunt neglijabile ^n comparatie cu cal-
culele, iar ordinea de precedenta trebuie sa e respectata. Algoritmul este
sugerat ^n Figura 3.24 pentru un caz particular. Se asigneaza etichete 1; : : : ; t
la cele t procese. Fie etichetele 1; : : : ; j 1 asignate la un moment dat si e
S multimea de procese cu succesori care au etichete. Pentru ecare nod x din
S se de neste l(x) ca ind secventa descrescatoare de etichete a succesorilor
imediati ai0 lui x. Se eticheteaza x cu j daca l(x)  l(x0) (lexicogra c) pen-
tru toti x ^n S . Se asigneaza procesul pregatit cu eticheta cea mai mare la
urmatorul timp disponibil ^ntre procesoare.
Echilibrarea dinamica a ^ncarcarii. Inconvenientul major al echilibrarii
dinamice a ^ncarcarii este surplusul ^n timp necesar pentru distribuirea
informatiilor de ^ncarcare, luarea deciziilor de plasare si transferul proceselor
^ntre gazde. Scopul este atingerea unui suplus mic prin utilizarea unor masuri
precum indexul de ^ncarcare si metode e ciente de distribuire a ^ncarcarii. Sis-
temele de organizare ierarhice cu distribuirea locala a informatiei de ^ncarcare
si politici locale de echilibrare a^ncarcarii sunt asociate unei e ciente mai mari.
Se considera exemplul problemelor ce exploateaza paralelismul ^n date. Se
prefera, pentru cazul static, distributia datelor a ate ^ntr-o structura bidimen-
sionala ^n mod ciclic sau bloc-ciclic, realiz^andu-se astfel o^ncarcare aproximativ
echilibrata (statistic). Figura 3.25 trateaza exemplul distribuirii ciclice a unei
structuri matriceale la o grila de 4  4 procesoare. Distribuirea ciclica este o
modalitate simpla de a ^mbunatati echilibrarea ^ncarcarii dar poate produce
numeroase comunicari pentru ca duce la cresterea frontierelor unui procesor.
250
Figura 3.25: Distribuire ciclica
Adesea este utilizata o forma de bisectie recursiva. In acest caz este adop-
tata o strategie divide-et-impera. Se ^ncearca partitionarea domeniului astfel
^nc^at sa se obtina o ^ncarcare calculatorie aproximativ egala. Algoritmul de
partitionare este el ^nsusi executat ^n paralel. Exista trei tehnici: bisectie re-
cursiva pe baza coordonatelor, a inechilibrului sau a grafului. Bisectia recursiva
bazata pe coordonate este aplicabila domeniilor cu structura locala de comuni-
care; subdivizarea este bazata pe coordonatele zice ale diferitelor puncte speci-
ce ale domeniului (divizare de-a lungul dimensiunii) { este o tehnica simpla,
necostisitoare ce ofera a partitionare buna a calculului ^nsa nu optimizeaza co-
municarile. Bisectia recursiva bazata pe inechilibru ^ncearca sa reduca costurile
de comunicare; se considera partitii cu ^ncarcari diferite si diferite variante si se
face o alegere asupra celei mai bune partitioni din punctul de vedere al costurilor
de comunicare (tehnica este costisitoare). Bisectia recursiva pe baza grafului
este utilizata pentru domenii complexe nestructurate; domeniul este reprezen-
tat printr-un graf, se identi ca extremitatile grafului si acestea se asigneaza la
procesoare (costuri de comunicare reduse).
Bisectia recursiva ortogonala (ORB) este un exemplu de bisectie pe baza
de coordonate care divide prima data un domeniul bidimensional ortogonal pe
directia o directie, e x, astfel ^nc^at exista un numar egal de obiecte ^n ecare
dintre cele doua subdomenii. Apoi ecare dintre aceste doua subdomenii sunt
independent divizate ortogonal pe cealalta directie, e y, obtin^andu-se 4 sub-
domenii, ecare cu aproximativ acelasi numar de obiecte ^n ecare. Acest
proces continua altern^and ^ntre directiile x si y, p^ana c^and exista un sub-
domeniu pentru ecare procesor. ORB (Figura 3.26) nu este indicat ^n cazul
^n care obiectele sunt uniform distribuite ^n domeniu pentru ca surplusul da-
torat tehnicii nu este justi cat fata de metoda subdomeniilor identice. Daca
obiectele nu sunt distribuite uniform pe domeniu, ORB poate produce o vari-
etate de forme pentru subdomenii. Utilizarea unei scheme dinamice de echili-
brare a ^ncarcarii precum ORB adauga complexitate la software, ^n particular
^n decizia care date de frontiera trebuie comunicate cu care procesor. Bisectia
recursiva ierarhica (HRB) este o varianta de ORB ^n care se fac prima data
toate taieturile^ntr-o singura directie, apoi toate taieturile^n directia secundara
si nu altern^and directiile. HRB permite ca distributia datelor sa e ajustata
de-a lungul unei singure directii si nu ^n ambele. ORB si HRB pot extinse
usor la 3 sau mai multe dimensiuni.
251
Figura 3.26: Bisect ia recursiva bazata pe coordonate aplicata la studierea
miscarii particulelor: (a) ORB ^n cazul unei distributii aproape uniforme; (b)
ORB ^n cazul unei distributii neuniforme; (c) HRB
Mecanisme de migrare a proceselor. O echilibrare a ^ncarcarii poate
fara sau cu eliminare. In plani carea dinamica fara eliminare (numita si plasare
dinamica) procesele sunt eligibile pentru redistribuire numai^nainte de pornirea
executiei lor. In plani carea cu eliminare (numita si migrarea proceselor), un
proces poate realocat dupa ce executia sa ^ncepe. Pasii sunt urmatorii: sus-
pendarea procesului ce va migra pe calculatorul gazda, transferarea procesului
^mpreuna cu starea curenta la gazda destinatie si continuarea executiei proce-
sului pe gazda destinatie.
Politica de migrare a proceselor este similara cu politicile de plasare di-
namica a proceselor. Un proces eligibil trebuie sa e mai mare dec^at o valoare
prag, a fost executat pe masina sursa mai mult dec^at o valoare prag, sau
apartine multimii de procese care au mai fost transferate. Pe l^anga surplusul
similar cu cel introdus de plasamentul dinamic al taskurilor, migrarea proce-
selor adauga un surplus necesar transferului ^ntre sursa si destinatie. O stare
tipica de proces consta dintr-o informatie de memorie virtuala, siere deschise,
tampoane mesaje, date de mediu. Transferul informatiei memoriei virtuale
poate realizat ^n mai multe moduri: transfer complet, precopiere, copie la
referinta sau copie extinsa la referinta. In cazul unui transfer cu precopiere
se seteaza un pipeline astfel ^nc^at la luarea unei decizii de migrare, proce-
sarea paralela si transferul au loc simultan (transferul continua p^ana c^and este
atins un prag de numar de pagini "murdare"), ^n nal procesul ind suspendat
si paginile "murdare" curente sunt tranferate si ele. In cazul unei copii la
referinta, la timpul migrarii, procesul si starea sa cu exceptia memoriei vir-
tuale sunt transferate la destinatie unde executia continua, iar paginile cerute
sunt transferate de la sursa la cerere. In cazul unei copii extinse la referinta se
presupune ca at^at sursa c^at si destinatia partajeaza un server de siere (^n rest
se aseamana cu varianta anterioara).
Daca procesul parinte al unor procese i migreaza apar probleme supli-
mentare ^n cunoasterea noii locatii a parintelui de catre i.
Plani carea proceselor
Una dintre temele cele mai di cile din mediile de operare paralela sau dis-
tribuita este dezvoltarea unor tehnici efective pentru distribuirea proceselor ale
252
Figura 3.27: Starile unui proces: (a) Cazul secvential; (b) Cazul paralel
unui program paralel pe procesoare multiple. Problema este plani carea pro-
ceselor pe elementele de procesare pentru a atinge anumite scopuri legate de
performanta, precum minimizarea^nt^arzierilor datorate comunicarilor si timpul
de executie sau maximizarea utilizarii resurselor.
Plani carea locala efectuata de sistemul de operare al unui element de proce-
sare consista ^n asignarea proceselor la intervale de timp. Plani carea globala
este procesul de decizie a locului unde se va executa un proces ^ntr-un sistem
multiprocesor. Poate realizata de o singura autoritate sau poate distribuita
^ntre elemente de procesare. Figura 3.27 indica starile posibile ale unui proces.
Aspecte teoretice ale plani carii sarcinilor. Teoria plani carii este o
ramura teoretica a stiintei calculatoarelor si cercetarilor operationale care
trateaza ordinea alocarii proceselor sau sarcinilor la procesoare pentru a max-
imiza un anumit criteriu de optimizare.
Se considera multimea de sarcini T = fT ; T ; : : : ; Tng, si multimea de pro-
cesoare P = fP ; P ; : : : ; Pmg si resurse aditionale R = fR ; R ; : : : ; Rs g. Pro-
1 2

cesoarele pot identice, uniforme (difera ^n viteza, ^nsa viteza pe ecare pro-
1 2 1 2

cesor este constanta si nu depinde de sarcina rulata), sau nerelationate (viteza
procesorului depinde de sarcina particulara procesata).
O sarcina constituie unitatea de baza a activitatii de calcul.
Se asociaza cu ecare sarcina Ti un numar pozitiv pi care reprezinta
timpul de procesare sau executie a sarcinii Ti . Se constituie vectorii pi =
(p i ; : : : ; pmj )T ^n care pij este timpul necesar procesorului Pi pentru a procesa
sarcina Tj . In cazul unor procesoare identice avem pij = pj ; i = 1; 2; : : : ; m.
1

Timpul de disponibilitate rj este timpul la care sarcina Tj este disponibila


pentru procesare. Data cuvenita sau scadenta dj este timpul la care Tj tre-
buie sa e terminat (^n mod uzual se stabilesc niste functii de penalitate ^n
concordanta cu aceste date). Greutatea wj exprima urgenta relativa a lui Tj .
Fie < o ordine partiala ire exiva (adica tranzitiva, antisimetrica si ire-
exiva) pe T ce reprezinta constr^angerile de precedenta ^ntre sarcini: daca
Ti < Tj , atunci Tj nu poate starta p^ana c^and Ti nu a fost terminat.
Un sistem de sarcini TS este complet speci cat prin: T S = (fTig; fpig; <).
Se considera timpul de completare Cj , timpul de scurgere Fj = Cj rj ,
^nt^arzierea Lj = Cj dj si ^ncetineala D = maxfCj dj ; 0g: Tin^and seama
de aceste notatii, exista mai multe posibilitati de descriere a optimalitatii unei
plani cari, sugerate ^n Tabelul 3.7.
Notatia Graham-Blazewics. Notatia pentru clasi carea algoritmilor se
face pe baza a trei c^ampuri: j j unde este mediul procesoarelor, , carac-
teristicile sarcinilor si resurselor, iar , criteriul de optimizare.
253
3.7: Criterii de optimizare
Tabelul

Criteriu Descriere formala


Lungimea plani carii Cmax =PmaxfCj g
Timp mediu de scurgere F = nP nj Fj P
1
=1
Timp ponderat mediu de scurgere F w = nj wj Fj = nj wj
Int^arziere maxima Lmax =PmaxfLj g
=1 =1

Incetineala medie D = nP nj Dj P
1
=1
Incetineala ponderata medie Dw = Pnj wj Dj = nj wj
=1 =1
Valoare timpurie medie E = nP nj Ej P
1
=1
Val. timpurie ponderata medie E w = nj wj Ej = nnj wj
U = nj Uj , Uj = 10; dac a C j > dj
=1 =1
P
Nr. de taskuri ^nt^arziate Pn
=1 altfel
Nr. ponderat de taskuri ^nt^arziate Uw = j wj Uj : =1

Mediul procesoarelor. Poate un element din multimea f;; P; Q; R; O; F;


J g, caracteriz^and tipul procesorului utilizat: ; pentru un singur procesor, P
pentru procesoare identice, Q pentru procesoare uniforme, R pentru procesoare
nerelationate, O pentru procesoare dedicate ^ntr-un sistem deschis, F pentru
procesoare dedicate ^ntr-un sistem bazat pe ux, J pentru procesoare dedicate
^ntr-un sistem bazat pe joburi. Un parametru de tipul f;; kg indica un numar
variabil de procesoare 1  k.
Mediul sarcini si resurse. C^ampul = ; ; ; : : : ; descrie caracteristi-
cile sarcinilor si resurselor, unde 2 f;; pmg indica posibilitatea unei eliminari
1 2 3 8

de sarcini, 2 f;; resg caracterizeaza existenta unei resurse aditionale, 2


1

f;; prec; uan; tree; chainsg re ecta constr^angerile de precedenta, 2 f;; rj g


2 3
4
timpii de disponibilitate, 2 f;; pj g descrie timpii de procesare, 2 f;; dg
descrie scadentele 2 f;; nj g descrie numarul maxim de sarcini a unui job
5 6

^n cazul unui sistem de joburi, iar 2 f;; no waitg se refera la timpul de
7

asteptare ^n cazul sistemelor cu procesoare dedicate.


8

Criteriu de optimalitate. C^ampul denota un criteriu de optimalitate (pre-


cum cele din Tabelul 3.7): 2 fCmax; F ; F w ; Lmax; D; Dw ; E; E w ; U; Uw ; g.
De exemplu, P jjCmax se citeste astfel: plani care a taskurilor ne-eliminative
si independente cu timpi de procesare arbitrari (lungimi), ce sosesc la sistem la
timpul 0, ^n paralel, la procesoare identice, scopul ind minimizarea lungimii
plani carii. De asemenea 1 jprecj este o plani care ^n care sarcinile nu sunt
eliminate, sunt ordonate printr-o anumita precedenta si sunt disponibile la
timpul 0 pe un unic procesor.
Plani carea sincrona sau asincrona ^n sistemele ^n timp real. Scopul
plani carii ^ntr-un sistem multiprocesor ^n timp real este garantarea faptului
ca toate procesele critice respecta scadentele si exista c^at mai multe asemenea
procese care respecta scadentele. Plani carea poate sincrona sau asincrona.
Algoritmii de plani care sincroni sunt algoritmi de plani care statica ^n
care timpul de procesare disponibil este divizat de ceasul hardware ^n intervale
numite cadre. In ecare cadru o multime de procese este alocata astfel ^nc^at
254
se garanteaza terminarea lor p^ana la sf^arsitul cadrului. Daca un proces nu se
^ncadreaza ^ntr-un cadru, el este arti cial divizat ^ntr-o submultime de sarcini
puternic dependente astfel ^nc^at procese mai mici pot plani care ^n cadre.
Plani carea asincrona poate statica sau dinamica. In general algoritmii
de plani care dinamica sunt preferati deoarece reactioneaza la schimbarile ^n
starea sistemului precum esecurile hardware si software^n anumite subsisteme.
In sistemele ^n timp real, replici (copii) ale proceselor critice sunt alocate
static la mai multe procesoare si informatia de stare a procesului este duplicata.
La un eveniment de esec de procesor informatia de stare este expediata unui
duplicat al procesului si toate intrarile ulterioare sunt rerutate la replica.
Exista doua abordari ^n plani carea dinamica a proceselor critice. Prima
consta ^n plani carea taskurilor esentiale si ne-esentiale ^npreuna, iar criteriul
de optimalitate este minimizarea numarului de procese care esueaza sa ajunga
la scadenta sau minimizarea timpului maxim de violare a scadentei. In a doua
abordare, la aparitia unui proces ^n sistem, plani carea curenta este veri cata
sa se vada daca noul proces poate adaugat la aceasta respect^and scadenta.
Exemple de algoritmi dinamici de plani care ^n timp real initiati de server
sunt primul{procesul cu scadenta minima,^n care procesul cu cea mai apropiata
scadenta este plani cat urmatorul, si primul{procesul cu relaxarea maxima ^n
care se selecteaza procesul cu timpul minim disponibil ^nainte de scadenta,
adica (minj (Pj Dj )).
Exemple de algoritmi ne-deterministici ^n plani carea sarcinilor
Algoritmii ne-deterministici pot priviti ca ind compusi din doua etape: etapa
de ghicire si etapa de veri care. Data o instanta a problemei I , etapa de ghicire
se bazeaza pe determinarea unui certi cat C (I ). At^at I c^at si C (I ) sunt oferite
ca intrari ^n etapa de veri care. Aceasta etapa continua sa calculeze ^ntr-o
maniera deterministica: e se opreste cu un raspuns pozitiv, e se opreste cu
un raspuns negativ, e calculeazaPla nesf^arsit fara oprire.
Se considera problema kjrj j wj Cj ; timpii la care sarcinile pot star-
tate nu sunt identici; problema este NP-complexa chiar ^n cazul ^n care toate
greutatile sunt 1. Se construieste plani carea prin adaugarea unei sarcini la un
moment, pornind de la plani catorul vid. La orice moment, avem un plani -
cator partial SU a multimii de sarcini U  T , SU = (T 1 ; :::; T jU j ). Timpul de
start cel mai timpuriu al sarcinii Tj 2 U , sj , si timpul de completare al sau,
Cj , sunt date prin
(
rj daca j =
sj = maxfrj ; C j 1 g daca j = j ; j 6= 1
1

maxfrj ; C U g daca Tj 2 T U
si Cj = sj + pj . Cele doua euristici sunt urmatoarele:
1. regula timpului de completare cel mai timpuriu (ECT): se selecteaza
sarcina Tj cu Cj = minfCijTi 2 T U g; la balotaj se alege Tj cu
sj = maxi fsi g,si la balotaj ulterior Tj cu indexul minim j . Se actu-
alizeaza sj si Cj .
2. regula timpului de start cel mai timpuriu (EST): se selecteaza sarcina Tj
cu sj = minfsijTi 2 T U g; la balotaj se alege Tj cu Cj = minifCi g, si
la balotaj ulterior Tj cu indexul minim j . Se actualizeaza sj si Cj .
255
3.28: Exemplu pentru algoritmul Schrage
Figura

De exemplu, e T = fT ; :::; T g cu timpii de procesare p = [3; 18; 17; 21; 25] si
timpii posibili de startare r = [35; 22; 34; 37; 66]. Regula ECT conduce la o plan-
1 5

i care (T ; T ; T ; T ; T ). Valorile nale ale timpului de start cel timpuriu s si


timpul de completare C sunt date de elementele vectorilor s = [35; 55; 38; 73; 94]
1 3 2 4 5

si C = [38; 73; 55; 94; 119]; si suma timpilor de completare este 379. Un plani-
cator optimal este (T ; T ; T ; T ; T ) a carui suma de completare este 346.
Algoritmul Schrage este schitat de urmatorul pseudo-cod:
2 1 3 5 4

t := min{r_j| T_j in T}
C_max:= t
while <T nu este vid> do
T1:= {T_j | T_j in T, r_j <= t}
<alege T_j in T1: p_j=max{p_k|T_k in T1,q_k=max{q_l|T_l in T1}>
<planificare T_j la timpul t>
T := T - {T_j }
t:= max{t+p_j , min {r_l | T_l in T} }
C_max:= max{C_max, t +p_j +q_j }
Daca se introduce dupa executia taskurilor un timp de livrare q ^n sis-
tem, algoritmul Schrage poate extins. De exemplu, pentru r = [10; 13;
11; 20; 30; 0; 30]; p = [5; 6; 7; 4; 3; 6; 2]; q = [7; 26; 24; 21; 8; 17; 0], algoritmul
plani ca (T ; T ; T ; T ; T ; T ; T ) pe o lungime 53. Plani carea optimala este
(T ; T ; T ; T ; T ; T ; T ), cu lungimea totala 50. Timpii de executiie sunt
6 1 2 3 4 5 7

reprezentati ^n Figura 3.28 prin linii solide, iar timpii de livrare sunt reprezen-
6 3 2 4 1 5 7

tate prin linii ^ntrerupte.


Exemplu: echilibrarea dinamica centralizata a ^ncarcarii prin conce-
sionarea sarcinilor
Anumite probleme au un paralelism st^anjenitor: problema poate divizata
^n subprobleme independente si solutia este concatenarea sub-rezultatelor. De
exemplu o asemenea tehnica este aplicabila la metoda drumului optic sau la
adunarea matriceala (element cu element). Timpul de comunicare trebuie sa
e su cient de mic pentru a justi ca distributia.
Concesionarea sarcinilor (modelul ferma, task farming) este un exemplu
pentru abordarea dinamica. Se asigneaza sarcini una c^ate una la procesele
lucratori odata ce sarcinile vechi sunt terminate. Fermierul (Figura 3.29)
detine problema orginala, distribuie subproblemele la lucratori si str^ange sub-
256
Figura 3.29: Structura unei ferme cu sarcini
rezultatele. Lucratorii fac cereri repetate si rezolva sub-probleme; orice lucrator
poate rezolva orice problema.
Se considera cazul unui lant de procesoare. Fiecare procesor lucrator trebuie
sa trateze avansarea sarcinilor si rezultatelor la celelalte procese. Abordarea
cea mai simpla este scrierea acestora ca procese separate care ruleaza ^n para-
lel pe acelasi procesor. Fermierul tine evidenta care lucratori sunt inactivi si
executa repetat urmatoarele: receptioneaza un rezultat etichetat, marcheaza
lucratorul expeditor ca inactiv, expediaza o noua sarcina, la orice lucrator in-
activ, etichetat cu numarul recipientului. La ecare procesor lucrator, avem
de fapt trei procese ce se deruleaza ^n paralel: supraveghetor de sarcini,
supraveghetor de rezultate si lucrator. Supraveghetorul de sarcini efectueaza
urmatoarele: receptioneaza o noua sarcina, daca marcatorul este nul atunci
paseaza sarcina la lucrator, altfel decrementeaza marcatorul si-l paseaza la
procesorul vecin din lant. Supraveghetorul de rezultate efectueaza urmatoarele:
avanseaza rezultatele de la vecin^nspre fermier, accepta rezultate de la lucrator
si le paseaza ^nspre fermier.
In cazul ^n care performanta este idealizata, adica comunicarile sunt in-
stantanee, fermierul este in nit de rapid, toate subproblemele au aceeasi di-
cultate (timp), si exista M sub-probleme, ecare de timp T , atunci timpul
secvential este MT , iar timpul paralel cu p lucratori este dM=peT , si acce-
lerarea este aproximativ p. Un studiu de performanta realist tine seama de
faptul ca putem avea un timp de expediere a sarcinilor si de receptionare a
rezultatelor, D, iar fermierul poate servi la un moment dat un singur lucrator.
Problemele care se preteaza pentru aceasta abordare sunt cele pentru care
T > D (contraexemplu: multiplicarea matriceala ^n care D si T sunt O(n)).
Reducerea costului de comunicare se poate realiza prin expedierea mai multor
subprobleme la un moment dat. In cazul unor probleme iregulate, timpul de
rezolvare al subproblemelor poate varia si distributia poate sa conduca la o
comportare asemanatoare cazului secvential. Alegerea aleatoare a distributiei
sarcinilor este utila c^and numarul de sarcini este mult mai mare dec^at numarul
de lucratori.

3.2 Exemple
Designerii experimentati de algoritmi se bazeaza pe o multime de blocuri con-
structive si unelte necesare pentru a pune blocurile ^mpreuna ^ntr-un algoritm.
Intelegerea acestor blocuri de baza si unelte este de aceea critica ^n ^ntelegerea
257
si constructia algoritmilor paraleli. Multe dintre blocurile si uneltele pentru
algoritmii paraleli provin de la agoritmii secventiali, precum programarea di-
namica si divide-et-impera, pe c^and altele sunt noi.
3.2.1 Insumare si operatii asociative
O tehnica comuna de constructie a algoritmilor implica construirea unui arbore
binar balansat din datele de intrare si parcurgerea acestuia ^nspre si de la
radacina. Acest arbore nu este adesea o structura de date ci un concept realizat
ca un arbore recursiv. Aceasta tehnica, a arborelui balansat, este utilizata ^n
reducere, dar si ^n sume pre xate, ^mprastiere si compactare matriceala.
Unul dintre cele mai simple si mai utile blocuri de constructie pentru algo-
ritmii paraleli este operatia de baleiaj (sau de explorare, de scanare sau toate-
sumele-pre xate). In plus fata de proprietatea de a un bloc de constructie
util, operatia este un exemplu bun de calcul care pare inerent secvential, dar
pentru care exista un algoritm paralel e cient. Se considera pentru ^nceput un
exemplu mai simplu, cel al unei^nsumari, care a mai fost tratata drept exemplu
^n paragrafe anterioare.
Insumarea a n numere
Pe un calculator secvential, codul unei asemenea ^nsumari este ^n principiu:
sum:= a[0]; for i:=1 to n do sum:= sum + a[i]
Timpul de rulare este proportional cu m, adica O(m):
Insumare utiliz^and memorie partajata. Cele n numere, si suma globala sunt
pastrate ^n memoria partajata. Atunci, initial global_sum=0 si apoi ecare
dintre cele p procese (procesoare) calculeaza suma locala a m=p numere ^ntr-o
variabila locala local_sum si apoi
LOCK
global_sum = global_sum + local_sum
UNLOCK
Deoarece global_sum este o variabila partajata ecare proces (procesor) tre-
buie sa aiba acces mutual exclusiv la ea, altfel raspunsul nal poate incorect.
Timpul de rulare (sau complexitatea algoritmului) este O(n=p) + O(p) unde
n=p indica numarul de elemente care vor ^nsumate local si p provine din
adunarea a p numere ^n ordine.
Insumare utiliz^and memorie distribuita. Sa presupunem ca avem o grila de
procesoare. Algoritmul este urmatorul. Fiecare proces (procesor) dintre cele
p gaseste suma locala a n=p numere, apoi paseaza suma locala la alt procesor
^ntr-o maniera coordonata astfel ^nc^at suma globala este ^n nal la procesorul
cu cel mai mic index (Figura 3.30).
Algoritmul ^n pseudocod este urmatorul:
for_all <proces ^
n {1,...,p}> do {
1 Rezumat: Operatii simple precum adunarea pot exista ^n cantitati apreciabile ^n nu-
meroase programe. Reducerea timpului de ^nsumare a elementelor unei structuri de date
mare este de aceea una din problemele calcului paralel.

258
Figura 3.30: Insumare utiliz^and o grila 3  3
<calculeaz
a localsum a n/p numere>
for j=sqrt(p) downto 1 do {
if <proces ^
n coloana j> then
send <localsum> to <vecin ^n coloana j-1>
if <proces in coloana j-1> then {
receive <new_local_sum> from <vecin ^n coloana j>
local_sum = local_sum + new_local_sum } }
if <proces ^
n prima coloana> then {
for i=sqrt(p) downto 1 do {
if <proces ^
n linia i> then
send <local_sum> to <vecin deasupra>
if <proces ^
n linia i-1> then {
receive <new_local_sum> from <vecin dedesubt>
local_sum = local_sum + new_local_sum } }
if <proces ^
n prima linie> then
global_sum = local_sum } }
Sunt necesare pp 1 adunari si pp 1 comunicari^n ecare directie, astfel^nc^at
complexitatea timpului este O(n=p) + O(p) + C , unde C este timpul petrecut
^n comunicari.
Operatia de baleiaj (suma pre xata)
Operatia de baleiaj considera un operator binar asociativ , un vector de
n elemente [a ; a ; : : : ; an ]; de un tip dat si returneaza vectorul [a ; (a 
0 1 1 0 0
a ); : : : ; (a  a  : : :  an )]; adica de componente Æki xi .
In general, data o secventa de obiecte (de exemplu, numere) S si o operatie
1 0 1 1 =0

asociativa , solutia problemei sumelor pre xate este o alta secventa de


obiecte{rezultate ale operatiei pe ecare secventa pre xata a lui S . Formal
acest problema se poate de ni astfel: intrari x ; : : : ; xn si iesiri: S (1); : : : ; S (n)
unde S (i) = x      xi (operatorul  este generic pentru orice operatie aso-
1

ciativa, nu necesar XOR;  poate orice operator precum ^; _; max; min; etc).
1

De exemplu, daca  este adunarea, atunci operaratia de baleiaj pe matricea


[3 1 7 0 4 1 6 3] va returna [3 4 11 11 14 16 22 25]. Aceasta operatie poate
realizata ^n timp O(n) printr-un algoritm secvential.
Utilizarea operatiei de baleiaj este extensiva. Iata o lista de asemenea
aplicatii: compararea lexicala a sirurilor de caractere (de exemplu a deter-
mina daca "strategie" apare ^nainte de "strati care"^n dictionar), adunarea^n
multi-precizie a numerelor foarte mari sau foarte mici (aceste numere nu pot
reprezentate ^ntr-un singur cuv^ant masina), evaluarea polinoamelor, imple-
259
Figura 3.31: Algoritmul arborelui binar: (a) Deplasare ^n sus pentru operatia
de reducere; (b) Executia operatiei de reducere pe un vector de 8 elemente ^n
modelul EREW PRAM
mentarea quicksort si radixsort, rezolvarea sistemelor liniare tridiagonale,
alocarea dinamica a procesoarelor, efectuarea analizei lexicale, cautarea unei
expresii regulate, rezolvarea recurentelor, gasirea ad^ancimii tuturor v^arfurilor
^ntr-un arbore etc. De fapt, operatiile de baleiaj ce utilizeaza adunarea, min-
imum si maximum sunt at^at de utile ^n practica ^nc^at au fost incluse ca
instructiuni primitive ^n anumite masini.
Operatii de reducere. Dat un vector a ; a ; : : : ; an , operatia de reducere
calculeaza a  a  : : :  an.
1 2

Operatia de reducere poate realizata usor ^n paralel utiliz^and un ar-


1 2

bore binar pentru efectuarea ^nsumarii. Se considera un arbore binar cu el-


ementele a ; a ; : : : ; an drept frunze. La o deplasare ^nspre radacina arborelui,
se stocheaza la ecare nod suma valorilor celor doi i, produc^andu-se astfel la
1 2

radacina rezultatul operatiei de reducere.Figura 3.31.a sugereaza modalitatea


de aplicare a algoritmului pentru un exemplu de 8 intrari.
Consideram un model PRAM de tip EREW ^n care  este o operatie
de baza. Presupunem ca intrarile a ; a ; : : : ; an sunt reprezentate ^n n
celule de memorie M ; M ; : : : ; Mn. Algoritmul PRAM va termina cu iesirile
1 2

s ; s ; : : : ; sn , unde si = a  a  : : :  ai , plasate ^n cele n celule de memorie.


1 2

Deoarece valorile la ecare nod din acelasi nivel al arborelui sunt calculate ^n
1 2 1 2

paralel si deoarece exista cel mult n=2 noduri per nivel, algoritmul arborelui
binar poate efectuat ^n timp O(log n) utiliz^and n=2 procesoare. Intr-adevar
algoritmul arborelui binar poate implementat ^ntr-un model PRAM fara nici
o celula suplimentara de memorie pentru nodurile interne, iar implementarea
poate realizata teoretic ^n log n pasi. In pasul k (0  k  log n), procesorul
Pi (1  i  n=2k ) citeste a k i si a k+1 i (Figura 3.32.a), ^nsumeaza va-
+1

lorile si scrie rezultatul ^n a k+1i . Figura 3.31.b sugereaza executia PRAM a
2 (2 1) 2

operatiei de reducere pe acelasi exemplu precum ^n Figura 3.31.a. Acest al-
2

goritm nu este cost-optimal, deoarece numarul minim de procesoare necesar


este n=2 (unul pentru ecare pereche de frunze), obtin^andu-se astfel un lucru
total de Wp (n) = O(n log n), iar algoritmul serial necesita un timp O(n), deci
Wp (n) 6= O(Ts (n)). In formularea WT recursiva:
SCAN(x, +) {
if dim(x)= 1 then { s[1]:= a[1] ; return s }

260
Figura3.32: (a) Suma a 8 valori pe baza unei structuri arborescente; (b) Arbori
multipli
for_all i in 1:dim(a)/2 do y[i]:= a[2*i-1]+ a[2*i]
z := SCAN(y, +)
for_all i in 1:n do
if even(i) then s[i]:= a[i/2]
else if i = 1 then s[1]:= a[1]
else s[i]:= z[(i-1)/2]+ a[i]
return s }
Pentru determinarea unui algoritm cost-optimal, se considera p < n pro-
cesoare si ecare procesor poate ^nsuma secvential o n=p sectiune a vectorului
necesit^and timp O(n=p) si apoi utiliz^and tehnica arborelui. Timpul necesar
celor p < n procesoare pentru implementarea operatiei de reducere este ast-
fel O(n=p + log p). Daca n=p  log p, timpul necesar este O(n=p) care este
acceleratia optimala asupra algoritmului secvential. Astfel daca se utilizeaza
n= log n procesoare ^n loc de n=2: ecare procesor efectueaza log n operatii
seriale, apoi se combina valorile rezultate ^ntr-un arbore. Primul pas nece-
sita un timp log n deoarece ecare procesor aduna log n numere. Pasul com-
binarii necesita un timp corespunzator ad^ancimii arborelui, sau timp log p,
unde p = n= log n este numarul de procesoare. Astfel, Tp(n) = log n + log p =
O(log n), deoarece log n creste mai repede dec^at log(n= log n). Lucrul total este
Wp (n) = P  Tp (n) = (n= log n)  O(log n) = O(n), acelasi ca^n cazul serial, astfel
algoritmul este cost-optimal. In concluzie, daca un algoritm nu are paralelism
su cient pentru a utiliza un procesor per element, utilizarea unui numar mai
mic de procesoare poate conduce la un algoritm care este cost-optimal.
Arbori multiplii. Arborii multiplii se pot utiliza pentru calculul ^n paralel a
sumelor partiale ale operatiei de baleiaj. Figura 3.32.b sugereaza modalitatea
de difuzare a valorile de-a lungul coloanelor si a sumele de-a lungul liniilor unei
grile de procesoare virtuale. Rezultatele se obtin sunt de-a lungul diagonalei.
Pentru aceasta avem nevoie de n =2 procesoare. Fiecare linie este o suma
2

calculata separat. Fiecare suma p^ana la i poate realizata cu i= log i procesoare


(lucru local) ^n timp O(log i). De aceea este necesar un total de O(n = log n)
2

procesoare. Baleiajul poate realizat ^n timp O(log n), dar lucrul total este
O(n ), astfel ^nc^at algoritmul nu este cost-optimal.
2

Algoritm cu lucru plocal ^n doua faze. Utilizeaz p a pn procesoare. Fiecare


procesor ^nsumeaza n valori local (^n timp O( n)). Apoi ecare procesor
261
Figura 3.33: (a) Deplasare ^n jos pentru calculul pre-baleiajului; (b) Executia
operatiei de pre-baleiaj ^n modelul EREW PRAM
transmite vecinului din dreapta suma sa la care a adunat valoarea de la vecinul
din st^anga (^n timp O(pn)). Fiecare procesor efectueaza un baleiaj local,
^ncep^and pcu ofsetul (plecarea) care o receptioneaz a de la vecinul din st^anga
(timp O( n)). Lucrul este astfel p  Tp(n) = pn  3pn = O(n). Incerc^and
marirea numarului de procesoare ^n ideea reducerii timpului de rezolvare, se
poate reduce cantitatea de lucru local la n = , deci o crestere a numarului
1 4

de procesoare la n = . Atunci cele


3 4
doua faze locale pvor necesita ecare timp
O(n ), iar faza de baleiaj O(n = ), si lucrul va O(n n) (ne-e cient^n lucru).
1 4= 3 4

Operatia de pre-baleiaj. Un pre-baleiaj este similar cu un baleiaj, ex-


cept^and faptul ca vectorul rezultat de lungime n + 1 este [1; a ; (a 
a ); : : : ; (a  : : :  an )] unde 1 este elementul identitate pentru operatia
0 0

care este efectuata.


1 0 1

a1 a2 ... an ! S
baleiaj
1 S2 ... Sn

a1 a2 .. . an prebaleiaj
! I a . . . a      an 1 1 1

Rezultatele celor doua operatii pot obtinute una din alta ^n timp constant.
Dat ind un vector de valori [a ; a ; a ; a ; a ; a ; a ; a ; a ; a ; : : : ; an] si un
vector de fanioane [1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, . . . ] se compreseaza elementele
0 1 2 3 4 5 6 7 8 9

cu fanion obtin^andu-se vectorul [a ; a ; a ; a ; a ; a ; : : :]: Aceasta tehnica poate


utilizata de exemplu la sortarea rapida quicksort, unde elementele pilot sunt
0 2 3 7 8 9

marcate cu un 1 ^n matricea de fanioane. In exemplul dat, prin pre-baleiaj se


obtine [0, 1, 1, 2, 3, 3, 3, 3, 4, 5, 6, . .. , astfel ^nc^at a ajunge ^n pozitia 1,
a ajunge ^n pozitia 3, si asa mai departe. Deoarece compresia (^mpachetarea
2

a unui vector) utilizeaza operatia de pre-baleiaj, poate realizata utiliz^and


7

n= log n procesoare ^n timp O(log n).


Operatia de pre-baleiaj poate efectuata pe baza de arbore binar printr-o
deplasare^nspre frunze pe arbore (utilizata pentru operatia de reducere). Initial
elementul identitate (0) este inserat la radacina. La ecare pas, ecare v^arf din
nivelul curent paseaza ului din st^anga valoarea sa noua si ului din dreapta
valoarea sa noua la care se adauga valoarea veche a ului din st^anga. Figura
3.33.a sugereaza rezultatul unei deplasari ^n jos pe acelasi arbore ca cel gurat
^n Figura 3.31.a. Figura 3.33.b prezinta executia PRAM a deplasarii ^n jos pe
262
Figura 3.34: (a) Circuit pentru n = 2 de calcul al sumelor S (i); (b) Circuit
direct pentru n de calcul a sumelor S (i)
acelasi exemplu. Dupa terminarea operatiei, ecare v^arf al arborelui contine
suma tuturor valorilor frunza preced^andu-l ^n preordine. Aceasta a rmatie
poate demonstrata prin inductie dupa nivelul arborelui ce contine v^arful.
Intreaga operatie poate sumarizata astfel:
// la urcare ^
n arbore
sum[v] = sum[l(v)] + sum[r(v)]
// la coborare ^
n arbore
prescan[r(v)] = prescan[v] + sum[l(v)]
prescan[l(v)] = prescan[v]
Calculul sumelor pre xate utiliz^and circuite. Studiem un algoritm care
utilizeaza modelul circuit pentru calculul sumelor pre xate^n paralel. S (i) este
functia care se doreste a calculata. Un circuit simplu pentru calculul sumelor
S (i) c^and n = 2 este prezentat ^n Figura 3.34.a. Un circuit pentru n general
de calcul a sumelor S (i) este prezentat ^n Figura 3.34.b. Circuitul din Figura
3.34.b are ad^ancime liniara si dimensiune liniara, ceea ce nu este e cient.
Cu ajutorul unui algoritm recursiv este posibila obtinerea unei ad^ancimi
logaritmice si a unei dimensiuni liniare. Chiar daca ad^ancimea liniara nu este
considerata a e cienta, dimensiunea liniara a portilor sau procesoarelor este
considerata a e cienta. C^and n este o putere a lui 2, putem calcula sumele
S (i) recursiv precum este descris mai jos si de Figura 3.35. Datele de intrare
ale algoritmului sunt (x ; x ; : : : ; xn). Pasii sunt urmatorii:
1. Efectueaza n=2 operatii x  x ; x  x ,. . . ,xn  xn ^n paralel.
1 2
1 2 3 4 1
2. Apeleaza recursiv Algoritm(x  x ; x  x ; : : : ; xn  xn ), de data
aceasta cu n=2 intrari, iesirile ind x  x ; x     x ; x  : : : 
1 2 3 4 1

x ; : : : ; x  : : :  xn , adica iesirile pare S (2); S (4); S (6); : : : ; S (n) ale


1 2 1 4 1

problemei initiale.
6 1

3. Se cunoaste S (1) = x . Se calculeaza iesirile impare pentru problema


initiala utiliz^and ecuatia S (2i+1) = S (2i)x i , unde i = 1; : : : ; n=2 1.
1

Fie D(n) ad^ancimea circuitului si G(n) dimensiunea (numarul de porti non-
2 +1

intrare). Stim ca D(2) = 1; G(2) = 1. Se observa ca D(2n) = D(n)+1 (sumele
263
Figura 3.35: Circuit recursiv de calcul al sumelor S (i) c^and n = 2k
perechi initiale) +1 (pre xele pentru lungime impara), iar G(2n) = G(n) + n
(sumele perechi initiale) +(n 1) (pre xele pentru lungime impara). De aceea
ad^ancimea circuitului este D(n) = O(log n) si dimensiunea circuitului este
G(n) = O(n). Astfel utiliz^and algoritmul recursiv paralel se obtine un circuit
de ad^ancime logaritmica si dimensiune liniara. Acest algoritm este implementat
ca operatie de baza ^n anumite masini paralele.
3.2.2 Sortare paralela
Cele mai des utilizate sortari secventiale sunt cea prin selectie (c^and se se-
lecteaza treptat cel mai mic/mare numar si se scoate din secventa), insertie
(c^and ecare numar este inserat pe pozitia corecta relativ la o secventa an-
terior sortata), numarare (c^and ecare numar este comparat cu celelalte si
numarul celor mai mici dec^at acesta indica pozitia ^n secventa nala), inter-
schimbare (c^and numerele din doua locatii curente ^si schimba pozitia ^ntre ele
daca ordonarea nu este respectata). Intr-un calculator secvential ecare in-
terschimbare se poate executa separat. Un algoritm paralel necesita cel putin
O(n log n) comparari, unde n este numarul de elemente ce se sorteaza. Din
pacate algoritmii secventiali care realizeaza numarul minim de comparatii nu
pot restructurati ^n algoritimi paraleli cost-e cienti. Tabelul 3.8 prezinta
masurile de complexitate a celor mai bune versiuni paralele ale acestor algo-
ritmi secventiali precum si a altora des utilizati ^n sortare.
Exemplul 0 de paralelizare a unui algoritm secvential: sortare prin in-
terclasare (mergesort). Mergesort consista din sortarea recursiva a doua
jumatati a secventei de sortat si apoi ^mbinarea rezultatelor. Pentru a gasi
2 Rezumat: Ordonarea unor informatii este des ^nt^ alnita ^n aplicatiile pe calculator. La
cantitati mari de date, timpul necesar ordonari poate critic. Algoritmii paraleli de sortare
pot oferi solutii mai rapide; cei mai rapizi ^nsa difera de algoritmii secventiali clasici.

264
Tabelul 3.8: Complexitatea timpului echivalentilor paraleli a algoritmilor
secventiali (^n termeni O())
Sortare Seriala Paralela
Timp Ad^ancime Lucru
Insertie 2
n n 2
n
Selectie 2
n n 2
n
Interclasare (mergesort) n log n log n 2
n log n
Rapida (quicksort) n log n log n n log n
Numarare (radixsort) 2
n n 2
n
Grupare (heapsort) n log n nu poate paralelizat e cient
un algoritm paralel e cient ^n lucru trebuie gasit ^n primul r^and un algoritm
paralel. Algoritmul standard secvential selecteaza repetat cel mai mic dintre
primele elemente ale celor doua secvente sortate. Acesta tehnica nu poate
direct convertita ^ntr-un algoritm paralel. Se poate utiliza^nsa o tehnica divide-
et-impera: se selecteaza elementul de mijloc a uneia dintre secvente. Pentru a
asigura o diviziune rezonabila a lucrului, ^ntotdeauna se taie cea mai mare din-
tre cele doua secvente. Se utilizeaza apoi o taiere corespunzatoare ^n cealalta
lista. Se interclaseaza recursiv cele doua perechi de secvente taiate. Se un-
esc prin alipire cele doua secvente rezultate pentru a forma secventa ordonata.
Pentru a studia complexitatea acestui algoritm trebuie sa stabilim structura de
date utilizata pentru reprezentarea secventelor. Utiliz^and o matrice, taierea
matricei si cautarea binara necesita lucru si ad^ancime O(log n), iar unirea
necesita lucru O(n) si ad^ancime O(1). Astfel complexitatile sunt: W (n) =
2W (n=2)+ O(log n + n) = O(n log n); D(n) = D(n=2) + O(log n) = O(log n). 2

Utiliz^and o lista ^nlantuita, taierea si cautarea binara necesita lucru si ad^ancime
O(n), dar daca mentinem un pointer la sf^arsitul ecarei liste atunci adaugarea
poate realizata ^n lucru si ad^ancime O(1). Complexitatile sunt urmatoarele:
W (n) = 2W (n=2) + O(n) = O(n log n); D(n) = D(n=2) + O(n) = O(n). Daca
utilizam o matrice ^n sensul ^n jos al recursiei si o lista ^nlantuita ^n sensul
^n sus, se poate pro ta de bene ciile ambelor variante, iar complexitatile sunt
W (n) = 2W (n=2) + O(log n) = O(n); D(n) = D(n=2) + O(log n) = O(log n). 2

Astfel se poate obtine un algoritm paralel e cient ^n lucru daca se utilizeaza
ambele structuri. Singura problema este aceea ca rezultatul este returnat drept
lista ^nlantuita. Pentru a converti aceasta lista ^napoi ^n matrice (astfel ^nc^at
sa poata utilizata ca intrare pentru o alta ^mbinare este necesara o lista cu
ranguri, realizabil cu o ad^ancime O(log n) si lucru O(n).
Exemplul 1 pentru introducerea de noi algoritmi: sortare pe baza de
esantioane. Sample-sort este un exemplu de algoritm paralel care nu are
un analog serial util; este o generalizare paralela a sortarii rapida (quicksort).
Pasii implicati sunt urmatorii. Selecteaza un numar de "chei" din secventa si
p 1 de "sparturi" (splitter), care vor utilizate de catre cheile de partitii.
Baz^andu-se pe sparturi, cheile sunt expediate la unul dintre cele p grupuri
(bucket). Sortarea are loc ^n interiorul grupurilor. Aceasta poate realizat
serial, dar se poate realiza si un apel recursiv la sortare pentru a descreste sur-
265
plusul difuzarii. O modalitate simpla pentru selectarea sparturilor este aceea
de a considera p 1 chei aleator si sortarea lor. Rezulta ^n medie grupuri de
marime (n log n)=p. Astfel este probabil ca un grup sa e mai mare dec^at me-
dia cu un factor de log n. O modalitate de a selecta sparturile pentru a face
grupurile de dimensiune uniforma este supraesantionarea. Ideea este aceea ca
^n loc de esantionarea a p 1 chei, se considera s(p 1) chei unde s este rata
de supraesantionare. O alegere rezonabila pentru s este log n. Atunci dupa
sortarea a (log n)(p 1) straturi, se considera p 1 chei cu un pas mare de
log n. Exista o diferenta ^ntre obtinerea grupurilor uniforme ca marime si tim-
pul necesar acestei faze de sortare. Daca selectam sparturile secvential, atunci
timpul de rulare a acestei parti a algoritmului este timpul necesar sortarii a
p log p chei: Tspart = O((p log p) log(p log p)) = O(p log p). Dupa ce sparturile
2

au fost selectate, sunt difuzate la ecare procesor. Fiecare procesor efectueaza


apoi o cautare binara pentru a partitiona cheile sale de-a lungul grupurilor, si
rutarea cheilor sale la grupurile corespunzatoare. Aceasta parte a algoritmului
necesita Tgrupuri = Tdifuzare + Tcautbin + Tsend = O(p + (n=p) log p + (n=p)):
Timpul necesar sortarii grupurilor este egal cu timpul de sortare necesar pro-
cesorului cu cel mai mare grup. Daca presupunem ca cel mai mare grup este
doar cu un factor constant mai mare dec^at grupul mediu (care este aproape
^ntotdeauna adevarat daca consideram o rata buna de supraesantionare), atunci
Tsortlocal = O((n=p) log(n=p)): Astfel timpul total este
Tsampsort = O(p log p + p + (n=p) log p + (n=p) + (n=p) log(n=p)) =
2

= O(p log p + (n=p) log n):


2

Daca comparam acest rezultat cu regula standard T = O(W=p + D) putem


vedea ca W = n log n si D = p log p:
2

Exemplul 2: sortarea pe o linie de procesare. Un pas de calcul al


unui proces se compune din: receptionarea intrarilor de la vecini, inspectarea
^nregistrarii locale, efectuarea calcului prescris, modi carea ^nregistrarii lo-
cale, si generarea iesirii pentru vecini. Un ceas global guverneaza procesoarele
(sistolic). Se considera o structura de interconectare liniara, ^n cazul dat o
agregare uni-dimensionala de procesoare, cu porturi de I/O la capatul st^ang.
Fiecare proces ^nregistreaza numarul minim pe care-l vede. Valoarea initiala a
^nregistrarii este , care se considera a mai mare dec^at orice valoare potentiala
a intrarii si care^nseamna "nici un semnal". La receptionarea unui numar Y de
la vecinul din st^anga, procesul retine minimul dintre Y si valoarea curenta sto-
cata si paseaza valoarea mai mare la vecinul din dreapta. La sf^arsit, al ilea pro-
cesor va avea al ilea cel mai mic numar (Figura 3.36.a). "Iesirea" este activata
la receptionarea unei  dupa receptionarea unui non (Figura 3.36.b). Fiecare
proces expediaza continutul memoriei locale la vecinul din st^anga, apoi paseaza
orice valoare de la vecinul din drepata la cel din st^anga. Acesta operatie nu este
pornita p^ana c^and vecinul din st^anga nu o termina. Pentru j < i, valoarea de
la al ilea proces soseste la al j lea proces la momentul n + i +(i j ) = n +2i j
(Figura 3.36.c). Pentru acest algoritm speci c, Tp = 3n 1 = O(n); la p = n
procesoare, S = O(log n); W = O(n ); E = O((log n)=n). In cazul p < n
2

se ^mpart cele n procese teoretice ^n p blocuri la procesoare consecutive de


266
Figura3.36: Sortarea pe o linie de procesare: (a) Pasii de sortare; (b) Activarea
procesului de iesire; (c) Valoarea returnata

Figura 3.37: Gruparea proceselor pe procesoare ^n cazul ^n care numarul de
procesoare este mai mic dec^at cel al proceselor
marime egala, ecare av^and diemnsiunea bn=pc. Capacitatea de memorie pre-
cum si capacitatea de comunicare este crescatoare. Al ilea procesor simuleaza
toate procesele din blocul asociat (Figura 3.37), deci surplusul este de O(n=p).
Exemplul 4: sortarea pe biti. Un procesor poate trata numai operatii pe
biti. Se sorteaza n numere a maxim k biti ecare.
Intr-o prima solutie, se utilizeaza o structura liniara de k procesoare si
matrice k  n unde celula (i; j ) stocheaza al ilea bit al j lea procesor pe cuv^ant.
Se compara doua numere de k biti examin^and bitii lor de la st^anga la dreapta.
Informatia comunicata de-a lungul liniilor sunt biti, iar de-a lungul coloanelor
este "interschimbare", "pastrare" si "?" (Figura 3.38).
Intr-o a doua solutie, se utilizeaza un arbore binar plin de ad^ancime e care
satisface k = 2e . A ia frunza compara ai, al ilea bit al ^nregistrarii curente si
bi , cel al valorii receptionate, si expediaza la parintele sau "?" daca ai = bi ,
"interschimba" daca ai > bi , si "pastreaza", altfel. Nodurile interne aplica
urmatoarea regula la cele doua semnale de la i sai:
st^anga/dreapta ? interschimba pastreaza
? ? interschimba pastreaza
interschimba interschimba interschimba interschimba
pastreaza pastreaza pastreaza pastreaza
267
Figura 3.38: Sortare pe biti: (a) Solutia 1; (b) Solutia 2; (c) Solutia 3

Figura 3.39: Notatii pentru solutia 3


Surplusul este O(log k).
Intr-o a treia solutie, se fac comparatii directe; bitul ce este retinut poate
determinat fara a cunoaste bitii inferiori. Utiliz^and notatiile din Figura 3.39),
regula este urmatoarea:
y a b z new-a c
pastreaza pastreaza a b
interschimba interschimba b a
? 0 0 ? 0 0
? 1 1 ? 1 1
? 0 1 pastreaza 0 1
? 1 0 interschimba 0 1
Linia a i-a ^ncepe sa receptioneze intrari la al ilea pas. Atunci y si b sosesc la
acelasi timp. Timpul de rulare este T = (3n 1)+(k 1) = O(n + k). Aceasta
a treia solutie este optimal a.
Sortarea a n = 2h biti pe un arbore binar de ad^ancime h. Radacina este
un procesor cuv^ant pe (h + 1)-biti si celelalte noduri sunt procesoare pe biti.
Bitii de intrare se a a la nodurile frunza. Iesirile se fac prin frunze (Figura
3.41). La radacina se calculeaza numarul de 1uri de la bitii inferiori ^nspre cei
superiori, e m, si se transmit semnale la frunze astfel ^nc^at exact cele mai din
drepata m frunze receptioneaza un 1 si celelalte receptioneaza un 0. In pasul
1, se stocheaza un carry c (Figura 3.41.b); semnalele de la i ce devin  indica
sf^arsitul intrarii. Procesorul expediaza carry c (Figura 3.41.c); Bitul superior
este 1 daca si numai daca toti bitii de intrare sunt 1. La receptionarea celui mai
superior bit, radacina expediaza cei h + 1 biti la i sai de la st^anga la dreapta.
In pasul 2, ecare procesor (incluz^and radacina) receptioneaza anumiti k biti
a ; : : : ; ak , si paseaza ultimii k 1 biti la i cu modi cari daca este necasar
1

268
Figura 3.40: Un exemplu

Figura 3.41: (a) Procesor cuv^ant pe (h + 1)-biti la radacina; (b) Pas 1; (c) Ex-
pedierea carry; (d) Pas 2
(Figura 3.41.d). Regulile de modi care sunt urmatoarele:
1. a = 1: mascheaza prin 1 toti bitii care merg la i;
1
2. a = 0; a = 1: mascheaza prin 1 toti bitii ce merg la ul din dreapta,
mascheaza prin 0 primul bit ce merge la ul din st^anga.
1 2

3. a = 0; a = 0: mascheaza prin 0 toti bitii ce merg la ul st^ang.


1 2

Exemplul 5 de algoritm secvential cu performante slabe usor de par-


alelizat: algoritmul de sortare par-impar. Algoritmul serial al bulelor
se bazeaza pe compararea succesiva a doua numere alaturate din secventa
(cu interschimbare), astfel ^nc^at, dupa o parcurgere a secventei, maximul va
plasat pe ultima pozitie. La pasul urmator se efectueaza compararile ^n
secventa ramasa prin excluderea maximului (Figura 3.42.a). Numarul de pasi
este n(n 1)=2. Algoritmul contine un anumit grad de paralelism: ecare etapa
poate porni c^and dispune de toate elementele necesare (Figura 3.42.b), numarul
se pasi reduc^andu-se la 2n 3. In implementare este preferata structura liniara.
Sortarea par-impar este un algoritm ^n n pasi pe o structura liniara cu n
celule care utilizeaza numai operatii de comparare si interschimbare. Initial,
269
Figura 3.42: Sortare prin procedeul bulelor si par-impar: (a) Sortarea prin
metoda bulelor a 6 numere (liniile orizontale reprezinta locatiile, sagetile com-
pararile, iar v^arful sagetii, locul pe care ^l va ocupa maximul); (b) Sortarea
prin metoda bulelor ^n paralel, prin avansarea compararilor; (c) Sortarea par-
impar pe un sistem paralel ^n cazul a 7 numere; (d) Exemplu pentru sortarea
par-impar
celula i detine al ilea numar de intrare. La un pas impar, compararile se fac
^ntre celulele 2j 1 si 2j pentru ecare j; 1  j  N=2. La un pas par, se fac
comparatii ^ntre celulele 2j si 2j + 1 pentru ecare j; 1  j < N=2: Celulele
vecine I si J (I < J ), posed^and ecare un numar, ^si arata ecare numerele
celeilalte, iar I ^l va retine pe cel mai mic iar J ^l retine pe cel mai mare.
Sortarea par-impar necesita mai multi pasi secventiali dec^at metoda bulelor,
dar mai putini ^n implementarea paralela (deoarece metoda bulelor ^n varianta
paralela este neechilibrata, pe c^and metoda par-impar produce o echilibrare
mai buna). Cazul n = 8 este tratat ^n Figura 3.42.d.
Exemplul
p 6: sortare ^npfoarfece p (shearsort). Este un algoritm cu
O( n log n) pasi pe o grila n  n. Se presupune ca log n este par. Al-
goritmul ruleaza ^n fazele 1; : : : ; log n + 1. Efectueaza sortarea par-impar pe
linii ^n ecare faza numerotata impar si sortare par-impar pe coloane ^n ecare
faza impara. Ordinea de sortare este: de la st^anga la dreapta ^n liniile nu-
merotate impar, de la dreapta la st^anga ^n liniile numerotate par, si de sus ^n
jos ^n orice coloana (Figura 3.43). Algoritmul sorteaza intrarile ^ntr-o ordine
ca un sarpe (sau boustrophedon, ^n greaca, semni c^and o scriere a r^andurilor
consecutive de la st^anga la dreapta si de la dreaptapla st^anga). Algoritmul ce
utilizeaza sortarea par-imparp^ntr-o dimensiune are n(log n + 1) pasi.
Un algoritm optimal ^n 3 n + O(pn) pasi pe o grila pn  pn, ^n ordinea
sarpelui este urmatorul. Fie m = n = .
1 8

Faza 1: Divide grila ^n m blocuri de dimensiune m  m , si sorteaza-le si-


2 3 3

multan ^n ordinea sarpelui ^n interioul ecarui bloc.


270
Figura 3.43: Sortare ^n foarfece: (a) Un exemplu; (b) Efectul asupra unei
matrice de 0uri si 1uri

Figura 3.44: Sortarea par-impar cu interclasare: principiu


Faza 2: Amesteca coloanele, unde a ia transa verticala este constituita ^n nal
din toate coloanele j cu j  i 1(modm):
Faza 3: Sorteaza ecare bloc ^n ordinea sarpelui.
Faza 4: Sorteaza ecare coloana ^n ordine liniara.
Faza 5: Sorteaza colectiv blocurile 2i 1 si 2i a ecarei transe verticale, i =
1; m=2.
Faza 6: Sorteaza colectiv blocurile 2i si 2i + 1 a ecarei transe verticale, i =
1; m=2 1
Faza 7: Sorteaza ecare linie ^n ordine liniara.
Faza 8: Efectueaza 2m pasi de sortare par-impar asupra sarpelui ^n general.
3

Exemplul 7: sortarea par-impar cu interclasare. Se sorteaza o lista de


n = 2r elemente. Initial lista consista din blocuri n sortate cu 2 -elemente.
0

Pentru i = 1; : : : ; r; se interclaseaza concurent doua blocuri consecutive de


2i -elemente ^ntr-un
1
singur bloc sortat de 2i elemente. La nal, obtinem un
singur bloc cu 2r -elemente sortat. Inima algoritmului ^l constituie interclasarea
a doua liste sortate A = [a ; : : : ; am ] si B = [b ; : : : ; bm ] (Figura 3.44). Se
efectueaza trei pasi: se creaza C si D prin interschimbarea intrarilor cu indici
0 1 0 1

impari (pas 1), se sorteaza C si D (pas 2), se ^mbina C si D si sorteaza lista
271
Figura 3.45: Sortarea par-impar cu interclasare { implementare pe BF r : ( )

(a) Etapele anterioare; (b) Pas 1; (c) Pas 2; (d) Pas 3


^mbinata (pas 3). Acest ultim pas necesita doar un pas de comparare par-impar.
Implementarea algoritmului pe BF r , unde intrarile sunt date la al r-lea
( )

nivel este urmatoarea. In etapele anterioare, se sorteaza jumatatea superioara


si jumatatea inferioara, utiliz^and BF i consist^and din nivelele de la 0 la
( 1)

i 1 (Figura 3.45.a). In pasul 1, sunt mutate numerele de pe nivelul 0 la


nivelul 1, utiliz^and muchiile directe din jumatatea de sus si muchiile ^n cruce
din jumatatea de jos (Figura 3.45.b). In pasul 2, se sorteaza liniile pare si liniile
impare utiliz^and BF i consist^and din nivelele 1 la i (Figura 3.45.c). In pasul
( 1)

3, se sorteaza ecare pereche pas^and numerele de la nivelul 1 la nivelul 0 de-a


lungul ambelor tipuri de muchii (Figura 3.45.d).
Fie T (i) timpul necesar etapelor de la 1 la i. Atunci T (1) = 2. Pasul
2 poate realizat ^n 2i 2 pasi. In "liniile pare", c^at si ^n "liniile impare",
se ^mbina doua liste sortate. Astfel, se continua divizarea p^ana la atingerea
nivelului 0, apoi are loc o ^ntoarcere la nivelul (r 1) ^n timp ce se efectueaza
comparatPiile par-impar. Astfel, T (i) = T (i 1) + 2i pentru i > 1. Adica
T (r) = i 2i = r + r = O(log n):
2 2 2

Intr-o operatie compara si despica, ecare proces are un bloc de marime
=1

n=p. Se presupune ca procesul Pi detinul blocul Ai a vectorului A care va


sortat. Ai  Aj daca ecare element ^n Ai0 este mai mic dec^ at orice element ^n
Aj . Dupa sortare, Pi detine o multime Ai astfel ^nc^at A0i  A0j , pentru i  j ,
si [pi Ai = [pi A0i . Prespunem ca ecare bloc se sorteaza local. Fiecare
1 1

procesor expediaza blocul sau la altul. Fiecare procesor apoi interclaseaza cele
=0 =0

doua blocuri (Figura 3.46) si retine numai o jumatate din blocul combinat (de
unde denumirea de despicare).
Sortare bitonica. Se bazeaza pe retele de interconectare^ntre procese pentru
sortare ^n timp semni cativ mai mic dec^at cel secvential, O(n log n).
Elementul cheie ^ntr-o retea de sortare este comparatorul . Comparatorul
este un dispozitiv cu 2 intr
a ri x si y si doua iesiri x0 si y0 . Pentru un comparator
crescator x0 = min(x; y) si y0 = max(x; y); vice-versa pentru un comparator
descrescator (Figura 3.47). Se noteaza un comparator crescator cu  si unul
descrescator cu .
O retea de sortare (Figura 3.48) are o serie de coloane, ecare cu un
numar de comparatori conectati ^n paralel. Fiecare coloana efectueaza o per-
mutare si scoate din coloana nala intrarile sortate ^n ordine crescatoare sau
descrescatoare. Numarul de coloane este ad^ancimea retelei.
272
Figura 3.46: Operatii compara si despica: (a) Expediere bloc de dimensiune
n=p ^ntre procesoare; (b) Fiecare procesor ^mbina blocurile si retine jumatate
(^n acest exemplu Pi retine cele mai mici elemente si Pj le retine pe cele mai
mari

Figura 3.47: Reprezentari schematice a comparatorilor: (a) Un comparator


crescator; (b) Un comparator descrecator
O retea de sortare bitonica sorteaza n elemente ^n timp O(log n). Se pre-
2

spune pentru simplicitate ca n = 2k .


O secventa < a ; a ; : : : ; an > este bitonica daca e exista i; 0  i  n 1,
astfel^nc^at < a ; a ; : : : ; ai > este monoton crescator si < ai ; : : : ; an > este
0 1 1

monoton descrescator, e o asemenea ordine poate atinsa printr-o deplasare


0 1 +1 1

ciclica a indicilor. De exemplu, < 1; 3; 7; 9; 6; 2; 0 >; < 12; 15; 18; 9; 8; 7; 11 >
sunt bitonice.
Sa presupunem ca S =< a ; a ; : : : ; an > este bitonica, astfel ^nc^at
a  a  a  : : :  an= si an=  an=  : : :  an . Sa consideram
0 1 1

subsecventele lui S :
0 1 2 2 1 2 2+1

S =< min(a ; an= ); min(a ; an= ); : : : ; min(an


1 0 2 1 2+1 2 1; an ) >
273
Figura 3.48: O retea tipica de sortare: constituita dintr-o serie de coloane, cu
ecare coloana contin^and un numar de comparatori conectati ^n paralel

Figura 3.49: Imbinarea unei secvent e bitonice de 16 elemente printr-o serie de


log 16 divizari bitonice
S =< max(a ; an= ); max(a ; an= ); : : : ; max(an
2 0 2 1 2+1 2 1; an ) >
Se poate observa ca exista bi 2 S astfel ^nc^at toate elementele ^naintea lui bi
sunt din partea crescatoare a secventei originale si toate0 elementele de dupa
1

el sunt din partea descrescatoare. De asemenea exista bi 2 S astfel ^nc^at are


loc vice-versa. De aceea S si S sunt bitonice. De asemenea, ecare element
2

al lui S este mai mic sau egal cu ecare element al lui S . Prin aceasta
1 2

dizivare, problema originala de marime n poate redusa la 2 sub-probleme de


1 2

marime n=2 (divizare bitonica), rezultatul nal obtin^andu-se prin concatenarea


rezultatelor subproblemelor. Se obtin recursiv secvente si mai scurte p^ana la
dimensiunea 1. Iesirea este sortata acum^n ordine monoton crescatoare (Figura
3.49). Numarul total de pasi este log n. Procedura de sortare a unei secvente
bitonice ce utilizeaza divizarea bitonica este numita interclasare bitonica.
Implementarea sortarii bitonice se face utiliz^and o retea de comparatori
numita retea de interclasare bitonica. Reteaua bitonica are log n coloare si
ecare coloana are n=2 comparatori. Intrarea este o secventa bitonica si iesirea
este secventa sortata. Reteaua bitonica de interclasare cu n intrari este no-
tata cu BM [n] ^n cazul iesirii ^n ordine crescatoare si BM [n] ^n ordine
descrescatoare. Figura 3.50 prezinta o retea bitonica pentru n = 16 (o retea
BM[16]); ecare coloana de comparatori este trasata separat si rele de in-
trare sunt numerotate 0, 1 . . . , n 1.
274
Figura 3.50: O retea bitonica de interclasare pentru n = 16

Figura 3.51: Reteaua de comparatori care transforma o secventa de intrare de


16 numere ^ntr-o secventa bitonica
Sortarea a n numere oarecare (secventa ne-bitonica) se realizeaza prin
interclasarea repetata a unor secvente bitonice de lungime crescatoare. La
ecare etapa se ^mbina secvente bitonice adiacente ^n ordine crescatoare sau
descrescatoare. Figura 3.51 prezinta o retea de comparatori care transforma
275
Figura 3.52: O reprezentare schematic a a retelei care converteste o secventa de
intrare ^ntr-o secventa bitonica, dupa care o sorteaza

Figura 3.53: Un exemplu pentru sortarea bitonica


secventa de intrare de 16 numere^ntr-o secventa bitonica; ^n contrast cu Figura
3.50, coloanele de comparatori din ecare retea de interclasare bitonica sunt
trasate ^ntr-un singur dreptunghi, separate de o linie punctata.
Figura 3.52 prezinta o reprezentare schematica a unei retele care converteste
o secventa de intrare ^ntr-o secventa bitonica. In acest exemplu, BM[k] si
BM[k] denota retelele bitonice de ^mbinare de dimensiune k a intrarii care
utilizeaza comparatori  si . Ultima retea de ^mbinare (BM[16]) sorteaza
secventa bitonica creata din datele de intrare (alt exemplu ^n Figura 3.53).
Ultima etapa are n intrari si ad^ancime log n. Etapele anterioare sorteaza
n=2 elemente. Relat ia recursiva pentru ad^ancime este D(n) = D(n=2) + log n.
Atunci D(n) = Pi n i = (log n + log n)=2 = O(log n), ^n comparatie cu
log
=1
2 2

algoritmii secvential pentru care O(n log n).


2

La mapare pe un sistem de calcul multiprocesor, ecare r al retelei pentru


sortarea bitonica reprezinta un procesor. Procesoarele sunt mapate la re astfel
^nc^at sa minimizeze drumul de parcurs a elementelor ^ntr-un pas de comparare-
interschimbare. De exemplu ^n cazul hipercubului o comparare-interschimbare
(C-E) este efectuata numai ^ntre re a caror etichete difera numai ^ntr-un bit
276
Figura 3.54: Diferite modalitati de mapare pe linii a relor de intrare ale retelei
de sortare bitonica pe o grila de procesoare: (a) Standard; (b) Ca un sarpe; (c)
Amestecat

Figura 3.55: Ultima etapa a algoritmului de sortare pentru n = 16 pe o grila


ce utilizeaza maparea pe linii amestecata (la ecare pas procesoarele perechi,
indicate prin sageti, efectueaza C-E pe elementele lor)
( rele a caror etichete difera ^n al ilea cel mai putin semni cativ bit efectueaza
C-E de log n i + 1 ori).
Sortarea bitonica pe o grila. In cazul maparii pe o grila, datorira slabei
conectivitati, nu este posibil sa avem toate operatiile C-E^ntre vecini apropiati.
Se considera maparea relor de intrare pe linii amestecat ca^n Figura 3.54.c.
O asemenea mapare are avantajul ca procesoarele ce efectueaza operatii C-E
rezida pe subsectiuni patratice ale grilei a caror marime este dependenta de
frecventa operatiilor C-E. Procesoarele care efectueaza C-E din ecare etapa
a sortarii bitonice sunt vecine. In general, rele care difera ^nb ial i=leac cel mai
putin semni cativ bit sunt mapate pe procesoare care sunt la 2 ( 1) 2
legaturi
departare (Figura 3.55).
Se presupune un numar de n procesoare, acelasi cu numarul de elemente.
Numarul total de pasi este (1+log n)(log nP)=2. nCantitatea de comunicatii efec-
tuata de ecare procesor se exprima prin i Pij 2b j = c = O(pn). La
log ( 1) 2

ecare pas, un procesor efectueaza cel mult o comparatie; calculul se efectueaza


=1 =1

^n O(log n). Astfel, timpul de rulare paralel este


2

Tp = O(log n) + O( n)
2
p
| {z } | {z }
compar comunic
iar algoritmul nu este cost-optimal, deoarece pTp = O(n = ) si complexitatea
3 2

277
Figura 3.56: Caracteristicile comunic arii sortarii bitonice pe un hipercub: de-a
lungul ecarei etape, procesoarele comunica de-a lungul dimensiunilor indicate
secventiala a sortarii este O(n log n). Acest rezultat nu poate ^mbunaptatit
deoarece timpul de rulare paralel a sortarii pe o grila este marginit de O( n).
Un algoritm bazat pe blocuri este urmatorul. Se presupune ca sunt n=p
elemente per procesor. Se efectueaza o sortare locala utiliz^and sortarea cu in-
terclasare ^n timp O((n=p) log(n=p)). Procesoarele efectueaza log p pasi de 2

comparare-despicare.p Timpul depcalcul este O((n=p) log p). Timpul de comu-


2

nicare este O((n=p) p) = O(n= p). Timpul de rulare paralel este deci
n n n n
Tp = O( log( )) + O( log p) + O( p ) : 2

|
p {z
p } |
p {z
p } | {z }
sort local compar comunic
Pentru
p o formulare cost-optimala, p = O(log n). Functia de izoe cienta este
2

O(2 p pp). Algoritmul este slab scalabil.


Sortarea bitonica pe un hipercub. Operatiile compara-despica au loc ^ntre
procesoare ( re) care difera numai ^ntr-un bit (Figura 3.56). Asemenea proce-
soare sunt vecini ^ntr-un hipercub. Se considera numarul de procesoare p = 2d.
De-a lungul primului pas al ultimei etape, numai procesoarele ce difera ^n cel
de-al dlea cel mai semni cativ efectueaza operatia comparare-despicare. La al
doilea pas operatia este realizata ^ntre procesoarele din a (d 1)a dimensiune
(Figura 3.57). In general, de-a lungul pasului i, procesoarele ^n a (d (i 1))a
dimensiune efectueaza comparare-despicare. In formularea paralela urmatoare
pentru sortarea bitonica pe un hipercub cu n = 2d procesoare, label este
eticheta procesorului si d este dimensiunea hipercubului:
BITONIC_SORT(label, d) {
for i= 0 to d-1 do
for j=i downto 0 do
if not (al (i+1)-lea bit al label = al j-lea bit al label)
then comp_exchange_max(j);
else comp_exchange_min(j); }

278
Figura 3.57: Comunicari de-a lungul ultimei etape a sortarii bitonice: ecare
r este mapat la un procesor al hipercubului, iar ecare conexiune reprezinta
un C-E ^ntre procesoare
In ecare pas al algoritmului, ecare procesor efectueaza o operatie comparare-
interschimbare. Numarul total de pasi din algoritm este (1 + log n)(log n)=2.
Atunci Tp = O(log n). Tehnica nu este cost-optimala relativ la algoritmul
2

serial de complexitate O(n log n).


Intr-o varianta cu blocuri, ecare procesor are un bloc de marime n=p.
Numarul total de pasi este (log p + log p)=2 = O(log p). Blocurile sunt sortate
2 2

local prin interclasare; apoi se fac O(log p) pasi de comparare-despicare:


2

n n n n O(n log n)
Tp = O( log ) + O( log p) + O( log p); S = n n
2 2
:
|
p {z
p } |
p {z } |
p {z }
O( p log p ) + O( np log p) 2

sort local compar comunic

Pentru o formulare
p cost-optimala, (log p)=(log n) = O(1). Se pot utiliza e -
2

cient p = O(2 n) procesoare. Functia de izoe cienta este O(p p log p).
log log 2

Algoritmul este slab scalabil.


3.2.3 Operatii concurente asupra numerelor ^ntregi
Aritmetica ^ntregilor
Adunarea a doua numere de n biti utiliz^and procesoare pe biti.
Fie cele doua numere care se aduna an : : : a si bn : : : b . O abordare triviala
1 1
3 Rezumat: Operatii elementare asupra numerelor ^ntregi efectuate ^n paralel sunt o pre-
ocupare de baza a constructorilor de cipuri cu procesoare performante. Calculele paralele la
nivel de bit constituie o directie aparte ^n teoria procesarii paralele.

279
Figura 3.58: Adunarea a doua numere utiliz^and procesoare pe biti

Figura 3.59: Algoritmul cu anticiparea reportului: (a) Pas 1; (b) Pas 2; (c) Un
exemplu
ce utilizeaza o structura liniara cu (n + 1)-celule este urmatoarea. Initial,
procesorul al ilea cel mai din st^anga detine ai si bi (an = bn = 0). Al ilea
procesor receptioneaza un report (carry) ci de la vecinul sau din st^anga,
+1 +1

calculeaza di = (ai + bi + ci ) mod 2; si paseaza de la vecinul drept di =


1

[(a + bi + ci )=2]: (Figura 3.58).


1
1 1

Adunare cu anticiparea reportului. Se de nesc x = s, 0

xny spg
(
s daca ai = bi = 0,
xi = g daca ai = bi = 1, 8i; 1  i  n + 1; si x Æ y prin: ps ssg
spg
p altfel g sgg
Se observa ca p este identitatea la st^anga si la dreapta si Æ este asociativa.
Pentru ecare i; 1  i  n + 1, e yi = x Æ x Æ : : : Æ xi . Atunci pentru
ecare i; 1  i  n + 1; ci = 1 daca si numai daca yi = g, astfel ^nc^at
0 1 1

di = (ai + bi + yi ) mod 2: Calcularea tuturor celor d-valori este echivalent cu


calcularea tuturor valorilor y. Se utilizeaza un arbore binar cu (n + 1) frunze
pentru calculul yi la frunza a ia de la st^anga pentru ecare i; 1  i  n + 1. A
ia frunza are ai si bi la ^nceput. Algoritmul este urmatorul. A ia frunza
calculeaza xi , seteaza yi pe p, si paseaza xi la parinte. La receptia a doua
1 1

semnale L si R de la copii sai (care nu ajung ^n mod necesar la acelasi timp),
un nod intern expediaza L Æ R la parintele sau (daca exista) si L la ul din
dreapta. In plus, radacina expediaza ? la ambii i un pas dupa expedierea
lui L la dreapta (Figura 3.59.a). Fiecare nod intern paseaza un semnal de la
parinte la ambii i. De ecare data c^and receptioneaza un semnal u 2 fs; p; gg
de la parinte, o frunza ^nlocuieste valoarea sa y prin u Æ y. La receptionarea ?,
a ia frunza seteaza yi pe s Æ yi , si calculeaza di (Figura 3.59.b).
280
Figura 3.60: (a) Arborele lui Wallace; (b) Inmultirea a doua numere pe k biti
Adunarea a n numere a k biti. Rezultatul are cel mult h = k + dlog ne
biti. Problema poate privita din punctul de vedere al adunarii a n numere de
h biti. O metoda directa este aceea de ^njumatatire. Colectia de numere este
^n mod repetat divizata pentru adunarea ^n perechi (x; y). Timpul de rulare
este ^n acest caz O(log h log n) = (log k log n + log log n log n).
In adunarea cu salvarea reportului, ideea este urmatoarea. Suma lui a =
ar : : : a ; b = br : : : b , si c = cr : : : c este egala cu suma dintre u = dr    d 0 si
v = 0er    e , unde di ei este reprezentarea binara a lui ai + bi + ci . De exemplu,
1 1 1 1

^n 0110 + 0110 + 0011, di ei; i = 4; : : : ; 1 sunt 00, 10, 11, 01. Astfel, suma este
1

0110
| {z } 0 + 0 0011
| {z } :
pt. di pt. ei
Pentru a aduna m  3 numere de h biti, se ^mpart aceste numere ^n triplete,
cu exceptia ultimului (care poate un numar singur sau o pereche). Prin
calcule locale, se converteste ecare grup la o pereche echivalenta de nu-
mere (conversia nu este aplicata la un numar singular).Reducerea se repeta
p^ana c^and ram^an numai doua numere. Apoi se calculeaza suma a doua nu-
mere utiliz^and adunarea cu anticipare a reportului. Algoritmul descris poate
implementat pe baza unei structuri numita arborele lui Wallace (Figura
3.60.a). Ad^ancimea recursiei este O(log n). Adunarea nala necesita ad^ancimea
O(log h) = O(log k + log log n): Astfel timpul total este T = O(log k + log n) si
p = O(n(log n + k)):
Inmultirea a doua numere de k biti. Fie a = ak : : : a si b = bk : : : b .
O constructie naiva este urmatoarea: se utilizeaza o matrice k  k pentru a
1 1

converti ^nmultirea ^ntr-o suma a k numere de k biti. Se calculeaza pentru


ecare i; j , ci;j = ai  bj la a (i; j )a celula (Figura 3.60.b). Se trateaza problema
^nmultirii ca o problema de adunare c = c ;k    c ; ; : : : ; ck = ck;k : : : ck; ce se
poate rezolva prin adunarea cu salvarea reportului.
1 1 11 1

O constructie simpla este urmatoarea: convolutie pe o matrice liniara.


Convolutia a doi vectori (ak ; : : : ; a ) si (bk ; : : : ; b ) este (y k ; : : : ; y ) astfel
1 1 2 1 1
^nc^at yi este coe cientul lui xi Pa produsului dintre a +a x+   ak xk si b +
1 1

b x +    + bk xk . Avem yP = i j p aj bj : Se utilizeaza o structura liniara


1 2 1
1
2 + = +1
de 2k celule. Fie secventele (a ; ; a ; ; : : : ; ak ; ) si (; bk ; ; bk ; ; : : : ; b ) ce
1 2 1 1

281
Figura 3.61: Convolut ie: (a) Mutarea datelor; (b) O celula; (c) Exemplu {
convolutia lui 5 = 101 si 7 = 111
trece prin structura de la capatul st^ang si respectiv de la cel drept (Figura
3.61.a). Pentru ecare i; j; 1  i; j  k, si p; 1  p  2k; ai si bj ajung la a pa
celula cea mai drepta la momentul 2(k + i) p 1 si respectiv 2(k j )+ p +1.
Astfel ai si bj se ^nt^alnesc la celula (i + j 1). Celula i detine un bit local mi ,
si bi calatoreste cu un report ci (Figura 3.61.b); aceste valori sunt toate 0 la
^nceput. C^and ai si bj se ^nt^alnesc (la celula p = i + j 1); celula stocheaza
paritatea lui mp + cj + ai bj si seteaza cj pe report. Astfel T = O(k) si p = O(k),
W = O(k ).
2

Numere prime
Se considera problema gasirii tuturor numerelor prime mai mici dec^at un numar
dat n. Acest exemplu demonstreaza o alta tehnica comuna utilizata ^n algo-
ritmii paraleli: rezolvarea unui caz mic a aceleiasi probleme pentru accelerarea
solutiei problemei mari. Pentru gasirea unui algoritm paralel e cient pentru
numere prime se cauta ^n primul r^and un algoritm secvential e cient.
Cel mai comun algoritm secvential pentru gasirea numerelor prime este
ciurul lui Eratosthene. Algoritmul returneaza o matrice ^n care a i-a pozitie
este setata pe "adevarat" daca i este un numar prim si "fals" ^n caz contrar:
int primes[n], current, i, j
primes[0]:=0; primes[1]:= 0
for i:= 2 to sqrt(n)-1 do {
if not primes[i] then continue;
current:= i;
for j:=current*current to n-1 by current do
primes[j] = 0; }
Algoritmul initializeaza matricea A pe adevarat si apoi seteaza pe fals toti
multiplii ecarui numar prim gasit. Se porneste de la primul numar prim, 2, si
282
limita superioara este pn. Algoritmul necesita timp O(n log log n) cu o cons-
tanta foarte mica. Ciurul lui Eratosthene nu este cel mai bun algoritm pentru
gasirea numerelor prime, dar este foarte apropiat de cel optim si consideram
ca este fericita situatia gasirii unui algoritm paralel cost-optimal relativ la al-
goritmul ciurului (adica cu un cost de O(n log log n)).
Algoritmul recursiv. Agoritmul ciurului are un anumit grad de par-
alelism. In particular ultimele doua instructiuni pot implementate ^n paralel.
Ad^ancimea unei asemenea operatii este constanta si lucrul este dat de numarul
de multiplii care este acelasi ca si ^n cazul secvential. Lucrul total al algorit-
mului paralel este acelasi cu cel al algoritmului secvential deoarece efectueaza
aceleasi operatii, iar ad^ancimea este de O(pn) deoarece ecare iteratie a ciclu-
lui are ad^ancime constanta si numarul de iteratii este pn. Gradul de paralelism
variaza foarte mult de la prima iteratie^n care se elimina ^n paralel n=2 multiplii
ai lui 2, la ultima iteratie unde se elimina maxim pnp multiplii.
Daca am avea toate numerele prime de la 2 la n, am putea genera toti
multiplii acestor numere prime de-o data. Acest calcul este un exemplu de
paralelism imbricat, deoarece exista paralelism ^n determinarea multimii nu-
merelor prime (paralelism exterior) si de asemenea ^n generarea multiplilor
ecarui numar prim (paralelism interior). Ad^ancimea calculului este constanta,
iar lucrul este O(n log log n) deoarece acesta este numarul total de multiplii
generati (timpul de rulare al versiunii secventiale). Pentru generarea multimii
numerelor prime se poate apela algoritmul recursiv. Algoritmul este apelat re-
cursiv asupra problemei de dimensiune redusa pn si se termina c^and se ajunge
la problema de dimensiune 2. Majoritatea lucrului este realizat la nivelul de
sus al recursiei. Deoarece ecare nivel de recursie are ad^ancime constanta,
ad^ancimea totala este proportionala cu numarul de nivele. Pentru a calcula
acest numar, se observa ca dimensiunea problemei la niveluld i este n = i , iar
1 2

c^and dimensiunea este 2, algoritmul se termina. Astfel n = = 2, unde d este


1 2

ad^ancimea cautata. Astfel d = log log n. Deci lucrul este O(n log log n), iar
ad^ancimea O(log log n). Algoritmul ram^ane cost-optimal relativ la ciurul lui
Eratosthene, dar ad^ancimea a fost ^mbunatatita simtitor.
Algoritm concurent. Se ignora timpul necesar gasirii urmatorului numar
prim si se considera numai timpul necesar marcarii multiplilor numerelor prime.
Presupunem ca este necesara o unitate de timp pentru marcarea secventiala a
unui element din matricea numerelor prime. Fie problema este de dimensiune
n = 10 , si numarul de procesoare p variaza ^ntre 1 si 16. Din presupunerile
6

anterioare, timpul de rulare TS al algoritmului secvential este determinat de


numarul de c^ate ori este executata linia primes[j]: = 0. Pentru n = 10 , de 6

exemplu, TS = 2122048 unitati de timp.


O solutie cu paralelism al controlului. Se considera un algoritm paralel
pentru un sistem cu memorie partajata. Toate procesoarele partajeaza accesul
la matricea numere prime si ^ntregul curent. Fiecare procesor elimina multiplii
unui numar prim diferit. Taskurile de baza vor executate ^n paralel. Aceste
taskuri sunt programate (pe baza unui programator simplu) la p procesoare.
Se calculeaza acceleratia utiliz^and valoarea TS de mai sus. In implementare
se sesizeaza o limitare a acceleratiei ^ncep^and cu aproximativ 5 procesoare,
deoarece de la un asemenea punct timpul de terminare este determinat de
283
procesorul care elimina multiplii lui 2. In plus este necesara utilizarea unei
sincronizari deoarece un procesor poate elimina multiplii unui numar compus
sau procesoare multiple pot sa elimine multipli ai aceluiasi numar prim (ambele
situatii nu sunt fatale, dar cresc timpul de rulare).
O solutie cu paralelism al datelor. In aceasta versiune procesoarele lu-
creaza ^mpreuna pentru eliminarea multiplilor ecarui numar prim nou gasit.
Fiecare procesor este responsabil pentru o bucata (consecutive) din vectorul
numerelor prime. Presupunem ca acest algoritm ruleaza pe un calcula-
tor cu memorie distribuita cu p  pn procesoare, astfel ^nc^at toate nu-
merele prime candidate pot gasite de procesorul 1. Se presupune ca pro-
cesorul 1 difuzeaza numerele prime nou gasite la ecare dintre celelalte pro-
cesoare si ecare mesaj necesita  unitati deptimp. Sa presupunem ca ex-
ista k numere prime mai mici sau egale cu n. Se noteaza aceste numere
prime cu n ; : : : ; nk . Timpul necesar unui procesor pentru eliminarea nu-
merelor compuse nu este mai mare dec^at (ddn=pe=n e +   ddn=pe=nke) : Din
1

descrierea algoritmului de difuzare, stim ca timpul total de comunicare este


1

k(p 1). Pentru exemplu n = 10 , exista k = 168 numere prime mai mici
6

sau egale cu 1000, cel mai mare ind 997. Se considera  = 100. Astfel,
Tcomp = ( dd10 =pe=2e +    + dd10 =pe=997e si Tcomm = 16800(p 1), adica
6 6

S (10 ; p) = 2122048=fdd10 =pe=2e +    dd10 =pe=997e + 16800(p 1)g:


6 6 6

Sa consideram si cazul algoritmului ^n cazul rularii pe un calculator cu


memorie partajata cu un dispozitiv I/O secvential pe care se va a a secventa
nala de numere prime. Numai un singur procesor poate accesa dispozitivul
I/O la un moment dat, si necesita unitati de timp pentru a transfera un
numar pe acel dispozitiv. Pentru = 1, si se determina timpul de calcul ca
functie de p. Timpul de calcul este acelasi ca si ^nainte. Timpul de comunicare
este zero. Exista 78498 numere prime mai mici sau egale cu 10 , d^and un 6

timp I/O de TI=O = 78498 . Fractia secventiala a acestei probleme este


= 78498=(2122048+ 78498) = 0:0357: Pentru p procesoare, legea lui Amdahl
indica o margine superioara a acceleratiei care poate atinsa: S (10 ; p)  6

1=(0:0357 + 0:9643=p). Se observa ca fractia secventiala inerenta din timpul de


rulare este descrescatoare c^and n creste. De aceea paralelizarea ciurului este
mai buna pentru probleme de dimensiuni mai mari.
3.2.4 Liste, arbori, grafuri tratati ^n paralel
Saritura pointerului. Cunoscuta si sub denumirea de dublarea pointeru-
lui, aceasta tehnica permite procesarea paralela rapida a structurilor de date
^nlantuite precum arborii si listele. Se cere ^n moz uzual obtinerea pentru
ecare nod a unui pointer la si distanta de la radacina arborelui sau (sau coada
listei sale). Se da o structura de pointeri care reprezinta arborele de exemplu
(pointeri de la i la parinti; radacina pointeaza la sine ^nsasi). Ideea consta ^n
aceea ca la ecare apel recursiv al procedurii de salt a pointerilor, pointerii vor
indica de doua ori mai departe.
Un arbore orientat rutat T este un graf orientat cu un v^arf special r,
4 Rezumat: In cazul unor aplicatii cu date numeroase, datele sunt organizate ^n struc-
turi. Parcurgerea, analiza si restructurarea rapida a datelor ^n procese paralele distincte este
usurata de existenta unor algoritmi standard.

284
Figura 3.62: Determinarea r adacinilor unei paduri: (a) Starea initiala; (b) Dupa
o iteratie; (c) Dupa o alta iteratie
radacina, astfel ^nc^at gradul de iesiri ale radacinii este zero pe c^and gradul
de iesiri a celorlalte v^arfuri este unu, si exista un drum de la ecare v^arf ne-
radacina la v^arful radacina. Problema tratata ^n urmatoarea seventa ^n formu-
larea WT este aceea de a determina toate radacinile unei paduri F ce contine
n v^arfuri (Figura 3.62):
// Intrare: vector P[1:n] parint i a n varfuri ai unei paduri
// iesire: vector S[1:n] cu radacina arborelui coresp. varf
for_all i in 1 : n do {
S[i]:=P[i]
while not (S[i] = S[S[i]]) do S[i]:=S[S[i]] }
P [i] = j daca si numai daca (i; j ) este o muchie a padurii, P [i] = i daca si numai
daca i este radacina. Toate valorile SSi trebuie evaluate ^nainte de efectuarea
oricarei asignari la S [i]. Pointerul Si este succesorul curent al v^arfului i, si este
initial parintele sau. La ecare pas, distanta^ntre v^arfurile i and Si se dubleaza
cu exceptia cazului ^n care Si este radacina padurii. Fie h ^naltimea maxima
a arborelui ^n padure. Atunci corectudinea algoritmului poate stabilita prin
inductie dupa h. Algoritmul ruleaza pe un PRAM CREW. Toate scrierile sunt
distincte, dar mai multe v^arfuri pot citi valori de la un v^arf comun. Pentru
a stabili complexitatile algoritmului se observa ca ciclul while se va efectua
de O(log h) ori, si ecare iteratie efectueaza O(1) pasi si O(n) lucru. Astfel
T (n) = O(log h) si W (n) = O(n log h). Aceste margini sunt extrem de slabe,
dar nu putem obtine nici o limitare mai buna fara a presupune mai multe
despre datele de intrare. Algoritmul nu este lucru-e cient except^and cazul ^n
care h este constant. In particular, pentru liste ^nlantuite, algoritmul necesita
O(log n) pasi si O(n log n) lucru.
Daca cel mai ad^anc arbore are ^naltimea L, atunci aceasta rutina necesita
ad^ancime O(log L) si lucru O(n log L).
Indexarea unei liste. Indexarea unei liste (list ranking) este problema
gasirii pozitiei elementelor ^ntr-o lista ^nlantuita. Secvential, problema este
triviala ^n implementare (se parcurge^n jos lista si se incrementeaza un contor la
ecare nod). Lucrul total este O(n). In paralel se poate utiliza tehnica sariturii
pointerului ^n implementare, dar aceasta necesita O(n log n) daca exista o lista
de lungime n.
Un alt algoritm este urmatorul. Presupunem ca este dat un vector de
legaturi. Se scot m elemente aleator din vector (numite puncte de start) si se
adauga la un vector numit de start.Lucrul este O(m) si ad^ancimea O(1). De
la ecare punct de start se urmareste lista p^ana se atinge urmatorul punct de
start. In cel mai defavorabil caz, O(n=m log m) (probabilistic). Lucrul este
285
Figura 3.63: (a) Distribuire paralel a; (b) Reducerea^n marimea problemei dupa
ecare nivel de recursie
O(n) si ad^ancimea este O(n=m log m). Se unesc segmentele listei ^n liste mai
scurte (se agata ecare punct de start la urmatorul punct de start). Lucrul este
O(m) si ad^ancimea este O(1). Se utilizeaza saritura pointerului pe listele mai
scurte. Lucrul este O(m log m) si ad^ancimea este O(log m). Lucrul total este
astfel O(n+m log m) si ad^ancimea totala este O(n=m log m). Daca m=n = log n
atunci lucrul este O(n) si ad^ancimea este O(log n).2

Eliminarea duplicatelor. Algoritmul de eliminare a duplicatelor este


frecvent utilizat pentru diferite operatii, precum reuniunea unor multimi. Data
o lista de articole, algoritmul de eliminare a duplicatelor elimina toate dupli-
catele din lista, return^and lista rezultata.
Abordarea 1: ^mpachetarea matricei domeniului. Daca domeniul de a-
partenenta a articolelor este mic si face parte din multimea numerelor nat-
urale, putem utiliza o matrice egala ^n marime cu domeniul. Se seteaza un
steag ^n matrice pentru ecare numar care apare ^n lista de intrare, si apoi
se ^mpacheteaza domeniul pe baza matricei. Dezavantajul evident al abordari
este acela ca este inaplicabila c^and numerele sunt ^ntr-un domeniu mare.
Abordarea 2: distribuire (hashing). Se poate construi un algoritm paralel
recursiv pentru eliminarea duplicatelor. Se asigneaza un procesor la ecare
articol din vectorul de intrare. Se utilizeaza recipiente de marime unu, si
se amesteca toate articolele ^n paralel. De exemplu, Figura 3.63 descrie o
functie particulara de distribuire aplicata la vectorul [69, 23, 91, 18, 42, 23,
18]. Presupunem utilizarea unei arhitecturi cu scriere simultana, care asigura
ca dupa doua scrieri ^n aceeasi locatie de memorie, una dintre valori ca corect
scrisa. Ca o consecinta, toate valorile cu exceptia uneia care mapeaza ^n acelasi
recipient vor eliminate (42, 23 si 18 ^n exemplul dat). Dupa ce toate scrierile
sunt complete, ecare procesor citeste ^napoi valoarea din locatia din tabelul
de distribuire ^n care este scrisa propria sa valoare. Daca este gasita o valoare
diferita, elementul este retinut pentru urmatorul nivel al recursiei. In exemplu,
unicul element ramas pentru urmatorul nivel al recursiei este 42. Toate cele-
lalte elemente sunt adaugate la lista fara duplicate, prin^mpachetarea tabelului
hash, adica ignor^and intrarile neasignate din tabel. O functie diferita de dis-
tribuire trebuie sa e utilizata pentru ecare nivel de recursie pentru a evita
coliziunile. O alegere buna a functiei de distribuire este h(v) = v mod dimen-
siunea tabelului hash (de obicei o marime prima de ordin 2n). Cu o probabili-
tate mare, ecare nivel de recursie reduce dimensiunea elementelor active cu o
286
Figura 3.64: Un graf cu 8 v^arfuri si 7 muchii
fractie constanta (Figura 3.63.b), astfel putem conclude ca D(n) = O(log n) si
W (n) = O(n).
Problema numirii. Eliminarea duplicatelor poate trivial rezolvata uti-
liz^and algoritmul pentru problema mai generala a numirii. Data o secventa
de n valori, se doreste asignarea unui unic nume din intervalul [0; n] pentru
ecare valoare ^n vectorul de intrare. Tuturor elementelor cu aceeasi valoare li
se asigneaza acelasi nume.
Abordarea 1: sortare. Abordarea naiva este aceea de a sorta elementele,
ceea ce nu este e cient ^n lucru ^n mod normal deoarece complexitatea lucrului
unui algoritm de sortare bazat pe comparatii este W (n) = O(n log n). Totusi,
daca intervalul numerelor de intrare este mic, se poate utiliza sortarea prin
numarare, care are complexitatea lucrului W (n) = O(n + m) unde m este
numarul de elemente diferite. Pentru un m mic, algoritmul este apropiat de
liniar ^n lucru.
Abordarea 2: distribuire (hashing). C^and exista multe elemente diferite,
putem utiliza o adaptare a algoritmului eliminarii duplicatelor. Pasii algo-
ritmului sunt urmatorii: distribuirea cheilor, scriere ^n locatiile tabelului de
distribuire, recitirea valorilor si detectarea oricaror coliziuni, a area indicilor
cheilor ciocnite, asignarea de noi etichete fara nici o coliziune, apelul recursiv
asupra cheilor ciocnite, interclasarea cheilor ciocnite cu cheile fara coliziune.
Consideratii legate de grafuri. Un graf G = (V; E ) consta dintr-o multime
de v^arfuri V si o multime de muchii E ^n care ecare muchie conecteaza doua
v^arfuri. Intr-un graf orientat, ecare muchie este orientata de la un v^arf la
altul, pe c^and ^ntr-un graf neorientat ecare muchie este simetrica, adica ^n
ambele directii. Un graf ponderat este un graf ^n care ecare muchie e 2 E
are o pondere w(e) asociata cu ea. Se utilizeaza conventia n = jV j si m = jE j.
Diametrul unui graf, notat D(G), este maximum peste toate perechile de v^arfuri
(u; v) a minimului numarului de muchii care trebuie traversate pentru a ajunge
de la u la v. Calitativ, un graf este considerat rar daca m  n si dens ^n caz
2

contrar. Arborii sunt grafuri conectate aciclice.


Se considera graful din Figura 3.64. Exista trei moduri de reprezentare: lista
de muchii, lista de adiacente, matrice de adiacenta. In primul caz ecare muchie
este reprezentata ca o pereche de v^arfuri conectate. Astfel graful din gura
este reprezentat prin: [(1,2),(2,3), (2,5), (4,5), (5,6), (5,7), (6,8)].(reprezintare
directa a multimii E ). In al doilea caz, a ia intrare ^n vector reprezinta toate
v^arfurile care sunt conectate la nodul i. Astfel graful poate reprezentat prin
[[2], [1,3,5], [2], [5], [2,4,6,7], [5,8], [5], [6]] (o lista de adiacenta este o lista de
287
liste). O matrice de adiacenta este o matrice nn, A, astfel^nc^at Aij este 1 daca
(i; j ) 2 E si 0 altfel. Matricea de adiacenta este utilizata ^n mod tipic numai
c^and graful este dens deoarece necesita un spatiu O(n ), opus cerintei de spatiu
2

O(m) pentru celelalte doua reprezentari. Grafurile rare sunt reprezentate mai
e cient de liste de adiacente.
Algoritmii standard pentru grafuri sunt cei care trateaza urmatoarele pro-
bleme: componente conectate (pentru etichetarea v^arfurilor din aceeasi compo-
nenta conectata cu aceeasi eticheta), arborele minim de acoperire, componente
biconectate (oricare doua v^arfuri^ntr-o componenta bi-conectata sunt conectate
prin cel putin doua drumuri), probleme de potrivire, multimea independenta
maximala, cel mai scurt drum, sortare topologica.
Grafurilor au o serie de aplicatii: operatii pe matrice rare, simularea cir-
cuitelor, optimizare (de exemplu probleme de scurgere maxima), compilatoare,
aplicatii de inteligenta arti ciala, ^n special ^n viziune.
Grafurile prezinta unele dintre cele mai provocative probleme pentru par-
alelizare deoarece multe tehnici secventiale standard asupra grafurilor, precum
cautarea ^n ad^ancime si cautarea cu prioritate, nu se paralelizeaza bine. Pen-
tru anumite probleme, precum arborele de acoperire minima si componentele
bi-conectate, au fost dezvoltate noi tehnici pentru a genera algoritmi paraleli
e cienti. Pentru alte probleme, precum drumul cel mai scurt cu o singura
sursa, nu exista algoritmi cunoscuti paraleli e cienti, cel putin nu pentru cazul
general.
In algoritmii paraleli se utilizeaza reprezentari ale grafuri similare cu cele
din cazul secvential. Schimbarea principala este ^nlocuirea listelor legate cu
matrice. In particular, lista de muchii va reprezentata ca o matrice de muchii,
iar lista de adiacenta va reprezentata ca o matrice de matrice. Utiliz^and
matrice ^n loc de liste se poate procesa graful mai usor ^n paralel. Utilizarea
unei reprezentari sau a alteia depinde de algoritm. De aceea este importanta
posibilitatea de conversie ^ntre reprezentari. Conversia de la lista de adiacente
la lista de muchii este imediata (lucru liniar si ad^ancime constanta). Conversia
de la lista de muchii la lista de adiacente este mai di cila, dar necesita tot lucru
liniar. Ideea de baza este aceea de a sorta muchiile pe baza v^arfului sursa;
aceasta plaseaza muchiile unui v^arf adiacent particular ^n matricea rezultata
si matricea poate partitionata ^n blocuri bazate pe v^arfurile sursa. Deoarece
sortarea se face ^n domeniul ^ntregilor 0..jV j 1, poate utilizata o sortare cu
numarare cu lucru liniar.
Cautare pe nivel (Breadth First Search, BFS). BFS poate utilizat
pentru rezolvarea unor probleme variate, precum testarea daca un graf este
conectat, sau generarea arborelui de acoperire a unui graf. BFS paralel este
similar cu versiunea secventiala, care starteaza cu un v^arf sursa s si viziteaza
nivelele grafului unul dupa altul utiliz^and o coada. Diferenta principala este
aceea ca ecare nivel va vizitat ^n paralel si nu este ceruta nici o coada.
Precum ^n algoritmul secvential, ecare v^arf va vizitat o singura data si
ecare muchie cel mut de doua ori, o data ^n ecare directie. Lucrul este de
aceea liniar ^n marimea grafului, O(n + m) (lucrul necesar pentru BFS este
W (E; V ) = O(jE j + jV j), iar complexitatea pasilor este S (E; V ) = O(latimea
grafului)). Pentru un graf cu diametrul D, numarul de nivele ale algoritmului
vor cel putin D=2 si cel mult D, depinz^and de unde este initiata cautarea.
288
Figura 3.65: Aplicare BFS: (a) Un graf pentru exempli care; (b) G, mult imea
de frontiera la ecare pas a BFS asupra lui G cu s = 0 si un arbore BFS
Fiecare nivel poate procesat cu o ad^ancime constanta, astfel ^nc^at ad^ancimea
totala a BFS paralel este O(D).
Algoritmul de baza este urmatorul. Graful este reprezentat prin lista
de adiacente { ecare nod are o lista de noduri la care este conectat. Se
creaza multimea de frontiera care reprezinta nodurile care au fost descoperite.
Multimea de frontiera este initial constituita din nodul radacina. Se marcheaza
toate nodurile din multimea frontiera care au fost vizitate. Se considera gra-
ful din Figura 3.65.a. Se considera v^arful de start 1 ca radacina a arborelui
si se pune acest nod initial ^ntr-o multime numita multimea frontiera f1g. La
adaugarea unui nod^n multimea frontiera se marcheaza ca ind vizitat. Pentru
ecare nod ^n multimea frontiera, se parcurg muchiile (si se adauga la arbore)
care conecteaza nodul la oricare alt nod care nu a fost ^nca vizitat ((1,2) si
(1,5)), si se formeaza o noua multime de frontiera cu aceste noi noduri f2; 5g,
marc^andu-le ca ind deja vizitate. Se repeta procesul p^ana c^and toate nodurile
au fost vizitate. In cazul serial, acesta procedura lucreaza bine, deoarece ^n
urmatorul pas nodul 6 va vizitat pe baza muchiei cu nodul 2 sau nodul 5, dar
nu ambele, deoarece unul sau celalalt va primul analizat, se adauga muchia la
arbore, se pune nodul ^n multimea frontiera si se va marca drept vizitat. C^and
se ^nt^alneste celalalt nod, va vedea ca a fost deja vizitat si nu-l utilizeaza.
In cazul paralel, at^at nodul 2 c^at si nodul 5 ^ncearca sa adauge muchia la
6, astfel pun^and 6 ^n multimea de frontiera de doua ori (similar, ^n graful din
Figura 3.65.b, la pasul 2 v^arfurile 5 si 8 vor colecta ambele nodul 9). Evitarea
duplicatelor este esentiala. In paralel, toate nodurile care sunt conectate cu
nodurile din multimea frontiera sunt determinate, sunt eliminate duplicatele,
se elimina nodurile care au fost vizitate, si se constituie noua multime de fron-
tiera. Se repeta acest proces p^ana c^and multimea de frontiera devine vida. In
exemplul de mai sus, multimea initiala de frontiera este f1g. La pasul al doilea
multimea de frontiera este f2; 5g din care se elimina duplicatele si nodurile care
au mai fost vizitate (nici unul ^n acest caz). Se cauta muchiile cu v^arfuri ^n
2 sau 5, noua multime frontiera ind f3; 6; 6; 9g, se elimina duplicatele si se
obtine f3; 6; 9g, se marcheaza cele vizitate. La pasul urmator multimea este
f4; 7; 7; 10; 10; 13g. Pentru a elimina duplicatele se utilizeaza o matrice auxiliara
de lungime jV j, ^n care ecare element ^si scrie indexul. De exemplu, pentru
matricea f4; 7; 7; 10; 10; 13g se scrie 0 ^n locatia 4, se scrie 1 si 2 ^n locatia 7,
si asa mai departe. Fiecare element citeste valorile din aceeasi locatie si daca
289
Figura 3.66: Exemplu de MST: (a) Graful initial; (b) Dupa ce a fost selectata
prima muchie; (c) Dupa ce a doua muchie a fost selectata; (arborele minim
nal de acoperire)
indexul nu este al sau, elimina valoarea din matrice. De exemplu, e 1 e 2
va scris ^n locatia 7 si una dintre ele va citi indexul celuilalt si de aceea va
renunta sa scrie valoarea ^n multimea de frontiera.
Un aspect interesant a algoritmului BFS paralel este acela ca poate gen-
era arbori BFS care not pot generati de BFS secvential, chiar permit^and
orice ordine de vizitare a vecinilor ^n BFS secvential. Daca algoritmul paralel
utilizeaza o scriere cu prioritate, atunci se va genera acelasi arbore precum ^n
cazul secvential.
Arborele de acoperire minim (arbore partial minimal, Minimum
Spanning Tree, MST). Un arbore de acoperire a unui graf nedirectional
G este un subgraf al lui G care este arbore si contine toate v^arfurile lui G.
Un arbore de acoperire minim (MST sau Minimum Weight Spanning Tree,
MWST) pentru un graf neorientat cu ponderi (egale^n cazul simplu MST) este
un arbore de acoperire cu pondere minima. Fie VT multimea ce detine v^arfurile
MST ^n timpul constructiei sale. Matricea d[i] detine ponderea muchiei cu cea
mai mica pondere de la orice v^arf din VT la nodul i. Initial, VT = frg (orice
nod) si d[r] = 0. Pentru nodul v 2 (V VT ); d[v] = w(r; v) daca exista o
muchie, altfel d[v] = 1. La ecare iteratie, se adauga un nou v^arf u la VT ast-
fel ^nc^at d[u] = minfd[v]jv 2 (V VT )g iar toate valorile d[v] cu v 2 (V VT )
trebuie sa e actualizate. Algoritmul se termina c^and VT = V . In cazul unor
ponderi distincte, pentru ecare i; j , muchia (i; j ) este ^n MWST daca si nu-
mai daca ecare drum de la i la j de lungime cel putin 2 contine o muchie cu
pondere > wij .
O metoda recursiva de constructie a MWST este urmatoarea. Pentru ecare
i; j; k, e wijk minimul tuturor ponderilor maxime ce apar ^ntr-un drum de la
( )

i la j ^n G care trec prin  k noduri. Se poate calcula wijn recursiv:


( )

wij = wij ; wijk = min(wijk ; max(wikk ; wkjk )):


(0) ( ) ( 1) ( 1) ( 1)

(i; j ) este ^n MWST daca si numai daca wij < wijn .
( )

Algoritmul MST secvential al lui Prim este urmatorul:


PRIM_MST(V, E, w, r) {
VT := {r};

290
Figura 3.67: Partitionare paralela a MST a lui Prim
d[r] := 0;
for <toti v ^n (V-VT)> do
if <exista muchia(r,v)> then d[v]:=w(r,v)
else d[v]:=big
while not (VT=V) do {
<gaseste un varf u a.^. d[u]=min{d[v]| v in (V-VT)}>
VT:=VT + {u}
for <toti v ^n (V-VT)> do
d[v]:=min{d[v],w(u,v)}; } }
Complexitatea algoritmului este O(n ). 2

Paralelizarea algoritmului lui Prim se face prin mentinerea ciclului


secvential exterior si paralelizarea ecarei iteratii. Partionarea se face pe felii
verticale ale matricei de adiacenta de-a lungul procesoarelor. Se face o difuzare
unu-la-toti de la P apoi ecare procesor actualizeaza partea sa din d { toate
datele necesare sunt disponibile local, ^n partitii felii. Se considera p numarul
0

de procesoare si n numarul de v^arfuri din graf. Se partitioneaza graful G ^n


p submultimi astfel ^nc^at ecare procesor este responsabil pentru n=p v^arfuri
(Figura 3.67). Fie Vi submultimea de v^arfuri asignate procesorului Pi . Fiecare
procesor stocheaza o parte a matricei d care corespunde la Vi . Procesorul Pi
calculeaza di [u] = minfdi[v]jv 2 (V VT ) \ Vi g de-a lungul ecarei iteratiei.
Minimul global este obtinut peste toate di [u] printr-o acumulare la un singur
nod. De exemplu, procesorul P insereaza v^arful u (cu minimul di[u]) ^n VT si
difuzeaza informatia la toate procesoarele. Apoi ecare procesor actualizeaza
0

valorile lui di[v] ^n submultimea sa. Noul v^arf u va adaugat la VT .


Implementare pe un hipercub. Fiecare iteratie necesita O(n=p) si ind O(n)
iteratii, calculul este estimat la O(n =p); pentru comunicare, la ecare iteratie
2

exista acumulare la un singur nod (complementara difuzarii una-la-toti) si o


difuzare unul-la-toti, ^n total O(n log p): Astfel
 
n
+O(n log p); S = O(n =p)O+(nO)(n log p) ; E = 1 + O((p1log p)=n) :
2 2
Tp = O
p 2

Algoritmul este cost-optimal daca p = O(n= log n); cu izoe cienta O(p log p).
2 2

Implementare pe o grila. Costul calcului este acelasi si este egal cu O(n =p).
Costul total de comunicare este O(npp). De aceea,
2

291
Tabelul 3.9: Performantele algoritmilor Prim si Dijkstra pe diferite arhitecturi
Numarul maxim de Timpul paralel Functia
Arhitectura procesoare
p pt. E = O (1) de rulare de izoe cienta
Inel O( n) O(n ) = O(p )3 2 4

Grila O(n = ) 2 3
O(n = ) O(p )4 3 3

Hipercub O(n= log n) O(n log n) O(p log p) 2 2

 
O(n2 ) 1
Tp = O
n2
p
+ O(npp); S=
O(n =p) + O(npp)
2
; E=
1 + O(p : =n) : 15

Algoritmul este cost-optimal daca p = O(n = ); cu izoe cienta O(p ).


2 3 3

Problema celui mai scurt drum. Se considera D = (dij ) matricea de


distante, unde dij = 1 daca nu exista muchie de la i la j . Se de neste D k = ( )

(dijk ), unde dijk este lungimea celui mai scurt drum de la i la j care trece prin
( ) ( )

cel mult k noduri.


Se cere calcularea lui D N . Se observa ca D = D si pentru toti k  1,
( ) (0)

dijk = min(d k ; dikk + dkjk ):


( ) ( 1) ( 1) ( 1)

Odata cu calcularea D k , se calculeaza si M k = (mijk ), unde mijk este nodul


( ) ( ) ( ) ( )

ce precede j ^n cel mai scurt drum de la i la j care atinge lungimea dijk . Se ( )

actualizeaza mijk daca si numai daca s-a descoperit ca este mai scurt drumul
( )

care trece prin k.


Drumurile cele mai scurte cu o singura sursa. Intr-un graf ponderat,
orientat, se cauta lungimilor celor mai scurte drumuri de la un v^arf sursa s la
oricare alt v^arf din graf. In cele ce urmeaza se studiaza algoritmul lui Dijkstra.
Acesta este foarte similar cu algoritmul MST a lui Prim except^and faptul ca
ecare v^arf u 2 (V VT ) algoritmul Dijkstra stocheaza l[u], care este costul
minim pentru a ajunge la v^arful u de la v^arful s. Algoritmul Dijkstra lucreaza
numai pentru ponderi pozitive. Este un algoritm de tip greedy (lacom, avantaj
imediat). Gaseste incremental cel mai scurt drum de la s la celelalte v^arfuri
din G. Se adauga cel mai apropiat set de v^arfuri si se actualizeaza. In total
este necesar un timp O(n ). Performantele obtinute prin paralelizare sunt
2

prezentate ^n Tabelul 3.9.


Algoritmul lui Dijkstra secvential pentru drumurile cele mai scurte cu o
singura sursa este urmatorul:
DIJKSTRA_SINGLE_SOURCE_SP(V, E, w, s) {
VT := {s};
for <toti v in (V-VT)> do
if <exista muchia (s,v)> then t[v]:=w(s,v)
else t[v]:=big

292
Figura 3.68: (a) O harta a strazilor; (b) Poate reprezentata printr-un graf ^n
care ecare intersectie de strada este un v^arf si ecare muchie este un segment
de strada; v^arfurile sunt intersectii de strazi
while not (VT=V) do {
<gaseste un vector u a.^. t[u]:=min{t[v]| v in (V-VT)}>
VT:=VT+{u}
for <toti v in (V-VT)> do
t[v]:=min(t[v],t[u]-w(u,v)) } }
Formularea algoritmului paralel este similara cu formularea paralela a algo-
ritmului MST a lui Prim. Se partitioneaza matricea de adiacente cu ponderi
utiliz^and maparea feliata pe blocuri. Astfel ecare dintre cele p procesoare este
asignat la n=p coloane consecutive ale matricei de adiacente, si calculeaza n=p
valori ale matricei l.
Grafuri rare. In acest caz exploatarea paralela este di cila. Un exem-
plu de graf rar este reprezentat de harta strazilor (Figura 3.68). Algoritmul
lui Johnson ^mbunatateste algoritmul lui Dijkstra utiliz^and liste de adiacente
si o coada de prioritati pentru stocarea a t articole. Timpul de rulare este
O(m log n). Algoritmul lui Johnson ^n varianta secventiala pentru dumurile
cele mai scurte de la o singura sursa este urmatorul:
JOHNSON_SINGLE_SOURCE_SP(V, E, s) {
Q := V
for <toti v ^
n Q> do l[v] := 1
t[s] := 0
while not (Q <vida>) do {
u := extract_min(Q);
for <fiecare v ^n Adj[u]> do
if <v ^
n Q> and l[u]+w(u,v)<t[v] then t[v]:=t[u]+w(u,v) }
Pentru paralelizare, trebuie avut grija la Q. Daca un singur procesor trateaza
Q se poate produce o g^atuire. O alternativa consta ^n partitionarea v^arfurilor
(si listelor adiacente) ^ntre procesoare. Se ruleaza algoritmul lui Johnson pe
ecare procesor, cu o coada locala de prioritati (initial toate vide) except^and
procesorul cu sursa. Actualizarea necesita anumite comunicatii (pentru muchii
nonlocale). V^arfurile pot sa e repuse la coada. Se considera un graf tip grila,
cu sursa ^ntr-un colt. In mod tipic, activitatea progreseaza ^ntr-un val de-a
lungul grafului. Numai procesoarele din val sunt active (Figura 3.69.a). O
293
Figura 3.69: (a) Val; (b) Num arul de procesoare ocupate odata cu propagarea
valului de-a lungul grafului grilei
mapare feliata pe blocuri poate tine ^n medie jumatate de procesoare ocupate
(Figura 3.69.b). In cel mai optimist caz se poate obtine e cienta constanta.
Drumurile cele mai scurte ^ntre toate perechile. Se cauta cele mai
scurte drumuri ^ntre perechi de v^arfuri. Poate exploatat algoritmului lui
Dijkstra: pentru algoritmul secvential, se aplica algoritmul lui Dijkstra pentru
cazul unei singure surse de n ori. Deoarece complexitatea algoritmului Dijkstra
pentru o singura sursa este O(n ), algoritmul pentru toate perechile are O(n ).
2 3

In formularea paralela, pot exista doua abordari: formularea partitionare-a-


surselor care utilizeaza p = n procesoare si formularea sursa-^n-paralel care
utilizeaza p > n procesoare.
Formularea partitionare-a-surselor utilizeaza p = n procesoare prin
asignarea ecarui v^arf la un procesor. Apoi ecare procesor ruleaza algo-
ritmul Dijkstra secvential pentru drumul cel mai scurt cu o singura sursa.
Fiecare dintre cele n procesoare gaseste cea mai scurta cale pentru un v^arf
secvential. In acest algoritm nu exista comunicare inter-procesoare, iar Tp =
O(n ); S = O(n )=O(n ); E = O(1). Costul este optimal. Izoe cienta este
2 3 2

O(p ) (deoarece p = O(p)). Scalabilitatea este ^nsa redusa. Doar n procesoare


3

sunt ocupate.
In formularea sursa-^n-paralel se presupune ca avem p > n procesoare, care
sunt divizate ^n n partitii astfel ^nc^at ecare partitie are
pp p=n procesoare. Se
presupune c
a avem o gril
a de p-procesoare astfel ^
 nc^
a t
pn (Figura 3.70). Grila pp  pp este partitionata ^n n subgrile este un multiplu de
p p
de marime
p=n  p=n. Se asigneaza ecare v^arf la o partitie. Fiecare partitie poate
rula algoritmul Dijkstra paralel pentru cel mai scurt drum cu o singura sursa:
 
n
+ O(pnp); S = O(n =pO)(+n O) (pnp) ; E = 1 + O(p1: =n : ) :
3 3
Tp = O
p 3 15 25

Pentru formularea cost-optimala, este necesar ca p : = n : = O(1). Deci,


15 25

p = O(n ). Numarul total de procesoare care poate utilizat e cient este


:
1 66

294
Figura 3.70: Formularea sursa-^n-paralel ^n cazul unei grile
O(n ). Astfel aceasta formulare exploateaza paralelismul mai bine dec^at prima.
2

In exemplul din Figura 3.70, p = 16 si n = 4. Fiecare dintre sub-grile rezolva


problema celui mai scurt drum cu o singura sursa pentru un v^arf sursa dat. In
exemplul dat, ecare sub-grila este marcata prin v^arful sursa al algoritmului
sau cu o singura sursa.
Abordarea prin multiplicare de matrice. Se considera un graf pon-
derat G = (V; E; w) fara cicluri cu pondere negativa. Matricea de adiacente
ponderate este A = (ai;j ) (contine drumurile cele mai scurte de lungime 1
muchie). Se cer drumurile cele mai scurte cu cel mult n 1 muchii. Se ob-
serva ca cel mai scurt drum de la vi la vj cu cel mai mult k muchii este
cel mai scurt drum de la vi la un anume v^arf vm cu cel mult k 1 muchii
plus o muchie de la vm la vj . Aceasta poate gasita consider^and toti pre-
decesorii posibili vm la vj si considerarea cazului cel mai bun. Se poate
alege un v^arf vm, care este vecin cu vj astfel ^nc^at sa se minimizeze pon-
derea drumului:di;jk = min mnfdi;m
( )
1
k(
+ w(vm ; vj )g. Ecuatia de lucru are
1)

forma modi cata a unei Pn^


 nmult
 iri matriceale: D k = Ak sau D k = D k A
( ) ( ) ( 1)

unde ^n loc de ci;j = k (ai;k  bk;j ) este necesar ci;j = minnk (ai;k + bk;j )
=1 =1
(adica similar multiplicarii matriceale). n Mai mult, D = A, iar D n
(1) ( 1)

poate calculat pe baza A ; A ; : : : ; A . De aceea sunt necesare doar


2 4 1

dlog(n 1)e multiplicari modi cate. Algoritmul secvential necesita O(n ) pen-3

tru multiplicare matriceala. De aceea este necesar un timp secvential de rulare


O(n log n). Utiliz^and multiplicarea matriceala paralela, se poate accelera cal-
3

culul. Pe un hipercub de exemplu, este necesar un timp O(log n) utiliz^and


2

n procesoare, acceleratiia ind S = O(n )=O(log n) (nu este cost-optimala:


3 3 2

E = O(1= log n)).


2

Componente conectate. Se considera problema etichetarii componentelor


conectate ale unui graf neorientat. Mai precis se cere etichetarea tuturor
v^arfurilor dintr-un graf G astfel ^nc^at doua v^arfuri u si v au aceeasi eticheta
daca si numai daca exista un drum ^ntre cele doua v^arfuri. Secvential com-
ponentele conectate ale unui graf pot usor etichetate utiliz^and cautarea ^n
profunzime (DFS) sau pe nivele (BFS).
Algoritmul secvential pentru determinarea componentelor conexe ale unui
graf G = (V; E ) necesita un timp TS (V; E ) = O(V + E ). Un subgraf conec-
tat este o submultime a lui V cu un drum ^ntre toate perechile de v^arfuri. O
componenta conectata (CC) este un subgraf conectat maximal. Componentele
conectate ale unui graf neorientat G = (V; E ) sunt multimile maximale dis-
295
Figura 3.71: Un exemplu pentru algoritmul de c autare a drumurilor minime
^ntre toate perechile bazat pe multiplicare matriceala

Figura 3.72: (a) Componente conectate; (b) Arbore DFS

Figura 3.73: Algoritmul secvential CC


juncte C ; : : : ; Ck astfel ^nc^at V = [ki Ci si u; v 2 Ci daca si numai daca u
poate atins din v si v poate atins din u. De exemplu, graful din Figura
1 =1

3.72.a are doua componente conectate. Componentele conectate pot gasite


efectu^and o traversare primul-^n-ad^ancime a grafului. Iesirea este o padure de
arbori DFS (Figura 3.72.b). Super-v^arful este o structura de date tip arbore
cu radacina utilizat pentru a reprezenta sub-graful conectat. Ideea de baza
este initializarea ecarui v^arf cu propriul super-v^arf si interclasarea repetata a
super-v^arfurilor. Algoritimul CC este schitat ^n Figura 3.73.
Interclasarea a doua paduri de acoperire A si B se face dupa cum urmeaza.
A are cel mult n 1 muchii. Pentru ecare (u; v) din A, se determina daca u si
v sunt ^n acelasi arbore ^n B . Daca nu sunt, atunci uneste acesti doi arbori ^n
B ca un singur arbore. Altfel nu se face nimic. Se vor efectua cel mult (n 1)
296
Figura 3.74: Formularea paralela
operatii de interclasare
 de arbori. In formularea paralela (Figura 3.74), avem
Tp = O n =p + O(n log p).
2

DFS este greu de implementat ^n paralel. Face parte din clasa de pro-
bleme P-complete, pentru care se asteapta sa nu existe solutii de ad^ancime poli-
logaritmica. In cazul tehnicii de cautare BFS, timpul paralel este proportional
cu diametrul grafului, ceea ce este rezonabil pentru grafuri cu diametru mic, nu
si ^n cazul general. Alti algoritmi lucreaza bine pentru orice graf, baz^andu-se
pe contractarea grafului.
Contractarea aleatoare. Contractarea grafului str^ange v^arfurile unui
subgraf conectat ^ntr-un singur v^arf pentru a forma un graf nou mai mic. In
varianta paralela a algoritmului, contractarea unor arcuri multiple se poate face
simultan. Este un exemplu pentru ruperea simetriei. Algoritmii efectueaza
o secventa de pasi ^n care ecare contracteaza o multime de subgrafuri, si
formeaza un graf mai mic ^n care ecare subgraf a fost convertit ^ntr-un v^arf.
Daca ecare asemenea pas al algoritmilor contracteaza marimea grafului cu o
fractie constanta, atunci ecare componenta se va contracta la un singur v^arf^n
O(log n) pasi. Prin rularea inversa a contractiei, algoritmii pot eticheta toate
v^arfurile din componente.
Modalitatea ^n care se selecteaza subgrafurile pentru contractie poate
aleatoare sau deterministica. Nici un algoritm nu este e cient-^n-lucru, nece-
sit^and lucru O(m log n) pentru grafurile din cazul cel mai defavorabil. Se con-
sidera un model de scriere concurenta.
Tehnica tovarasului aleator (random mate, RM) este bazata pe formarea
unei multimi de subgrafuri tip stea si contractarea stelelor. O stea este un
arbore de ad^ancime unu: consista dintr-o radacina si un numar arbitrar de i.
Algoritmul gaseste o multime de stele care nu se suprapun ^ntr-un graf, si se
contracteaza ecare stea la un singur v^arf prin ^mbinarea ilor cu parintii lor.
Tehnica utilizata pentru a forma steaua este o aplicatie a randomizarii. Fiecare
v^arf se identi ca prin tragere la sorti ca ind parinte sau u. Se presupun sanse

297
Figura 3.75: Un pas din contractarea aleatoare: (a) Selectarea parintilor si ilor
aleator; (b) Contractarea ilor; (c) Dupa contractie
egale pentru ecare caz. Apoi ecare v^arf u cauta printre vecini daca exista
vreunul parinte. Daca exista cel putin unul, atunci se alege unul dintre vecinii-
parinti ca ind parintele v^arfului ^n cauza.
Dat ind un graf G ca cel din Figura 3.75.a, se selecteaza aleator 50% dintre
noduri ca ind parinti, si 50% ca i. Fiecare u care este vecin cu cel putin un
parinte alege un parinte ^n scopul contractarii. Toate muchiile de la u sunt
purtate la parinte. Figura 3.75.b prezinta un exemplu. Un parinte poate sa
aiba mai multi copii, dar un u poate sa aiba un singur parinte. In medie,
dupa ecare contractie cel putin 1/4 dintre v^arfuri vor eliminate (1/2 dintre
noduri se asteapta sa e i si cel putin 1/2 dintre i vor avea parinti). Graful
dupa contractie este trasat ^n Figura 3.75.c. Se continua acest proces p^ana
c^and ram^ane probabil un singur nod. Daca este necesara etichetarea ecarei
componente, se expandeaza graful dupa ce toate contractiile sunt terminate.
Se asteapta ca algoritmul sa se termine ^n nu mai mult de log = n pasi.
In exemplul dat contractia este realizata dupa cum urmeaza. Se creaza o
4 3

matrice de lungime n, initializat cu o matrice de indexi ^n care ecare nod


pointeaza spre sine ^nsusi. Pentru graful din exemplu, aceasta matrice este
[1, 2, 3, 4, 5, 6, 7, 8]. Se aleg parintii si copii aleator. De exemplu, ^n Figura
3.75.a, nodurile 1, 2, 6, 7 sunt alese sa e i, iar nodurile 3, 4, 5, 8 sa e parinti.
Pentru ecare muchie, daca un nod este un parinte si un alt nod este un u,
muchia scrie indexul la parintele sau ^n ul sau. De exemplu, pentru muchia
(2, 3), deoarece 2 este u si 3 este parinte, muchia va scrie valoarea 3 la pozitia
2 din matrice. Parinti multipii pot ^ncerca sa scrie la acelasi u ^n acelasi timp
dar numai unul (ales arbitrar) va reusi. De exemplu, ^n Figura 3.75.b, at^at
muchiile (2, 3) c^at si (2, 5) scriu indicii la parintii lor, ^n pozitia 2, dar numai
3 reuseste ^n acest caz. Actualizarea muchiilor este realizata prin aducerea
de catre ecare muchie din matrice a noilor pointeri pentru noduri. Muchiile
precum (3, 3), sunt eliminate, dar vor mai exista ^nca muchii redundante.
Algoritmul RM asigneaza aleator genuri la v^arfuri si interclaseaza M v^arfuri
^n F v^arfuri. Muchia (u; v) este vie daca v^arfurile u si v apartin la super-v^arfuri
diferite. Un super-v^arf este viu daca cel putin o muchie vie atinge unul dintre
v^arfurile sale. Ideea este urmatoarea: at^ata timp c^at exista muchii vii, se
interclaseaza super-v^arfuri a unor genuri diferite conectate printr-o muchie vie
(Figura 3.76): primul pas este unirea radacinilor si pasul doi este compresarea
drumurilor. Formularea WT este urmatoarea:
for_all v in V do p[v] := v

298
Figura 3.76: Algoritmul RM: (a) Clasi carea r
adacinilor; (b) Imbinarea
radacinilor; (c) Compresarea drumurilor
while <exista muchii vii ^
n G> do {
for_all v in V do {
g[v] := rand({M, F})
for_all (u, v) in E <sau (u, v) viu> do {
if g[p[u]] = M and g[p[v]] = F then p[p[u]] := p[v]
if g[p[v]] = M and g[p[u]] = F then p[p[v]] := p[u] }
for_all v in V do p[v] := p[p[v]] }
Dupa ecare iteratie a ciclului while, ecare super-v^arf este stea. Probabili-
tatea ca un super-v^arf sa e interclasat cu alt super-v^arf este de aproximativ
1/4. Probabilitatea ca un v^arf sa e viu dupa 5 log n iteratii este de cel mult
1=n . Numarul asteptat de super-v^arfuri dupa 5 log n iteratii este de cel mult
2

1=n. Cu probabilitatea de cel mult 1=n, RM nu se termina dupa 5 log n iteratii.


Necesita modelul CRCW: CR ^n pasul de dublare a pointerului, CW ^n pasul
de interclasare. Cu o mare probabilitate algoritmul va avea O(log n) pasi si o
complexitate a lucrului O((m + n) log n). Mai mult, W (n) = O(m) ^n practica
pentru grafuri plane. Acest algoritm nu este e cient-^n-lucru ^n general (chiar
si ^n cazul grafurilor plane).
Urmatorul algoritm utilizeaza un numar x de iteratii:
for_all in 1:n do S[i] := P[i]
for k = 1 to log n do
for_all in 1:n do S[i] := S[S[i]]
Este corect dar ine cient, complexitatea lucrului ind O(n log n). Algoritmul
for_all in 1:n do S[i] := P[i]
repeat
for_all i in 1:n do {
S[i] := S[S[i]]
if not (S[i] = S[S[i]]) then M[i]:=1 else M[i]:=0 }
t := REDUCE(M, +)
until t = 0
este corect dar necesita un lucru O(n log h). Urmatorul este lucru-e cient:
m := n
for_all i in 1:m do L[i], S[i] := i, P[i]
repeat
for_all i in 1:m do {
S[L[i]] := S[S[L[i]]]
if not (S[L[i]] != S[S[L[i]]]) then C[i]:=1 else C[i]:=0 }

299
Figura 3.77: Inchiderea tranzitiva
M := SCAN(C, +)
for_all i in 1:m do if C[i] then L[M[i]] := L[i]
m := M[m]
until m = 0
Inchidere tranzitiva. Raspunsul la ^ntrebarea daca doua v^arfuri dintr-un
graf sunt conectate poate dat determin^and^nchiderea tranzitiv a a grafului. Se
considera graful G = (V; E ), si ^nchiderea tranzitiva G = (V; E ) unde E  =
f(vi ; vj )jexista un drum de la vi la vj ^n Gg. Calculam ^nchiderea tranzitiva
a grafului prin calcularea matricei de conectivitate A = (ai;j ) astfel ^nc^at
ai;j = 1 daca exista un drum de la vi la vj (sau i = j ) si ai;j = 1 altfel
(Figura 3.77). Matricea A poate obtinuta din matricea D, solutia problemei
drumurilor minime pentru toate perechile dupa cum urmeaza:

daca di;j = 1
ai;j = 11 dac a di;j > 0 sau i = j .
Consider^and matricea de adiacente A = (aij ) a lui G (aij = 1 daca (i; j ) 2 E
sau i = j;, si 0 altfel). A este An cu baza de calcul (^; _) ^n loc de (; +).
1

Algoritmul Floyd-Warshall consta ^ntr-o procedura recursiva pentru calcu-


lul lui A. Se calculeaza A k = (aijk ), unde pentru ecare k; 0  k  n,
( ) ( )

aijk = 1 daca j poate atins din i trec^and prin mai putin de k noduri
( )

sau 0 altfel. Atunci A n = A ; A = A, si pentru ecare k 1, aijk =


( ) (0) ( )

aijk _ (aikk ^ akjk ).


( 1) ( 1) ( 1)

O componenta conectata este o multime maximala de perechi de noduri


care se ating. Toate componentele conectate pot enumerate dupa calculul lui
A : a ia linie reprezinta lista nodurilor din aceeasi componenta ca si i.
Pentru a calcula A k din A k , se pun intrarile liniei ka a lui A k ^ntr-o
( ) ( 1) ( 1)

matrice liniara cu n-celule de la st^anga la dreapta si se muta a ia linie ^ntr-o


maniera ^nclinata sub forma de V , cu partea de jos a V -ului ^n celula k (Figura
3.78.a). Celula k paseaza aikk la celelalte; aikk si akjk ajung la celula j la
( 1) ( 1) ( 1)

momentul jj kj + 1. Celula are aijk , astfel ^nc^at poate calcula aijk . Se pun
( 1) ( )

toti vectorii linie astfel ^nc^at a ka linie ajunge prima (Figura 3.78.b). Astfel
sekpoate intercala calculul tuturor liniilor klui A k .k A j a celula receptioneaza
( )

akj cu un pas ^nainte de a receptiona aik si akj . La receptionarea "*",


( 1) ( 1) ( 1)

celula paseaza valorile stocate (intrarile ^n a ka linie) descendent. Legatura la


urmatoarea matrice se face astfel: celulele 1; : : : ; k ale liniei a ka asteapta 2
300
Figura 3.78: Algoritmul Floyd-Warshall: (a) Stocare ^ n forma de V; (b)
Furnizarea liniilor; (c) Legatura pentru urmatoarea matrice

Figura 3.79: (a) Grile de arbori; (b) Rutare


pasi ^nainte de pasarea oricarei valori descendent (nu sunt necesare ^nt^arzieri
pentru ultima linie). Timpul de rulare al algoritmului este O(N ): Pe o grila
n  n, ecare pas recursiv este efectuat pe o matrice cu n celule.
Grile tri-dimensionale de arbori. O grila 3D de arbori este o extensie
naturala a unei grile bi-dimensionale de arbori la trei dimensiuni. Pentru ecare
j; k; 1  j; k  n, exista un arbore a carui noduri frunze sunt (i; j; k); 1  i  n,
un arbore a carui noduri frunze sunt (j; i; k); 1  i  n, si un arbore a carui
noduri frunze sunt (j; k; i); 1  i  n. Acesti arbori sunt numiti arborele din
dimensiunea 1, 2, si 3.
Aplicatie: Multiplicare matriceala ^n O(log n) pasi. Se multiplica matricele
n dimensionale A = (aij ) si B = (bij ). Pentru ecare i; j , se distribuie aij ^ntre
frunzele arborelui (i; j ) dimensiunea 3. Pentru ecare j; k, se distribuie bjk
printre frunzele arborelui (j; k) dimensiunea 1. A (i; j; k)a frunza multiplica
valorile a si b pentru a obtine aij bjk . Produsele sunt ^nsumate la radacina
arborilor dimensiunea 2.
Grile de arbori. O grila n  n de arbori este o grila n  n fara conectare
^ntre nodurile vecine dar cu un arbore binar cu n frunze dominant ^n ecare
coloana/linie (Figura 3.79).
Aplicatia 1: Rutare. Poate realizata ^n O(log N ) pasi. Se aplica ^nt^ai o
rutare spre coloana destinatiei, apoi spre linia destinatiei (Figura 3.79.b).
301
Figura 3.80: (a) Sortare; (b) Multiplicare matrice-vector

Figura 3.81: Metoda recursiv a pentru determinarea arborelui de acoperire cu


pondere minima: (a) Graful initial; (b) Prima runda; (c) Nodurile care se
prabusesc; (d) MST
Aplicatia 2: Sortarea a n numere. Se distribuie xi la nodurile frunza la
arborii coloana/linie i. Pentru ecare i; j; i 6= j , al (i; j )lea nod frunza expediaza
bi;j = [xi < xj ] la P radacina coloanei sale. Radacina celei de a j a coloana
calculeaza tj = 1 + i6 j bi;j (pozitia nala a lui xj ; sortare prin numarare).
=
Radacina coloanei j face ca frunza (tj ; j ) sa distribuie numarul sau la toate
frunzele din arborele linie j cu algoritmul de rutare (Figura 3.80.a).
Aplicatia 3: Multiplicare matrice-vector. Fie matricea A si vectorul x.
Valorile ai;j sunt distribuite frunzelor (i; j ). Valorile xi sunt distribuite la
toate frunzele arborelui coloanei i. Se utilizeaza arborii linie pentru calculul
sumei produselor dintre valorile a si valorile x.
Aplicatia 4: Arbore de acoperire cu pondere minima. Pentru orice graf
neorientat G = (V; E ) cu ponderi de muchii unice si orice U  V , muchia
de pondere minima ce conecteaza U si V U este ^n arborele de acoperire
de pondere minima a lui G. Incerc^and toate multimile posibile pentru U , se
descopera cel putin jV j=2 muchii. Acest fapt sugereaza o metoda recursiva
(Figura 3.81). Pentru ecare supernod u, se calculeaza muchia de pondere
minima cu U = fug. Acest algoritm poate implementat pe o grila n  n de
arbori, necesit^and O(log n) pasi.
3

Turul Euler. Tehnica turului Euler este utilizata pentru procesarea optimala
rapida a datelor structurate ca arbori. Numele provine de la circuitele Euler din
grafurile orientate. Un circuit Euler ^ntr-un graf orientat este un ciclu orientat
care traverseaza ecare muchie o singura data. Dac a se considera arborele
T = (V; E ) si se produce versiunea sa orientata T 0 = (V; E 0 ) prin ^nlocuirea
ecarei muchii (u; v) 2 E cu doua muchii orientate (u; v) si (v; u) din E 0, atunci
graful T este Eulerian. Un circuit Euler din T este un tur Euler ^n T . Formal,
0 0

302
3.82: Arbore si paranteze balansate
Figura

se speci ca un tur Euler a lui T prin de nirea functiei succesor s : E 0 ! E 0 ,


astfel ^nc^at s(e) este muchia urm^and muchia e ^n tur.
Se considera arbori cu radacina. Exista o legatura puternica ^ntre
reprezentarea turului Euler a unui arbore si o reprezentare a structurii de
arbore prin secvente de paranteze balansate (Figura 3.82). Fiecare secventa
de paranteze balansate are o interpretare drept arbore cu radacina. Aceasta
reprezentare are proprietatea cheie ca subsecventa reprezent^and orice subarbore
este de asemenea balansat. O consecinta a acestei proprietati este urmatoarea
a rmatie: daca Æ este un operator binar asociativ cu inversa, atunci plasam
elementul e la ecare paranteza st^anga si inversul sau e la ecare paran-
teza dreapta, atunci ^nsum^and (relativ la Æ) elementele pe orice sub-arbore
se obtine zero. Aceasta proprietate poate exploata dupa cum urmeaza. Se
presupune ca un arbore T cu n noduri este reprezentat prin doi vectori ^n
memoria partajata, L si R (pentru parantezele st^angi si drepte). Determinarea
ad^ancimii ecarui v^arf a unui arbore se poate determina printr-un algoritm
precum urmatorul ^n formularea WT:
// Intrare: arbore T cu radacin
a cu n varfuri reprezentat prin
// turul Euler, prin doua matrice L[1:n] si R[1:n].
// Iesire: matricea D[1:n] cu adancimile varfurilor
integer A[1:2n]
for_all i in 1:n do { A[L[i]]:=1; A[R[i]]:=-1 }
B:=SCAN(A,+)
for_all i in 1:n do D[i]:=B[L[i]]
Figura 3.83.a ilustreaza operatiile algoritmului ce poate rulat pe un PRAM
EREW cu complexitatea pasilor O(log n) si complexitatea lucrului O(n):
Convertirea unei reprezentarii a unui arbore bazata pe pointeri ^ntr-o
reprezentare bazata pe tur Euler se face dupa cum urmeaza. Daca se aran-
jeaza vecinii v^arfului u ^ntr-o ordine arbitrara (v ; : : : ; vd ), unde d este gradul
v^arfului u, si se de neste functia succesor astfel s((vi ; u)) = (u; v i mod d),
0 1

atunci se poate de ni un tur Euler valid a lui T . Partea netriviala a


( +1)

demonstratiei este aceea de a arata ca avem un singur ciclu. Acest lucru poate
stabilit prin inductie dupa numarul de v^arfuri. Presupunem ca arborele T
este reprezentat printr-o multime de liste de adiacente pentru ecare v^arf, si
presupun^and mai departe ca lista de adiacente Lu pentru v^arful u este^nlantuit
circular, si ca elementul lista contin^and v^arful v are de asemenea un pointer la
elementul din Lv ce contine v^arful u. Aceasta reprezentare este prezentata ^n
Figura 3.83.b. Elementul din lista circulara de adiacente Lu contin^and un v^arf
vi de neste implicit muchia directa (u; vi ). Unul dintre pointerii sai pointeaza
spre v^arful v i mod d (care de neste implicit muchia directa (u; v i mod d),
( +1) ( +1)

303
Figura 3.83: Determinarea ad^ancimii v^arfurilor unui arbore: (a) Exempli care;
(b) Construirea reprezentarii tur Euler a arborelui din reprezentarea bazata pe
pointeri
pe c^and celalalt pointer pointeaza la v^arful u din Lvi (care de neste implicit
muchia directa (vi ; u)). Astfel exista su cienta informatie pentru a calcula
functia succesor de nita anterior, ce poate evaluata pe un PRAM EREW ^n
O(1) pasi cu complexitatea lucrului O(n), ceea ce este e cient ^n lucru.

3.2.5 Algebra liniara


Calcule elementare
P
Produs scalar. Se presupune ca este necesara gasirea ni=1 ai bi pentru doi
vectori n-dimensionali. Timpul necesar este dlog ne + 1 utiliz^and n procesoare.
Presupunem ca avem p procesoare conectate ^ntr-o structura liniara cu p  n.
Presupunem ca k = n=p unde k este un^ntreg. Pentru procesorul i, se mapeaza
k valori ale lui a si b numerotate de la (i 1)k + 1 la ik. Problema poate
privita ca o problema de acumulare. Se presupune ca nodul radacina va obtine
rezultatul nal si alegerea optimala a radacinii este nodul "de mijloc" care
este la o distanta de cel mult bp=2c legaturi de ecare nod. Presupunem ca o
adunare si multiplicare necesita timpul , iar transmiterea produsului partial
de-a lungul unei legaturi necesita timpul . Timpul pentru calculul produsului
scalar
p este 2k + ( + )bp=2c. Valoare lui p optimala este aproximativ p 
4 n=( + ). Se observa ca T (p) = O(n = ) si numarul optim de procesoare
1 2

este substantial mai mic dec^at n; daca > (4n 1) , atunci este recomandata
utilizarea unui singur procesor. Daca se utilizeaza un arbore de acoperire,
atunci timpul total este 2n =p + ( + ) log p. Valoarea optimala a lui p este
aproximativ p  2 n=( + ). Se observa ca T (p) = O(log n); numarul optimal
de procesoare este mai mare dec^at ^n cazul utilizarii modelului matricei liniare.
Timpul de rezolvare a problemei este mult mai mic dec^at ^n modelul liniar.
5 Rezumat: Calculele numerice vectoriale si matriceale sunt baza aplicatiilor stiinti ce.
Efectuarea ^n paralel a unor asemenea calcule conduce la un timp de raspuns redus al
aplicatiei realizate pe calculator si la posibilitatea de abordare a unor probleme mai compli-
cate care pe un calculator cu un procesor nu pot rezolvate ^n timp rezonabil.

304
Adunare de matrice. Se ^nsumeaza n matrice de dimensiune m  m ^n
timp dlog ne utiliz^and m bn=2c procesoare. In cazul ^n care m = n, secvential,
2

se fac O(n) pasi, si un lucru O(n). In modelul PRAM CRCW cu combinare,
se poate efectua doar un singur pas (timp O(1)) utiliz^and n procesoare, la un
cost-optimal. Se poate de asemenea emula reducerea pe un arbore de locatii
partajate ^n timp O(log n), utiliz^and n=2 procesoare, ^nsa nu cost-optimal.
Este de preferat utilizarea a (n= log n) procesoare, ecare^nsum^and log n valori
secvential, ^ntr-un timp O(log n), solutie ce este cost-optimala.
Maparea datelor la procesoare. Localitatea datelor are un impact major
asupra performantei algoritmilor matriceali. Pe o masina seriala se exploateaza
ierarhia memoriei. In cazul paralel disponibilitatea locala sau la distanta a
datelor dicteaza cantitatea de comunicatii.
Se considera pentru exempli care cazul unei ^nsumari. Toate datele sunt
initial ^n memoria lenta. Fie m numarul de elemente de memorie (cuvinte)
mutate^ntre memoria rapida si cea lenta. Fie tm timpul necesar unei operatii^n
memoria lenta si f numarul de operatii aritmetice. Fie tf timpul per operatie
aritmetica < tm si q = f=m numarul mediu de ops per acces de element
lent. Atunci timpul minim posibil este ftf , c^and toate datele sunt ^n memoria
rapida. Timpul actual este ftf + mtm = ftf (1 + (tm=tf )(1=q)). Un q mai
mare ^nseamna un timp mai apropiat de valoarea minima ftf . Pentru a vedea
rezultatele schimbarii lui q, se considera calculul simplu
s = 0; for i = 1 to n do s = s + h(X[i])
Presupunem ca tf = 1 M op/s^n memoria rapida. Presupunem ca data mutata
este tm = 10 si ca h necesita q ops. Se presupune ca matricea X este ^n
memoria lenta. Astfel m = n si f = qn. Timpul este astfel 10n + qn (citire
plus calcul), iar f=t = q=(10+ q). C^and q creste, raportul se apropie de valoarea
maxima 1 M op/s.
Un algoritm matriceal este numit algoritm punct daca este bazat pe un
singur element al unei matrice. Un algoritm bloc este bazat pe sub-matrice.
Pentru maparea unui vector se considera cazul unei vector A(1 : n), n-
dimensional, si p procesoare. Prin mapare se transforma indexul global ^ntr-un
cuplu (numar-procesor, index local). Maparea se poate face astfel:
Nici o distributie: Totul este la procesorul 0 (varianta ne-utilizabila).
Replicare completa: A[i] apare ca local A[i] pe ecare procesor; capacitatea
totala de stocare este np.
Bloc: Fiecare procesor detine parti continue din A; procesorul j detine A[jn=p :
(j + 1)n=p 1]; A[i] se mapeaza ^n local A[imod (n=p)] pe procesorul i
div (n=p).
Ciclic: Fiecare procesor detine elemente risipite ale lui A; procesorul j detine
A[j : n : p]. A[i] se mapeaza pe local A[i div p] pe procesorul imod p.
Ciclic(k): Fiecare procesor detine grupuri de blocuri din A, ecare bloc ind
de marime k; se reduce la mapare bloc si ciclica pentru k adecvat.
General: Fiecare procesor detine o submultime arbitrara de elementel din A;
se speci ca prin intermediul unui vector de indirectare.
Pentru matrice bi-dimensionale, maparile de interes sunt produsele
carteziene ale variantelor uni-dimensionale: (bloc, bloc), (bloc, *), (*, bloc),
305
Figura 3.84: Partitionare a unei matrice cu n elemente pe o grila cu p procesoare:
(a) Benzi de coloane: n = 16 and p = 4; (b) Ciclic pe coloane; (c) Ciclic pe
blocuri de coloane cu n = 16; p = 4 si b = 2; (d) Ciclic pe blocuri de linii si
coloane; (e) Bloc ^nclinat
(bloc, :), (:, bloc), (*, ciclic). Intr-o partitionare pe benzi matricea este divizata
^n linii complete (benzi pe linii) sau coloane complete (benzi pe coloane). In
mod ideal ecare grup asignat unui procesor ar trebui sa aiba un numar egal
de linii sau coloane. In cazul distributiei ^n bloc de benzi ecare procesor are
linii sau coloane contigue. Prin partitionarea ^n forma tablei de sah, matricea
este divizata ^n patrate sau blocuri dreptunghiulare (sub-matrice) care sunt dis-
tribuite la procesoare. In partitionarea uniforma toate sub-matricele au aceeasi
marime. Distributia poate ^n bloc, ciclica sau bloc-ciclica. O matrice nn
este partitionata pe o grila de p-procesoare^n blocuri de marime (n=ppn=pp)
(maxim n procesoare).
2

Ideea generala a utilizarii blocurilor este aceea de a obtine informatie la


o viteza mare (^n cazul utilizarii de mai multe ori pentru a amortiza costul
mutarii datelor). Blocurile ^n cache reduc tra cul ^ntre memorie si cache.
Blocurile ^n registrii reduc tra cul dintre cache si CPU. Prin partitionarea
pe blocuri de coloane (Figura 3.84.a), o coloana i este stocata pe procesorul
bi=cc unde c = dn=pe este numarul maxim de coloane stocat per procesor. Nu
se permite astfel o echilibrare buna a ^ncarcarii. Dupa calculul a c coloane pro-
cesorul 0 este inactiv. Distributia similara pe linii are aceeasi problema. Prin
partitionarea ciclica pe coloane (Figura 3.84.b) ecare procesor detine apro-
ximativ a 1=p-a parte din matrice. Se realizeaza o balansare a ^ncarcari mai
buna. In partitionarea ciclica a blocurilor de coloane (Figura 3.84.c) se alege
o dimensiune a blocului b, se ^mpart coloanele ^n grupuri de marime b, se dis-
tribuie aceste grupuri ciclic. In cazul b < c se obtine o echilibrare a ^ncarcarii
mai buna dec^at ^n partitionarea pe blocuri de coloane. In partitionarea ciclica
pe blocuri de linii si coloane (Figura 3.84.d): procesoarele si blocurile matriceale
sunt distribuite ^n matrice bidimensionale (nu este necesara o simetrie ^n linii
si coloane). In partitionarea ^nclinata (Figura 3.84.e) ecare linie si ecare
coloana este partajata de cele p procesoare.
Partitionarea unor matrice rare, precum cea de adiacente ale unui graf
(Figura 3.85.a) trebuie sa se faca c^at mai uniform. O partitionare buna a grafu-
lui are numar egal (ponderat) de v^arfuri^n ecare parte (echilibrarea^ncarcarii
si stocarii), si un numar minim de muchii ^ntre ele (minimizare comunicare).
Adesea este necesara reordonarea liniilor/coloanelor matricei pentru a grupa
nodurile dintr-o aceeasi partitie. Structura matriceala ideala pentru paralelism
este astfel cea aproape bloc diagonala, cu numarul de blocuri identic cu numarul
306
Figura3.85: (a) Relatia dintre matrice de adiacente si graf; (b) Partitionarea
unei matrice ideale

Figura 3.86: (a) Pasul de comunicare ^n cazul p = n = 16; (b) Con guratia
2

nala ^n cazul p = n ; (c) Pasul de comunicare ^n cazul p = 16 < n = 64; (d)
2 2

Rea-aranjare locala ^n cazul p < n 2

de procesoare, cu blocuri de dimensiuni similare si putine non-zerouri ^n afara


acestor blocuri pentru a minimiza comunicatiile (Figura 3.85.b).
Transpusa matriceala. Se considera o matrice n  n, A, si se cere matricea
n  n, AT , astfel ^nc^at ATi;j = Aj;i pentru 0  i; j < n: Toate elementele de sub
diagonala principala se muta pe pozitii corespunzatoare deasupra diagonalei
si vice-versa. Daca se presupune ca este necesara o unitate de timp pentru a
interschimba perechi de elemente din matrice, timpul secvential este TS (n) =
(n n)=2 = O(n ). In cazul unei distributii a matricei ^n maniera (bloc,
2 2

*) sau (*, bloc) pe o linie de procesoare se pot efectua comunicari toti-la-toti


pentru rezolvarea problemei. In cazul unei distributii (bloc, bloc) pe o grila
patrata de procesoare se efectueaza o transpunere locala, dupa o amestecare a
datelor corespunzatoare. Transpunerea se poate face si recursiv baz^andu-se pe
formularea bloc a transpunerii matriceale (utiliz^and un hipercub de exemplu).
Transpusa matriceala pe o grila. Se presupune ca se utilizeaza partitionarea
^n maniera tablei de sah. Daca numarul de procesoare p = n , algoritmul
2

actioneaza precum^n Figura 3.86.a-b, iar daca p < n , precum^n Figura 3.86.c-
d. Dimensiunea blocului pe ecare procesor este n=pp  n=pp = n =p. In faza
2
2

de comunicare, blocurile de sub diagonala se muta ^n sus si apoi la dreapta
spre destinatie; blocurile de deasupra diagonalei se muta ^n jos si apoi la st^anga
spre destinatie; blocurile din st^anga jos sau dreapta sus au cel mai lung drum.
Numarul de legaturi pe care trebuie sa-l traverseze este^n jur de 2pp. De aceea,
307
Figura 3.87: Algoritmul RTA pentru o matrice 8  8: (a) Divizarea matricei
^n patru blocuri si inter-schimbarea blocurilor sus-dreapta si jos-st^anga; (b) di-
vizarea ecarui bloc^n patru sub-blocuri si inter-schimbarea sub-blocurilor sus-
dreapta si jos-st^anga; (c) ultima sub-divizare si transpunere; (d) con guratia
nala

Figura 3.88: Pasii de comunicare ^n algoritmul RTA pe un hipercub cu 16-


procesoare: (a) Divizarea matricei ^n patru blocuri si schimbul blocurilor sus-
dreapta si jos-st^anga; (b) Divizarea ecarui bloc ^n patru sub-blocuri si schim-
bul sub-blocurilor sus-dreapta si jos-st^anga
costul de comunicare este (ts + tw n =p)2pp. Pentru traspunerea ^n paralel a
2

sub-matricelor locale ^n faza a doua este necesar un timp n =(2p), si de aceea
Tp = 2ts pp + 2tw n =pp + n =(2p), iar costul este pTC (n; p) = O(n pp), adica
2
2 2 2

mai mare dec^at complexitatea secventiala O(n ) (algoritmul nu este de aceea


2

cost-optimal).
Transpusa matriceala pe un hipercub. Se utilizeaza asa-numitul algoritm de
transpunere recursiv (RTA, Figura 3.87). Matricea este partitionata ^n maniera
tablei de sah. In prima faza perechi de procesoare inter-schimba sub-matricele
(utiliz^and un procesor intermediar la ecare pas ^n cazul hipercubului). In faza
a doua, sub-matricele sunt transpuse local (recursiv ^n acest caz). Algoritmul
RTA este mapat ^n mod natural pe un hipercub. Sa presupunem ca hipercubul
are p-procesoare; acesta este compus din patru subcuburi de p=4 procesoare.
Se divide matricea ^n patru blocuri care ecare este mapat la un subcub. In
pasii urmatori, un subcub este privit ca o combinatie a patru sub-cuburi mai
mici. La nalul recursiei, subcuburile contin un singur procesor. Fiecare pas
recursiv reduce dimensiunea subcuburilor cu un factor de patru. De aceea avem
log p = (log p)=2 pasi. Se considera cazul ^n care n = 8 (o matrice 8  8) si
p = 16, ^n Figura 3.88. Se observa ca P ; P ; P ; P sunt inter-conectate ^n
4

hipercub. Timpul de comunicare este 2(ts + tw n =p), iar timpul paralel este
0 2 10 8
2

308
Figura 3.89: Comunicari personalizate toti-la-toti ^n transpunerea unei matrice
4  4 pe patru procesoare

Figura 3.90: Multiplicare matrice vector ^n cazul partitionarii pe benzi de linii:
(a) Partitionarea initiala; (b) Distributia vectorului
Tp = (ts + tw n =p) log p + n =p, deci costul este pTp = O(n log p) (algoritmul
2 2 2

nu este cost-optimal). Daca se utilizeaza rutarea CT timpul de comunicare este


(ts + tw n =p + 2th)(log p)=2.
2

Transpusa prin partitionare pe benzi. Se considera o matrice n  n si


p = n procesoare (Figura 3.89). In general, daca p  n, ecare procesor detine
n=p linii, astfel ^nc^at are n =p elemente. Printr-o comunicatie personalizata,
2

se transmite un bloc matriceal de dimensiune n =p . Receptionarea unui bloc


2 2

necesita un timp n =(2p ). Deoarece ecare procesor are p blocuri, este necesar
2 2

un timp de n =(2p) pentru a transpune o^ntreaga linie. Tin^and seama de costul


2

unei comunicatii toti-la-toti personalizata (capitolul anterior cu m = n =p ),


2 2

se obtine, la utilizarea unui hipercub si a rutarii CT, un timp Tp = n =(2p) +


2

ts (p 1) + tw n =p + th p(log p)=2 care este cost-optimal.


2

Multiplicare matrice-vector. Se doreste multiplicarea matricei A(n  n)


cu vectorul x(n  1): y = Ax. Timpul secvential este Ts = O(n ). 2

Daca se considera partitionarea pe benzi de linii (Figura 3.90) si deoarece


difuzarea toti-la-toti^ntre n procesoare pe orice arhitectura necesita O(n), Tp =
O(n). Pentru p < n, cazul hipercubului, si presupunerea ca ecare procesor
detine n=p din vector, si dimensiunea mesajului este n=p, costul de comunicare
este ts log p + tw (n=p)(p 1) (pentru p mari, este aproximativ ts log p + tw n).
Deci Tp = ts log p + tw n + n =p. Algoritmul este cost-optimal daca p = O(n).
2

O alta formulare este cea pentru partitionarea ^n maniera tablei de sah. Se
efectueaza: comunicare unu-la-unu pentru aliniere de-a lungul liniei, difuzare
unu-la-toti pentru coloana si acumulare la un singur nod. Pe o grila, ecare
operatie necesita un timp O(n). Presupun^and necesara o unitate de timp pen-
tru multiplicare, Tp = O(n). Presupun^and ca avem p = n , costul este O(n ).
2 3

309
Figura 3.91: Multiplicare matrice-vector^
n cazul partitionarii^n maniera tablei
de sah { cele 4 etape

Figura 3.92: Multiplicare matrice-vector: (a) Pe o linie; (b) Pe un inel


Pe un hipercub ecare operatie necesita O(log n); astfel Tp = (log n). Daca
p = n , costul este O(n log n). Pentru cost-optimalitate, se poate creste gran-
2 2

ularitatea datelor si utiliza p < n procesoare. Presupun^and ca avem o grila,
ecare procesor stocheaza unpbloc (n=pp)  (n=pp) al matricei. Vectorul este
2

distribuit ^n portiuni de n= p elemente ^n ultima coloana. Calculul se face


^n etape. In prima etapap ecare procesor din cea mai din dreapta coloana
expediaza vectorul sau n= p la diagonala. Apoi se efectueaza o difuzare unul-
la-toti pe coloana a acestor n=pp elemente. pIn etapa e treia ecare procesor
efectueaza n =p multiplicari si aduna cele n= p multimi de produse. In nal,
2

ecare procesor are n=pp sume partiale care trebuie cumulate (Figura 3.91).
Un algoritm cu O(n) pasi pe o structura liniara cu n celule este sugerata ^n
Figura 3.92.a; x trece prin matrice ^n directie orizontala, iar a ia linie a lui A
trece prin procesorul al ilea ^ncep^and cu pasul al ilea. Figura 3.92.b sugereaza
o multiplicare pe un inel: x este initial stocat ^n matrice si trece prin matrice
^n directie orizontala, iar linia ia trece prin procesorul al ilea ^ncep^and cu al
ilea element.
In cazul ^n care A este rara, se pune problema care procesor va stoca yi; xi ,
si Ai;j si care procesor calculeaza yi = Pn Ai;j xj . Se utilizeaza de obicei regula
proprietarului un procesor calculeaza yi-ul pe care-l stocheza.
1

Se considera multiplicarea matriceala y = y + Ax si memorie cache:


<cite
ste x(1:n)> ^
n mem.rapida>; <citeste y(1:n) ^n mem.rapid
a>
for i=1:n do <citeste linia i a lui A ^n memoria rapida>
for j=1:n do y[i]:=y[i]+A[i,j]*x[j];<scrie y(1:n) ^n mem.lenta>

310
Figura 3.93: Variante ale multiplicarii matriceale secventiale
Daca m este numarul de referiri la memoria lenta, m = 3n + n . Numarul de
2

operatii aritmetice este f = 2n . Atunci q = f=m  2. Astfel multiplicarea


2

este limitata de viteza memoriei lente.


Produsul matriceal. Date ind doua matrice n  n patratice A si B , se cere
determinarea matricei C = A  B. Presupun^and ca este necesara o unitate de
timp pentru adunare si multiplicare ^ntre scalari, timpul de executie secvential
este Ts = n , indiferent de care varianta (Figura 3.93) din cele 6 posibile se
3

alege pentru variabilele ciclurilor urmatoare:


for _ = 1:n
for _ = 1:n
for _ = 1:n
C[i,j]:=C[i,j]+A[i,k]*B{k,j]
Abordarea PRAM. In cazul unor matrice patratice, se genereaza toate cele
n3 multiplicari simple ^n paralel ^ntr-un timp O(1) utiliz^and n procesoare
3

(necesit^and doar citire concurenta). Rezultatul este produs prin ^nsumarea a


n multimi de grupuri apropiate de n termeni simpli. Timpul necesar aces-
2

tei etape este (1) ^n modelul CRCW cu combinare cu n procesoare, si timp
3

O(log n) ^n modele mai putin puternice (CREW). In modelul CRCW cu com-
binare timpul total este O(1) utiliz^and n procesoare (cost-optimal), iar ^n
3

celelalte modele O(log n) utiliz^and tot n procesoare (cost-ne-optimal). Daca


3

se multiplica matrice de dimensiuni m  n si n  l, sunt necesare ml produse


interne de vectori n-dimensionali. Timpul necesar este dlog ne + 1 utiliz^and
nml procesoare.
Problema din punct de vedere al memoriei cache. Se considera multiplicarea
matriceala C = C + AB:
for i = 1 to n do
<cite
ste linia i a lui A ^n memoria rapida (cache)>
for j = 1 to n do
<cite
ste C[i,j] ^
n cache>; <citeste col.j din B ^n cache>
for k = 1 to n do C[i,j]:=C[i,j]+A[i,k]*B[k,j;
<scrie C[i,j] ^
n memoria lenta>
Numarul de referinte la memoria lenta, m, este n + n citiri (coloanele lui B
3 2

de n ori, si ecare linie a lui A o data pentru ecare i), si 2n citiri si scrieri
2

ale ecarui element din C odata, deci m = n + 3n . Astfel q = f=m =


3 2

(2n )=(n + 3n )  2 pentru n mare (nici o ^mbunatatire fata de multiplicarea


3 3 2

matrice-vector).
Daca multiplicarea are loc pe blocuri, respectiv cele trei matrice A; B; C
sunt constituite din pp sub-blocuri bb (unde b = n=p este marimea blocului):
311
Figura 3.94: (a) Distributie pe blocuri de coloane; (b) Distributie ^n maniera
tablei de sah; (c) Difuzari ^n cazul (b)
for i = 1 to p do
for j = 1 to p do
<cite
ste bloc C[i,j] ^n memoria rapida>
for k = 1 to p
<cite
ste A[i,k] ^
n cache>; <citeste B[k,j] ^n cache>
C[i,j]:=C[i,j]+A[i,k]*B[k,j] //multiplicare pe blocuri
<scrie bloc C[i,j] ^n memoria lent
a>

numarul de referinte la memoria lenta este dat de 2p  n=p  n=p citiri (a ecarui
3

bloc a lui B si a lui A de p ori) si 2n citiri si scrieri a ecarui bloc a lui C odata,
3 2

adica m = (2p + 2)n . Astfel q = f=m = 2n =((2p + 2)n )  n=p = b pentru


2 3 2

n mare. Astfel performanta poate ^mbunatatita prin cresterea dimensiunii


blocului b (mult mai rapid dec^at multiplicarea matrice vector pentru care q =
2). Totusi exista o limitare: toate cele trei blocuri ale lui A; B; C trebuie sa
^ncapa ^n memoria rapida (cache), astfel ^nc^at acestepblocuri nu pot facute
arbitrar de mari, adica 3b  M , astfel ^nc^at q  b  M=3.
2

Produs matriceal pe o grila. Datele celor doua procesoare pot distribuite


pe blocuri de coloane sau ^n maniera tablei de sah (Figura 3.94). In ambele
cazuri se aplica regula proprietarului adica Ci;j = Ci;j + Ai;k Bk;j este executat
de procesorul ce detine Ci;j . In primul caz se observa ca este necesara o difuzare
toti-la-toti a elementelor Ai;k (care este utilizat de toate procesoarele). In al
doilea caz Ai;k este utilizat de procesoarele Pi ; este necesara o difuzare toti-
la-toti pe linie a lui Ai;k : Bk;j este utilizat de procesoarele P;j ; este necesara
difuzarea toti-la-toti pe coloana a lui Bk;j (Figura 3.94.c).
Daca se partitioneaza matricele n  n, A si B, ^n blocurile Ai;j ; Bi;j
(0  pi; j <ppp) de marime n=pp  n=pp ecare si se mapeaz a blocurile pe o
grila p  p cu procesoarele etichetate P ; ; P ; ; : : : ; Ppp ;pp , procesorul
00 01 1 1

312
Figura 3.95: Multiplicarea matrice-matrice ^ ntr-o maniera sistolica: (a) Pe o
grila; (b) Pe un tor
Pi;j are initial Ai;j sp
i Bi;j si va calcula Ci;j . Pi;j necesita toate sub-matricele
Ai;k ; Bk;j (0  k < p). Se efectueaza difuzare toti-la-toti a blocurilor lui A
de-a lungul liniei si a blocurilor lui B de-a lungul coloanei. Se calculeaza Ci;j
^n paralel pe toate procesoarele. Din pacate este necesara o mare capacitate de
stocare, de ordin O(n =pp). Pentru difuzare se trateaza ecare linie/coloana
2

ca un inel;p procesoarele muta datele la vecini ^n paralel ^n ecare pas. Sunt
necesari p pasi; marimeap ecarui mesaj este n =p. Timpul
2
de comunicare
pp multiplic
(linii si coloane) este 2( t p + t 2
npp(n=pp) = n =p. Timpul totalade
=p). Se efectueaz
a ri a sub-
matricelor (n=pp) p(n=pp), adic
s w
a 3 3
rulare
este Tp = n =p +2ts p +2twn =pp. Costul este pTp = n +2tsp = +2tw n pp;
3 2 3 3 2 2

cost-optimalitatea are loc daca p = O(n ). 2

Algoritmul lui Canon. Un algoritm sistolic este schitat ^n Figura 3.95.a.
Liniile lui A,^n cazul din gura, sunt introduse pe verticala ^n matricea sistolica
cu o ^nt^arziere i 1, iar coloanele lui B pe orizontala, cu o ^nt^arziere i
1. Algoritmul are O(n) pasi. In cazul unui tor, liniile lui A sunt transmise
pe verticala ^ntre procesoare, iar coloanele lui B pe orizontala, elimin^andu-se
^nt^arzierile (Figura 3.95.b).
Algoritmul lui Cannon ^n cazul unei distributii ^n maniera tabla de sah,
presupune o distributie initiala a datelor pe grila precum pentru cazul torului
(Figura 3.96). Se "^nclina" A si B prin mutarea diagonalelor lor la marginile de
vest si de nord a torului. La ecare pas, se efectueaza o multiplicare locala, se
deplaseaza A spre vest (orizontal) si B la nord (vertical). Figura 3.97 prezinta
doi pasi ai algoritmului.
Produs matriceal pe o hipercub. Algoritmul Cannon descris pentru grila
este transpus pe un hipercub cu rutarea CT. Costul comunicatiei pentru cele
doua operatii de aliniere este corespunzator la doi pasi de difuzare toti-la-toti
^n grupuri de c^ate pp procesoare si cu pmarimea mesajului de n =pp elemente,
2

adica Tcomm = 2(ts log p + tw (n =p)( p 1)). Apoi sunt necesare pp de-
2

plasari^n faza de calcul si deplasare pentru ambele matrice, ceea ce necesita un
timpp 2(ts + twpn =p)pp. Pentru a obtine Ci;j , sunt pnecesare ppp multiplicari a
2

(n= p)  (n= p) sub-matrice, necesit^and un timp p  (n= p) = n =p. De 3 3

aceea, Tp = n =p + 2(ts log p + tw (n =p)(pp 1)).


3 2

313
Figura 3.96: Agoritmul lui Canon: (a)-(b) Inclinare; (c)-(f) Multiplicari si de-
plasari

3.97: Algoritmul Cannon ^n actiune


Figura

Algoritmul pentru grila este cost-optimal, de aceea nu se poate astepta


un algoritm mai rapid pentru un hipercub din n procesoare. Totusi poate
2

construit un algoritm O(log n) pentru un hipercub cu n procesoare. Nu


3

este la fel de e cient, ^nsa poate utilizat daca exista su ciente procesoare.
Conceptual, procesoarele sunt aranjate ^ntr-o grila tri-dimensionala. Fiecare
dintre cele n multiplicari scalare sunt asignate la un procesor. Se considera ca
3

Pi;j;k calculeaza Ai;k  Bk;j (0  i; j; k < n). Se presupune ca matricea logica
tri-dimensionala este mapata ^ntr-un hipercub cu n = 2 d procesoare (vizua-
3 3

lizat prin n plane a n  n procesoare ecare, ecare plan av^and o valoare k


diferita, precum ^n Figura 3.98). Algoritmul are trei etape: distribuirea 8i; j; k,
314
Figura 3.98: Pa sii de comunicare ^n algoritmul de multiplicare a matricelor
4  4, A si B, pe un hipercub cu 64 procesoare: (a) Distributia initiala a lui
A si B ; (b) Aij este mutat de la Pij la Pijj ; (c) Toate Aij sunt difuzate de-a
0
lungul axei j ; (d) Distributia coerspunzatoare a lui B
a valorilor Ai;k ; Bk;j la un procesor unic din coloana i; j , efectuarea celor n 3

multiplicari simultan, ^nsumarea pe a (i; j )a coloana a produselor. Initial ma-


tricele sunt distribuite de-a lungul a n procesoare ^n planul corespunzator lui
2

k = 0 la baza matricei tri-dimensionale. Procesorul Pi;j; stocheaza Ai;j ; Bi;j .


A (i; j )a coloana va calcula toate produsele care contribuie la Ci;j . Comuni-
0

carea matricei A distribuite se face dupa cum urmeaza: se muta ecare coloana
a lui A astfel ^nc^at ocupa aceeasi pozitie ^n planul k = j , precum cea ocupata
^n planul k = 0 (adica se muta Ai;j de la Pi;j; la Pi;j;j ); se replica apoi toate
coloanele lui A de n ori, ^n planele lor printr-o difuzare unu-la-toti de-a lungul
0

axei j (adica copiaza Ai;j la Pi; ;j ; Pi; ;j ; : : : ; Pi;n ;j ). Comunicarea matricei


B distribuite se face dupa cum urmeaza: Bi;j se muta de la Pi;j; la Pi;j;i ;
0 1 1

apoi se efectueaza o difuzare unu-la-toti a lui Bi;j de-a lungul axei i (adica se
0

copiaza Bi;j la P ;j;i ; P ;j;i ; : : : Pn ;j;i ). In Figura 3.98.c, procesoarele hasurate


stocheaza elemente ale primei linii a lui A, iar cele din Figura 3.98.d elementele
0 1 1

primei coloane a lui B. Valorile Ai;k si Bk;j sunt multiplicate de procesorul
Pi;j;k . Fiecare element al sumei de nitorii a lui Ci;j este comunicat de-a lungul
axei k la procesorul Pi;j; . Procesorul Pi;j; ^nsumeaza rezultatele obtinute de
la procesoarele Pi;j; ; Pi;j; ; : : : Pi;j;n . Operatiile ^n sub-cuburi necesita un
0 0
1 2 1

315
Tabelul 3.10: Numarul de operatii pentru multiplicarea matriceala la descom-
punerea ^n patru submatrice
Algoritm Multiplicari matriceale Adunari matriceale Complexitate
Regulat 8 4 2n + O(n ) 3 2

Strassen 7 18 4:7n : + O(n ) 28 2

timp O(log n), astfel ^nc^at timpul de rulare paralel utiliz^and n procesoare este 3

O(log n).
Algoritmul lui Strassen. Este un algoritm recursiv ce se bazeaza pe posibil-
itatea de descompunere a produsului matriceal astfel:
     C =A B +A B ;
unde CC == AA BB ++ AA BB ;;
11 11 11 12 21
C C11
= A A
12 A A B 11B 12 11 12 12 11 12 12 22
C C B B
C =A B +A B
21 22 21 22 21 22 21 21 11 22 21
22 21 12 22 22

Algoritmul presupune construirea matricelor auxiliare:


P = (A + A )(B + B ); P = (A + A )B ; P = A (B
1 12 22 21 12 2 B );
21 22 11 3 11 12 22

P = A (B
4 22 B ); P = (A
21 11 A )B ; P = (A
5 11 A )(B + B )
12 22 6 21 22 11 12

P = (A A )(B + B )
7 12 22 21 22

C = P +P P +P ; C = P +P ; C = P +P ; C = P +P P +P :
11 1 4 5 7 12 3 5 21 2 5 22 1 3 2 6

Se observa ca o multiplicare matriceala poate i ^nlocuita cu 14 adunari de


matrice (Tabelul 3.10). T (n), costul multiplicarii a n  n matrice cu algoritmul
Strassen satisface ecuatia T (n) = 7T (n=2) + 18(n=2) astfel ^nc^at T (n) = 2

O(n ) = O(n : ) dar necesita mai multa memorie dec^at algoritmul standard
log 7 2 81

(pentru matricele P , ceea ce constituie o limitare: a acestui algoritm). Cel mai


bun algoritm cunoscut este cel pentru care O(n ). 2 376

Puterea unei matrice. Fie A o matrice nn; se doreste calculul lui Ak pentru
un anumit numar natural k. Daca k este o putere a lui 2, acest deziderat poate
realizat prin ridicare la patrat succesiva: se obtine A , apoi A , etc. Dupa log k 2 4

etape, se obtine Ak . Sunt necesare n procesoare si timpul este log k (dlog ne +
3

1). Daca se doreste calculul matricelor A ; : : : ; An, se utilizeaza algoritmul 2

urmator. Prima data se calculeaza A , apoi ^n etapa a doua se calculeaza2

A si A prin multiplicarea matricelor calculate anterior. La ecare etapa k,


3 4

sunt calculate A k 1 ; : : : A k . Dupa log n etape sunt calculate A ; : : : ; An .


2 +1 2 2

Fiecare etapa implica cel mult O(n) multiplicari matriceale simultane care pot
realizate utiliz^and n procesoare ^n timp log n. Timpul total este log n.
4 2

Rezolvarea sistemelor liniare


Se cere rezolvarea sistemului liniar Ax = b cu necunoscuta x. O prima categorie
de metode este constituita din cele care determina inversa matricei A.
316
Sisteme cu matrice inferior triunghiulara. Fie A o matrice patratica
triunghiulara inferiora, adica aij = 0 pentru i < j . Se cere determinarea lui
A . Se considera aii = 1 pentru toate i. Fie A = I L, adica Lij = 0 pentru
1

i  j . Putem veri ca ca Lkij este zero daca i j < k, astfel ^nc^at Ln = 0.
Algoritmul 1. T  in^and seama ca daca A = I L atunci L este strict inferior
triunghiular 
s i se aplica observatia de mai sus, si formula de descompunere a
lui I Ln, rezult^and A = (I + L + L +  + Ln ), care poate calculat ^n
1 2 1

timp O(log n) folosind n procesoare.


2 4

Algoritmul 2. In mod similar algoritmului anterior se obtine A = (I + 1


dlog ne 1
L2
)(I + L dlog ne 2 )    (I + L )(I + L )(I + L) care poate calculat prin
2 4 2

ridicare la patrat succesiva si adunarea matricei identitate la ecare matrice


rezultata si multiplicarea nala ^n paralel. Daca se utilizeaza n procesoare cu 3

timpul O(log n). 2

Daca aii 6= 1 se de neste o matrice diagonala D astfel ^nc^at dii = aii pentru
ecare i. D poate calculat ^ntr-un timp unitate utiliz^and n procesoare. Se
1

observa ca D A este o matrice cu elemente diagonale egale cu unitatea. De


1

aceea prima data se transforma A ^n D A, se inverseaza D A pentru a obtine


1 1

A D, apoi se multiplica la dreapta cu D pentru a obtine A .


1 1 1

Inversarea matricei prin tehnica divide-et-impera. Fie


 
A= A 0 1
A2 A3
unde A este de marime dn=2e  dn=2e, iar A si A sunt matrice inferior
triunghiulare. Atunci
1 1 3

 
A = A 0 1 1
1

A 3 A2 A1 1 A3 1
1

Daca n = 1, se obtine A . Daca n > 1, se partitioneaza A, se inverseaza


1

(recursiv) A si A , apoi se multiplica la st^anga A cu A , si la dreapta


1 3 2
1

A A cu A . Se considera n dimensiunea matricei putere a lui doi; calculul


3
1 1

inversei are log n faze de divizare (jos) si de revenire (sus). Timpul este T (n) =
3 2 1

T (dn=2e) + O(log n) = O(log n). 2

Substitutia paralela regresiva. Se presupune Ax = b unde A este o matrice


inferior triunghiulara. A ia ecuatie este:
ai x + ai x +    + aii xi = bi
1 1 2 2

Algoritmul necesita n procesoare. Se presupune ca la ^nceputul etapei a ia,


sunt disponibile at^at x ; : : : ; xi c^at si expresia aj x +    + aj;i xi pentru
j  i. Atunci al ilea procesor poate evalua xi prin
1 1 1 1 1 1

1
xi = (bi ai xi    ai;j xi )
aii 1 1 1

In nal, ecare procesor j cu j  i +1 evalueaza expresia aj x +   + aj;i xi


(Figura 3.99). Algoritmul se termina la etapa a n-a. Timpul este T (n) = O(n).
1 1 1 1

317
Figura 3.99: Implementarea substitutiei regresive

Figura 3.100: Rezolvarea unui sistem triunghiular pe o matrice liniara: (a)


Dupa primii 3 pasi; (b) Calculul lui x si transferul acestuia
2

Un algoritm pentru o structura liniara cu n celule este urmatorul: celula


1 calculeaza xi la momentul n + i 1, si trimite iesirea la dreapta. Incep^and
cu momentul n + i 1, celula i este hranita cu a ia diagonala a lui a cu 
^ntre elemente. Secventa b ; ; b ; ; : : : provine din celula n. C^and un x; un
b, si un a se ^nt^alnesc ^n celula k  2, ax este scazut din b. C^and un b si un
1 2

a se ^nt^alnesc ^n celula, b se divide cu cu a pentru a deveni x (Figura 3.100).


Cel mai bun algoritm secvential pentru aceasta problema este O(n). Pentru
2

tehnica divide-et-impera, Sp = O(n = log n); Ep = O 1=n log n , pe c^and


2 2 2

pentru tehnica substitutiei regresive Sp = O(n); Ep = O(1).


Inversarea unor matrice inferior triunghiulare. Pentru inversarea unei ma-
trice triunghiulare pe o grila N  N se rezolva sistemele A  x = ei unde ei este
al i-lea vector unitate (Figura 3.101).
318
Figura 3.101: Inversarea unei matrice triunghiulare
Sisteme cu matrice tridiagonala. Se considera sistemul liniar Ax = b
unde A este o matrice n  n tridiagonala, adica ai;j = 0 daca ji j j > 1.
Sistemul are forma:
d x +u x = b
1 1 1 2 1
li xi + di xi + ui xi
1 = bi ; 1 < i < n 1
+1
ln xn + dn xn = bn
1

unde di sunt elementele de pe diagonala, li si di sunt elemente de sub si deasupra
diagonalei.
Algoritmul de reducere par-impar. Algoritmul se aplica c^and di 6= 0 si n
este putere a lui 2. Se observa ca xi = (bi lixi uixi )=di (notata drept
ecuatia Ei ). Inlocuind ^n sistemul initial se obtine
1 +1

 
ui 1 li ui fi+1 lf ui hi+1 li ui
di xi i i 1 xi x =b b b
di 1 di+1 di 1 2
di+1 i+2 i di 1 i 1
di+1 i+1
adica sistemul initial este transformat^ntr-un sistem liniar de dimensiune bn=2c.
Noul sistem este de asemenea tridiagonal. Aceasta implica faptul ca se poate
aplica acelasi algoritm recursiv p^ana c^and avem o singura ecuatie, apoi se
itereaza ^napoi pentru gasirea raspunsului. Figura 3.102.a sugereaza modul de
functionare al algoritmului.
Calculul poate implementat pe un X-arbore (Figura 3.102.b), adica un
arbore binar cu nodurile de la acelasi nivel conectate liniar.
Algoritmul poate aplicat si sistemelor liniare cu matrice bloc-tridiagonale,
^n care xi este un vector de dimensiune k daca li; di si ui sunt matrice de
dimensiune k  k, iar 1=di corespunde inversarii matriceale.
Calcul pre xat. Se considera prin conventie x = 0. Atunci pentru i  1,
1
0
!
xi+1 di =ui li =ui bi =ui ! xi !
xi = 1 0 0 xi 1
1 0 0 1 1
Fie Gi matricea anteriora. Se de neste Hi = Gi Gi    G (se poate aplica un
1 1

319
Figura 3.102: (a) Reducere par-impar pentru un sistem cu n = 8 ecuatii (nu-
merele reprezinta indici de ecuatii); (b) X-arbore
algoritm de reducere). Atunci, pentru toti i  1,
xi+1 ! x1 !
xi = Hi 0
1 1
Astfel se ajunge la o ecuatie Fi de tip xi = ai x + ci. Prin introducerea
lui F ^n E , se obtine x si similar celelalte Introduc^and x ^n Fj ; j  2, se
+1 +1 1

calculeaza xj urile.
2 1 1 1

Descompunere LU. O descompunere LU a unei matrice este o factorizare a


matricei ^ntr-una triunghiular inferioara si una triunghiular superioara. Orice
matrice tridiagonala nesingulara are o descompunere LU de forma:
0
1 10
q u
1
1 0 C 0 C
1 1
Bp B q u
. .
2 2 2
B CB C
B
B .. C
CB
B .. C
C
@ 0 pn 1 A @ 0 qn un A
pn 1
1 1 1
qn
Odata ce A este descompus ^n L si U; Ax = b poate rezolvat ^n doua etape:
se determina y din ecuatia matriceala Ly = b, apoi x din ecuatia matriceala
Ux = y: Se observa ca y = b , si pentru i  2,
1 1
    
yi pi bi yi
1 = 0 1 1 :
1

Fie Gi matricea anterioara si se de neste Hi = Gi Gi : : : G . Atunci


1 1
   
yi = H 0 :
1 i 1

Se utilizeaza calculul pre xat pentru calculul lui y. Calculul lui x se poate face
^n mod similar except^and startul de la xn si revenire.
Procedura secventiala (pe linii) pentru descompunere LU contine ciclul:
320
Figura 3.103: Decompunere LU: (a) Ordinea descompunerii; (b) Descompunere
^n blocuri; (c) Operatii ^n paralel
for k:= 0 to n-1 do {
for j:=k+1 to n-1 do A[k,j]:=A[k,j]/A[k,k]
for i:=k+1 to n-1 do
for j=k+1 to n-1 do A[i,j]:=A[i,j]-A[i,k]*A[k,j]}
Pentru a identi ca concurenta este necesara analiza ordinii transformarilor
(Figura 3.103). In cazul unui program SPMD pentru adresare partajata:
for k:= 0 to n-1 do {
for_all j:= k+1 to n-1 do A[k,j]:= A[k,j] / A[k,k];
BARRIER(bar1, nprocs);
for_all i:= k+1 to n-1 do
for_all j:= k+1 to n-1 do A[i,j]:=A[i,j]-A[i,k]*A[k,j] }
Prin declaratii se poate transmite compilatorul (HPF, Fortran-D, Split-C)
cum se aloca spatiu pentru obiectele globale; compilatorul se va ocupa de
distributia ciclurilor for_all. In cazul unei asignari de blocuri de linii ^n care
mymin si mymax indica prima si ultima linie asignata procesului:
rows:=n/procs; mymin:=pid * rows; mymax:=mymin + rows - 1
for k:=0 to n-1 do {
if (mymin <= k <= mymax) then
for j := k+1 to n-1 do A[k,j]:=A[k,j]/A[k,k]
BARRIER(bar1, nprocs)
for i:=max(k+1,mymin) to mymax do
for j:=k+1 to n-1 do A[i,j]:=A[i,j]-A[i,k]*A[k,j] }
sau utiliz^and steaguri:
rows:=n/procs; mymin:=pid * rows; mymax:=mymin + rows - 1

321
for k:=0 to n-1 do {
if (mymin <= k <= mymax) then for j := k+1 to n-1 do
{ A[k,j]:=A[k,j]/A[k,k]; flag[k]:=1 }
while (flag[ k ] = 0) {}
for i:=max(k+1,mymin) to mymax do
for j:=k+1 to n-1 do A[i,j]:=A[i,j]-A[i,k]*A[k,j] }
In cazul transmiterii de mesaje:
mymin:=pid * nrows; mymax:=mymin + rows 1
for k := 0 to n-1 do {
h:= k mod rows
if (mymin <= k <= mymax) then {
for j:=k+1 to n-1 do myA[h,j]:=myA[h,j ]/myA[h,k];
for p:=pid to nproc-1 do send(&myA[h,0],n*sizeof(double),p)}
if (k <= mymax) then {
receive(rowk, n*sizeof(double), *)
for i:=max(k+1,mymin) to mymax do {
f = mod rows
for j:=k+1 to n-1 do myA[f, j]:=myA[f,j]-myA[f,k]*rowk[j]}}}
La o asignare ciclica a liniilor ^n care myfirst indica prima linie asignata pro-
cesului:
rows := n / nprocs;
for k := 0 to n-1 do {
if (k mod nprocs = pid) then
for j:=k+1 to n-1 do A[k,j]:=A[k,j]/A[k,k]
BARRIER(bar1, nprocs)
for i:= myfirst to n-1 by nprocs do
for j:=k+1 to n-1 do A[i,j]:=A[i,j]-A[i,k]*A[k,j] }
In cazul unei descompuneri pe blocuri precum cea din Figura 3.103.b,^n ecare
pas k, se factorizeaza blocurile diagonale ale lui A, se asteapta la bariera, se
actualizeaza toate blocurile de perimetru ^n coloana k si linia k utiliz^and A,
se asteapta la o noua bariera si ^n nal se actualizeaza blocurile interioare
utiliz^and blocurile perimetru.
Metode directe pentru sisteme liniare. Fie A o matrice n  n densa.
Se cere sa se rezolve Ax = b. Majoritatea metodelor directe transforma A
^ntr-o forma triunghiulara si se aplica unul dintre algoritmii anteriori. Teo-
retic pentru obtinerea unei forme triunghiulare, se multiplica A cu o secventa
M ; : : : ; M K astfel ^nc^at M K M K    M A este triunghiulara:
(1) ( ) ( ) ( 1) (1)

(M K M K    M )A = (M K M K    M )b:
( ) ( 1) (1) ( ) ( 1) (1)

Tabelul 3.11 prezinta limitele numarului de ecuatii de-a lungul ultimilor ani.
Eliminarea gaussiana (GE). Se bazeaza pe descompunerea A = LU . Se
rezolva Ly = b, apoi Ux = y. In cazul serial sunt necesare aproximativ 2n =3 3

operatii pentru factorizare si 2n pentru


2
rezolvarea sistemelor triunghiulare. Pe
scurt, se de neste C = A, si C i = M i    M A. C i are proprietatea
(0) ( ) ( ) (1) ( 1)

322
3.11: Recodurile ^n rezolvarea sistemelor dense
Tabelul
An Dimensiune sistem Masina Nr.proc. G ops Sarcina max.
1950 O(100)
1995 128,600 Intel Paragon 6768 281 ( 338)
1998 148,000 Cray T3E 1488 1127 (1786)
1998 235,000 Intel ASCI Red 9152 1338 (1830)
1999 374,000 SGI ASCI Blue 5040 1608 (2520)

Figura 3.104: GE secvential


ca toate intrarile de sub diagonala a celei de a j a coloane sunt nule pentru
j < i. Se presupune ca Ciii 6= 0. Se poate arata ca Cjii cu j > i este zero si
( 1) ( )

ca pentru j > i; k > i, avem:


Cji(i 1)

Cjki ( )
= Cjki
( 1)
Cik(i 1)

Cii(i 1)

Intrarile ^n C i pot obtinute cu o multiplicare, o ^mpartire si o scadere.


( )

Utiliz^and n procesoare, se pot gasi ntoate intrarile lui C i ^n trei unitati de
2 ( )

timp. Este necesara calcularea lui C , care are aproximativ 3n unitati.


( )

Mai detaliat, algoritmul GE pentru rezolvarea sistemului Ax = b porneste


de la matricea densa A, adauga multiplii ecarei linii la liniile urmatoare pentru
a crea zerouri sub diagonala si pentru a ajunge ^n nal la o matrice superior
triunghiulara U . Apoi se rezolva sistemul liniar prin substitutie ^ncep^and cu
ultima variabila (Figura 3.104). Algoritmul poate descris astfel:
for i = 1 to n-1 do
for j=i+1 to n do
A(j,i)=A(j,i)/A(i,i)
for j=i+1 to n do
for k =i+1 to n do
A(j,k)=A(j,k) - A(j,i) * A(i,k)
Daca Aii este zero algoritmul nu poate progresa. Daca Aii este foarte mic, apar
probleme de instabilitate numerica. Pivotarea partiala presupune reordonarea
liniilor lui A astfel ^nc^at Aii sa e su cient de mare din punct de vedere al
calculelor necesare, la ecare pas al algoritmului. La pasul i al algoritmului
323
Figura 3.105: (a) Eliminarea gaussiana de baza (GE); (b) GE cu distributie
(bloc,*) a lui A
(GEPP) linia i este interschimbata cu linia k > i daca jAki j este cea mai mare
valoare dintre intrarile jA(i : n; i)j. Interschimbarea se face si la elementele
lui b. Algoritmul calculeaza A = P LU , unde P este o matrice de permutare.
Algoritmul secvential cu pivotare poate descris astfel: pentru ecare i; 1 
i < n 1, gaseste indexul ip pentru elementul maximal al coloanei i a lui A,
de sub diagonala, interschimba liniile i si ip ale lui A, ^mparte coloana pivot de
la i + 1 la n cu pivotul, scaleaza si scade coloana pivot din coloanele ramase.
Matricea poate distribuita ^n benzi de coloane. In implementarea paralela
calculul porneste cu procesorul ce detine prima coloana si gaseste elementul
pivot, interschimba linia pivot cu prima linie, divide coloana pilot cu pivotul.
Apoi coloana pivot si numarul liniei pivot sunt difuzate la toate procesoarele.
C^and un procesor receptioneaza un asemenea mesaj,^si interschimba linia pivot
cu prima linie. Apoi ecare procesor scade linia pivot, scalata corespunzator
din toate celelalte coloane ramase (Figura 3.105). Fie numarul de procesoare
egal cu p si indexul de procesor stocat ^n variabila me. Algoritmul paralel poate
descris astfel:
for i = 1,..., n-1 do {
if (i-1 mod p) = me then {
<gaseste indexul ip al elem.maximal de pe coloana i a lui A>
<interschimba linia i cu linia ip a lui A>
<divide coloana pivot de la A[i+1,i] la A[n,i] cu pivotul>
<difuzeaz a col.pivot de la A[i+1,i] la A[N,i] si index pivot>}
else {
receive <coloana pivot  si indexul pivotului>
<interschimba linia i cu linia ip> }
<scaleaza si scade coloana pivot din fiecare coloana ramas
a> }
call <rutina de substituire regresiva>
Daca algoritmul GE ^n varianta de mai sus este implementat pe un hipercub
cu p = n, atunci Tp = 3n(n 1)=2 + ts n log n + tw n(n 1)=2 log n, iar costul
este O(n log n).
3

In cazul distribuirii matricei pe blocuri, submatricele sunt asignate la pro-


cese diferite, iar ecare proces este responsabil pentru actualizarea submatricii
pe care o detine (regula proprietarului).
GE poate implementat si ^ntr-o maniera pipeline (Figura 3.106: regiunile
324
Figura 3.106: GE ^n maniera pipeline: pasii de la 1 la 16

Figura 3.107: (a) GE sistolic pe linie de procesoare; (b) Celula i > 1


hasurate indica procesoarele ocupate) observ^and faptul ca nu este necesara
terminarea iteratiei k ^nainte de startul iteratiei (k + 1). k noi iteratii pot
lansate la ecare 4 pasi. Numarul total de pasi este O(n), iar ecare pas are
O(n) de lucru, astfel ^nc^at timpul paralel este O(n ).
2

Algoritmul poate implementat si ^ntr-o maniera sistolica pe o linie de


procesoare (Figura 3.107). Se realizeaza pivotarea repetata relativ la prima
coloana a matricei. Se hraneste cu vectorul coloana i celula i cu ^nt^arzierea
i 1. Celula 1 gaseste prima intrare nenula ak , si expediaza  = 1=ak
la dreapta. Celula paseaza restul la dreapta. Celelalte celule lasa sa treaca
1 1

semnalele de jos p^ana vad . La receptionarea , memoreaza Æi = ak;i si ^l


scoate, unde ak;i este semnalul pe care l-a receptionat de jos. Paseaza  la
vecinul din dreapta. Din acest moment, pentru ecare j > k, receptioneaza
aj; de la vecinul din st^anga si aj;i de jos ^n acelasi moment. Scoate aj;i Æi aj;
si paseaza aj; la vecinul din dreapta.
1 1

In aceeasi modalitate ca cea descrisa anterior se poate inversa o matrice


1

ne-singulara. Se mai ataseaza n celule suplimentare la dreapta si a (n + i)a


coloana suplimentara este al ilea vector unitate (Figura 3.108).
Metode iterative pentru ecuatii liniare. O metoda iterativa genereaza
secvente de aproximatii la vectorul solutie x. La ecare pas iterativ matricea
325
Figura3.108: Inversarea unei matrice
A sau o matrice ^nrudita este utilizata pentru a efectua ^nmultiri matrice-
vector. Numarul de iteratii este dependent de problema. Convergenta metodei
iterative este o tematica importanta. Nu orice sistem poate rezolvat prin
metode iterative; totusi pentru problemele la care metodele iterative converg,
ele sunt utilizate ind mai putin costisitoare dec^at metodele directe. Pentru o
implementare paralela este su cient a se considera doar un pas iterativ.
Exista mai multe metode iterative care sunt utilizate pentru rezolvarea it-
erativa a sistemelor liniare cu matrice de dimensiuni mari (raspunsul nu este
exact ^nsa sirul de aproximatii converge la solutia exacta): Jacobi (J), re-
laxarii succesive (Successive overrelaxation, SOR), gradientilor conjugati
(Conjugate Gradients, CG), multi-grila (Multigrid), etc. Metodele iterative
sunt des utilizate ^n prelucrarea imaginilor (de exemplu, vectorul x corespunde
unui punct particular din spatiul tri-dimensional).
Daca Ax = b unde A este o matrice n  n, cu aii 6= 0, atunci xi este:
 
xi =
1 X
aij xj bi :
aii j6=i
Algoritmii Jacobi (J), Gauss-Seidel (GS), supra-relaxarii de tip Jacobi (JOR)
si algoritmul relaxarilor succesive (SOR) considera iteratiile
 
(J) xi (t + 1) = 1 X
aij xj (t) bi ;
aii j6=i
 
1
(GS) xi (t + 1) = aii
X X
aij xj (t) + aij xj (t) bi ;
j<i j>i
 
X
(JOR) xi (t + 1) = (1 )xi (t) a x (t) bi ;
aii j6=i ij j
 
X X
(SOR) xi (t + 1) = (1 )xt (t)
aii j<i
aij xj (t) + aij xj (t) bi ;
j>i

326
Figura 3.109: Metode iterative pentru rezolvarea sistemelor liniare: (a)
Convergenta; (b) Divergenta
unde x(t) este estimarea curenta a solutiei, x(t +1) este cea de la pasul urmator,
iar este un factor scalar de relaxare. Algoritmii JOR si SOR sunt des utilizati
pentru ca converg adesea rapid daca este ales convenabil (Figura 3.109).
Se considera metodele Jacobi si JOR candidate pentru implementarea pa-
ralela. Se considera ca sunt disponibile n procesoare si al ilea procesor are
intrarile celei de a ia linie a lui A si b (se asigneaza ecare procesor la un punct
si se utilizeaza algoritmul sincron). Se difuzeaza xj la toate procesoarele. Pen-
tru ecare arhitectura paralela data (de exemplu, structura liniara si hipercub),
putem avea performante diferite.
Pentru metoda GaussSeidel paralela, se asigneaza ecare procesor la doua
puncte. Numai procesoarele vecine trebuie sa comunice. De exemplu:
x (t + 1) =
1 (a ; x (t) + a ; x (t) b )
1
a1;1 12 2 15 5 1

x2 (t + 1) = 1 (a ; x (t + 1) + a ; x (t) + a ; x (t) b2 ):
a;
22
21 1 23 3 26 6

Terminarea algoritmului are loc c^and maxi j(Ax)i bij. Aceasta este o prob-
lema de acumulare la un singur nod (ce poate realizata ^n paralel utiliz^and
un arbore de acoperire cu ecare procesor propag^and spre nodul radacinii cea
mai mare valoare dintre cea detinuta de el si valorile receptionate de la i).
Metode iterative pentru rezolvarea ecuatiilor cu derivate partiale
O serie de sisteme zice sunt modelate prin ecuatii cu derivate partiale. De ex-
emplu, clima poate modelata printr-o functie continua vreme:=[temperatura,
presiune, umiditate, viteza v^ant(3D)]. O stare este un 6-uplu de variabile con-
tinue, ecare depinz^and de 4 parametrii [longitudine, latitudine, elevatie, timp].
Ecuatiile ce guverneaza modelul sunt ecuatii cu derivate partiale (PDE), care
descriu cum cele 6 variabile se schimba ca functii de toate celelalte. Alte ex-
emple mai simple sunt sumarizate ^n Tabelul 3.12.
Transformarea ecuatiilor PDE ^n sisteme liniare prin discretizare.
Se considera ecuatia caldurii. Problema cea mai simpla este urmatoarea: o
bara de material uniform este izolata cu exceptia capetelor (Figura 3.110). Fie
327
Tabelul 3.12: Exemple simple de functii a caror variatie poate edscrisa prin
PDE
Problema Descriere variabile
Fluxul caldurii Temperatura(pozitie,timp)
Difuzie Concentratie(pozitie,timp)
Potential electrostatic sau gravitational Potential(pozitie)
Intensitatea c^ampului electromagnetic C^amp(pozitie,timp)
Scurgerea uidelor Viteza,Presiune,Densitate(poz,timp)
Modelarea semiconductorilor Densitate electroni(pozitie,timp)
Mecanica cuantelor Functia de unda(pozitia,timp)
Elasticitatea Solicitare,Deformatie(pozitie,timp)

3.110: Bara de material uniform


Figura

u(x; t) temperatura la pozitia x ^n momentul t. Caldura transmisa la capetele


barei calatoreste de la x h la x + h cu o rata proportionala cu
du(x; t)
dt
= C (u(x h; t) u(x; t))=h (u(x; t) u(x + h; t))=h
h
C^and h ! 0, se obtine ecuatia caldurii:
du(x; t)
= C d u(x; t)
2

dt dx2
Pentru simplicitate se presupune ca C = 1. Se discretizeaza at^at timpul c^at
si pozitia. Se utilizeaza diferentele nite cu Uij de nind caldura la momentele
tj = j  k (j = 0; 1; 2; : : :) si pozitiile xi = i  h (i = 0; 1; : : : ; n = 1=h). Conditiile
initiale se impun asupra Ui . Conditiile de frontiera se pun asupra U j si Unj .
Formula cu diferente pentru ecuatia uni-dimensionala a caldurii este:
0 0

Ui;m Ui;m Ui ;m 2Ui;m + Ui ;m


+1
k
= 1
h2
+1

Se presupun cunoscute temperaturile pentru toti xi la momentul tm, si se


rezolva ecuatia temperaturii pentru toti xi la urmatorul pas ^n timp tm =
tm + k:
+1

Ui;m = zUi ;m + (1 2z )Ui;m + zUi ;m


+1 1 +1

unde z = k=h . Astfel pentru ecare i = 0; 1; 2; : : : solutia explicita este


2

for m = 1 to final_m
for i = 1 to n-1
U[i,m+1] = z * U[i-1,m] + (1-2*z) * U[i,m] + z * U[i+1,m]

328
Figura 3.111: (a) Discretizarea ecuatie uni-dimensionale a caldurii; (b) Repar-
tizarea punctelor discretizarii pe procesoare ^n paralelizarea solutiei explicite
Solutia explicita este usor de paralelizat (Figura 3.111). Spatiul (x) este
^mpartit ^n p bucati mari; daca numarul de puncte este mare relativ la p se
poate obtine o echilibrare buna a ^ncarcarii. Pentru minimizarea comunicarii
p trebuie sa e c^at mai redus.
Din pacate solutia explicita este instabila pentru pasi mari^n timp (instabil-
itate numerica). Solutia este susceptibila de a exploda daca z = dt=h > 1=2. 2

Pasii ^n timp trebuie sa e astfel foarte mici daca ecuatia se rezolva cu o
acutatete ridicata (adica h este mic).
Solutia implicita necesita rezolvarea unui sistem liniar la ecare pas^n timp.
Discretizarea PDE pentru schema Crank-Nicholson este urmatoarea:
Ui;m Ui;m Ui ;m 2Ui;m + Ui ;m Ui ;m 2Ui;m + Ui ;m
+1
k
= 2h
1
+ 2
+1
2h
1 +1
2
+1 +1 +1

Rezolv^and ecuatia pentru U;m se ajunge la +1

z z z z
2 Ui ;m +(1+ z)Ui;m 2 Ui ;m = 2 Ui ;m +(1 z)Ui;m + 2 Ui ;m
1 +1 +1 +1 +1 1 +1

unde z = k=h , care se poate rescrie sub forma unui sistem liniar cu matrice
2

tridiagonala cu matricele A si b:


0 1
1+z 2
z
0 z 1
z z (1 z )U1;m
+ 2 U2;m
B 2 1+z 2 C z
B C B 2 (U1;m + U3;m ) + (1 z )U2;m C
B .. .. .. C;B .
C
B . . . C @ . A
@ z z A .
2 1+z 2 z
z
1+z 2 (Un 3;m + Un 1;m ) + (1 z )Un 2;m
2

329
Figura 3.112: Ecuat ii caldurii ^n 2D: (a) Grila ^n spatiu (x); (b) Discretizarea
ecuatiei ^n spatiu-timp; (c) Numerotarea punctelor interne
si x = (U ;m ; U ;m ; : : : ; Un ;m ; Un ;m )T . Sistemul poate abreviat
1 +1 2 +1 2 +1 1 +1

(I + z2 T )U ;m = b(m) = (I z2 T )U ;m
: +1 :

unde I este matricea identitate, iar T este matricea simetrica tridiagonala


0 1
2 1
B 1 2 1 C
T =B
B
B . . .
.. .. .. C
C
C
@ 1 2 1A
1 2
Astfel:
for m = 1 to final_m {
b(m) = ( I - (z/2)*T) * U(:,m)
<rezolva ( I+(z/2)*T)*U(:,m+1) = b(m) pentru U(:,m+1)> }
Cazul ecuatiei bidimensionale (ecuatia Poisson) este similar. Necunos-
cutele (Figura 3.112.a) de pe grila spatiala unidimensionala sunt puse ^ntr-o
ordine liniara (Figura 3.112.b). Numai punctele interioare sunt necunoscute.
Matricea T a sistemului liniar obtinut prin discretizare este ^n acest caz
bloc-tridiagonala (Figura 3.113). Pentru rezolvarea sistemului ^n T ^n cazul
bidimensional exista mai multe metode (Tabelul 3.13). LU dens se refera
la eliminarea
p gaussiana. LU banda exploateaza faptul ca T este nenul nu-
mai pe N diagonale. Metoda Jacobi efectueaza multiplicari matrice-vector
cu T ^ntr-un ciclu intern al algoritmului iterativ. La inversarea explicita se
presupune ca se doreste rezolvarea mai multor sisteme cu matrice T , astfel
^nc^at se pre-calculeaza si stocheaza T . Metoda gradientului conjugat uti-
1

lizeaza multiplicarea matrice-vector, precum metoda Jacobi, dar exploateaza


proprietatile matematice ale lui T ceea ce metoda Jacobi nu face. Metoda
SOR pe doua culori este o variatie a metodei Jacobi care exploateaza diferitele
330
Figura 3.113: Problema Poisson discreta pe o grila 4  4

Figura 3.114: Graf si tipar { ecuatia caldurii: (a) 1D; (b) 2D

Tabelul3.13: Metode de rezolvare a ecuatiei Poisson discrete, cu N necunoscute


Algoritm Serial PRAM Memorie Nr.proc.
LU dens N 3
N N 2
N 2

LU banda N 2
N N= 3 2
N
Jacobi N 2
N N N
Inversare explicita N 2
log N N 2
N 2

Gradient conjugat N= 3 2
N =  log N N
1 2
N
SOR cu colorare rosu-negru N = 3 2
N= 1 2
N N
LU rara N = 3 2
N= 1 2
N log N N
FFT N log N log N N N
Multigrila N log N 2
N N
Margine inferioara N log N N N

331
3.115: Descompunere pe un domeniu de tip inel
Figura

proprietati matematice ale lui T (utilizata ^n metoda multigrila). LU rara


este eliminarea gaussiana care exploateaza structura rara a matricei T . FFT
(Fast Fourier Transform) si metoda multigrila lucreaza numai pe matrice
asemanatoare cu T .
Pentru un domeniu regulat se utilizeaza o discretizare pe o grila structurata.
Pentru geometrii mai complicate sunt necesare adesea abordari diferite precum
urmatoarele.
Maparea grilelor simple: C^ateodata se poate lua o grila 2D sau 3D si ^ntinde
sau ^ndoi astfel ^nc^at ram^ane logic un dreptunghi (care este necesar par-
alelizarii), dar zic poate reprezenta o alta regiune. Figura 3.115 prezinta
un exemplu^n care liniile grilei consista din cercuri concentrice si raze (de
fapt o grila dreptunghiulara cu doua laturi opuse unite.
Grile compuse: Mai multe grile simple pot alipite la laturi pentru a crea
regiuni mai complicate precum cele cu mai multe gauri. Intr-o imple-
mentare paralela grilele pot tratate separat.
Grile cu suprapunere: Regiunile iregulate pot compuse din grile regulate care
au suprapuneri ^n apropierea laturilor ^ntr-o maniera iregulata. Algorit-
mii ce utilizeaza asemenea grile necesita interpolarea datelor^ntre diferite
grile, ceea ce reduce gradul de paralelism.
Grile nestructurate: Regiuni complet iregulate pot triangularizate utiliz^and
o varietate de algoritmi din geometria computationala, conduc^and la o
grila nestructurata. Implementarea paralela necesita algoritmi diferiti si
tehnici noi de partitionare.
Grile adaptive: Daca se asteapta ca solutia sa se schimbe rapid ^ntr-o anumita
regiune dar sa ram^ana aproape constanta ^n alta regiune, sunt necesare
mai multe puncte ale grilei ^n regiunea schimbarii rapide si mai putine
^n regiunea ramasa, pentru a nu efectua un lucru suplimentar pentru a
obtine raspunsul cu acuratetea dorita. Ra narea adaptiva a grilei nece-
sita partitionare si balansarea dinamica a ^ncarcarii ^n implementarea
paralela.
Metoda Jacobi. Se considera ecuatia Poisson discreta astfel:
Ui;j = (Ui ;j + Ui ;j + Ui;j + Ui;j + bi;j )=4
1 +1 1 +1

Fie Ui;jm aproximatia lui Ui;j dupa a m-a iteratie. Trebuie data o valoare
( )

initiala pentru Ui;j ; adesea se poate utiliza Ui;j = 0. Pentru a obtine o formula
(0) (0)

pentru Ui;jm ^n termenii iteratiei anterioare Ui;jm , se utilizeaza


( +1) ( )

(m+1)
Ui;j = (Ui(m1);j + Ui(+1
m)
;j + Ui;j 1 + Ui;j +1 + bi;j )=4:
(m) (m)

332
3.116: Cazul n  p
Figura

Cu alte cuvinte Ui;jm este o medie ponderata a celor patru vecini ai sai si
( +1)

bi;j . Convergenta devine mai lenta pentru probleme mari, cu un numar de pasi
proportional cu N = n . 2

Implementarea paralela este directa: se asigneaza puncte ale grilei (i; j ) la


procesoare ^ntr-o maniera bloc, si ecare procesor actualizeaza valorile Ui;jm ( +1)

^n punctele grilei pe care le detine. Aceasta strategie necesita ca valorile U de


pe marginile blocurilor sa e comunicate ^ntre procesoare vecine. C^and n  p,
astfel ^nc^at ecare procesor detine un numar mare n =p de puncte ale grilei
2

(Figura 3.116), cantitatea de date comunicate este relativ mica: n=p cuvinte
pe ecare vecin.
Metoda suprarelaxarii succesive (SOR). Este similara metodei Jacobi
^n sensul ca calculeaza iteratia Ui;jm ca o combinatie liniara de vecinii sai,
( +1)

dar combinatia si ordinea actualizarii este diferita:


( +1) (
;j + Ui ;j + Ui;j
Ui;jm = (Ui ultim 1
)ultim (
+1
ultim
)
+ Ui;jultim + bi;j )=4
(
1
) (
+1())

unde "ultim" este e m e m + 1, depinz^and de care puncte particulare ale


grilei sunt deja actualizate. O prima varianta este urmatoarea
Solve(A) {
int i, j, done:= 0; float diff:= 0,temp
while (not done) do {
diff = 0;
for i:=1 to n do // ciclu asupra punctelor interioare
for j:=1 to n do {
temp:= U[i,j] // salvarea valorii vechi a elementului
U[i,j]:=0.25*(U[i,j]+U[i,j-1]+U[i-1,j]+U[i,j+1]+U[i+1,j])
diff:=diff + abs(A[i,j] - temp) }
if(diff/(n*n) < TOL) then done:= 1; } }
produs pe baza unei ordonari pe linii, ce conduce la algoritmul Gauss-Seidel:
Ui;jm = (Ui m ;j + Ui j (m) + Ui;jm + Ui;jm + bi;j )=4:
( +1) (
1
+1)
+1
( +1)
1
( )
+1

In ordonarea pe doua culori a punctelor (rosu-negru) ideea este aceea de a


actualiza toate punctele de o culoare (negre de exemplu), apoi toate de culoarea
333
cealalta (rosu). Punctele negre ale grilei sunt conectate doar la puncte rosii ale
grilei astfel ^nc^at pot toate actualizate simultan utiliz^and cele mai recente
valori rosii. Apoi valorile rosii pot actualizare utiliz^and cele mai recente
valori negre. Astfel pentru toate punctele (i; j ) negre ale grilei,
Ui;jm = (Ui m ;j + Ui m ;j + Ui;jm + Ui;jm + bi;j )=4;
( +1) (
1
) ( )
+1
( )
1
( )
+1

iar pentru toate punctele (i; j ) rosii ale grilei,


Ui;jm = (Ui m ;j + Ui m ;j + Ui;jm + Ui;jm + bi;j )=4:
( +1) (
1
+1) ( +1)
+1
( +1)
1
( +1)
+1

In implementarea paralela sunt necesari doar doi pasi, unul pentru actualizarea
simultana a punctelor negre, si unul pentru a actualiza punctele rosii.
O ^mbunatatire a convergentei metodei este realizata prin supra-relaxare
succesiv a. Ideea suprarelaxarii este aceea de a utiliza o corectie a mutarii lui
Ui;jm ^n directia data de metoda anterioara, corectie cu un factor w > 1:
( )

(m+1)
Ui;j = Ui;j(m) + w  dir(i; j; m);
unde w este numit factor de supra-relaxare (w < 1 corespunde sub-relaxarii,
care nu este utila). Cuv^antul succesiv se refera la utilizarea ultimelor date
pentru evaluarea corectiei. Algoritmul SOR(w) este descris astfel: pentru toate
punctele (i; j ) negre,
Ui;jm = (1 w)Ui;jm + w(Ui m ;j + Ui m ;j + Ui;jm + Ui;jm + bi;j )=4;
( +1) ( ) (
1
) ( )
+1
( )
1
( )
+1

iar pentru toate punctele (i; j ) rosii ale grilei,


Ui;jm = (1 w)Ui;jm + w(Ui m ;j + Ui m ;j + Ui;jm + Ui;jm + bi;j )=4:
( +1) ( ) (
1
+1) ( +1)
+1
( +1)
1
( +1)
+1

Exemplul 1: problema corzii vibratoare. O corda de lungime L este


xata la ecare capat si i se da initial o deplasare cunoscuta. Se pune pro-
blema care este deplasamentul ^n momente ulterioare de timp. Se introduce
coordonata x astfel ^nc^at la un capat al corzii x = 0, iar la celalalt x = L. Se
noteaza deplasamentul corzii la pozitia x si timpul t cu (x; t): Se cere (x; t):
Matematic problema este descrisa prin ecuatia undei:
1@ @
=0
2 2

c @t
2 2 @ 2x
cu conditiile de frontiera (0; t) = (L; t) = 0 si conditia initiala (x; 0) = u(x)
unde u(x) este o functie cunoscuta descrisa prin deplasamentul initial al corzii.
Problema este rezolvata numeric aproxim^and solutia^ntr-un numar de valori
egal distantate ale lui x (Figura 3.117.a). Se convine ca cele n valori ale lui x la
care dorim aproximarea solutie sa e notate cu x ; x ; : : : xn , unde xi = ix
pentru i = 0; 1; : : : ; n 1, si x = L=(n 1). Se noteaza deplasamentul, (xi ; t),
0 1 1

la pozitia xi si timpul t cu i(t). Se cauta solutia la momentele tj = j t pentru


334
Figura 3.117: Coarda vibratoare: (a) Valori egal distantate; (b) Distributia
datelor

Figura 3.118: Comunicatii ^n rezolvarea problemei corzii vibratoare


j = 0; 1; : : : ; J 1. Date ind aproximatiile la momentele t si t t, solutia la
t + t poate aproximata:
i (t + t) = 2 i (t) i (t t) +  ( i (t) 2 i (t) + i (t))
2
1 +1

unde  = ct=x. Astfel, la un nou pas de timp depinde de valoarea din


aceeasi pozitie la cei doi pasi ^n timp anteriori si de valorile pozitiilor vecine
pentru cel mai recent pas^n timp. Se considera deplasamentul initial sub forma
unei unde sinusoidale, adica u(x) = sin x.
Daca ecare proces este responsabil de un bloc de puncte ale corzii, ecare
proces trebuie sa aproximeze acelasi numar de puncte pentru a asigura o echili-
brare buna a^ncarcarii (Figura 3.117.b). Pentru actulizarea unui punct trebuie
cunoscute valorile lui la punctele vecine, ceea ce se poate realiza prin co-
municare. Fiecare proces trebuie sa comunice valorile ^nainte de efectuarea
actualizarii. Astfel principalele faze ale versiunii paralele a codului sunt:
1. Initializarea distribuirii datelor: gasirea pozitiei ecarui proces pentru
determinarea carui bloc de puncte ^l trateaza. Gasirea numerelor de nod
a proceselor de la st^anga si dreapta.
2. Initializarea matricelor: determinarea numarului de puncte tratat de
ecare proces si indexul primului punct al ecaruia. Setarea matricelor
psi si old_psi.
3. Efectuarea actualizarii (ciclul principal): comunicarea punctelor de capat,
actualizarea locala.
4. A sarea rezultatelor.
Fiecare proces necesita stocarea valorilor punctelor de capat receptionate de la
procesele vecine. Acestea sunt stocate^n doua pozitii suplimentare ale matricei
psi. Faza de actualizare are trei parti principale: comunicarea punctelor de
capat ^ntre vecini, actualizarea locala a punctelor si copierea matricelor pentru
urmatorul pas de actualizare. Prima data toate procesele expediaza valoarea
psi de la capatul st^ang la procesul din st^anga, si receptioneaza date de la
procesul din dreapta, stoc^andu-le ^n matricea psi (Figura 3.118.a). Apoi toate
procesele expediaza valoarea psi de la capatul drept la procesul din dreapta si
receptioneaza date de la procesul din st^anga, stoc^andu-le ^n matricea psi.
Pentru a analiza performanta codului paralel pentru ecuatia undei se anal-
izeaza faza de actualizare, dominanta. Pentru actualizarea ecarui punct
335
Figura 3.119: Forma obiectului conductor din cutie

Figura 3.120: Ecuatia Laplace: (a) Distributia datelor; (b) Schimbul de date
sunt necesare 6 operatii ^n virgula otanta. In codul paralel ecare pro-
ces expediaza si receptioneaza doua numere ^n virgula otanta ^n ecare pas
de actualizare. Ignor^and timpul pentru copierea matricelor old_psi si psi,
acceleratia este S (p) = 6ntcalc=[(6n=p)tcalc + 2tcomm] = p=[1 + =(3g)], unde p
este numarul de proces, n este numarul de puncte, g = n=p este granularitatea,
si  = tcomm=tcalc. E cienta este E (p) = 1=[1 + =(3g)] si supra^ncarcarea
f = =(3g). Cum e cienta depinde numai de g, si este independenta de p,
algoritmul paralel este perfect scalabil.
Exemplul 2: potential electric. Se determina c^ampul electric de-a lungul
unui obiect conductor tinut la un potential electric x ^ntr-o cutie. Precum
problema corzii vibratoare, aceasta problema poate exprimata matematic
printr-o ecuatie cu derivate partiale cunoscuta drept ecuatia Laplace  = 0
unde, ^n cazul bi-dimensional, () = @  =@x + @  =@y cu conditiile de
2 2 2 2

frontiera (0; y) = (L ; y) = 0; (x; 0) = (x; L ) = 0 si (x; y) = 1 pe


S (x; y), unde S (x; y) indica forma obiectului din cutie (Figura 3.119). Problema
1 2

poate rezolvata numeric prin aproximarea solutiei ^n puncte egal departate
dintr-un dreptunghi. Pentru problema corespunzatoare unui patrat L = L =
L, se cauta aproximarea solutiei^n n puncte^ntr-o grila regulata nn. Valorile
1 2
2

x sunt notate x ; x ; : : : ; xn , iar valorile y, y ; y ; : : : ; yn . Se aplica metoda


Jacobi. Pornind de la o aproximat ie initiala, kse ra neaz a aproximatia ^ntr-o
0 1 1 0 1 1

serie de pasi prin ki;j = (ik ;j + ik ;j + i;j


1
4
1
1
1
+1
1
+ i;j
1
k ) unde (x ; y ) la
1
+1 i j
pasul iterativ k este notat cu ki;j . Iteratiile sunt efectuate p^ana la convergenta.
Fiecare proces este responsabil de un bloc de puncte. Fiecare proces tre-
buie sa aiba aproximativ acelasi numar de puncte pentru a asigura o buna
336
echilibrare a ^ncarcarii (Figura 3.120.a). Pentru actualizarea unui punct se
considera media punctelor vecine la iteratia anterioara. Punctele ce se a a
de-a lungul marginii blocului unui proces trebuie comunicate ^ntre procesoare
vecine (Figura 3.120.b). Fazele principale ale versiunii paralele ale codului sunt:
1. Initializarea distributiei datelor: se gaseste pozitia ecarui proces pentru
a determina de care bloc este responsabil si se gasesc numerele de nod a
proceselor de pe directiile st^anga, dreapta, sus si jos.
2. Initializarea matricelor: se determina c^ate puncte sunt tratate de ecare
proces si se seteaza matricele phi si mask.
3. Efectuarea actualizarii (ciclul principal): se copiaza matricea phi ^n ma-
tricea old_phi, se comunica valorile de margine si se efectueaza actu-
alizarea locala.
4. A sarea rezultatelor.
Fiecare proces trebuie sa e capabil sa stocheze valorile de margine receptionate
de la vecinii sai. Aceste valori sunt stocate^n doua linii si doua coloane speciale
ale matricei phi.
Formula de actualizare necesita 4 operatii ^n virgula-mobila per punct al
grilei. Numarul de puncte ale grilei deplasate ^n directiile st^anga/dreapta este
n=p, unde n  n este dimensiunea grilei si p este numarul de procesoare ^n
directia y a grilei de procesoare. Numarul de puncte ale grilei per procesor
deplasate ^n directia sus/jos este n=q, unde q este numarul de procesoare din
directia x a grilei de procesoare. Acceleratia este
S (pq) =
4n tcalc
2
pq
(4n =(pq))tcalc + (2n=q)tshift + (2n=p)tshift = 1 + (q=n)(1 + )=2
2

unde p = q, si  = tshift =tcalc, unde tshift este timpulpuneipcomunicari.


Deoarece pq = qp e cient
2
pa este E (pq) = 1=[1 + (1 + )=(2 )( pq=n ) ] = 2

1=[1 + (1 + )=(2 )(= g)], undep g p= n =pq este granulatia, si


2

supra^ncarcarea este f = (1 + )=(2 )(= g). Cum e cienta depinde numai


de g, si este independenta de n si pq, algoritmul paralel este perfect scalabil.
Exemplu 3: simularea curentilor oceanici. Ecuatiile modelului mate-
matic sunt tot ecuatii cu derivate partiale. Exista mai multe grile (pe nivele
de ad^ancime) si se stabileste o ierarhie ^n setul de lucru. Principiul de divizare
a datelor per procesoare este similar. Daca n=p este mare atunci raportul co-
municare per calcul este mic, si poate exploatata localitatea datelor cu linii
mari de cache. Daca n=p este mic, atunci raportul comunicare per calcul este
mare si localitatea spatiala este slaba.
Se considera expresia (*) de nita la metoda SOR versiune simpli cata a
problemei discretizare a simularii oceanice. Datele necesare metodei Gauss-
Seidel secventiala sunt schitate pentru o grila cu n  n puncte interioare ^n
Figura 3.121.a. O modalitate simpla pentru identi carea concurentei este ana-
liza ciclurilor (analiza dependentelor, Figura 3.121.b); concurenta apare de-a
lungul anti-diagonalelor. Daca se retine structura de ciclu trebuie utilizata sin-
cronizarea (din pacate prea multe operatii de sincronizare sunt necasre. Daca se
restructureaza ciclurile, se poate utiliza o sincronizare globala (se poate ajunge
^nsa la o inechilibrare). Intr-o asemenea situatie se pot exploata cunostiintele
337
Figura 3.121: Metoda Gauss-Seidel: (a) Puncte interioare grilei; (b) Graful de
dependente ale metodei; (c) Ordonare pe doua culori
despre aplicatie. Se poate utiliza o reordonare transversala a grilei, precum
cea din gura Figura 3.121.c. In modelul PRAM codul paralel pentru metoda
Gauss-Seidel este urmatorul:
Solve(A) {
int i, j, done:= 0; float mydiff:= 0, temp
DECOMP_A[BLOCK,*, nprocs]
while (not done) do {
mydiff:= 0
for_all i:= 1 to n do
for_all j:= 1 to n do {
temp:= U[i,j]
U[i,j]:=0.25*(U[i,j]+U[i,j-1]+U[i-1,j]+U[i,j+1]+U[i+1,j])
mydiff:=mydiff+ abs(A[i,j] - temp) }
REDUCE (mydiff, diff, ADD)
if (diff/(n*n) < TOL) then done:= 1 } }
Daca se efectueaza o distribuire a datelor pe grila, gradul de concurenta este
n2 .Daca se efectueaza o distribuire pe linii gradul este n.
3.2.6 Algoritmi diversi
Consideratii asupra interactiunii corpurilor
In problema Barnes-Hut, un numar n de corpuri (celule) interactioneaza pe
baza unor forte (Figura 3.122). Daca dimensiunea problemei n este mare rel-
ativ la numarul de procesoare p majoritatea timpului este petrecut ^n faza de
calculul a fortelor (raport scazut^ntre comunicatii si calcule, o echilibrare buna
a ^ncarcarii). Daca dimensiunea problemei este mica relativ la p, timpul de
constructie a arborelui de distribuire a datelor in uenteaza sensibil e cienta
implementarii. Particulele apropiate ^n spatiu este indicat sa se a e pe acelasi
procesor. Di cultatea consta ^n schimbarea dinamica a pozitiei particulelor
ceea ce poate duce la ne-uniformitate ^n cazul unei distributii statice a par-
ticulelor. Structurile principale de date utilizate sunt ^nregistrarile de corpuri,
de celule si pointeri la ele. Fiecare corp/celula are mai multe c^ampuri: masa,
pozitie, pointeri la alte celule. Pointerii sunt asignati la procesoare. Distributia
2 Rezumat: Aplicatiile stiinti ce ale calculului paralel sunt diverse: de la gra c
a si geome-
trie la zica sau chimie.

338
Figura 3.122: Structura unui algoritm de rezolvare a problemi Barnes-Hut

Figura 3.123: Distributia datelor: (a) Domeniu spatial; (b) Reprezentarea prin
arbori cuadrici; (c) ORB; (d) Zone de coasta
datelor este mult mai di cila dec^at redistribuirea de-a lungul pasilor ^n timp.
Distributia ne-uniforma a datelor poate conduce la ne-echilibrarea lucrului si
comunicarii. Partitionarea trebuie sa e continua pentru localitate. Nu ex-
ista o asignare ideala pentru toate cazurile. De obicei se asigneaza costuri la
particule baz^andu-se pe lucrul pe care-l fac. O abordare a distributiei datelor
se bazeaza pe ORB: se divizeaza recursiv spatiul ^n sub-spatii cu lucru egal; se
introduce un susplus simtitor ^n cazul unui numar mare de procesoare. O alta
abordare pentru distributie este cea a zonelor de coasta (Figura 3.123.d). ORB
este mapat usor ^ntr-un hipercub, iar zonele de coasta pe o structura liniara.
Evaluarea unei integrale
Daca se cere evaluarea unei integrale, de exemplu,
Z bZ d
f (x; y)dxdy;
a c
atunci o modalitate evidenta de a progresa este divizarea domeniului de inte-
grare^n n dreptunghiuri mici, ri ,^n asemenea maniera ^nc^at problema orginala
este ^mpartita ^n subprobleme, prin
Z bZ d XZ Z
f (x; y)dxdy = f (x; y)dxdy:
a c ri ri

339
Calculul reprezentat de ecare termen din dreapta poate realizat pe un pro-
cesor diferit. Dupa ce sunt realizate toate calculele, cele n rezultate trebuie
puse ^mpreuna pentru a forma suma. La acest moment este necesara comuni-
carea. Se poate reduce comunicatia prin reducerea numarului de dreptunghiuri
ce acopera domeniul de integrare, dar se reduce paralelismul ^n calcul. Daca
se ^mparte regiunea de integrare ^n subarii egale ar parea ca toate procesoarele
sunt egal ocupate. Nu este ^n mod necesar astfel. Integrandul poate sa-si
schimbe rapid valoarea ^n anumite regiuni comparate cu altele. Este posibila
ajungerea la o situatie ^n care un procesor efectueaza majoritatea calculului
si toate celelalte sunt neocupate. Pentru a mentine acuratetea este necesara
utilizarea unor pasi mici de integrare^n anumite regiuni fata de altele. Daca se
cunoaste ^n avans acest fapt, se poate efectua divizarea pe subdomenii inegale,
prin utilizarea unei scheme adaptive pentru a ajusta pasul de integrare de-a lun-
gul calculului. Daca se doreste partajarea lucrului, este necesara o comunicare
aditionala pentru a gasi care procesoare pot accepta lucru.
Transformarea Fourier rapida
Transformarea Fourier este o functie continua ^ntre timp si domenii de frecvente
ce se poate exprima prin convolutie cu o multime in nita de fuctii de baza or-
togonale. Este utilizata extensiv ^n procesarea semnalelor si imaginilor precum
si la modelarea interactiunii corpurilor.
Transformarea Fourier discreta (DFT) utilizeaza secvente nite; integrarea
este ^nlocuita cu ^nsumarea, iar coe cientii Fourier utilizati sunt complexik
(marime si faza). Dat un vector x = (x ; : : : ; xn ), se presupune ca n = 2
0 1
si se calculeaza vectorul y = (y ; : : : ; yn ), yk = Pjn xj !njk . Marginea supe-
0 1
1
=0
rioara asupra complexitatii este O(n ). 2

Transformarea Fourier rapida (FFT, Fast Fourier Transform) se refera


la un algoritm rapid pentru calculul DFT ^n O(nlgn) operatii. Se exploateaza
structura speciala de matrice Vandermonde si structura de grup a radancinilor
complexe ale unitatii, adica a numerelor complexe ! care satisfac ! = 1,
respectiv
!nj = ei j=n = cos2 2j + i sin 2j
n n
Pentru evaluarea polinomiala FFT:
n
2X1 nX1 nX1 nX1
yk = xj !2jkn = (x j ! njk +x j
2
2
2
(2j +1)k
2 +1 !2n )= x2j !njk +!2kn x2j+1 !njk
j =0 j =0 j =0 j =0

utiliz^and proprietatea j!nk j = j(!kn) j, formula ce ne sugereaza o posibilitate


2

de recursivitate. Codul FFT recusiv este urmatorul:


2

R_FFT(X[1:2n]) (return Y) {
w := 1; X0:= X[0:2n:2]; X1 := X[1:2n:2]
Y0:= if n = 1 then X0 else R_FFT(X0)
Y1:= if n = 1 then X1 else R_FFT(X1)
for k:= 0 to n-1 do {
Y[k]:=Y0[k]+w*Y1[k]; Y[k+n]:=Y0[k]-w*Y1[k]; w:=w*w2n} }

340
Figura 3.124: Operatii uture

Figura 3.125: Exemplu pentru 8-pt FFT: (a) Pe un hipercub 2D cu mapare


bloc; (b) Pe un hipercub 2D cu mapare ciclica sau pe un hipercub 3-D
Operatiile din ciclul for au structura din Figura 3.124. Dependentele de date
sugereaza un graf de comunicare ^ntre proceselor de calcul de tip uture. Un
asemenea graf poate transpus pe o hipercub (Figura 3.125).
Algoritmi paraleli ^n procesarea imaginilor si ^n geometrie computa-
tionala
Etichetarea componentelor. Data o matrice bi-dimensionala de n pixeli
cu valori 0 sau 1, se cere etichetarea ecarui pixel cu valoare 1 astfel ^nc^at
pixelii conectati sa aiba aceeasi eticheta.
Un algoritm trivial este acela care asigneaza adresa la ecare pixel, apoi
se re-eticheteaza pixelii conectati doi c^ate doi cu cea mai mica eticheta, re-
etichetarea continu^and p^ana c^and nu mai este necesara nici o re-etichetare. Un
asemenea algoritm are O(n) paspi (Figura 3.126.a).
Un algoritm recursiv cu O( n) pasi (Figura 3.126.b) pentru matrice de
pixeli pn  pn unde n este o putere a lui 2 este urmatorul. In faza 1, se
^mparte matricea ^n patru submatrice si se efectueaza etichetarea completa
^n ecare cuadrant prin apeluri recursive. In faza 2, are loc o re-etichetare
prin jonctiunea orizontala a sub-matricelor adiacente. In faza 3, are loc o
re-etichetare prin jonctiunea verticala a sub-matricelor adiacente. Fie T (m)
timpul de rulare a algoritmului pe o matrice m  m si timpul de rulare^n fazele
2 si 3 ca ind c  m. Atunci T (m)  cm + T (m=2), astfel ^nc^at T (n)  2cn.
Re-etichetarea (Figura 3.127) se face dupa cum urmeaza. In cadrul unei
sub-matrice, se sorteaza etichetele ce apar la margine fara multiplicitate. Se
construieste matricea adiacentelor etichetelor si se calculeaza componentele
conectate ale matricei adiacentelor. Se distribuie noile etichete.
Transformarea Hough a matricei de pixeli 0-1. Fie  un unghi =2 <
  =2. Se ^mpart cei n  n pixeli ai unei imagini monocrome ^n benzi
de latime 1-pixel si cu unghiul , cu coltul de jos-st^anga pe frontiera. Pentru
341
3.126: Etichetarea componentelor: (a) Rezultatul unui algoritm^n O(n)
pasi; (b) Un algoritm recursiv ^n O(pn) pasi
Figura

Figura 3.127: Re-etichetare: (a) Initial; (b) Sortat; (c) Numai o componenta;
(d) Re-etichetat

Figura 3.128: Transformarea Hough: (a) Benzi de numarare; (b) Calatoria


contorului
ecare banda se cere numararea pixelilor de 1 a caror centru le apartine (Figura
3.128.a). Cel mult 2n 1 benzi se vor intersecta cu matricea. Se asigneaza un
contor la ecare banda si acesta va calatori de la pixelul cel mai din st^anga la
pixelul cel mai din dreapta a benzii (Figura 3.128.b). C^and se ^nt^alneste un 1,
se incrementeaza contorul. Urmatoarea pozitie posibila poate calculata din
 si locatiile celulei de start si a celulei curente. Timpul de rulare este O(n).
Algoritmul are un paralelism intrinsec.
342
Figura 3.129: (a) Invelitoarea convexa; (b) Utilizarea unghiurilor; (c) Valori r

Figura 3.130: Invelitoarea a m  n pixeli 0-1


Gasirea ^nvelitorii convexe. Fie S o multime de n puncte din plan. Fiecare
punct pi 2 S este o pereche ordonata de coordonate (xi ; yi). Invelitoarea
convexa CH (S ) este cel mai mic poligon convex care contine toate punctele din
S (dat prin v^arfurile sale ^n ordinea ceasului; Figura 3.129.a). Complexitatea
secventiala a acestei probleme este TS (n) = O(n log n).
Un algoritm ce utilizeaza o structura liniara de n elemente este urmatorul.
Se sorteaza (x; y) < (u; v) daca x < u sau x = u si y < v. Fie pi = (xi ; yi )
punctul din a ia celula. Se observa ca p si pn apartin ^nvelitorii convexe. Se
calculeaza punctele^nvelitorii superioare si cele ale^nvelitorii inferioare. Pentru
1

ecare i; j; 1  i < j  n, e i;j unghiul liniei pipj relativ la linia verticala


negativa (Figura 3.129.b). Se de neste r(i) ind k pentru care i;k este cel
mai mare dintre i;j ; i + 1  j  n (Figura 3.129.c). pi este ^n ^nvelitoarea
superioara daca si numai daca x < xi < xn si r(j )  i pentru toate j; 1  j 
i. Algoritmul paralel este urmatorul: se sorteaza punctele utiliz^and sortarea
1

par-impar; pentru ecare i, se calculeaza r(i) cu algoritmul paralel pentru


determinarea maximului si pentru ecare i, se ver ca daca (8j < i)[r(j )  i]
utiliz^and algoritmul paralel pentru determinarea minimului. Timpul este O(n).
Pentru ^nvelitoarea a m  n pixeli 0-1 se face apel la algoritmul anterior.
Pentru ecare coloana se determina 1-ul superior si inferior (Figura 3.130).
Deoarece sunt mai putin de 2n asemenea pixeli, se pun ^ntr-o structura liniara
cu 2n elemente si se utilizeaza algoritmul anterior.
Strategia divide-et-impera poate utilizata ^n rezolvarea problemei.
Aceasta tehnica, familiara calculului secvential, are trei pasi: divizarea pro-
343
Figura 3.131: Determinarea ^ nvelitoarei convexe: (a) Multimea de puncte si
^nvelitoarea; (b) Divizarea^n doua sub-probleme; (c) Solutiile obtinute recursiv;
(d) Modalitatea de combinare a solutiilor
blemei ^n sub-probleme, rezolvarea sub-problemelor recursiv, si combinarea
sub-solutiilor pentru a produce solutia problemei initiale. Primul si al treilea
pas sunt critice. Se presupune ca punctele sunt sortate dupa coordonata x.
Se observa ca p si pn apartin lui CH (S ) prin virtutea sortarii lui S , si ele
partitioneaza ^nvelitoarea convexa ^n ^nvelitoarea superioara UH (S ) si cea in-
1

ferioara LH (S ). Fara a pierde din generalitate se poate considera doar cazul


determinarii lui UH (S ). Problema este divizata ^n sub-probleme precum ^n
Figura 3.131.b, se rezolva sub-problemele recursiv precum sugereaza Figura
3.131.c, si se combina sub-solutiile pentru a produce solutia nala prezentata
^n Figura 3.131.a. Tangenta superioara sau inferiora din Figura 3.131.c poate
obtinuta cu un algoritm secvential O(log n). Pentru varianta paralela este reco-
mandat un PRAM CREW. In acest caz T (n) = T (n=2)+ O(log n) = O(log n), 2

iar W (n) = 2W (n=2) + O(n) = O(n log n); algoritmul este lucru-e cient.
Metoda drumului optic. Razele ce trec prin pixeli ai imaginii sunt nu-
mite raze primare. Un proces recursiv este utilizat pentru a genera razele.
Structuri de date ierarhice tin evidenta primitivelor din scena. Nodurile sunt
celule spatiale, frunzele au liste^nlantuite de primitive. Partitionarea datelor se
poate face printr-o abordare orientata pe scena sau abordarea orientata-raza.
In primul caz se partitioneaza celulele scenei si se proceseaza razele c^and sunt
^ntr-o celula. In cazul al doilea se partitioneaza razele primare. Asignarea di-
namica asigura o echilibrare buna a^ncarcarii. Utilizarea unor blocuri contigue
permite explotarea coerentei spatiale dintre raze vecine si posibilitatea de furt
a sarcinilor (Figura 3.132.b). Se poate utiliza de asemenea asignarea pe placi
cu amestecare.
Evaluarea relatiilor recursive
Are la baza tehnica dublarii recursive sau tehnica reducerii ciclice. Se considera
pentru exempli carea primei tehnici, relatia recursiva xi = axi + bixi ; i 
2, unde valorile x ; ai ; bi sunt cunoscute. Relatia recursiva poate formulata
1 2

vectorial yi = Miyi ; i  2, unde


0
1
   
Mi = a1i b0i ; yi = xxi
i 1

Atunci yn = MnMn    M y , iar produsul matricelor poate calculat ^n


paralel, prin reducere, pe o structura arborescenta tin^and seama ca este o
1 2 1

344
Figura 3.132: Metoda drumului optic: (a) Descompunerea unei raze de la obser-
vator la obiectele din scena (corespunzatoare unui pixel al imaginii); (b) Blocuri
si placi
operatie asociativa. Pentru exempli carea tehnicii reducerii ciclice se considera
relatia recursiva xi = ai +bixi , unde a = x ; ai ; bi sunt cunoscuti. Termenul
xi poate exprimat succesiv ^n functie de xi ; xi ; xi ; xi ; : : :, astfel
1 0 0
1 2 4 8

xi = ai + bi (ai + bi xi ) =: ai + bii xi =
1 1 2
(1) ( )
2

= ai + bi (ai + bi xi ) =: ai +   
(1) (1) (1)
2
(1)
2 4
(2)

Relatiile recursive pentru coe cientii noi sunt:


aip = aip + bip aip p 1 ; bip = bip bip p 1 ; ai = ai ; bi = bi :
( ) ( 1) ( 1) (
2
1) ( ) ( 1) (
2
1) (0) (0)

Atunci xn = ank +bnk xn k ; unde k = dlog ne. Valorile ank ; bnk se pot calcula
( ) ( ) ( ) ( )

printr-un algoritm paralel care exploateaza graful de scurgere a informatiilor.


2

Evaluarea expresiilor aritmetice


Se considera o expresie aritmetica constituita din variabile si operatori de tip
adunare, scadere, ^nmultire si ^mpartire. In procesarea paralela, evaluarea ex-
presiei aritmetice este bazata pe selectarea unei expresii echivalente care poate
efectuata ^ntr-un numar minim de pasi. Doua expresii sunt echivalente daca
este posibila trecerea de la una la alta prin aplicarea unui numar nit de reguli
de comutativitate, ascociativitate si distributivitate. Trecerea de la o expresie
la alta echivalenta estimabila prin mai putini pasi paraleli se realizeaza pe baza
analizei arborelui binar de evaluare: se determina un arbore binar echivalent
care are o ^naltime mai redusa.
Se considera c^ateva exemple. Fie expresia E = a + b + c + defg + hi; daca
^ntr-o unitate de timp se pot efectua mai multe operatii simultan, timpul de
1

calcul poate redus de la 8 unitati la 4 (pe un sistem MIMD). In cazul expresiei


E = (ab+c)d+e, pe un calculator secvential sunt necesare 4 unitati; respect^and
ordinea parantezelor,^n implementarea paralela timpul nu este redus, dar daca
2

se considera expresia echivalenta abd + cd + e, aceasta poate evaluata ^n 3


pasi pe un MIMD si ^n 4 pasi pe un SIMD. Expresia echivalenta optima pe un
sistem paralel poate sa difere de tipul acestuia, precum^n cazul expresiei E 3 =
(((ab) + c)d + e)f + g: expresia echivalenta ((((ab)(df )) + (c(df ))) + ((ef ) + g))
este evaluata pe un MIMD ^n 4 unitati si pe un SIMD ^n 5 unitati, iar pe de
alta parte ((((ab) + c)(df )) + ((ef ) + g)) este evaluata ^n 4 pasi pe un sistem
SIMD.
345
346
4. Programare paralela
4.1 Difererentierea uneltelor existente pentru
programare paralela
Diferentierea se face functie de modalitatea ^n care este exprimat paralelis-
mul, comunicarile, sincronizarea, constructia de structuri de date locale sau
partajate, si modalitatea de optimizare a perfomantei (Figura 4.1).

Figura 4.1: Limbaje de programare paralela


In ultime trei decade au fost produse si experimentate numeroase interfete
de programare. Ratiunea acestei diversitati este aceea, ca ^n absenta unui
standard ecare producator de calculator paralel si-a de nit propria interfata,
inhib^and astfel portabilitatea ^ntre masini diferite (Tabelul 4.1). Numeroase
grupuri de cercetare au ^ncercat sa rezolve problema portabilitatii de nind
interfete de programare independente de arhitectura. Unele dintre acestea sunt
utilizate pe scara larga (cum sunt PVM, P4). In ultima perioada s-a ^ncercat
construirea de standarde (precum MPI pentru transfer de mesaje, HPF pentru
aplicatii de paralelism a datelor sau OpenMP pentru multiprocesare cu memo-
rie partajata) care sa indice cerintele unor asemenea interfete care s-au dovedit
si ele a foarte variate.
O alta directie distincta a constituit-o cea de constructie a unor compila-
toare care sa paralelizeze codurile secventiale existente. Compilatoare comer-
ciale sunt curent disponibile numai pentru masinile cu memorie partajata (de
exemplu pentru Cray, SGI) si exploateaza paralelismul la nivelul ciclurilor nu
si cel functional.
1 Rezumat: In sprijinul programatorului unui sistem cu mai multe procesoare s-au construit
o serie de unelte de o diversitate uneori complesitoare si descurajanta. Exista doua mari
categorii: bibliotecile de functii ce solicita ^ntelegerea concurentei de catre programator si
compilatoarele care depisteaza automat gradul de paralelism ce poate exploatat ^ntr-un
program secvential. Numarul interfetelor de programare este ^nca redus.

346
Tabelul 4.1: Exemple de interfete dedicate arhitecturii
Arhitectura Producator Interfata
Hypercube Caltech Crystalline Operating Sys-
tem CrOS
Computing Surface CS1, Inmos, Meiko Occam, CSP, CSTools
CS2: Transputer
Personal SuperComputer Intel NX
iPSC1, Paragon
Scalable Power SP1, SP2 IBM Extern User Interface (EUI)
MasPar 1, 2 MP1, MP2 MasPar Corporation MasPar Fortran MPF, Mas-
Par Programming Langua-
ge MPL, MasPar Program-
ming Environment MPPE
Connection Machine CM2 Thinking Machine *Lisp, C*, CM Fortran, Pa-
rallel Instruction Set Paris,
CMOST, CMMD, Active
Mess.Layer AML
Programatorii prefera sa nu aiba de a face cu aspectele legate de comuni-
carea inter-procesoare. Ei pot utiliza biblioteci pentru transmiterea de mesaje
care ofera abilitatea de a crea procese pe procesoare, abilitatea de monitor-
izare a starii proceselor create, rutine care permit transferul de mesaje de
la un proces la altul fara ca programatorul sa cunosca modalitatea de re-
alizare a transmisiilor. Utilizarea bibliotecilor pentru schimb de mesaje va
continua sa se dezvolte chiar daca au aparut compilatoare care exploateaza pa-
ralelismul datelor cu ajutorul unui limbaj portabil (precum HPF), deoarece
acestea din urma nu garanteaza performante optimale doar ^ntr-un numar
restr^ans de cazuri. Exista o mare varietate de biblioteci de transfer de
mesaje pe o varietate de arhitecturi. Un programator trebuie sa aleaga ^ntre
ele, desi ele ofera functii similare. Printre pachetele soft existente ^n dome-
niul public se remarca: Chameleon, TCGMSG, P4, PARMACS, PVM, Zipcode.
Printre pachete soft similare dar dedicate unor anumite sisteme de calcul
paralele se remarca: EUI (IBM), NX (Intel), Vertex (nCUBE), Express
(ParaSoft Coporation), CMMD (Thinking Machines). Cele doua bib-
lioteci pentru schimb de mesaje recunoscute international sunt PVM
(Parallel Virtual Machine) si MPI (Message Pasiing Interface).
Se reaminteste fatul ca transferul de mesaje este o metoda pentru comu-
nicarea ^ntre procese c^and acestea nu dispun de memorie comuna. Biblioteca
generica pentru transmiterea de mesaje trebuie sa contina: operatii de identi -
care a proceselor, operatii de transmitere/receptie, rutine de informare, rutine
de sincronizare. Aplicatia este^mpartita ^ntr-un numar de procese si ecare pro-
ces opereaza "independent", de obicei pe procesoare diferite. Logica aplicatiei
este mentinuta prin coordonarea proceselor componente prin schimb de mesaje.
Responsabilitatea mentinerii logicii revine programatorului, nu masinii. De
aceea aceasta forma de programare este di cila. Mesajele sunt pachete de
date ce se misca ^ntre sub-programe. Sistemul de transmitere de mesaje tre-
347
buie sa retina: procesorul emitator, locatia sursei, tipul datei, lungimea datei,
procesorul receptor, locatia destinatie, dimensiunea destinatiei. Comunicarea
punct-la-punct este cea mai simpla forma de transmitere de mesaje: un proce-
sor transmite la altul. Exista diferite tipuri de comunicare punct-la-punct care
trebuie surprinse de o biblioteca pentru transfer de mesaje: transfer sincron
c^and se furnizeaza ^nformatii despre realizarea transmiterii, transfer asincron
c^and cunoaste numai c^and mesajul a fost trimis, operatii cu blocare c^and re-
turnarea din rutina are loc numai c^and operatia a fost terminata, operatii fara
blocare c^and returnarea din rutina se face fara asteptare (permite continuarea
efectuarii altor operatii; ulterior printr-o rutina de testare se poate veri ca ter-
minarea operatiei neblocante), bariere care sunt utilizate pentru sincronizarea
proceselor, difuzare pentru comunicare unu-la-mai-multi, operatii de reducere
pentru combinarea datelor pentru producerea unui singur rezultat.
4.2 Masina paralela virtuala: PVM
PVM este un pachet software care permite unei colectiei de calculatoare seriale,
paralele si vectoriale dintr-o retea sa e gestionate ca o unica resursa de calcul.
De-a lungul anilor au fost dezvoltate o serie de sisteme pentru inter-
conectarea unei multimi de statii de lucru ^n asemenea maniera ^nc^at sa le
permita sa se comporte ca un multiprocesor cu memorie distribuita. Sistemul
cu cel mai mare succes este PVM (Parallel Virtual Machine). PVM a fost
dezvoltat de-a lungul mai multor ani de o serie de persoane din diverse institutii
din SUA care sunt interesate ^n cercetare ^n domeniul calculului distribuit. In-
tentia primara a fost dezvoltarea unei biblioteci pentru transfer de mesaje pen-
tru utilizarea unei retele de statii de lucru care sa se comporte ca un calculator
paralel. Pe l^anga faptul ca acest sistem permite ca statiile sa lucreze^mpreuna,
permite de asemenea ca o statie singulara sa se comporte ca un multiprocesor
^n ceea ce priveste programarea.
4.2.1 Scop si disponibilitate
PVM nu este restrictionat la statii de lucru, ci au fost construite versiuni pentru
masini paralele. Astfel PVM poate servi ca mediu pentru programare paralela
ce^mbunatateste portabilitatea programelor paralele si poate servi ca platforma
pentru un multiprocesor heterogen constituit de exemplu dintr-un Paragon, un
CM-5, si un grup de statii de lucru. Succesul PVM-ului se datoreaza usurintei
^n portare (peste 30 de arhitecturi-calculator) si con gurare a masinii para-
lele virtuale. Este implementat at^at pe multiprocesoare cu memorie distribuita
(T3D, iPSC/860, Paragon, CM-5, SP-2), c^at si cu memorie comuna (Convex/HP,
SGI, Alpha, Sun, KSR, Symmetry). Lista curenta a calculatoarelor pe care este
instalabil PVM contine cel putin sistemele de calcul din Tabelul 4.2. Utiliza-
torul poate descrie o colectie de masini contactabile prin retea care ^mpreuna
vor constitui masina paralela (Figura 4.2.a).
PVM intentioneaza sa prezinte utilizatorului o imagine unica a unei masini
virtuale. Aceasta este compusa din mai multe masini zice. Complexita-
1 Rezumat: PVM este ^n principiu o bibliotec a de functii pentru transfer de mesaje ^ntre
procesoarele unui sistem bazat pe retea de interconectare. Este disponibil at^at pe calculatoare
paralele c^at si pe retele de calculatoare.

348
4.2: Disponibilitate PVM
Tabelul

Retele de calculatoare Calculatoare paralele


803/486 (BSDI, NetBSD, FreeBSD) Alliant FX/8
803/486 (Linux) BBN Butter y TC2000
DEC Alpha(OSF-1), Mips, uVAX Convex C2, CSPP
DG Aviion Cray T-3D, YMP, 2, C90 (Unicos)
HP 68000, PA-Risc Encore Multimax
IBM RS-6000, RT Fujitsu 780 (UXP/M)
Mips IBM Power-4
Intel 80486/Pentium Intel Paragon, iPSC/860, iPSC/2
NeXT Kendall Square
Silicon Graphics Maspar
Sun 3, 4x (SunOS, Solaris) NEC SX-3
Sequent Symmetry
Stardent Titan
Thinking Machines CM-2, CM-5

Figura 4.2: (a) Masina paralela virtuala; (b) Trezirea demonilor


tea tratarilor este ascunsa prin utilizarea bibliotecilor PVM. Prin scrierea de
aplicatii care sa e executate pe o masina virtuala abstracta, utilizatorul este
capabil sa creeze cod rulabil ^ntr-o varietate de medii.
Software-ul si documentatia pot obtinute prin ftp de la netlib.att.com si
netlib2.cs.utk.edu/pvm3 sau de la http://www.netlib.org/ pvm3. Pagina o ciala
a PVM-ului este la http://www.epm.ornl.gov/pvm/pvm home.html.
Din punct de vedere al evolutiei ^n timp, exista mai multe variante ale
PVM-ului. Versiunea 1 a fost scrisa ^n vara lui '89 si a fost utilizat pentru
demonstrarea conceptului de transmitere de mesaje; versiunea nu a fost di-
349
fuzata pentru uz general. Versiunea 2 a fost scrisa ^n martie '91 cu scopul de
a utilizata de HeNCE. Este o versiune stabila si robusta si a fost data pub-
licitatii. Versiunea 3 a fost scrisa ^n septembrie '92 { februarie '93. Aduce
o serie de ^mbunatatiri ^n transmiterea mesajelor si suport pentru simularea
memoriei distribuite sau comune.
Printre bibliotecile stiinti ce construite cu ajutorul PVM-ului se remar-
ca de exemplu, pentru metode directe de rezolvarea a sistemelor liniare,
ScaLapack, http://www.netlib.org/scalapack, sau pentru metode itera-
tive PIM, ftp://unix.hensa.ac.uk/misc/netlib/pim.
Pachete similare cu PVM sunt sistemele portabile pentru transfer de mesaje
precum MPI, P4, Express, PICL, sistemele dedicate NX, CMMD; abordari
diferite se ^nt^alnesc de exemplu la AM sau Linda.
Din punct de vedere al programatorului, pachetul software PVM consista
dintr-o biblioteca de proceduri pentru programe C sau Fortran care suporta
comunicare interprocesoare prin transfer de mesaje si un executabil numit de-
mon. Apelurile utilizatorului la functii din biblioteca presupun transmiterea de
cereri la demonul local (Figura 4.2.b). PVM nu este un limbaj, este un ansam-
blu de utilitare si de biblioteci care ofera programatorului primitivele cu care
poate opera pentru realizarea unui aplicatii multiprocesor. Experienta acumu-
lata cu ajutorul PVM si a unui numar de alte cercetari ^n acelasi domeniu au
condus la crearea unui standard pentru transferul de mesaje cunoscut drept
MPI (Message-Passing Interface), creat de Message Passing Interface
Forum, ce speci ca sintaxa si semantica procedurilor de transfer de masaje
pentru programe C sau Fortran.
PVM a fost construit:
(a) pentru utilizarea statiilor de lucru ale unei retele ^n timpul orelor cu
^ncarcare redusa (SCAN: SuperComputers At Night); PVM poate construi
calculatorul paralel al omului sarac, deoarece se pot obtine performante
bune cu o retea de statii de lucru obisnuite (^n orele de solicitare minima);
(b) pentru utilizarea e cienta a multiprocesoarelor cu memorie distribuita
(exemple: T3D, SP2);
(c) pentru conectarea supercalculatoarelor la reteaua mondiala; poate con-
stitui un metacalculator ce leaga multiple super-calculatoare, permit^and
adaptarea elementelor de calcul la subprobleme si vizualizare;
(d) pentru scopuri pedagogice de formare a conceptului de paralelism; poate
constitui o unealta educationala, ind simplu de instalat, de ^nvatat,
disponibil si modi cabil.
Facilitatile majore oferite de PVM sunt urmatoarele: usor de instalat, usor
de con gurat, utilizatori multiplii pot folosi PVM simultan, usurinta ^n scrierea
programelor, suportat de C si Fortran, pachetul este mic, pot executate
simultan aplicatii multiple de catre un utilizator. Suporta heterogenitatea la
3 nivele: aplicatie, masina, retea. La primul nivel, sub-aplicatiile pot exploata
arhitectura cea mai potrivita pentru aplicatiile lor si este posibila punerea ^n
practica a diferitelor modele de programare. La nivel masina, computere cu
diferite con guratii si sisteme de operare, masini care pot secventiale sau
paralele, pot colabora ^ntr-o singura masina virtuala. In plus, pot utilizate
diferite tipuri de retele (FDDI, Ethernet, Token Ring etc.).
PVM, ca mediu de programare a modelului de transmitere de mesaje,
350
Figura 4.3: Functiile demonului
prezinta urmatoarele facilitati: trateaza mesaje, procese si masini gazda,
topologia de intercomunicare nu este impusa, masina virtuala poate compusa
din diferite tipuri de masini zice, un proces poate activat sau dezactivat ori-
unde^n masina virtuala, orice proces poate comunica cu oricare altul, conversia
de date este tratata de PVM, procesele se pot alatura sau desprinde de grupuri
^n mod dinamic, un proces poate cere noti carea pierderii/c^astigarii resurselor
(PVM trateaza esecurile din retea).
4.2.2 Partile si functionarea sistemului PVM
PVM este constituit dintr-un proces demon numit pvmd, un program consola
pvm, o biblioteca ^n C, libpvm.a, o biblioteca ^n Fortran, libfpvm.a, o biblioteca
libgpvm.a si un demon pvmgs pentru gestiunea grupurilor de procesoare.
Biblioteca de interfata ^n C (libpvm.a) sau Fortran este legata la ecare
componenta a aplicatiilor utilizator ce folosesc PVM. Sunt posibile prin inter-
mediul sau cereri la sistemul PVM directionate spre pvmd.
Demonul pvmd (Figura 4.3) este o interfata ^ntre sarcinile care se executa
pe diferite masini, realiz^and toate functiile de comunicare si control a proce-
selor (server cu mecanism de rutare a mesajelor). Gestioneaza si coordoneaza
ecare masina gazda a masinii virtuale. Exista un demon per utilizator si per
masina. Demonul local este cel care activeaza demonii de pe masinile a ate
la distanta, are puncte de intrare la care procesele pot cere servicii, creaza
procese, colecteaza iesirile standard ale acestora si detecteaza erorile ^n retea.
Consola pvm (Figura 4.4) asigura controlul interactiv al masinii virtuale,
este de tip interpretor si este un proces PVM care poate atasat oricarei
masini gazda.
Protocoalele de comunicatii sub PVM sunt TCP (mod ux; fara limitarea
dimensiunii mesajului, comunicatie securizata) si UDP (mod datagrama; cu
limitarea lungimii mesajului, comunicare nesecurizata, mai rapida de 2  dec^at
TCP). Intre demoni este utilizat UDP, ^ntre procese si demoni TCP, iar ^ntre
procese TCP.
Biblioteca libpvm.a este utilizata de programatorii^n limbajul C. Este com-
pusa din primitive ce permit gestiunea proceselor, comunicatiilor si masinilor.
2 Rezumat: PVM are o bibliotec a de programare pentru interfata cu sistemul multi-
procesoare si c^ateva executabile.

351
Figura 4.4: Programul consol a pentru con gurarea masinii virtuale, comenzile
disponibile si a sarea proceselor ^n executie
Numarul functiilor cod-obiect incluse este de aproximativ 80. Biblioteca
interfetei este legata cu ecare componenta a aplicatiei si detine functii de
compunere, transmitere si receptie a mesajelor. Apelurile de functii din bib-
lioteca se traduc prin cereri catre pvmd si ^nlocuiesc procedurile de comunicatii
dependente de masini. Este compusa din 4 clase de subprograme pentru:
1. gestiunea proceselor si a masinilor: creare/distrugere task-uri, de-
terminare identi catori task-uri, adaugarea/eliminarea masinilor zice,
starea masinilor gazda, start/oprire masina virtuala prin pvm_spawn,
pvm_mytid, pvm_exit, pvm_kill, pvm_addhost, pvm_delhost, pvm_pa-
rent, pvm_pstat, pvm_mstat, pvm_tasks, pvm_config, pvm_tidtohost,
pvm_notify.
2. comunicare punct la punct: transmitere, receptie, difuzare, de-
terminare/setare optiuni prin pvm_send, pvm_pk..., pvm_psend,
pvm_recv, pvm_nrecv, pvm_upk..., pvm_precv, pvm_trecv, pvm_probe,
pvm_getopt, pvm_setopt, pvm_advice.

352
Tabelul 4.3: Optiuni la lansarea pvmd-ului
Optiuni ^n sierul de gazde Valorile implicite
lo= nume login pentru gazda ^n cauza acelasi ca la gazda initiala
so=pw cere parola pentru aceasta gazda aceeasi ca la gazda initiala
dx= locatia pvmd pe gazda $PVM ROOT/lib/pvmd
ep= cale la executabile utilizator ~ /pvm3/bin/$PVM ARCH
wd= directorul de lucru pentru procese $HOME
sp= rata de viteza relativa 1000
bx=locatia depanatorului dorit $PVM ROOT/lib/debugger
so=ms start manual pvmd pe acea gazda [pentru depasire securitate]
3. gestiunea zonelor tampon: creare/distrugere zone tampon, ^mpache-
tare/despachetare date prin pvm_mkbuf, pvm_freebuf, pvm_initsend,
pvm_bufinfo, pvm_getsbuf, pvm_getrbuf, pvm_setsbuf, pvm_setrbuf
4. gestinea erorilor, noti care, functii speciale legate de masinile gazda prin
pvm_catchout, pvm_perror, pvm_serror.
Biblioteca libgpvm.a se refera la aproximativ 10 functii apelabile din pro-
grame C ce permit alaturare/parasire grup, alocare identi catori pentru mem-
brii, difuzare, operatii globale: pvm_joingroup, pvm_lvgroup, pvm_gettid,
pvm_getinst, pvm_gsize, pvm_bcast, pvm_barrier, pvm_scatter,
pvm_gather, pvm_reduce.
Exista trei moduri de start a PVM-ului, prin lansare pvm, xpvm sau pvmd.
C^and PVM este pornit, examineaza masina virtuala ^n care opereaza, si la
cerere creaza un proces demon pe ecare masina. Pe ecare masina zica din
masina virtuala pot rula una sau mai multe aplicatii.
Modalitatea cea mai simpla de a enumera masinile care fac parte din sis-
temul PVM este prin intermeniul unui sier care este citit de PVM. Utiliza-
torul trebuie sa furnizeze: numele masinilor componente, informatii despre cum
PVM poate distribui sarcini, de exemplu daca utilizatorul trebuie sa introduca
manual parola pe anumit calculator, indicatii privind puterea unui calculator
(de exemplu un Cray este mai puternic dec^at un PC):
#Exemplu de fisier de descriere a masinii paralele virtuale
disco.info.uvt.ro
lalescu.info.uvt.ro
pitagora.info.uvt.ro
#Urmatoarea masina necesita introducerea parolei
baboon.info.uvt.ro pw
Posibilele optiuni ale utilizatorului sunt prezentate ^n Tabelul 4.3.
Anumite variabile de mediu trebuie setate: $PVM_ARCH, $PVM_ROOT, etc.
Daca se utilizeaza ^n Unix, interpretorul csh, atunci ^n .cshrc:
setenv PVM ROOT /usr/local/pvm3
Daca se foloseste ksh, ^n .profile:
PVM ROOT=/usr/local/pvm3

353
PVM DPATH=$PVM ROOT/lib/pvmd
export PVM ROOT PVM DPATH

4.2.3 Aplicatii paralele cu ajutorul PVM


Procesele sunt realizate pe masini a ate ^n retea slab cuplate, cu memorie
distribuita, sub control central, asincron, ceea ce impune un mod de progra-
mare prin schimburi de mesaje. Alegerea modelului de programare se face
urm^and diferite criterii: tipul de aplicatii care se programeaza, mediul zic de
care se dispune, obisnuinta programarii. PVM este un mediu pentru transfer
de mesaje care nu forteaza o anumita topologie, permit^and colaborarea ^ntre
masini de tipuri mixte. Procesele pot create si distruse oriunde ^n masina
virtuala (control al proceselor), orice proces poate comunica cu oricare altul
(comunicare), conversia datelor este tratata de PVM, taskurile se pot alatura
sau parasi grupuri la orice moment (grupuri de procese dinamice) si taskurile
pot cere noti carea c^astigarii sau pierderii de resurse (toleranta la esecuri).
Interfata contine peste 80 de functii cu scopuri diferite (Tabelul 4.4).
Tabelul 4.4: Funct ii PVM
Apel PVM Semni catie
pvm consola PVM
pvm addhosts adauga gazde la masina virtuala
pvm addmhf instaleaza functiile pentru handler de mesaj
pvm advise controleaza utilizarea rutarii directe task-la-task
pvm archcode returneaza codul unei nume de arhitectura PVM
pvm barrier blocheaza procesul apelant p^ana c^and toate procesele ^n
grup l-au apelat
pvm bcast difuzeaza data din tamponul de mesaje activ la un grup
pvm bu nfo returneaza informatia despre un tampon de mesaje
pvm catchout obtinerea iesirii unor procese i
pvm con g returneaza informatii despre con guratia curenta a PVM
pvm delete sterge data din baza de date pvmd
pvm delhosts sterge gazde din masina virtuala
pvm delmhf elimina functiile pentru handler de mesaje
pvm exit informeaza pvmd local ca procesul paraseste PVM
pvm export, pvm unexport
indica variabilele de mediu care sunt exportate via spawn
pvm freebuf elibereaza un tampon de mesaje
pvm freecontext elibereaza contextul existent
pvm freezegroup ^ngheata situatia membrilor unui grup si obtine informatii
pvm gather un numar speci cat de membrii din grup receptioneaza
mesaje de la ecare membru al grupului (^ntr-o matrice)
2 Rezumat: Functiile din biblioteca PVM-ului ofera posibilitatea de lansare ^n executie a
unor noi procese, gestiunea acestora, precum si comunicarea ^ntre ele. Modelul de programare
este cel al transferului de mesaje.

354
Tabelul 4.4 (continuare)
Apel PVM Semni catie
pvm getcontext obtine contextul curent
pvm getfds obtine descriptorii de siere utilizati de PVM
pvm getinst returneaza numarul de instanta ^ntr-un grup al unui proces
pvm getmwid, pvm setmwid
obtine sau seteaza identi catorul asteptat al unui mesaj
pvm getopt, pvm setopt
returneaza/seteaza valorile optiunilor libpvm
pvm getrbuf identi catorul tamponului de mesaje activ de receptionare
pvm getsbuf identi catorul tamponului de mesaje activ de expediere
pvm gettid identi catorul procesului identi cat prin grup si nr.instanta
pvm gettmask, pvm settmask
obtine/seteaza o masca de urmarire a procesului/ ilor sai
pvm gsize returneaza numarul de membrii prezenti ^n grupul numit
pvm halt opreste ^ntregul sistem PVM
pvm hostsync obtine timpul pe ceas de la gazda PVM
pvm initsend sterge tamponul implicit de expediere si speci ca codarea
pvm insert stocheaza o data ^n baza de date a pvmd
pvm joingroup ^nroleaza procesul apelant ^ntr-un grup numit
pvm kill termina un proces PVM speci cat
pvm lookup obtine date de la baza de date a pvmd
pvm lvgroup procesul apelant paraseste grupul numit
pvm mcast difuzarea datei din tamponul la o multime de taskuri
pvm mkbuf creeaza un nou bu er de mesaje
pvm mstat returneaza starea unei gazde ^n masina virtuala
pvm mytid returneaza identi catorul procesului apelant
pvm newcontext cere un nou context
pvm notify cere noti carea unui eveniment PVM precum esecul gazdei
pvm nrecv receptionare fara blocare
pvm pack ^mpacheteaza tamponul de mesaje activ cu tip prescris
pvm parent identi catorul procesului care a generat procesul apelant
pvm perror tipareste mesaj de descriere a erorii la un apel PVM
pvm pkmesg, pvm pkmesgbody, pvm upkmesg
^mpacheteaza mesaje ^n alte mesaje
pvm precv receptioneaza un mesaj direct ^ntr-un tampon
pvm probe veri ca daca mesajul a sosit
pvm psend ^mpacheteaza si expediaza data ^ntr-un singur apel
pvm pstat returneaza starea unui proces PVM speci cat
pvm putinfo, pvm recvinfo, pvm getmboxinfo, pvm delinfo
stocheaza si ofera mesaje ^ntr-o cutie postala comuna
pvm recv receptioneaza un mesaj
pvm recvf rede neste functia de comparare pentru acceptarea mesajelor

355
Tabelul 4.4 (continuare)
Apel PVM Semni catie
pvm reduce efectueaza o operatie de reducere pe membrii unui grup
pvm reg hoster ^nregistreaza procesul ca starter sclav PVM
pvm reg rm ^nregistreaza procesul ca manager de resurse PVM
pvm reg tasker ^nregistreaza procesul ca starter task PVM
pvm scatter expediaza la ecare membru al unui grup o matrice de la
un membru speci cat al grupului
pvm send expediaza imediat date ^n tamponul de mesaje activ
pvm sendsig expediaza un mesaj la alt proces PVM
pvm serror seteaza on/o tiparirea automata a mesajelor de eroare
pvm setcontext schimba context
pvm setrbuf comuta tamponul de receptionare activ, salveaza cel anterior
pvm setsbuf comuta tamponul de expediere activ
pvm shmd demon PVM cu memorie partajata
pvm siblings nr. si identi catorii asociati ai proceselor startate ^mpreuna
^ntr-un singur apel spawn
pvm spawn starteaza noi procese PVM
pvm start pvmd starteaza un nou demon PVM
pvm tasks returneaza informatii despre procesele ce ruleaza ^n PVM
pvm tidtohost returneaza gazda unui proces PVM speci cat
pvm trecv receptionare cu timeout
pvm unpack despacheteaza tamponul de mesaje activ ^ntr-o matrice
de tip prescris de date
pvmd, pvmd3 demon PVM
Gestiunea proceselor si a masinilor
Controlul proceselor se realizeaza prin urmatoarele functii: pvm_spawn(file,
argv,flags,where,ntask,tids) ce creaza noi procese, pvm_mytid() ce
identi ca TID-ul procesului si lanseaza procesul ^n cadrul masinii vir-
tuale, pvm_parent() ce identi ca TID-ul procesului care a lansat proce-
sul curent, pvm_exit() ce deconecteaza, de la masina virtuala, procesul
curent, pvm_kill(tid) ce termina un proces PVM altul dec^at cel curent, si
pvm_pstat(tid) ce determina starea unui anumit proces.
Controlul masinii virtuale se realizeaza prin: pvm_addhosts(gazde,numar,
tids) ce adauga masini zice la masina virtuala, pvm_config(nrgazde,
nrarch, gazde) ce ofera informatii asupra con guratiei masinii virtuale,
pvm_delhosts(gazde, numar, rezultate) ce elimina masini gazde din masina
virtuala, pvm_halt() ce opreste toate procesele si demonii, pvm_mstat(gazda)
ce determina starea unei masini gazda, pvm_start_pvmd(argc,argv,block)
ce porneste un nou pvmd principal.
Pentru identi carea procesului-ului, prin analogie cu PID (identi cator de
proces) din sistemul de operare Unix a tuturor proceselor ^n executie, PVM
utilizeaza un cod pe 32 de biti numit TID (Task IDentification). Acest
TID permite adresarea ^ntr-un mod unic la demoni, procese sau la grupuri de
356
Figura4.5: Codi care TID
procese ale unei masini virtuale (Figura 4.5).
Pentru a area TID-ului unui task, PVM ofera o serie de functii. De exemplu
tids si gtid din exemplele urmatoare:
numt=pvm_spawn("a.out", PvmTakDefault,"*",naout,&tids[1]);
gtid=pvm_gettid("grup",inum);
TID-ul este folosit la expedierea de mesaje (de date), de exemplu la
info=pvm_send(tid,mestag);
info=pvm_mcast(tids,naout,mestag);
info=pvm_psend(tid,mestag,buf,len,PVM_FLOAT);
la receptionarea unui mesaj, de exemplu la:
buf=pvm_recv(tid,mestag);
buf=pvm_trecv(tid,mestag,&timeout);
buf=pvm_nrecv(tid,mestag);
info=pvm_precv(tid,mtg,buf,len,PVM_FLOAT,atid,atag,alen);
sau la testarea sosirii unui mesaje, de exemplu la:
buf=pvm_probe(tid,mestag);
Un proces poate a a indenti catorul sau ^n masina paralela prin:
int tid= pvm_mytid(void);
Aceasta linie este de obicei prima ^ntr-un proces care ruleaza sub PVM. Ultima
instructiune din proces trebuie sa e:
int info=pvm_exit(void);
Dupa un asemenea apel, procesul este eliminat din masina virtuala, ^nsa poate
continua executia pe acea masina (de obicei se efectueaza eliberari de memorie).
Crearea altor procese dec^at cel care ruleaza programul curent (Figura 4.6.a)
este realizata prin instructiunea:
357
Figura 4.6: (a) Crearea de procese; (b) Distribuirea proceselor ^n caz de pana
4.5: Optiuni la lansarea de procese
Tabelul

Flag valSemni catie


PvmTaskDefault 0 PVM alege unde vor distribuite procesele (ciclic)
PvmTaskHost 1 argumentul where este numele unei statii (*.* este
cea locala)
PvmTaskArch 2 argumentul where indica un tip particular de arhi-
tectura pe care are loc executia, fara a tine cont de
masina zica
PvmTaskDebug 4 porneste depanatorul, si ruleaza un proces
PvmTaskTrace 8 datele trace vor generate pentru analiza dupa ter-
minarea proceselor
PvmMppFront 16 porneste procesele cu interfata MPP
PvmHostCompl 32 completeaza informatiile despre statiile din where
int numt=pvm_spawn(char *task,char **argv,int flag,
char *where, int ntasks, int *tids);
Parametrii sunt: task, numele programului care se doreste a creat, argv, lista
de parametrii pe care vrem sa-i trimitem acestui program, where, numele statiei
pe care se executa sau sirul vid, ntasks, numarul de programe pe care dorim sa
le creem (cu acelasi nume), tids, spatiu pentru plasarea identi catorilor noilor
procese, flag, modalitatea de tratare a noului proces de catre masina virtuala,
un bit masca care poate pozitionat pe unul din indicatorii din Tabelul 4.5.
Alegerea lui PvmTaskDefault permite o anumita toleranta la cazurile de pana
(Figura 4.6.b).
Pe sistemele care suporta de nitii pentru mediu, spawn paseaza variabilele
selectate din mediul parintelui la procesele i. Daca este setat, PVM_EXPORT
este pasat. De exemplu:
setenv DISPLAY myworkstation:0.0
setenv MYSTERYVAR 13
setenv PVM_EXPORT DISPLAY:MYSTERYVAR
Exemplu. Executabilul numit worker este pornit pe lalescu.info.uvt.ro
358
Figura 4.7: Transfer de mesaje: (a) Intre procese utiliz^
and send-recv; (b) Uti-
liz^and o zona tampon; (c) Transfer sincron { cazul send ^nainte de recv; (d)
Transfer sincron { cazul recv ^nainte de send
(codul asociat ind compilat deja pe respectiva masina):
int worker_tid;
numar=pvm_spawn("worker",(char **)0,PvmTaskHost | PvmTaskDebug,
"lalescu.info.uvt.ro",1,&worker_tid);
Variabila numar este setata pe numarul de procese care au fost create (^n
acest caz 1 ^nseamna succes, 0 eroare). Identi catorul procesului este plasat ^n
worker_tid.
Transferul de mesaje
Odata ce au fost create procese ^n masina virtuala trebuie sa realizam coor-
donarea eforturilor lor pentru a capabile sa pro te de avantajele paralelismu-
lui. Variantele posibile de transmitere a mesajelor sunt prezentate ^n Figura
4.7. In PVM, la transmiterea de mesaje: mesajele sunt copiate ^ntr-o zona
tampon (buffer), transmiterea unui mesaj se face fara blocare, receptia unui
mesaj se face cu blocare, exista posibilitatea de selectare a unui mesaj prin
identi cator si/sau expeditor; ^n modelul asincron, un proces poate veri ca
(pvm_probe) daca a sosit un mesaj, iar ^ntre doua procese mesajele sosesc ^n
ordinea transmiterii lor. Adesea programatorul nu acorda atentie etichetelor
mesajelor astfel^nc^at este posibila receptionare gresita a mesajelor (Figura 4.8).
Transmiterea se face ^n 3 etape: crearea unei zone tampon la procesul sursa
care va detine datele care urmeaza a transmise ^n mesajele ce urmeaza, apoi
plasarea datelor ^n zona tampon si ^n nal initierea unei transmiteri la un grup
bine de nit de procese. Astfel
pvm_initsend(codare);
initializeaza o zona tampon; codare poate lua valorile din Tabelul 4.6; apoi
mesajul este ^mpachetat cu
359
Figura 4.8: Receptionare eronata (a) comportarea dorita (b) o posibila com-
portare
Tabelul 4.6: Modalitatile de ^mpachetare a detelor
Parametru Val. Semni catie
PvmDataDefault 0 date ^n format XDR
PvmDataRaw 1 date fara format XDR
PvmDataInPlace 2 identic PvmDataRaw, dar datele nu sunt copiate ^n
zona tampon
pvm_pk[tip](data,numar,impachet);
si ^n nal pvm_send(dest,eticheta) sau pvm_mcast(dests, contor,
eticheta) trimit zona tampon la alt/alte procese si se returneaza c^and zona
tampon poate stearsa.
Pvmd este cel care se ocupa de transferarea datelor din zona tampon pe
retea. La un moment dat exista o singura zona tampon activa si biblioteca
permite procesului sa schimbe zona activa din cea curenta ^n alta. Functia de
^mpachetare este destul de costisitoare ^n timp pentru ca o parte din memorie
trebuie copiata zic. Poate marita viteza prin descrierea zonei tampon cu
tipul de codare PvmDataInPlace (Figura 4.9). In acest caz, c^and data este
^mpachetata, ^n zona tampon este plasat un pointer pentru indicarea zonei ^n
care data actuala este tinuta. Programatorul trebuie sa e atent sa nu stearga
datele ^nainte de a trimise. PvmDataDefault este o varianta ^nceata, dar
poate mixa arhitecturile; PvmDataRaw este mai rapid ^nsa presupune utilizarea
aceluiasi tip de arhitectura (^n cazul PvmDataInPlace este varianta cea mai
rapida ^n care nu este cerut un tampon).
Pentru crearea unei zone tampon:
int bufid=pvm_mkbuf(int codare);
Parametrul encoding indica viteza de transmitere ca si^n cazul pvm_initsend.
Continutul zonei tampon poate inspectat prin
int info=pvm_bufinfo(int bufid,int *bytes,int *eticheta,int *tid)
A area zonei tampon active se face prin:
int bufid=pvmgetsbuf(void) | pvmgetrbuf(void);

360
Figura 4.9: Modele de formatare

Tabelul 4.7: Functii de ^mpachetare


Functie PVM Tip data
pvm pkbyte(char *cp,.. . ); octet
pvm pkcplx( oat *xp,. . . ); nr. ^n virgula mobila, simpla precizie
pvm pk oat( oat *fp,. . . ); nr. ^n virgula mobila, simpla precizie
pvm packckdcplx(double *zp,. . . ); nr. ^n virgula mobila, dubla precizie
pvm pkdouble(double *dp,. . . ); nr. ^n virgula mobila, dubla precizie
pvm pkint(int *np,.. . ); ^ntreg
pvm pklong(long *np,.. . ); ^ntreg lung
pvm pkshort(short *np,.. . ); ^ntreg scurt
pvm pkstr(char *cp); sir caractere
pvm packf(const char,*fmt,<>) arbitrar
prima varianta pentru expediere, a doua pentru receptionare.
Demonul si biblioteca utilizeaza malloc pentru a obtine spatiu de memo-
rie. Astfel ^n PVM numarul si dimensiunea mesajelor sunt limitate numai de
sistemul de memorie. Exista doua zone tampon active (pentru expediere si
receptie). Pe masinile cu memorie comuna, zona tampon este limitata implicit
la 1Mb. Variabila de mediu SHMBUFFSIZE permite modi carea acestei valori im-
plicite. Pe masinile multiprocesor, limita zonei tampon depinde de arhitectura
(la Paragon, limita este de 64Kb).
Odata ce a fost creata o zona tampon noua si a fost activata sau a fost
initializata zona tampon implicita, preparativele pentru initierea unui transfer
de mesaj sunt terminate. Pentru o plasa o variabila ^n zona tampon se uti-
lizeaza functia de^mpachetare^n zona tampon ce returneaza rezultatul (starea)
^mpachetarii: cu sau fara succes. Functiile de ^mpachetare sunt prezentate ^n
Tabelul 4.7. Parametrii secunzi ai functiilor sunt int nitem, int stride care
permit ^mpachetarea mai multor variabile de acelasi tip.
361
Figura 4.10: Moduri de comunicatie ^n PVM (setare cu pvm setopt)
Mesajul transferat contine un c^amp destinatie care este identi catorul pro-
cesului caruia ^i este destinat mesajul si o eticheta plasata ^n mesaj, cu anu-
mita semni catie pentru aplicatie; aceasta eticheta permite tratarea diferita a
mesajelor. De exemplu, mesajele de avertizare pot avea o eticheta diferita de
eticheta mesajelor de lucru. Instructiunea de expediere a mesajului este:
int info=pvm_send(int tid, int eticheta);
Daca se doreste transmiterea mesajului unei colectii de procese se utilizeaza
urmatoarea:
int info=pvm_mcast(int *tids,int nprocese, int eticheta);
Exemplu:
char *text="Salut"; int contor=3, nou_buffer;
nou_buffer=pvm_mkbuf(PvmDataDefault);
pvm_setsbuf(nou_buffer);
pvm_pkstr(text);
pvm_pkint(&contor,1,0);
pvm_send(1,2);
In mod implicit tranzitul de date se face prin intermediul demonilor.
Aceasta setare implicita poate schimbata (Figura 4.10) prin pvm_setopt
(PvmRoute,PvmRouteDirect). Primul parametru poate avea o valoare indicata
^n PvmRoute, PvmDebugMask, PvmAutoErr, PvmOutPutTid, PvmOutPutCode,
PvmTraceTid, PvmTraceCode, PvmFragSize, PvmRecvTids, iar parametrul se-
cund poate avea una din valorile PvmRoute, PvmDontRoute, PvmAllowDirect,
PvmRouteDirect.
Receptia mesajelor se face ^n 2 pasi: pregatirea zonei tampon pen-
tru receptia mesajului ^mpreuna cu receptia mesajului ^n zona tampon
si despachetarea datelor din mesaj. Astfel pvm_recv(sursa, etiche-
ta)/pvm_nrecv(sursa, eticheta) receptioneaza cu/ fara blocare, apoi
pvm_upk[tip](data, numar, impachet) despacheteaza mesajul ^n variabilele
utilizatorului.
Zona tampon de receptie este construita utiliz^and pvm_mkbuf(...) si este
selectata prin
362
int oldbuf=pvm_setrbuf(int bufid);
Astfel toate mesajele vor receptionate ^n aceasta zona tampon. Modi carea
modalitati ^n care se asteapta receptionarea mesajelor ^n bu er-ul local se face
prin:
int (*old)()=pvmrecvf(int(*new)(int buf,int tid,int eticheta));
Exista 3 moduri de receptionare a mesajului, oricare invoc^and o anumita
eticheta, sau accept^and orice eticheta. In prima varianta procesul asteapta p^ana
c^and mesajul care corespunde conditiilor este primit (receptionare cu blocare).
In a doua varianta procesul receptioneaza mesajul daca a sosit, altfel trece
la executia urmatoarelor instructiuni (receptionare fara blocare); un indicator
este setat pentru a indica succesul sau insuccesul operatiei. In a treia vari-
anta, procesul asteapta receptionarea unui mesaj particular, dar daca acesta
nu soseste ^ntr-o anumita perioada de timp se trece la executia urmatoarelor
operatii (receptionare fara blocare). Pvmd este cel care permite ^nt^arzierea
proceselor care asteapta receptionarea mesajelor.
Receptionarea cu blocare se realizeaza prin
int bufid=pvm_recv(int tid, int eticheta);
Un mesaj particular identi cat prin eticheta este asteptat de la un proces
transmitator particular identi cat prin tid. Pentru receptionarea unui mesaj
cu o eticheta particulara sau de la un proces arbitrar, se utilizeaza valoarea -1.
Mesajul va plasat ^n zona tampon activa de receptie.
Receptionarea fara blocare. Daca dorim receptionarea unui mesaj care a
sosit si nu este asteptat daca nu a sosit, se utilizeaza
int bufid=pvm_precv(int tid, int eticheta);
Daca mesajul a sosit, el se va a a ^n zona activa de receptionare, iar bufid va
indicatorul acestei zone tampon. Altfel, bufid va pus pe 0 si mesajul nu
se va a a ^n zona tampon.
Varianta a treia este realizata prin:
int bufid=pvm_trecv(int tid,int eticheta,struct timeval *timeout)
Daca receptionarea nu a avut succes (a trecut timpul timeout), atunci bu d va
0, altfel efectul este acelasi cu cel al lui pvm recv.
O rutina utila este cea care poate informa procesul daca un mesaj cu o an-
umita eticheta poate receptionat. Testarea aparitiei unui mesaj se realizeaza
astfel cu
int bufid=pvm_probe(int tid, int eticheta);
Daca mesajul nu a sosit, bufid este setat pe 0, altfel este setat cu identi catorul
zonei tampon care receptioneaza mesajul. Mesajul nu este transferat ^n zona
tampon activa de receptie.
Odata ce mesajul a fost receptionat, trebuie despachetat ^n variabilele lo-
cale. Acest lucru este realizat prin functiile unpack, ce corespund ^n numar si
format cu functiile pack (Figura 4.11).
Transmiterea structurii de matrice poate realizata direct (Figura 4.12):
363
Figura 4.11: Impachetare si despachetare

Figura 4.12: Functionarea transmiterii unei matrice de date


int info=pvm_psend(int tid,int etich,void *ce,int cnt,int tip);
int info=pvm_precv(int tid,int etich,void *ce,int cnt,
int *rtid,int *retic,int *rcnt);

Toate mesajele sunt construite initial ^ntr-o zona tampon { aceasta permite
utilizarea XDR ce suporta con guratii heterogene de gazde si mixarea a mai
multor tipuri de date ^ntr-un singur mesaj. Surplusul aditional cauzat de man-
agementul tampoanelor este considerabil. Pentru a rezolva aceasta problema
se pot utiliza variantele pvm_psend/pvm_precv asemanatoare ^n performanta
cu cele oferite de bibliotecile producatorilor de masini paralele.
La nivel de programare, un anumit numar de actiuni pot ^ntreprinse pen-
tru optimizarea comunicatiilor: evitarea sincronizarilor inutile sau costisitoare
(barrier, recv, etc), limitarea utilizarii zonelor tampon (PvmDataInPlace),
transferul volumelor mari de date ^n mod PvmRouteDirect, combinarea
comunicatiilor si calculelor.
Pvmd detecteaza automat pierderile pe retea sau gazde si recon gureaza
masina virtuala. Gazdele care nu comunica cu demonul principal ^n decursul
a 3 minute (setat ^n pvm3/src/ddpro.h), termina automat procesele PVM si
demonul. pvm_trecv este utilizat pentru receptionarea cu expirare de timp.
364
Figura 4.13: Mesaj la/de la o colectie de procesoare (a) broadcast (b) scatter (c)
gather (d) reduce

Noti carea este cea mai buna metoda de utilizat. Procesele care urmeaza a
noti cate apeleaza pvm_notify(ce, tag, contor, tids) si este expediat un
mesaj c^and se ^nt^ampla ce care poate PvmTaskExit, PvmHostDelete, sau
PvmHostAdd. De exemplu:
int tids[2], x, I;
pvm_spawn("myprog",(char **)0, 0, "", 2, tids);
pvm_notify(PvmTaskExit, 666, 2, tids);
for (I=0; I<2;I++){
pvm_recv( -1, 666 );
pvm_unpackf("%d", &x);
printf( "t%x exit\n", x); }
Operatii ^n grupuri dinamice de procese
Principale functii din biblioteca libgpvm.a sunt (Figura 4.13) pvm_barrier
(grup, contor) pentru sincronizarea proceselor din grup, pvm_bcast
(grup eticheta) pentru difuzarea unui mesaj la toate procesele din grup
pvm_scatter (rezultat, data, numar, datatip, eticheta, rootinst,
grup), pvm_gatter (rezultat, data, numar, datatip, eticheta,
rootinst, grup) pentru distribuirea/colectarea matricelor la/de la procesele
din grup, pvm_reduce ((*func)(), data, numar, datatip, eticheta, grup,
rootinst) pentru reducerea matricelor distribuite.
Daca un proces doreste alaturarea la o colectie existenta, poate sa trans-
mita un mesaj procesorului responsabil pentru ^ntretinerea listei de procesoare
din ecare colectie, sau poate transmite mesaje ecarui membru al colectiei in-
dic^and ,,sunt un membru nou". Ambele variante sunt ^ncete si apar di cultati,
de exemplu, la adaugarea simultana a doua procese la acelasi grup. PVM ofera
o abstractizare de grup care trateaza asemenea probleme: un procesor se poate
alatura unui grup ^n orice moment si daca un mesaj este transmis grupului,
365
Figura 4.14: Sincronizare prin bariere (a) asteptare (b) bariera ce utilizeaza un
contor (c) implementarea barierei ^ntr-un sistem cu transmitere de mesaje
atunci el va receptionat de toti membrii grupului. Alaturarea se face prin:
int inum=pvm_joingroup(char *grup);
Se indica numele grupului; daca acesta nu fost desemnat printr-un nume p^ana
^n acest moment, atunci grupul este creat la apelul acestei functii. Parametrul
inum indica numarul procesului^n grup. Parasirea unui grup se realizeaza prin:
int info=pvm_lvgroup(char *grup);
Operatii care pot realizate^ntr-un grup sunt: a area identi catorului unui
proces din grup prin
int tid = pvm_gettid(char *grup, int inum);
unde inum face referire la procesul ce se identi ca, operatia inversa ind
int inum=pvm_getinst(char *grup, int tid);
determinarea numarului de procese dintr-un grup prin
int size=pvm_gsize(char *grup);
si orice proces, membru sau ne-membru al unui grup, poate transmite un mesaj
la toti membrii unui grup:
int info = pvm_bcast(char *grup, int eticheta);
Una dintre cele mai importante probleme care implica crearea grupurilor
este sincronizarea proceselor (Figura 4.14). Barierele sunt functii de blocare ce
actioneaza la nivel de grup. Trecerea la urmatoarele instructiuni este posibila
daca un anumit numar de procese a atins bariera. Oprirea la o bariera:
366
int info=pvm_barrier(char *grup, int contor);
unde contor indica numarul de membrii care trebuie atins ^nainte de trecerea
la urmatoarele instructiuni. Este posibil ca procese distincte sa astepte ca un
numar de alte procese sa atinga bariera, un numar distinct de cel indicat ^n
alte procese. Procesul care apeleaza functia se numara ^n cadrul lui contor.
Reducerea globala presupune existenta unor date particulare la un numar
de procese care trebuie prelucrate pentru a determina o unica valoare stocata
la un anumit proces. Reducerea globala poate realizata cu ajutorul PVM-
ului astfel. Procesele care contin date care vor prelucrate formeaza un grup.
Toate procesele apeleaza pvm reduce; aceasta functie speci ca locatia datelor,
numarul de date locale, tipul datelor si functia care urmeaza a efectuata,
precum si numarul de instanta ^n cadrul grupului a procesului care va detine
rezultatul. Apelul functiei este:
int info = pvm_reduce(void (*func)(), void *data, int contor,
int tipdata, int eticheta, char *grup, int root);
unde func este functia care va opera asupra datelor, data este un pointer
la adresa de ^nceput a unei matrici de valori, tipdata daca data este o
matrice, atunci se speci ca un nume de nit, eticheta cea care va trans-
misa procesului radacina care detine rezultatul nal, grup este numele
grupului, root este numarul de instanta al procesului care va primi data
nala. Operatia care se executa corespunde unei subrutine prede nite
(PvmSum, PvmMax, PvmMin, PvmProd) sau de nite de utilizator.
Exemplu. O colectie de procese efectueaza minimizarea functiei pe anumite
arii a parametrilor functiei. Se cere determinarea minimului din setul de minime
a ate si transmiterea rezultatului procesului principal. PVM ofera o functie de
minimizare care poate utilizata ^n pvm reduce. Daca presupunem ca ecare
proces are urmatoarea declaratie de variabila: float minimax[No] si ecare
proces determina instanta procesului principal ^n grup:
parent_tid=pvm_parent();
root=pvm_getinst(GRUP,parent_tid);
atunci aplicam
info=pvm_reduce(PvmMin,minimax,No,PVM_FLOAT,1,GRUP,root)
si matricea minimax a procesului radacina va contine^ntr-o prima faza minimele
locale determinate de proces, iar dupa pvm_reduce, minimele globale. Operatie
de reducere se efectueaza pe elemente corespunzatoare ^n indice ale datelor
locale (Figura 4.15.a). Pentru a evita situatii de eroare c^and unul din procese
iese din grup^nainte ca procesul radacina sa apeleze pvm_reduce, se utilizeaza
bariere. Operatiile pvm_scatter si pvm_gather sunt asemanatoare operatiei
de reducere (Figura 4.15.b).
Exemple
Exemplul 1. Construim o aplicatie ^n C constituita din doua procese: progra-
mul principal hello.c creaza programul secundar h2.c si asteapta un mesaj
de la acesta:
367
Figura 4.15: (a) Reducerea pe elemente; (b) Operatiile scatter si gather

Figura 4.16: (a) Modelul MPMD; (b) Modelul SPMD; (c) Programul SPMD
de determinare identi catori
/* programul hello.c */ /* programul h.c */
#include <stdio.h> #include <stdio.h>
#include "pvm3.h" main() {
main() { int ptid; char b[100];
int t,c; char buf[100]; ptid=pvm_parent();
printf("Eu sunt t%d\n",pvm_mytid());strcpy(buf,"hello, de la ");
pvm_spawn("h",(char**)0,0,"",1,&t); gethostname(b+strlen(b),64);
pvm_recv(-1,-1); pvm_initsend(PvmDataDefault);
pvm_bufinfo(c,(int*)0,(int*)0,&t); pvm_pkstr(buf);
pvm_upkstr(buf); pvm_send(ptid,1);
printf("De la t%d: %s\n",tid,buf); pvm_exit();
pvm_exit(); exit(0);
exit(0); } }
Acesta este un exemplu pentru modelul MPMD (Multiple Programs Multiple
Data) de programare suportat de PVM (Figura 4.16.a).
Exemplu 2: un program SPMD. Modelul SPMD (Figura 4.16.b; Single
Program Multiple Data) are urmatoarele caracteristici: acelasi program se
deruleaza pe toate procesoarele, datele sunt repartizate pe toate procesoarele,
iar daca un procesor are nevoie de o data pe care nu o detine, atunci trebuie
sa o ceara celui care o are. Se cere un program de identi care a proceselor ce
sunt lansate (Figura 4.16.c).
#define NRPROCS 3

368
#define TIDTAG 1
#define IPROCTAG 2
#include <stdio.h>
#include <sys/types.h>
#include "pvm3.h"
main() {
int eutid; int tids[NPROCS]; int i,iproc,numt;
eutid=pvm_mytid(); /*care este TID-ul meu?*/
if (pvm_parent()<0) { /*sunt primul proces?*/
numt=pvm_spawn("spmd",(char**)0,0,"",NPROCS-1,&tids[1]);
tids[0]=eutid;
if(numt!=NPROCS-1) exit(1);
pvm_initsend(PvmDataDefault);
pvm_pkint(&tids[1],NPROCS-1,1);
pvm_mcast(&tids[1],NPROCS-1,TIDTAG);
for(i=1; i<NRPROCS; i++) {
pvm_recv(tids[i],IPROCTAG);
pvm_upkint(&iproc,1,1)
printf("eu sunt procesul %d\n",iproc);} }
else { /*sunt proces sclav*/
pvm_recv(-1,TIDTAG);
pvm_upkint(&tids[1],NPROCS-1,1);
for(i=1;i<NPROCS;i++) if(eutid==tids[i]) iproc=i;
pvm_initsend(PvmDataDefault);
pvm_pkint(&iproc,1,1);
pvm_send(tids[0],IPROCTAG); }
pvm_exit(); } /*ie
sire din PVM*/
Exemplul 3: calculul valorii  . Se calculeaza  prin aproximarea unei inte-
grale prin metoda dreptunghiurilor:
Z 1
f (x)dx =
Xn Z i=n
f (x)dx 
1X n
f ((i 1=2)=n)
0 i=1 i
( =n
1) n i=1
cu f (x) = 4=(1 + x ). Programul secvential este urmatorul:
2

#include <stdlib.h>
#include <stdio.h>
main(int argc, char **argv) {
register double width, sum; register int intervals, i;
intervals = atoi(argv[1]); /* numarul de intervale */
width = 1.0 / intervals;
sum = 0;
for (i=0; i<intervals; ++i) { /* aproximarea integralei */
register double x = (i + 0.5) * width;
sum += 4.0 / (1.0 + x * x); }
sum *= width;
printf("Estimarea lui pi este %f\n", sum);
return(0); }

369
Utilizam PVM pentru calcul unor sume partiale ^n procese independente:
#include <stdlib.h>
#include <stdio.h>
#include <pvm3.h>
#define NPROC 4
main(int argc, char **argv) {
register double lsum,width; register int intervals,i;
int mytid, iproc, msgtag = 4; int tids[NPROC]; double sum;
mytid = pvm_mytid(); /* ^nregistreaza proces ^n PVM */
iproc = pvm_joingroup("pi"); /* alaturarea la grup*/
if (iproc == 0) { /* daca proces 0 atunci creaza procese*/
tids[0] = pvm_mytid();
pvm_spawn("pvm_pi", &argv[1], 0, NULL, NPROC-1,&tids[1]); }
pvm_barrier("pi", NPROC); /* asteapta la bariera */
intervals = atoi(argv[1]); /* obtine numarul de intervale*/
width = 1.0 / intervals;
lsum = 0.0;
for (i = iproc; i<intervals; i+=NPROC) { /* sume partiale*/
register double x = (i + 0.5) * width;
lsum += 4.0 / (1.0 + x * x); }
sum = lsum * width; /* ^
nsumeaza rezultatele partiale*/
pvm_reduce(PvmSum, &sum, 1, PVM_DOUBLE, msgtag, "pi", 0);
if (iproc == 0) { /* procesul 0 tipareste rezultat*/
printf("Estimation of pi is %f\n", sum); }
pvm_barrier("pi", NPROC); /* verifica terminare program*/
pvm_lvgroup("pi"); /* parasire grup */
pvm_exit();
return(0); }
Functiile PVM din acest program sunt
mytid = pvm_mytid();
iproc = pvm_joingroup("pi");
pvm_spawn("pvm_pi", &argv[1], 0, NULL, NPROC-1, &tids[1]);
pvm_barrier("pi", NPROC);
pvm_reduce(PvmSum, &sum, 1, PVM_DOUBLE, msgtag, "pi", 0);
pvm_lvgroup("pi");
pvm_exit();
Exemplul 4: multiplicare matrice-vector. Datele si organizarea aplicatiei
(^n Fortran) sunt sugerate prin Figura 4.17.a.
program mv
implicit none
include 'fpvm2.h'
integer lmax, cmax, eutid
parameter(lmax=50, cmax=50)
real a(lmax,cmax), b(cmax), c(lmax), temp
integer i, j, k, linii, col, bufid, stid, stag, slen, nsend

370
Figura 4.17: (a) Multiplicare matrice-vector;
parameter DATAFLAG, RESTAG, NPROCSMAX
parameter (DATAFLAG = 0, RESTAG = 1, NPROCSMAX = 11)
integer nprocs, info, numt, tids(0:NPROCSMAX-1)
call pvmfmytid(eutid)
call pvmfparent(tids(0))
if (tids(0).lt.0) then
tids(0)=eutid
read(*,*) nprocs
call pvmfspawn('mv',PVMTASKDEFAULT,'*',nprocs-1,tids(1),numt)
linii=nprocs-1;
coloane=nprocs-1;
k=0
do j=1,col
b(j)=1.
do i=1, linii
k=k+1
a(i,j)=float(k)
enddo
enddo
call pvmfinitsend(PVMDATARAW,bufid)
call pvmfpack(INTEGER4,linii,1,1,info)
call pvmfpack(INTEGER4,col,1,1,info)
call pvmfpack(INTEGER4,nprocs,1,1,info)
call pvmfpack(INTEGER4,tids(0),nprocs,1,info)
call pvmfpack(REAL4,b,col,1,info)
call pvmfmcast(nprocs-1,tids(1),DATATAG,info)
do i=1, linii
call pvmfinitsend(PVMDATARAW,bufid)
call pvmfpack(REAL4, a(i,1), col, lmax,info)
call pvmfsend(tids(i),DATATAG,info)
enddo
do i=1, linii
call pvmfprecv(tids(i),RESTAG,c(i),1,REAL4,stid,stag,slen,info)
enddo
printf('10(1x,f6.1))',(c(i),i=1,linii)
else

371
call pvmfrecv(-1,DATAFLAG,bufid)
call pvmfunpack(INTEGER4,linii,1,1,info)
call pvmfunpack(INTEGER4,col,1,1,info)
call pvmfunpack(INTEGER4,nprocs,1,1,info)
call pvmfunpack(INTEGER4,tids(0),nprocs,1,info)
call pvmfunpack(REAL4,b,col,1,info)
call pvmfprecv(tids(0),DATAFLAG,c,col,REAL4,stid,stag,slen,info)
temp=0.
do j=1, col
temp=temp+c(j)*b(j)
enddo
call pvmfpsend(tids(0),RESTAG,temp,1,REAL4,info)
endif
call pvmfexit(info)
end
Exemplul 5: calculul normei unui vector. Se creaza un grup de procesoare
si se utilizeaza functia pvm_reduce (Figura 4.17.b).
program norma
implicit none
include 'fpvm3.h'
integer n1, nc, i, j, k, root, NPROCSMAX, DATAFLAG, SUMTAG
integer bufid, info, nprocs, iproc, eutid
parameter (n1=10, nc=10, root=0)
parameter (NPROCSMAX=10, DATAFLAG=0, SUMTAG=1)
integer tids(0:NPROCSMAX-1), stid, stag, slen, numt
real e(n1,nc,norm2)
external PVMSUM
call pvmfmytid(eutid)
call pvmfjointgroup('NORME',iproc)
if (iproc .eq. 0) then
tids(0)=eutid
read(*,*) nprocs
call pvmfspawn('nrg',PVMTASKDEFAULT,'*',nprocs-1, tids(1),numt)
call pvmfinitsend(PVMDATARAW,bufid)
call pvmfpack(INTEGER4,nprocs,1,1,info)
call pvmfmcast(nprocs-1,tids(1),DATAFLAG,info)
endif
if(iproc .ne. 0)
call pvmfprecv(-1,DATATAG,nprocs,1,INTEGER4,stid,stag,slen,info)
call pvmfbarrier('NORME',nprocs,info)
k=iproc
do j=1,nc
do i=1,nl
k=k+1
e(i,j)=float(k)
enddo
enddo

372
norm2=0
do j=2,nc-1
do i=2,nl-1
norm2=norm2 +e(i,j)*e(i,j)
enddo
enddo
call pvmfreduce(PVMSUM,norm2,1,REAL4,SUMTAG,'NORME',root,info)
if(iproc .eq. rootinst) then
norm2=sqrt(norm2)/(nprocs*nl*nc)
print('(25x,' 'Norma = ' ',f8.2)'),norm2)
endif
call pvmfbarrier('NORME',nprocs,info)
call pvmflvgroup('NORME',info)
call pvmfexit(info)
end

4.2.4 Medii de programare


Mediile de programare paralela contin cel putin un depanator (debugger), un
evaluator pas cu pas (tracer), sau un analizor de performanta. XPVM poate
considerat un mediu de programare pentru PVM. Se bazeaza pe X-Windows, Tcl
si Tk. XPVM este o interfata gra ca pentru PVM ce ofera monotorizare gra ca
^n timp real pentru: vizualizarea con guratiei masinii virtuale si a activitatii
^n cadrul acesteia, gra ce spatiu-timp a starii proceselor, gra ce de utilizare a
procesoarelor gazda, pentru depanare indica ultimele apeluri^n libpvm efectuate
de ecare task, scrie siere urma (trace) ce pot utilizate pentru analiza post-
mortem a proceselor.
Hence bazat tot pe PVM este un mediu complet, gra c si interactiv, intrarea
ind un graf de construire a proceselor ce functioneaza ^n paralel, detecteaza
automat crearea si activitatea executabilelor pe diferite noduri. ParaGraph
poate efectua analiza post-mortem a executiei programelor PVM; permite
reprezentarea procesoarelor, a comunicatiilor si a sierului urma (pentru re-
capitulare, medii si extreme). Alte medii pentru analiza performantelor, ^n
domeniul public, sunt UpShot, TeeShot, Pablo, iar la constructori (adaptate la
arhitectura) sunt Intel { ParAide, XIPD, SPV , Xprof Cray cu depanator To-
talView, analizor de performante MPP Apprentice.

4.3 Standardul interfetelor pentru transfer de


mesaje: MPI
MPI este o speci care de biblioteca de transfer de mesaje. Este construit pentru
a permite dezvoltarea de biblioteci de software paralel. MPI a fost construit cu
o participare larga: din partea producatorilor de arhitecturi paralele, IBM, Intel,
TMC, Meiko, Cray, Convex, Ncube si din partea producatorilor de biblioteci,
PVM, p4, Zipcode, TCGMSG, Chameleon, Express, Linda.
2 Rezumat:C^ateva interfete de programare care au fost construite pe baza PVM.
3 Rezumat:MPI este un standard ^n dezvoltare pentru transferul de mesaje. Precum
PVM-ul, implemetarile curente sunt concretizate ^n biblioteci de functii.

373
Scopul initial al Forumului MPI a fost dezvoltarea unui standard extensibil,
e cient, portabil, practic si larg rasp^andit pentru transfer de mesaje. Mai pre-
cis, s-a dorit constructia unei interfete de programare care poate utilizata ^n
proiecte de dezvoltare de software la nivele variate, de la aplicatii ale utilizato-
rilor la biblioteci optimizate si sisteme de compilatoare ce exploateaza parale-
lismul ^n date. Implementarile sunt e ciente; de exemplu este posibila evitarea
copierii repetate a unui volum de date, suprapunerea comunicarii si a calculelor.
Interfata nu este diferita de cele construite ^nainte, precum NX, PARMACS,
PVM, P4 etc, astfel ^nc^at interfata poate implementata pe diferite platforme
arhitecturale cu schimbari minore ^n comunicatii si sistemul software. Permite
implementarea ^n medii heterogene si legare cu C si Fortran, desi semantica
limbajului este independenta de limbaj. Scopul interfetei este ^ndeplinirea si-
multana a acestor conditii, pe c^and generatiile anterioare de asemenea sisteme,
precum PVM au optat pentru portabilitate de-a lungul unor sisteme heterogene
cu performante mai putin dec^at cele optimale.
MPI-1 ^ncorporeaza notiunea de grup de procese si ^ncapsuleaza domenii de
comunicare numiti comunicatori (introdusi prima data ^n interfata Zipcode).
Grupul de procese poate avea o structura topologica foarte similara cu su-
portul topologie din PARMACS. MPI-1 este indicat pentru utilizare ^n stilul
MPMD (Multiple Program, Multiple Data) ^n care ecare proces urmeaza
o executie distincta pe baza codului sau propriu. Pot scrise si programe
^n stilul SPMD (Single Program, Multiple Data), ^n care toate procesele
urmeaza o executie distincta a aceluiasi program. Interfata este construita si
pentru suportul threadurilor. MPI-1 ofera ofera numeroase facilitati pentru a
mari performanta pe calculatoare paralele scalabile. Pe de alta parte imple-
mentari MPI-1 pe baza de protocoale de comunicare^ntre procesoare cu sistem
Unix standard ofera portabilitate de la statii de lucru la calculatoare paralele.
MPI si PVM au fost construite pentru diferite scopuri. PVM a fost initial
construit pentru statii de lucru (NOW) si adreseaza teme precum heterogenei-
tatea, toleranta la esecuri, interoperabilitate si management de resurse, iar
capabilitatile sale de transfer de mesaje nu sunt foarte so sticate. Designul
MPI-1 s-a concentrat asupra atingerii unei performante ^nalte pe arhitecturi
paralele omogene str^ans cuplate. Una dintre principalele forte ale PVM-ului
este capabilitatea de management a resurselor { multe dintre acestea au fost in-
corporate^n MPI-2. Aspectele transferului de mesaje^n PVM au fost^nghetate
dupa versiunea 3.4, si proiectul PVM s-a rami cat ^n mai multe proiecte de
cercetare bazate pe PVM, precum CUMULVS si HARNESS care se concen-
treaza asupra mediilor distribuite si heterogene pentru NOW. MPI este mai
complex dec^at PVM (^n transferul de mesaje), ^nsa este mai putin exibil.
Standardul MPI include comunicare punct-la-punct, operatii colective,
grupuri de procese, contexte de comunicare, topologii de procese, managemen-
tul mediului si interfete pentru realizarea pro lului aplicatiilor. Standardul nu
include operatii explicite pe memorie partajata, operatii care necesita suport al
sistemului de operare (precum executie la distanta, mesaje active, receptionari
bazate pe ^ntreruperi), unelte de constructie a programelor, facilitati de de-
panare, suport explicit pentru threaduri, suport pentru management de sarcini
si functii de I/O. Principalele lipse ale MPI-ului sunt mecanismul de creare a
proceselor (exista un numar x de procese de la startul la sf^arsitul unei aplicatii)
374
Tabelul 4.8: Principalele functii ^nt^alnite ^ntr-un program MPI (sintaxa C)
Descriere Format
Fisier de de nitii #include <mpi.h>
Format functie MPI eroare=MPI_xxxxx(parametru, ...)
Initializarea MPI int MPI_Init(int *argc, char ***argv)
Identi carea proceselor diferite MPI_Comm_rank(MPI_Comm comm, int *rank)
Nr.procese ^ntr-un comunicator MPI_Comm_size(MPI_Comm comm, int *size)
Iesire din MPI int MPI_Finalize()

si lipsa memoriei partajate virtuala.


Implementarile MPI curente sunt urmatoarele. Implementari ale pro-
ducatorilor de arhitecturi paralele sunt cele ale IBM Research (MPI-F), Intel SSD,
Cray Research, Meiko, SGI Kendall Square Research, NEC, Fujitsu, Convex Hughes
Aircraft. Implementari portabile sunt cele produse de Argonne-Mississippi State
(MPICH), Ohio supercomputer Center (LAM), University of Edinburgh, Technical
University of Munich, University of Illinois. Alte grupuri de interes ce folosesc
MPI sunt: Sun, Hewlett-Packard, Myricom, PALLAS, Sandia National Laboratory
(Intel Paragon ce ruleaza SunMOS).
MPICH este o implementare portabila disponibila pe Internet (via ftp de la
info.mcs.anl.gov ^n directorul pub/mpi/mpich sierul mpich.*.tar.Z, cu manual
si surse). Ruleaza pe multiprocesoare precum: IBM SP1 si SP2, Intel IPSC860
si Paragon, TMC CM-5, SGI, Meiko CS-2, NCube, KSR, Sequent Symmetry, pe
statii de lucru cu sistem de operare Sun, Dec, HP, SGI, Linux, FreeBSD, NetBSD,
WinNT. Include biblioteci pentru masurarea timpului, evenimente, animarea
programelor. Include program de vizualizare a sierelor urma a sesiunilor de
lucru si biblioteci gra ce.
LAM este o alta implementare disponibila via ftp de la tbag.osc.edu ^n
directorul pub/lam, iar versiunea CHIMP version of MPI este disponibila via
ftp de la ftp.epcc.ed.ac.uk ^n directorul pub/chimp/release.
Programare cu MPI
MPI are peste 125 de functii, numarul acestora ne ind^n mod necesar o masura
a complexitatii. Majoritatea programelor paralele pot scrise cu numai 6
functii de baza (Tabelul 4.8). Astfel nu este necesara cunoasterea tuturor
functiilor pentru utilizare (valabil si la PVM).
Cel mai simplu exemplu de program MPI ^n C (cu utilizarea functiilor pe
comunicatori) este urmatorul:
#include "mpi.h"
void main(int argc,char *argv[]) {
int me, size;
MPI_Init( &argc, &argv);
MPI_Comm_rank( MPI_COMM_WORLD, &me);
MPI_Comm_size( MPI_COMM_WORLD, &size);
printf("Proces %d din %d procese\n", me, size);
MPI_Finalize(); }

375
Tabelul 4.9: Moduri de comunicare (cu blocare/fara blocare)
Mod expeditor Apel MPI Observatii
Sincrona MPI_Ssend/MPI_Issend se termina numai c^and a pornit receive
Cu tampon MPI_Bsend/MPI_Ibsend se termina imediat (daca nu apare o
eroare), independent de receptor
Standard MPI_Send/MPI_Isend e sincrona, e pe baza de tampon
Pregatita MPI_Rsend/MPI_Irsend se termina imediat (daca nu apare o
eroare), independent de receptionarea
mesajului
(Receptare) (MPI_Recv/MPI_Irecv) (terminata c^and soseste mesajul)
care nu face altceva dec^at tipareste un mesaj (de catre ecare proces) cu iden-
ti catorul si dimensiunea comunicatorului. Intructiunile dintre MPI_Init si
MPI_Finalize sunt operate independent si terminarea lor este independenta
de actiunea altor procese^ntr-un program MPI. In majoritatea implementarilor,
numarul de procese curent din MPI_COMM_WORLD este speci cat pe linia de co-
manda a executabilului.
Tipurile de date de baza utilizate sunt MPI_CHAR, MPI_INT, MPI_FLOAT,
MPI_PACKED etc. MPI gestioneaza memoria sistemului care este utilizata pentru
tampoane de mesaje si stocarea reprezentarilor interne ale obiectelor MPI pre-
cum grupuri, comunicatori, tipuri de date, etc. Aceasta memorie nu este direct
accesibila utilizatorului, iar obiectele stocate ^n ea sunt opace, adica marimea
si forma nu sunt vizibile utilizatorului. Un obiect opac este accesibil via un
handler (m^anuitor) care exista ^n spatiul utilizator si participa ^n atribuiri
si comparari. Procedurile MPI care opereaza pe obiecte opace au argumente
handleri pentru accesul acestor obiecte. Un handler constant prede nit este
MPI_COMM_WORLD care este un handler la un obiect care reprezinta toate proce-
sele disponibile la timpul startului si permite comunicarea cu oricare dintre ele.
Obiectele opace accesate de handleri constanti sunt de nite si nu-si schimba
valoarea ^ntre initializarea MPI (apel MPI_Init()) si terminarea MPI (apel
MPI_Finalize()).
Comunicare punct-la-punct. Un proces sursa expediaza un mesaj la un
proces destinatie, iar comunicarea are loc^n interiorul unui comunicator. Proce-
sul destinatie este identi cat prin rangul sau ^n comunicator. Un mesaj contine
un numar de elemente dintr-un tip de data particular. Modurile de comunicare
posibile sunt prezentate ^n Tabelul 4.9.
Intr-o operatie cu blocare, la returnare din procedura utilizatorul poate re-
folosi resursele speci cate ^n apel. In cazul unei operatii fara blocare, controlul
poate returnat din procedura ^nainte ca operatia sa e terminata si ^nainte
ca utilizatorului sa-i e permisa refolosirea resurselor (precum tampoane) spec-
i cate ^n apel. O operatie este colectiva daca toate procesele dintr-un grup de
procese trebuie sa invoce procedura.
De exemplu, expedierea sincrona a unui mesaj este urmatoarea:
int MPI_Ssend(void *buf, int count, MPI_Datatype datatype,
int dest, int tag, MPI_Comm comm)

376
iar la receptionare:
int MPI_Recv(void *buf, int count, MPI_Datatype datatype,
int source, int tag, MPI_Comm comm, MPI_Status *status)
Procesul expeditor speci ca modul sincron, iar ambele procese asteapta p^ana
c^and tranzactia este completata. Pentru ca o comunicatie sa aiba succes, ex-
peditorul trebuie sa speci ce un rang al destinatiei valid. De asemenea re-
ceptorul trebuie sa speci ce un rang valid al sursei, iar comunicatorul si tipul
mesajului trebuie sa e aceleasi. Zona tampon a receptorului trebuie sa e
su cient de mare pentru a cuprinde corpul mesajului. Receptorul poate uti-
liza sabloane; astfel pentru a receptiona de la orice sursa, MPI_ANY_SOURCE
(similar cu -1 la PVM), iar pentru a receptiona orice tag, MPI_ANY_TAG. Sursa
actuala si eticheta sunt returnate ^n parametru de stare al receptorului. Or-
dinea mesajelor este pastrata la transfer (valabil si pentru modul ne-sincron).
In cazul ^n care se foloseste MPI_Bsend, utilizatorul poate speci ca un tampon
de mesaje prin
int MPI_Buffer_attach(void* buffer,int size);
int MPI_Buffer_detach(void* buffer_addr,int *size);
Exemplu. Se considera urmatoarea secventa de program:
#include "mpi.h"
main(argc,argv)
int argc; char **argv; {
char mesaj[20]; int myrank;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&mrank);
if (myrank == 0) { /* cod pentru procesul 0*/
strcpy(mesaj,"Hello");
MPI_Send(mesaj,strlen(mesaj),MPI_CHAR,1,99,MPI_COMM_WORLD); }
else { /* cod pentru procesul 1*/
MPI_Recv(mesaj, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD,&status);
printf("receptionat: %s\n",mesaj);}
MPI_Finalize(); }
In acest exemplu, procesul 0 expediaza un mesaj la procesul 1 utiliz^and operatia
MPI_Send care speci ca un tampon ^n memoria expeditorului de la care este
extrasa data (contine mesaj). Locatia, marimea si tipul sunt speci cate de
primii 3 parametrii ai operatiei de exepediere. Ultimii trei parametrii speci ca
anvelopa mesajului. Al doilea proces selecteaza mesajul corespunzator valorii
anvelopei sale si data este stocata ^n tamponul de receptionare (^n cazul dat la
mesaj din memoria procesului 1). Primii trei parametrii ai operatiei speci ca
caracteristicile tamponului, iar urmatorii trei selecteaza mesajul (ultimul este
utilizat pentru returnarea informatiei asupra mesajului receptionat).
In cazul unei comunicari neblocante, expedierea se face ^n 3 faze: initierea
comunicarii neblocante, alte operatii (pot si alte comunicari) si asteptare
pentru completarea comunicarii. O expediere sincrona neblocanta este:
377
MPI_Issend(buf, count, datatype, dest, tag, comm, handle)
MPI_Wait(handle, status)
iar o receptionare fara blocare:
MPI_Irecv(buf, count, datatype, src, tag, comm, handle)
MPI_Wait(handle, status)
O expediere cu blocare poate de exemplu folosita ^n conjuctie cu o
receptionare fara blocare si vice-versa. Modul sincron poate afecta terminarea
si nu initierea. Prin MPI_Test se poate testa terminarea unei comunicari, iar
cu MPI_Request_free i se permite unei comunicari indicate sa e terminata si
datele corespunzatoare comunicarii sa e dealocate. Variantele MPI_Testany
si MPI_Waitany testeaza si asteapta terminarea oricarei, anumitor sau tuturor
operatiilor dintr-o lista, pe c^and MPI_Testall si MPI_Waitall testeaza sau
blocheaza p^ana c^and toate operatiile de comunicare asociate cu handleri ac-
tivi din lista sunt terminate si returneaza starea tuturor operatiilor (exista si
variante MPI_Testsome si MPI_Waitsome).
Operatiile MPI_Probe si MPI_Iprobe permit veri carea sosirii mesajelor fara
a le receptiona. Operatia MPI_Cancel permite anularea unor operatii nedecise
(partenerul ^n comunicare executa MPI_Test_canceled).
Adesea comunicarea cu aceeasi lista de argumente este executata repetat
^ntr-un ciclu de calcul paralel. Intr-o asemenea situatie, este posibila opti-
mizarea comunicarii prin legarea listei de argumente de comunicare la o cerere
de comunicare persistenta si apoi utilizarea cererii pentru initierea si terminarea
mesajelor (o asemenea constructie permite reducerea surplusului de comunicare
^ntre un controlor de comunicare si altul). Nu este necesar ca mesajele expedi-
ate cu o cerere persistenta sa e receptionate pe baza de cerere persistenta si
vice-versa. O cerere de comunicare este creata pentru o expediere standard cu
blocare astfel:
int MPI_Send_init(void *buf, int count, MPI_Datatype datatype,
int dest, int tag, MPI_Comm comm, MPI_Request *cerere);
O cerere de comunicare persistenta este inactiva dupa ce a fost creata (nu este
atasata o comunicare activa la cerere). O comunicare care utilizeaza o cerere
persistenta este initiata pe functia MPI_Start:
int MPI_Start(MPI_Request *cerere);
ce starteaza toate comunicarile asociate cu o matrice de cereri.
Operatia MPI_Sendrecv combina ^ntr-un singur apel expedierea unui mesaj
la o destinatie si receptionarea unei alt mesaj de la alt proces (sursa si destinatia
poate aceeasi). O asemena operatie este utila ^n executia unei operatii de
deplasare de-a lungul unui lant de procesoare.
Adesea este necesara utilizarea unei surse sau destinatii dummy ^n comu-
nicare, pentru simpli carea codul de exemplu pentru tratarea frontierelor ^n
cazul unei deplasari ne-circulare. Valoarea speciala MPI_PROC_NULL poate
utilizata ca rang unde apar sursa sau destinatia ca argumente ^ntr-un apel. O
comunicare cu procesul MPI_PROC_NULL nu are nici un efect si are ^ntotdeauna
succes.
378
Comunicarea punct-la-punct ^n formele enumerate mai sus implica tam-
poane continue contin^and elemente de acelasi tip. In cazul ^n care datele
ce urmeaza a expediate ^ntr-un mesaj sunt variate, trebuie utilizat un
mecanism MPI pentru ^mpachetarea datelor ^ntr-un tampon pentru trans-
mitere sau colectarea lor directa din pozitia ^n care se a a. Astfel MPI
ofera facilitati de construire a unor tipuri de date generale care sunt obiecte
opace, precum MPI_Type_contiguos pentru replicarea datelor ^n locatii con-
tigue, MPI_Type_vector pentru replicare ^n locatii consist^and din blocuri egal
spatiate, sau MPI_Type_struct pentru replicarea unor date de tipuri diferite.
Se considera drept exemplu, o secventa de program pentru transpunerea unei
matrice a ^ntr-o matrice b, ^n Fortran:
REAL a(100), b(100)
INTEGER row,xpose,sizeofreal,myr,ierr,status(MPI_STATUS_SIZE)
CALL MPI_COMM_RANK(MPI_COMM_WORLD,myr)
CALL MPI_TYPE_VECTOR(100,1,100,MPI_REAL,row,ierr)
CALL MPI_TYPE_VECTOR(100,1,100,MPI_REAL,row,ierr)
CALL MPI_TYPE_EXTENT(MPI_REAL,sizeofreal,ierr)
c crearea tipului de data pentru o linie
CALL MPI_TYPE_VECTOR(100,1,100,MPI_REAL,row,ierr)
c crearea tipului de data pentru matrice ^n ordinea liniilor
CALL MPI_TYPE_HVECTOR(100,1,sizeofreal,row,xpoes,ierr)
CALL MPI_TYPE_COMMIT(xpose,ierr)
c expediaza matricea pe linii si receptioneaza pe coloane
CALL MPI_SENDRECV(a,1,xpose,myrank,0,b,100*100,MPI_REAL,myr,
* 0,MPI_COMM_WORLD,status,ierr)
Impachetarea datelor necontigue este realizata cu MPI_Pack, operatia inversa
ind MPI_Unpack, iar prin MPI_Pack_size se determina spatiul necesar pentru
^mpachetarea mesajului. De exemplu, se considera o secventa de program C:
int position, i, j, a[2], myrank; char buff[100];
...
MPI_Comm_rank(MPI_COMM_WORLD,&myrank);
if (myrank == 0) { /*cod expeditor*/
position=0;
MPI_Pack(&i,1,MPI_INT,buff,1000,&position,MPI_COMM_WORLD);
MPI_Pack(&j,1,MPI_INT,buff,1000,&position,MPI_COMM_WORLD);
MPI_Send(buff,position,MPI_PACKED,1,0,MPI_COMM_WORLD); }
else /*cod receptor*/
MPI_Recv(a,2,MPI_INT,0,0,MPI_COMM_WORLD);
Comunicare colectiva. Actiunea colectiva are loc peste un comunicator.
Toate procesele pot comunica. Sincronizarea poate sau nu sa apara. Operatiile
colective au loc cu blocare, iar tampoanele de receptionare trebuie sa aiba
aceeasi marime. O bariera de exemplu este produsa prin apelul:
int MPI_Barrier (MPI_Comm comm)
iar o difuzare prin:
379
4.10: Operatii de reducere prede nite
Tabelul

Nume MPI Functie


MPI MAX, MPI MIN Maxim, Minim
MPI SUM, MPI PROD Suma, Produs
MPI LAND, MPI BAND Si logic, Si pe biti
MPI LOR, MPI BOR Sau logic, Sau pe biti
MPI LXOR, MPI BXOR Sau logic exclusiv, Sau exclusiv pe biti
MPI MINLOC, MPI MAXLOC Minim/Maxim cu locatie
int MPI_Bcast(void *buffer,int count,MPI_tip,
int root,MPI_Comm comm)
De exemplu, o difuzare a 100 de ^ntregi de la procesul 0 la ecare proces din
grup se efectueaza astfel:
MPI_Comm comm; int aray[100], root;
...
MPI_Bcast(array, 100, MPI_INT, root, comm);
Operatiile de reducere globala sunt utilizate pentru a calcula un rezultat
ce invoca date distribuite peste un grup de procese { de exemplu, sumele sau
produsele globale, maxim sau minim, operatii de nite de utilizator etc (Tabelul
4.10). De exemplu o reducere globala pentru o suma globala a unor ^ntregi
poate apelata prin:
MPI_Reduce(&x,&result,1,MPI INT,MPI_SUM,0,MPI_COMM_WORLD)
Utilizatorul^si poate de ni operatiile de reducere proprii pe baza unui operator
arbitrat cu MPI_Op_create. In varianta MPI_Allreduce rezultatul este retur-
nat la toate procesele din grup (receptioneaza rezultate identice). MPI_Scan
este utilizat pentru a efectua reducere pre xata pe datele distribuite la un
grup; operatia returneaza ^n tamponul de receptionare a procesului de rang i,
reducerea valorilor din tampoanele de expediere a proceselor cu rang 0; : : : ; i.
Se considera un exemplu^n care ecare proces are o matrice de 30 de numere
reale si pentru ecare din cele 30 de locatii se cere calcularea valorii si rangului
procesului ce contine cea mai mare valoare. Atunci:
double ain[30], aout[30]; /* matrice proces: ain*/
int i, myrank, root, ind[30];
struct { double val; int rank;} in[30], out[30];
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
for (i=0; i<30; ++i) { in[i].val=ain[i]; in[i].rank=myrank; }
MPI_Reduce(in, out, 30, MPI_DOUBLE_INT, MPI_MAXLOC, root,comm);
if (myrank == root) /* raspunsul la procesul radacin
a */
for (i=0;i<30;++i) {aout[i]=out[i].val; ind[i]=out[i].rank;}
Pentru produsul a doua numere complexe se creaza un operator-utilizator
special:
380
typedef struct { double real, imag; } Complex;
void myProd(Complex *in,Complex *inout,int *len,
MPI_Datatype *dptr)
{int i; Complex c;
for (i=0; i<*len; ++i) {
c.real = inout->real*in->real - inout->imag*in->imag;
c.imag = inout->real*in->imag + inout->imag*in->real;
*inout = c; in++; inout++; } }
...
Complex a[100],raspuns[100]; /*la fiecare proc. 100 complexe*/
MPI_Op myOp; MPI_Datatype ctype;
MPI_Type_contiguous(2,MPI_DOUBLE,&ctype); /*explic. definire*/
MPI_Type_commit( &ctype );
MPI_Op_create( myProd, True, &myOp ); /*crearea operatorului*/
MPI_Reduce(a,raspuns,100,ctype,myOp,root,comm); /*raspunsul*/
Se reia exemplul propus la PVM pentru calcul valorii :
#include "mpi.h"
#include <math.h>
int main(argc,argv)
int argc; char *argv[]; {
int done = 0, n, myid, numprocs, i, rc;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x, a;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
while (!done) {
if (myid == 0) {
printf("Numarul de intervale: (la 0 ies) ");
scanf("%d",&n); }
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0) break;
h = 1.0 / (double) n; sum = 0.0;
for (i = myid + 1; i != n; i += numprocs) {
x = h * ((double)i - 0.5);
sum += 4.0 / (1.0 + x*x); }
mypi = h * sum;
MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
if (myid == 0)
printf("pi is approximately %.16f, Error is %.16f\n",
pi, fabs(pi - PI25DT));}
MPI_Finalize(); }
Urmatorul exemplu este o rutina Fortran pentru calculul produsului scalar
dintre doi vectori care sunt distribuiti peste un grup de procese si returneaza
raspunsul ^n nodul 0:
SUBROUTINE PAR_PROD(m, a, b, c, comm)

381
REAL a(m), b(m) c, sum
INTEGER m, comm, i, ierr
sum=0.0
DO i = 1, m
sum = sum + a(i)*b(i)
ENDDO
CALL MPI_REDUCE(sum, c, 1, MPI_REAL, MPI_SUM, 0, comm, ierr)
RETURN
Intr-o operatie de str^angere, MPI_Gather, ecare proces expediaza
continutul tamponului propriu la procesul radacina care-l receptioneaza si-l
stocheaza pe ecare ^n ordinea rangului. Varianta MPI_Gatherv permite un
numar variabil de date expediate de la ecare proces. De exemplu, procesul
radacina str^ange 100 de ^ntregi de la ecare proces din grup (inclusiv el ^nsusi):
MPI_Comm comm; int gsize, sendarray[100], root, *rbuf;
...
MPI_Comm_rank(comm,myrank);
if (myrank==root) {
MPI_Comm_size(comm, &gsize);
rbuf=(int *)malloc(gsize*100*sizeof(int));}
MPI_Gather(sendarray,100,MPI_INT,rbuf,100,MPI_INT,root,comm);
In varianta MPI_Allgather toate procesele receptioneaza rezultatul (nu nu-
mai radacina; astfel al ilea bloc de date expediat de procesul i din grup
este receptionat de ecare proces si plasat ^n al ilea bloc al tamponului de
receptionare). MPI_Alltoall este o extensie a MPI_Allgather ^n care ecare
proces expediaza date distincte la ecare dintre receptori (al j lea bloc expediat
de procesul i este receptionat de procesul j si este plasat ^n al ilea bloc al
tamponului de receptionare). MPI_Scatter (^mprastiere) este operatia inversa.
Grupuri, contexte si comunicatori. Comunicatorii ofera un dome-
niu pentru operatiile de comunicare si sunt divizati ^n doua categorii:
intra-comunicatori pentru operatii ^ntr-un singur grup de procese si inter-
comunicatori pentru comunicari punct-la-punct ^ntre doua grupuri de procese.
Un grup este o multime ordonata de identi catori de procese. Fiecare proces
dintr-un grup este asociat cu un rang ^ntreg. Un context este o proprietate a
comunicatorilor care permit partitionarea unui spatiu de comunicare. Un mesaj
expediat ^ntr-un context nu poate receptionat ^n alt context. O topologie
virtuala speci ca o mapare a rangurilor ^ntr-un grup la si de la o topologie.
Asupra grupurilor si comunicatorilor se pot efectua o serie de operatie
(Tabelul 4.11 si 4.12). Un exemplu este urmatorul^n care se creaza un subgrup
de 4 procese din cele disponibile pentru comunicare:
int me, ranks[] = { 2, 4, 6, 8 };
MPI_Request cerere[2]; MPI_Status status[2];
MPI_Group grup, subgrup;
MPI_Comm comun;
MPI_Comm_group(MPI_COMM_WORLD,&grup);
MPI_Group_incl(grup, 4, ranks, &subgrup);
MPI_Group_rank(subgrup, &me);

382
4.11: Functii pe grupuri ^n MPI
Tabelul

Apel MPI Semni catie


MPI Group size determina dimensiunea grupului speci cat
MPI Group rank determina rangul procesului apelant ^ntr-un grup
speci cat
MPI Group translate ranks determina numerotarea relativa a aceluiasi proces
^n grupuri diferite
MPI Group compare compara doua grupuri
MPI Comm group returneaza handlerul la grupul speci cat
MPI Group union grupeaza elementele a doua grupuri ^n ordinea din
primul, apoi al doilea grup
MPI Group intersect creaza grupul tuturor elementele din primul grup
care apar si ^n al doilea
MPI Group di erence creaza grupul tuturor elementele din primul grup
care nu apar si ^n al doilea
MPI Group incl creaza un grup care consista dintr-un numar de
grupuri identi cate prin rank
MPI Group excl creaza un grup care este obtinut prin stergerea
unor procese de rang dat
MPI Group free marcheaza un grup pentru stergere
4.12: Functii pe comunicatori ^n MPI
Tabelul

Apel MPI Semni catie


MPI Comm size determinare numarului de procese dintr-un comunicator
MPI Comm rank determinarea rangului procesului apelant ^n comunicator
MPI Comm compare compara doi comunicatori
MPI Comm dup duplicarea comunicatorului speci cat
MPI Comm create creaza un comunicator de nit prin grup si context
MPI Comm split partitioneaza grupul asociat cu comunicatorul ^n sub-
grupuri disjuncte
MPI Comm free marcheaza un comunicator pentru stergere
MPI_Comm_create(grup, subgrup, &comun);
if ( me != MPI_UNDEFINED ) {
MPI_Irecv(buff1, count, MPI_DOUBLE, MPI_ANY_SOURCE,
TAG_ARBITRARY, comun, cerere);
MPI_Isend(buff2, count, MPI_DOUBLE, (me+1)%4,
TAG_ARBITRARY, comun, cerere+1); }
Pentru intercomunicari ^ntre comunicatori sunt utilizate functii de tipul
MPI_Intercomm_*.
Functiile MPI_Graph_create si MPI_Cart_create sunt folosite pentru
crearea de topologii virtuale cu structura de graf general sau topologie
carteziana (precum hipercub, tor etc) multi-dimensionale.
383
4.4 Limbaje pentru paralelism ^n date
Asemenea limbaje genereaza o singura secventa de instructiuni si implica
executia sincrona a instructiunilor, iar programarea este simpla, si depanarea
usoara deoarece nu exista impasuri. Codul dezvoltat speci ca explicit para-
lelismul. Programatorul exprima calculele ^n termenii operatiilor efectuate de
procesoare virtuale si nu este preocupat de numarul procesoarelor zice. Se
creaza iluzia unui spatiu de adresare partajat permit^and ecarui procesor sa
acceseze locatiile de memorie ale altor procesoare. Astfel se ascund multe car-
acteristici arhitecturale. Programarea este mai simpla dec^at^n cazul sistemelor
cu transfer de mesaje. Compilatoatele trebuie sa mapeze procesoarele virtuale
la procesoare zice, sa genereze cod pentru comunicarea datelor si sa forteze
executia sincrona. Exemple de asemenea limbaje sunt *LISP, C*, NESL, FP,
PC++, APL, MATLAB, etc.
Daca numarul de procesoare virtuale este mai mare dec^at numarul pro-
cesoarelor zice, mai multe procesoare virtuale sunt emulate de un procesor
zic. Procesorul zic partitioneaza memoria sa ^n blocuri, unul pentru ecare
procesor virtual si executa ecare instructie din program odata pentru ecare
procesor virtual.
Speci carea concurentei se face prin constructii de limbaj. Aceste
constructii de speci care a intructiunilor care sunt executate concurent nu sunt
la fel de puternice ca si constructiile fork/join,^nsa sunt mai usor de mentinut
deoarece concurenta este controlata si limitata. Aceste speci catii sunt ^n gen-
eral aplicate pentru un model de memorie partajata.
Exemplul 1. Se considera constructorul ParBegin:
ParBegin
F(a); G(b); H(c);
End;
In acest exemplu se speci ca faptul ca functiile F; G si H toate pot apelate
si pot executate concurent. Daca toate au acces la aceeasi memorie atunci
pot sa apara probleme la controlul accesurilor simultane.
Exemplul 2. ParDo speci ca faptul ca iteratii individuale ale unui ciclu pot
^mprastiate de-a la procesoare multiple. Se presupune ca nu exista dependente
de date ^n interiorului unui corp de ciclu. Se permite numai paralelizarea
ciclurilor si implica sincronizarea la sf^arsitul ecarui ciclu. De exemplu:
Pardo(i=0; i<N; i++) { x[i]=F[i]; }
Parallaxis
Este un limbaj care are facilitati similare limbajului folosit pe MasPar pentru
uni- si multi-procesoare. Pe un sistem uniprocesor (de exemplul PC cu DOS)
simuleaza un SIMD cu memorie distribuita care are acces la o memorie globala,
cea a sistemului gazda. Se pot de ni prin configuration si connection struc-
turi de comunicare ^ntre procese (cu posibilitatea de interconectare a struc-
turilor), prin SCALAR structuri de nite global ^n program sau prin VECTOR date
2 Rezumat: Implement arile curente ale modelului de programare cu adrese partajate
sunt extensii ale limbajelor clasice de programare pe baza unor primitive ce descriu sarcini
concurente.

384
locale diferitelor procese. Instructiunea propagate este utilizata pentru comu-
nicare sincrona ^ntre toate procesele participante. Portiunea din program care
indica executia concurenta a mai multor procese (operatii asupra variabilelor
VECTOR si comunicari) este ^ncadrata de perechea de cuvinte cheie PARALLEL si
ENDPARALLEL.
Se considera doua exemple complete, ^n Parallaxis, primul determin^and ma-
ximul din n numere distribuite ^n mod egal la n procese:
2 2

SYSTEM Max; (*-determinarea maximului*)


CONST dim=3; (*-dim^2 valori de intrare*)
CONFIGURATION matrice[dim],[dim]; (*-configuratia retelei*)
CONNECTION (*-conectare tip grila*)
drept: matrice[i,j]->matrice[i,j+1].stang;
stang: matrice[i,j]->matrice[i,j-1].drept;
sus: matrice[i,j]->matrice[i-1,j].jos;
jos: matrice[i,j]->matrice[i+1,j].sus;
SCALAR i,j,maxim: INTEGER; (*-variabile indici*)
a:ARRAY[1..dim,[1..dim] OF INTEGER; (*-datele initiale*)
VECTOR val,tampon: INTEGER; (*-max curent si val.transmise*)
BEGIN
WriteString("Introduceti numerele:");
FOR i:=1 TO dim DO
FOR j:=1 TO dim DO
ReadInt(a[i][j]) (*citirea datelor*)
END;
END;
LOAD(val,a); (*repartizare element/procesor*)
FOR i:=1 TO dim-1 DO (*determinare maxim pe linii*)
PARALEL (*val. max curenta se copiaza ca val.curenta*)
tampon:=val;
PROPAGATE.stang(tampon);
IF tampon>val THEN val:=tampon END;
ENDPARALLEL (*max se afla pe prima coloana*)
END;
FOR i:=1 TO dim-1 DO
PARALLEL (*determin
a max pe coloane*)
tampon:=val; (*max se propagaa ^nspre prima*)
PROPAGATE.sus(tampon);
IF tampon>val THEN val:=tampon END;
ENDPARALLEL (*max de pe prima coloana este max absolut*)
END;
STORE [0,],[0] (val, maxim); (*extragere mxaim*)
WriteString("Maximul este");
WriteInt(maxim,6);
END Max.
Calculul lui  prin aproximare cu o integrala poate realizat astfel:
SYSTEM integrala;

385
CONST n=100; h=1.0/FLOAT(n);
CONFIGURATION lista[1..n]; (*declararea proceselor*)
VECTOR val:REAL; (*va detine valorile de sub suma*)
PROCEDURE f(VECTOR x:REAL): VECTOR REAL; (*functia de integrat*)
BEGIN
RETURN (4.0/(1.0+x*x))
END f;
BEGIN
PARALLEL (*determin concurent val. aprox.distincte*)
val:=h*f((FLOAT(id_no)-0.5*h);
ENDPARALLEL;
WriteReal(REDUCE.SUM(val),15); (*afisarea sumei var. val*)
END integrala.
Fortran paralel
HPF (High Performance Fortran) ^ncearca sa standardizeze programarea ce
exploateaza paralelismul ^n date pe masini diferite. Limbajul de baza este
Fortran 90 la care s-au adaugat facilitati de de nire a distributiei datelor si
aliniament. Permite de nirea explicita a paralelismului si incorporarea unor
proceduri externe.
Fortran 90 utilizeaza o notatie sintactica pentru a exploata paralelismul ^n
date (de exemplu, A=B*C, unde A, B, C sunt matrice). Implementari speci ce
pe masinile SIMD sunt CM Fortran pe CM2, MP Fortran pe MasPar. Exista
si versiuni uniprocesor: compilator NAG pentru Sunuri, si Cray F90. Co-
municarile pot transparente, dar programatorul trebuie sa e constient de
arhitectura pentru a obtine performante.
In CM Fortran o matrice declarata comuna este considerata un obiect cu
paralelism ^n date ^n sensul ca operatiile care se efectueaza asupra matricei se
efectueaza concurent. Operatiile pe obiectele scalare si matrici care nu sunt
declarate comune sunt operatii secventiale. Exista o serie de facilitati de lucru
cu submatricele unei matrice comune. Constructorii de matrice pot utilizati
pentru initializarea elementelor unei matrice comune ^n paralel. De exem-
plu daca Z este declarat REAL, ARRAY(N) :: Z si apoi Z = REAL( [1:N] )
se asigneaza 1:0 la Z(1), 2:0 la Z(2), si REAL(N) la Z(N). Utilizarea numelui
unei matrice implica utilizarea ^ntregii matrice ^n paralel. De exemplu daca
se efectueaza Y = Z**2, atunci Y(1) este setat pe valoarea Z(1)**2, Y(2) pe
Z(2)**2, etc. Acest fapt este valabil si pentru asignare cu constante; de ex-
emplu ^n urma Y = -1.0 toate elementele matricei Y sunt setate pe -1. Daca
Y(1:10) = Z(11:20) atunci primele 10 elemente ale lui Y sunt setate pe alte
10 elemente ale lui Z (setare ^n paralel).
O structura de ciclare noua fata de Fortranul clasic este ciclul alternat:
N = 4096
DOWHILE (N .GT. 0)
Z(1:N) = ...
N = N/2
ENDDO
KK = 1
DO (N) TIMES

386
KK = KK * K
ENDDO
Primul ciclu asigneaza valori la primele N elemente ale matricei Z pentru N egal
cu o putere descrescatoare a lui 2. Al doilea ciclu se termina c^and KK=K N unde
N este un ^ntreg nenegativ. Aceasta ultima forma de ciclu DO este utila c^and
indexul ciclului nu este necesar^n interiorul corpului ciclului. Daca primul ciclu
este clasic pentru un Fortran secvential, al doilea nu mai este.
Instructiunea WHERE ofera o modalitate de lucru cu o submatrice sau sub-
structura a unei matrice ^n paralel. De exemplu, daca
WHERE (Z .GT. 0.0) Y = SQRT(Z)
toate procesoarele calculeaza Y = SQRT(Z) dar numai acelea cu valoarea lui Z
mai mare dec^at 0 stocheaza rezultatul. Functia SQRT este utilizata pentru o
^ntreaga matrice. Daca dorim sa setam celelalte elemente pe 0 ^n acelasi timp,
operatia va :
WHERE (Z .GT. 0.0)
Y = SQRT(Z)
ELSEWHERE
Y = 0.0
ENDWHERE
In acest caz, elementele lui Y sunt setate pe 0 c^and elementul corespunzator
din Z nu este mai mare dec^at 0. Aceasta constructie are loc ^n doi pasi. In
primul pas toate procesoarele calculeaza Y = SQRT(Z), dar numai cele cu valori
pentru elementelor lui Y corespunz^and la elemente nenule ale lui Z sunt stocate.
Apoi toate procesoarele calculeaza Y = 0, dar numai valorile corespunzatoare
la elemente zero sau negative din Z sunt stocate. Desi constructia este similara
unui IF..THEN..ELSE..ENDIF, comportarea este diferita.
Exemplu pentru constructia FORALL ce poate contine o singura asignare:
FORALL (I=1:N) Y(I) = I
Se indica valorile start si oprire pentru indexul ciclului executat ^n paralel
(poate utilizat si un increment, ^ntr-un triplet). Mai mult dec^at un index
poate utilizat ^ntr-un FORALL. De exemplu,
FORALL (I=1:N, J=1:N) S(I,J) = I
seteaza toate elementele liniei I a lui S pe I. Adesea elemente individ-
uale ale unei matrice trebuie initializate cu valori speci ce. De exemplu,
S(6,1) = S(6,2) + S(6,3) este ^n esenta o operatie scalara. Daca se uti-
lizeaza FORALL:
FORALL (I=6:6, J=1:1) S(I,J) = S(I,J+1) + S(I,J+2)
suna lui S(I,J+1) si S(I,J+2) pentru ecare I si J este calculata de toate
elementele din matrice, dar numai procesorul ce contine elementul din prima
coloana a liniei a sasea a lui S stocheaza aceasta valoare ^n elementul matricei.
In plus un FORALL cu dependente care nu pot rezolvate este executat serial.
387
Exista o serie de functii intrinseci limbajului care se executa pe matrice ^n
paralel. Exemple de asemenea functii sunt: sqrt, mod, transpose, matmul,
diagonal, dshape, replicate etc. Exista de asemenea o serie de functii pen-
tru operatii de reducere pe baza unei matrice de date precum sum, product,
maxval, minval, maxloc, minloc, count, any, all, rank, pack etc.
Directivele compilator sunt utilizate pentru a de ni asignarea elementelor
matriceale la diferite procesoare. In CM Fortran asemenea directive sunt
folosite pentru a speci ca locatia relativa a elementelor matriceale si a speci ca
utilizarea si localizarea matricelor ^n blocuri comune de program.
4.5 Alte limbaje concurente si biblioteci de
functii pentru procese
4.5.1 Ada
Limbajul Ada a fost dezvoltat de US Department of Defence drept limbaj de
programare standard necesar nevoilor lor speci ce, cuprinz^and o serie de prin-
cipii ale ingineriei software si ^n particular se adreseaza sistemelor concurente.
Modelul programarii concurente este taskul (sarcina) care este o colectie de
instructiuni secventiale. Mecanismul de comunicare si sincronizare a acestor
taskuri este un mecanism de rendez-vous.
Un task are doua sectiuni, o speci care si un corp. Speci carea contine
declaratii de intrari, adica acele rendez-vous-uri pe care taskul le va ac-
cepta. C^and doua taskuri se ^nt^alnesc, un task este taskul acceptor care
contine punctul de ^nt^alnire, iar celalalt este task apelant ce trebuie sa speci-
ce taskul acceptant si punctul de intrare ^n taskul acceptant la care doresc
sa se ^nt^alnaesca. Punctul de intrare ^n taskul acceptant este indicat prin
cuv^antul cheie accept. C^and un task apelant se ^nt^alneste cu taskul accep-
tant, sunt executate instructiunile secventiale din corpul lui accept. Taskul
apelant paseaza parametrii sai in la taskul acceptant si este blocat astept^and
terminarea rendez-vous-ului. Taskul acceptant executa operatiile din corpul
accept, iar parametrii out sunt pasati la taskul apelant. Rendez-vous-ul este
terminat si at^at taskul apelant c^at si cel acceptant continua executia.
Mecanismul de rendez-vous este sincron si fara tampoane, are identi care
asincrona (expeditorul, taskul apelant cunoaste cine este receptorul, taskul
acceptant, dar acesta nu stie identitatea taskului apelant), iar datele se scurg
^n doua directii de-a lungul rendez-vous-ului.
C^and un task acceptant atinge primul sau punct de intrare (accept)
asteapta p^ana c^and se ^nt^alneste cu un task apelant la acel punct de intare,
chiar daca alte taskuri au efectuate cereri de ^nt^alnire la alte puncte de intrare
^n taskul acceptant. Non-determinimul este introdus ^n Ada prin select. Se
considera urmatorul exemplu de task Buffer:
task Buffer
entry Append (I: in Integer);
entry Take (I: out Integer);
1 Rezumat: Ada este un limbaj concurent. Un programa paralel ^n Ada se bazeaz
a pe
sarcini comunicante.

388
end Buffer;
task body Buffer is
B: array (0..N-1) of Integer;
In_Ptr, Out_Ptr: Integer := 0;
Count: Integer := 0;
begin
loop
select
when Count < N =>
accept Append (I: in Integer) do B(In_Ptr) := I;
end Append;
Count := Count + 1;
In_Ptr: = (In_Ptr + 1) mod N;
or when Count > 0 =>
accept Take (I: out Integer) do I := B(Out_Ptr);
end Take;
Count := Count - 1;
Out_Ptr := (Out_Ptr + 1 ) mod N;
end select;
end loop;
end Buffer;
Un exemplu de apel de rendez-vous este Buffer.Append(I). Codul de mai sus
pentru un tampon marginit utilizeaza un select pentru a alege ne-determinist
^ntre doua alternative cu garda (when). Daca o garda este adevarata, se spune
ca alternativa este deschisa, altfel este ^nchisa. Daca exista mai multe alterna-
tive deschise si exista taskuri apelante^n cozile de intrare a punctelor de rendez-
vous ^n select, aplicatia este libera sa aleaga primul task dintr-o coada nevida
a unei intrari deschise. Daca toate cozile de intrare sunt vide, atunci taskul ac-
ceptant va suspendat si va astepta schimbarea acestei situatii. Gardele sunt
evaluate numai c^and se ^nt^alneste un select; atunci este de nita multimea de
alternative deschise ce nu se schimba de-a lungul realizarii select. Trebuie sa
existe cel putin o alternativa deschisa sau apare o eroare fatala.
Ultima alternativa ^ntr-un select poate o primitiva de excludere mutuala
precum else, delay T sau terminate. In primul caz se executa instructiunile
urmatoare daca nu exista alternative deschise sau daca cozile de asteptare a
alternativelor deschise sunt vide. In cazul al doilea, se executa instructiunile
urmatoare daca nu exista nici o alternativa deschisa sau daca cozile de asteptare
ale alternativelor deschise sunt vide pentru un timp T. In cazul al treilea, daca
select este suspendat si toate taskurile care pot apela intrarile taskului apelant
au terminat sau sunt ^n asteptare pe select, atunci termina aceste taskuri.
Exemplu. Se considera problema cititori/scriitori. Un schelet al unei aseme-
nea aplicatii este urmatorul. Un task T1 este
task body T1 is
begin
...
accept Sync_2 do -- sincronizare cu T2
accept Sync_3; -- sincronizare cu T3

389
end Sync_2;
...
end T1;
iar taskul Readers_and_Writers contine:
task body Readers_and_Writers is
begin
accept Start_Write;
accept End_Write;
loop
select accept Start Read ...;
or accept End_Read ...;
or accept Start_Write ...;
or accept End_Write ...
end select;
end loop;
end Readers_and_Writers;
Primitiva select poate utilizata si ^n procesul apelant pentru a preveni
ca procesul apelant sa e suspendat la in nit ^n asteptarea unui rendez-vous.
Taskul timeout al unui server din multiple disponibile este:
body timeout
begin
loop
select Sensor.Sample (...);
or delay 5.0;
Notify_Operator;
end select;
end loop;
end timeout;

astfel ^nc^at pentru un task apelant:


task body multi_poll is
begin
loop
select Server_1.E(...);
else null;
end select;
select Server_2.E(...);
else null;
end loop;
end multi_poll;
Daca utilizatorul declara o variabila drept task este creat un obiect task
care poate executa acelasi cod ca cel de nit ^n corpul taskului asociat dar cu
propriile sale variabile. Se pot crea liste de taskuri care sunt manipulate si
mentinute pe baza de pointeri.
390
La punctele de sincronizare, precum dupa terminarea unui rendez-vous, sis-
temul de rulare trebuie sa decida care dintre taskurile disponibile va continua.
Decizia poate controlata pe baza de prioritati. Se va selecta taskul cu priori-
tatea cea mai mare care este gata de executie. De asemenea, daca o ^nt^arziere
a unui task cu prioritate mare a expirat, un task cu prioritate mai mica trebuie
^ntrerupt pentru a permite executia taskului cu prioritate mai mare. Astfel un
task server poate programat astfel^nc^at sa accepte apeluri la server baz^andu-
se pe intrari cu prioritate:
type Priorities is (low ,medium, high);
task Server is
entry Request (Priorities)(...);
end Server;
task body Server is begin
loop
select accept Request (high)(...) ...;
or when Request (high)'Count = 0 =>
accept Request (medium)(...) ...;
or when Request (medium)'Count=0 and Request (high)'Count=0 =>
accept Request (low)(...) ...;
end select;
end loop;
end Server;
Un apel de intrare poate avea forma Server.Request(high)(...);.
Un program SR (Synchronised Resources) este o colectie de resurse si
globale. O resursa este un sablon pentru instante de resurse care pot create
si distruse dinamic. O resursa poate privita ca un obiect data abstract care
consta din doua parti: o speci care care indica interfata la resursa si corpul
care contine codul ce implementeaza comportarea obiectului data abstract.
Un global este o instanta singulara, neparametrizata si automatic creata a unei
resurse. Este o colectie de obiecte partajate de resurse si alte globale ^n acelasi
spatiu de adrese (masina virtuala). Diferentele majore dintre o resursa si un
global sunt urmatoarele: globalele permit variabile care sa e partajate ^ntre
instantele resursei pe c^and resursele permit ca variabilele sa e partajate numai
de procs din aceeasi instanta a a resursei. Procs declarat ^n speci catia unui
global poate referit ^n afara globalului direct via numele globalului, pe c^and
un procs declarat ^n speci catia unei resurse poate referit ^n afara resursei
numai indirect printr-o variabila de resursa pentru acea instanta a resursei.
Forma generala a unei resurse este:
resource resource_name
imports
constants, types, or operation declarations
body resource_name (parameters)
imports
declarations, statements, procs
final code
end resource_name

391
Parametrii si toate partile speci catiei si corpului sunt optionale, precum si
numele resursei ce urmeaza dupa end. O resursa stiva este de nita astfel:
resource Stack
type results = enum (OK, OVERFLOW,UNDERFLOW)
op push (item:int) returns r:result
op pop (res item:int) returns r:result
body Stack (size:int)
var store [1:size]:int, top:int := 0
proc push (item) returns r
if top < size ->
store[++top] := item
r := OK
[] top = size ->
r := OVERFLOW
fi
end
proc pop (item) returns r
if top > 0 ->
item := store[top--]
r := OK
[] top = 0 ->
r := UNDERFLOW
fi
end
end Stack
Corpul resursei stiva contine un parametru size. C^and este creata o noua
instanta a unei resurse stiva acest parametru este utilizat pentru a seta marimea
matricei locale si ^n testele if.
C^and o resursa doreste sa utilizeze o alta, trebuie sa importe alte resurse. De
exemplu, daca o resursa, stack_user doreste sa utilizeze operatiile declarate
publice ale resursei stiva, atunci
resource Stack_User ( )
import Stack
var x:Stack.result
...
end Stack_User
Deoarece mai multe instante ale unei resurse pot create este necesar un
mecanism de distingere ^ntre instante diferite ale unei resurse. Acesta este
oferit printr-o facilitate cap de tip pointer la o instanta speci ca a unei resurse.
De exemplu, urmatorul cod creaza doua instante ale unei resurse stiva:
resource Stack_User
import Stack
var x: Stack.result
var s1, s2: cap Stack
var y:int

392
s1 := create Stack(10)
s2 := create Stack(20)
s1.push (4); s1.push (37); s2.push (98)
if (x := s1.pop(y)) != OK -> ... fi
if (x := s2.pop(y)) != OK -> ... fi
end
Exista doua instante ale resursei stack, diferentiate de doua variabile cap de
resursa, s1, s2. Fiecare instanta are copia proprie a variabilelor locale store
si top, iar operatiile speci cate ^n partea de speci catii pot referite ^n afara
stack via variabile, de exemplu s1.push(37). O instanta de resursa precum
cea referita prin s1 poate distrusa astfel:
destroy s1
Executia unui program SR ^ncepe cu crearea implicita a unei instante a
resursei principale a programului. Codul initial al resursei poate la r^andul
sau crea instante ale altor resurse. C^and un program SR se termina, instanta
initiala creata a resursei principale este distrusa dupa executia codului sau nal.
Acest cod nal poate distruge la r^andul sau alte instante ale resurselor.
Codul initial este executat c^and este creata o instanta a unei resurse. Codul
initial este la acelasi nivel cu variabilele resursa si proc. Codul nal apare ca
un bloc de cod singular introdus prin cuv^antul cheie final si terminat cu end.
Poate sa apara oriunde ^n corpul resursei. Codul nal este utilizat pentru a
pune la r^and instanta unei resurse ^nainte ca instanta sa dispara. De exemplu,
daca instanta resursei creaza dinamic o lista ^nlantuita, atunci codul nal va
elibera memoria asociata cu lista. Se considera un exemplu:
resource foo body foo ( )
const N := 10; var a[N] : int
fa i := 1 to 10 -> a[i] := i af
const S := 20
var b[S,S] : int
begin # cod de initializare b
var c := 0
fa i := 1 to S, j := 1 to S ->
b[i,j] := c++
af
end
procedure ... end
final ... end
end foo
Cel mult o instanta a unui global va creata per masina virtuala. O
instanta a unui global este creata c^and este ^nt^alnit primul import al acelui
global. Forma generala combinata a unui global este:
global global_name
imports
declarations

393
body global_name
imports
declarations, statements, procs
final code
end global_name
In majoritatea cazurilor nu este necesara sectiunea corp a unui global (numai
daca declararea variabilelor din sectiunea de speci care este prea complicata
pentru a descrisa ^n acea pozitie). De exemplu, un global ce declara doua
constante este urmatorul:
global Characters
const TAB := '\t'
const CR := '\r'
end
si un global ce declara trei tipuri:
global Node
type node = rec (value: char; link: ptr node)
type head = ptr node
type tail = ptr node
end
si un global ce declara o variabila constanta si una partajata:
global Matrix
const N := 20
var m[N,N]: int := ([N] ([N] 0))
end
O resursa care utilizeaza cele trei globale de mai sus este urmatoarea:
resource foo ( )
import Characters, Node, Matrix
var x: Node.node
...
if x.value = Character.TAB -> ... fi
Matrix.m[3,4] :=: Matrix.m[4,3]
SR utilizeaza procese ca unitati ale sale de calcul concurent. Un proces este
un r de control independent care executa cod secvential. Forma unui proces:
process process_name (quantifier, quantifier, ...)
# corp
end
Numele procesului poate aparea optional dupa cuv^antul cheie end. Cuanti ca-
torii au aceeasi forma ca si cuati catorii din primitivele for-all. Se considera
exemplul multiplicarii matriceale:
394
Figura 4.18: Procese Ada
resource mult ( )
const N := 20
var a[N,N], b[N,N], c[N,N]: real
... # cite
ste valori ale lui a si b
process multiply (i := 1 to N, j := 1 to N) # c=a*b
var inner_prod:real := 0.0
fa k := 1 to N ->
inner_prod +:= a[i,k] * b[k, j]
af
c[i,j] := inner_prod
end
final
fa i := 1 to N -> # scrie c
fa j:= 1 to N ->
writes (c[i, j], ` `)
af
write
af
end
end mult
Procesul este o prescurtare pentru mecanismul SR general de concurenta care
este implementat prin operatii, proc, apeluri, send si in. Astfel un proces este
o operatie servita de un proc care a fost invocata printr-un send (Figura 4.18).
Primitiva co din SR ofera un alt mecanism pentru crearea dinamica a pro-
ceselor concurente:
co concurrent_command ... oc
unde ecare comanda concurenta consista dintr-o invocare si un bloc optional
de cod de postprocesare. Blocurile de post-procesare sunt executate unul c^ate
unul (nu sunt executate concurent). Urmatorul fragment de cod invoca o
instanta p pentru ecare valoare a lui i ^ntre 1 si N astfel ^nc^at a[i] este nenul.
Codul de postprocesare contorizeaza numarul de invocari si a seaza indicii lor:
cnt := 0
co (i := 1 to N st a[i] != 0) p(i) ->
begin
cnt++

395
write (cnt, i)
end
oc
Deoarece blocurile de post-procesare sunt executate unul c^ate unul nu sunt
necesare sectiuni critice pentru accesarea variabilei partajate cnt.
Un program SR ^ncepe cu procese care executa instructiunile de nivel ^nalt
^n resursa principala. Acest proces are prioritate zero. Orice nou proces
mosteneste prioritatea creatorului. Un proces poate schimba prioritatea sa
cu setpriority(n) si poate determina prioritatea sa cu mypriority( ). La
orice moment plani catorul executa unul dintre procesele neblocate cu pri-
oritatea cea mai mare. Procesele cu prioritate egala sunt executate ^ntr-un
modalitate ciclica. Daca un proces seteaza prioritatea sa la o valoare mai mica,
va da drumul la procesorul sau pentru un proces cu prioritate mai mare.
Modelul SR permite divizarea unui program^n unul sau mai multe spatii de
adresare numite masini virtuale. Fiecare masina virtuala de neste un spatiu de
adresare pe o masina zica. Comunicatiile ^ntre masinile virtuale sunt trans-
parente. Sintaxa interactiunii dintre resursele de pe masini virtuale diferite este
aceeasi cu sintaxa interactiunii ^ntre doua resurse pe aceeasi masina virtuala.
O masina virtuala este creata prin crearea unei instante a unei pseudo-resurse
vm. Daca un program ruleaza pe o masina zica numita marte si urmatorul
fragment de cod este executat atunci vor create trei variabile c1, c2, c3:
var c1, c1, c3 :cap vm
c1 := create vm ( )
c2 := create vm ( )
c3 := create vm ( ) on "saturn"
Prima si a doua masina virtuala ce creata pe marte, pe c^and a treia poate
creata pe masina zica numita saturn. Pentru a crea instante de resurse ce
ruleaza pe masinile virtuale se foloseste create:
create r(34) on c1
create r(22) on c3
create r(70)
si se creaza trei instante ale unei resurse r, prima pe masina virtuala c1, a doua
pe masina c3 si a treia pe aceeasi masina virtuala precum creatorul sau.
4.5.2 Linda
Linda este bazat pe un sistem de memorie virtuala partajata numit spatiul
tuplelor. In loc de a expedia mesaje de la un proces la altul, procesele creaza,
consuma, duplica si evalueaza obiecte date numite tuple. Desi implementarile
initiale ale conceptelor Linda au fost mai ^ncete dec^at bibliotecile native, versi-
unile curente sunt comparabile cu sistemele de trasfer de mesaje precum PVM
sau bibliotecile producatorilor de multiprocesoare.
Este un model de programare concurenta ce a fost dezvoltate la Yale Uni-
versity. Aplicatiile utilizeaza modelul Linda prin ^nglobare explicita, ^ntre
2 Rezumat: Ada este un limbaj concurent ^n care comunicarea ^ntre procese se face pe
baza de obiecte.

396
programe secventiale cooperative, prin constructii care manipuleaza spatiul
tuplelor. Linda este un concept de programare concurenta independent de
masina. Nu este un limbaj ^n sine ci o extensie a limbajelor secventiale exis-
tente care ofera procesare concurenta. De exemplu C-Linda este standardul C
cu extensii Linda. Astfel, din punct al programatorului, Linda este o multime
de extensii de limbaj pentru facilitarea programarii paralele ce ofera o abstrac-
tizare a memoriei partajate pentru comunicarea dintre procese fara a cere ca
hardware-ul pe care ruleaza aplicatiile sa partajeze zic o memorie. Mecan-
ismele implementarii Linda stabilesc si mentin spatiul tuplelor, ind utilizate
^n conjunctie cu biblioteci care interpreteaza si executa primitive Linda. De-
pinz^and de mediu (multiprocesoare cu memorie partajata, calculatoare paralele
cu transfer de mesaje, retele de statii de lucru, etc), mecanismele spatiului tu-
plelor este implementat utiliz^and tehnici diferite.
Spatiului tuplelor, concepul primar ^ntr-un sistem Linda, a fost propus ca
paradigma alternativa la cele doua paradigme traditionale ale programarii pa-
ralele: cea bazata pe partajarea memoriei si cea bazata pe transfer de mesaje.
Spatiul tuplelor este un spatiu de memorie logic partajat si adresabil aso-
ciativ ^n care tuplele sunt plasate sau sterse. Un tuplu este o colectie ordonata
de elemente de date. De exemplu, (3, 6, 8) este un tuplu ce contine 3 ^ntregi,
(3.5, "david") este un tuplu ce contine un real si un sir, ("worker", worker(
), 0) este un tuplu ce contine un sir, un apel de functie si un ^ntreg. Fiecare
tuplu este caraterizat de semnatura sa, care este o lista de tipuri de date ^n
tuplu. De exemplu, cele trei exemple de mai sus au semnatura (integer, integer,
integer), ( oat, string), (string, function call, integer). Exista doua tipuri de
tuple: pasive care contin date rezolvate si active care contin apeluri de functii
care nu au fost ^nca evaluate. C^and toate elementele unui tuplu activ au fost
evaluate, tuplul activ devine pasiv si semnatura sa se schimba.
In Linda se de nesc 6 primitive care opereaza pe spatiul tuplelor:
out, in, rd, inp, rdp, eval. Crearea unui tuplu se face prin apelul out,
care ^l va pasa ^ntr-un spatiu comun partajat cu toate procesele av^and acces la
el. Citirea unui tuplu este efectuat e prin rd sau in, unde rd doar citeste (du-
plica) tuplul si in consuma tuplul si ^l elimina din spatiul partajat. Potrivirea
tuplelor se face speci c^and un sablon pentru c^ampuri posibile ^n tuplu la apel
rd sau in. eval creaza tuple asincron, cu ecare c^amp al tuplului evaluat ^n
paralel (sau cel putin ^ntr-o ordine nedeterminista).
Primitiva out plaseaza un tuplu ^n spatiul tuplelor. Daca orice element
a tuplului nu este complet evaluat, atunci este evaluat ^nainte de plasarea ^n
spatiul tuplelor. Astfel out plaseaza numai tuple pasive ^n spatiul tuplelor. De
exemplu: out ("test_for_prime", 33) si out ("job", sqrt(64.0)) vor
plasa doua tuple ^n spatiul tuplelor, respectiv ("test_for_prime", 33) si
("job", 8.0).
Primitiva in elimina un tuplu din spatiul tuplelor. Daca se speci ca valori
ale tuplului, atunci numai tuplul cu aceleasi valori va eliminat. Daca nu
exista un asemenea tuplu, primitiva in asteapta p^ana apare^n spatiul tuplelor.
De exemplu, in("test", 4, "ok") va elimina tuplul ("test", 4, "ok") din
spatiul tuplelor. Daca se speci ca forme, atunci un tuplu cu aceleasi ele-
mente speci cate si care se potriveste cu tipul formelor va eliminat din
spatiul tuplelor. De exemplu, in ("test", ?number, ?result) va elimina
397
("test", 4, "ok"), daca 4 este numar si "ok" este rezultat.
Primitiva rd este similara cu in except^and faptul ca tuplul nu este eliminat
din spatiul tuplelor. Primitiva inp este similara cu in, except^and faptul ca nu
blocheaza daca un tuplu de potrivire nu exista ^n spatiul tuplelor. Primitiva
rdp este similara cu rd, except^and faptul ca nu blocheaza daca tuplul potrivit
nu exista ^n spatiul tuplelor. Primitiva eval este similara cu out except^and
faptul ca elementele tuplelor nerezolvate sunt rezolvate dupa ce tuplul este
plasat ^n spatiul tuplelor (plaseaza tuple active ^n spatiul tuplelor).
Exemplu: multiplicare matriceala. Programul ^n C-Linda este urmatorul:
#include <stdio.h>
#include <linda.h>
int main ( ) {
int i, x, y, z, a[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};
int bt[3][3]={1, 0, 2, 1, 2, 1, 1, 1, 1}, c_row[3];
/* liniile matricei A si coloanele matricei B */
out ("A", 1, a [1]); out ("A", 2, a [2]); out ("A", 3, a [3]);
out ("B", 1, bt [1]); out ("B", 2, bt [2]); out ("B", 3, bt [3]);
for (i=1; i <= 3; i++) eval ("worker", worker (i));
for (i =1; i <= 3; i++) in ("worker", i);
printf (Rezultatul este:\n");
for (i = 1; i <= 3; i++) {
in ("C", i, ?c_row);
printf ("%3d, %3d, %3d\n",c_row[0],c_row[1],c_row[2]);}
return 0; }
int worker (int index) {
int i, j, row [3], column [3], result [3];
rd ("A", index, ?row);
for (i = 1; i <= 3; i++) {
rd ("B", i, ?column); result [i] = 0;
for (j = 1; j <= 3; j++)
result [i] += row [j] * column [j]; }
out ("C", index, result); return (index);}

4.5.3 Express
Express este o colectie de unelte care individual adreseaza aspecte vari-
ate ale calculului concurent. Initial s-a bazat pe biblioteca de transfer
de mesaje CrOS de la Caltech. A fost dezvoltat si este comercializat de
ParaSoft Corporation. Pachetul complet suporta echilibrarea dinamica a
^ncarcarii, I/O paralel si o colectie de biblioteci pentru topologiile comune pre-
cum inel, plasa, tor, etc.
Filozo a din spatele Expressului este urmatoarea. Se ^ncepe de la crearea
unei versiuni secventiale a aplicatii si se urmeaza un ciclu de dezvoltare care
culmineaza cu o versiune paralela a aplicatiei care este aproape optimala. Ci-
clul de dezvoltare ^ncepe cu VTOOL, un program gra c care permite ca progre-
sul algoritmilor secventiali sa e a sat ^n maniera dinamica. Actualizarile si
3 Rezumat: Sistemul Express contine o multitudine de interfete gra ce ce permit progra-
marea rapida a calculatoarelor paralele si analiza aplicatiilor realizate.

398
referintele la structuri de date individuale pot a sate pentru a demonstra ex-
plicit structura algoritmului si a oferi cunoasterea necesara paralelizarii. FTOOL,
ofera o analiza a programului ce include analiza variabilelor folosite, structura
uxului; opereaza at^at pe versiunea secventiala c^at si pe cele paralele. A treia
unealta, ASPAR este un paralelizator automat care converteste programe C sau
Fortran pentru executie paralela sau distribuita utiliz^and modelul de progra-
mare Express. Inima sistemului sunt bibliotecile pentru comunicare, I/O si
gra ca paralela. Primitivele de comunicare sunt cele care se ^nt^alnesc ^n sis-
temele cu transfer de mesaje si includ o serie de operatii globale si primitive de
distribuire a datelor. A patra unealta este NDB, un depanator paralel.
4.5.4 P4
P4 este o biblioteca de macrouri si subrutine de nita de Argonne National
Laboratories pentru programarea unei varietati mari de masini paralele. Su-
porta at^at memorie partajata (bazata pe monitoare) c^at si memorie distribuita
(utiliz^and transferul de mesaje).
Sistemul p4 a fost initiat ca un sistem de macrouri pentru Fortran pentru
utilizarea pe calculatoare HEP cu memorie partajata. Pachetul initial, numit
MonMacs, ofera utilizatorului un set de functii de monitorizare utilizate pentru
accesul la sectiuni critice a codului asupra datelor partajate. Numele p4 provine
de la Parallel Programs for Parallel Processors. Desi a fost foarte e -
cient, nu este la fel de popular precum alte sisteme de transfer de mesaje;
a constituit ^nsa schema de baza pentru alte proiecte precum Chameleon,
BlockComm si MPICH.
Managementul proceselor este bazat pe un sier de con gurare care speci ca
rezerva de gazde, sierul de executat pe ecare masina, numarul de procese care
sa e startate pe ecare gazda si alte informatii auxiliare.
Exista notiunea de proces principal si procese secundare si ierarhii multi-
nivel pot formate pentru a implementa un model de calcul de grup (cluster).
Modul primar de creare a proceselor este static; crearea dinamica a unui pro-
ces este posibila numai de catre un proces creat static care invoca o functie p4
speciala care creaza un nou proces pe masina locala.
Sistemul p4 este bazat pe apeluri de procedura si este suportat de C si
Fortran pe o gama variata de sisteme. Paradigma de programare este cea a
proceselor care formeaza grupuri administrative care intercomunica via blocaje
si transfer explicit de mesaje. Nu exista apeluri asincrone, ci mecanisme de
rendez-vous. Transferul de mesaje se face prin primitive traditionale send si
recv cu mai multe variante pentru semantica, precum schimbul heterogen si
transfer cu sau fara blocare. Un apel global punct-la-punct p4sendr() produce
asteptare p^ana la sosirea unei ^nstiintari de la receptor (r de la rendezvous).
Managementul tampoanelor este lasat ^n seama utilizatorului. Se ofera de
asemenea o varietate de operatii globale ce includ difuzarea, minime si maxime,
sincronizare la bariera.
PARMACS (PARallel MACroS) a fost de asemenea initial un sistem de trans-
fer de mesaje bazat pe macrouri si pe MonMacs. Versiunile ulterioare, biblioteci
pentru C si Fortran au constituit cele mai portabile si mai e ciente sisteme de
4 Rezumat: P4 este o biblioteca de functii precum PVM-ul sau MPI-ul.

399
transfer de mesaje ^naintea implementarilor MPI. PARMACS suporta topologii
virtuale. Astfel comunicarea ^ntre procese poate realizata utiliz^and adresare
relativa ceea ce implica o usurinta ^n programare si depanare.
4.5.5 Biblioteci de functii pentru re de control
Numele de thread sau de proces cu pondere (greutate) usoara vine din expresia
thread of control ( r de control). Este utilizat la paralelismul functional:
la nivel de instuctiune (arhitecturi ILP), sau la nivel de proces. Ponderea este
usoara deoarece crearea relor de control, existenta, distrugerea si sincronizarea
sunt su cient de ieftine ca programatorul sa le utilizeze pentru toate necesitatile
concurentei. Astfel difera de procese care sunt ^n mod uzual cu pondere grea.
Threadurile sunt bucati mici de cod din interiorul proceselor care sunt exe-
cutate concurent sau ^n paralel ca entitati. Un thread este astfel o secventa de
instructiuni. Threadurile sunt create ^n si apartin de procese. Toate thread-
urile create ^ntr-un proces partajeaza resursele procesului, ^n particular spatiul
de adresare. Plani carea este realizata pe baza threadurilor. Astfel modelul
proces-thread este un model de plani care la o granulatie mai na dec^at cea
a modelului proces. Costul unui thread este mai mic dec^at cel al unui proces
deoarece toate threadurile din cadrul procesului partajeaza resursele.
Un thread este un ux secvential de control. In limbajele de nivel ^nalt,
threadurile sunt programate utiliz^and procese. In cazul unor re de control
multiple, la orice moment, programul are puncte multiple de executie, unul
per thread. Imaginea logica este cea a threadurilor care se executa simultan.
Exista un singur spatiu de adrese: toate threadurile unui program pot citi si
scrie aceleasi locatii de memorie. Variabilele globale si alocate^n heap (zona de
manevra) sunt partajate de catre rele de control. Fiecare thread are o stiva
de apel cu variabilele sale locale proprii. Utilizatorul este responsabil pentru
sincronizarea relor de control.
Diferite re de control pot rula pe procesoare diferite ale unui multiproce-
sor simultan. Se permite astfel proceselor sa suprapuna calculele cu unul sau
mai multe apeluri blocante la sistem. Comunicarea se face utiliz^and memoria
partajata. Acelasi binar este utilizat pentru uniprocesoare si multiprocesoare.
Resursele sistemului sunt e cient utilizate (structura procesului este partajata
de catre threaduri) si structura programelor este simpli cata.
Starile unui r de control pot (Figura 4.19): activ, rulabil (gata de ru-
lare dar ^n asteptarea detinerii controlului), adormit (^n asteptarea unei sin-
cronizari), stopat (suspendat), sau zombi (mort, asteapta curatire).
Implementarile relor de executie pot la nivel de utilizator sau nu-
cleu. Majoritatea sistemelor de operare dintre '80 si '90 sunt bazate pe mo-
delul proces-thread (de exemplu OS/2, Windows NT, SunOS 5.0). Interfata
thread a fost standardizata (IEEE POSIX 1003.40). Exista mai multe bib-
lioteci pentru threaduri. PTHREADS este un standard Posix similar cu
threadurile tipice Solaris. P4 de la Parmacs este cel mai rasp^andit
pachet. Threadurile pot implementate pe baza unor pachete precum
cthreads, Solaris threads, POSIX threads, prin constructii de limbaj
4 Rezumat: Sistemele de operare Unix si Windows permit programarea concurent a. La
dispozitia programatorilor de aplicatii pe aceste sisteme de operare se ofera biblioteci de
functii pentru crearea, controlul si comunicarea ^ntre procese.

400
Figura 4.19: Starile unui thread
precum cele din Ada tasks, MultiLisp, pot generate de compilator sau
suportate hardware precum la Cray si Tera MTA.
Componentele de baza a unei biblioteci pentru threaduri sunt crearea unui
r de control (cthread_fork, cthread_join), excluderea mutuala (mutex_t,
mutex_lock, mutex_unlock), asteptare la evenimente (condition_t,
condition_wait, condition_ signal, condition_broadcast). Exista doua
abordari de baza pentru crearea threadurilor: fork, rami carea unui thread din
acelasi proces ce partajeaza acelasi spatiu de adrese (la PTHREADS), sau spawn,
^nmultirea unui proces (cu aceeasi imagine) si rendez-vous pe o regiune parta-
jata a spatiului de adresare (la SYS V). Managementul spatiului de memorie
partajat se face ^n majoritatea cazurilor cu forme speciale de malloc/free (de
exemplu la p4 cu p4_shmalloc, p4_shfree, p4_malloc, p4_free). In cazul
F90 exista un singur thread ce porneste la rutina principala si merge p^ana la
sf^arsit. La MPI si Split-C toate rele de control starteaza cu rutina principala
si merg p^ana la sf^arsit. In cazul Solaris si P4 un singur thread principal este
startat si acesta creaza alti lucratori. In P4 o creare de thread arata astfel:
#include "p4.h"
main(int argc, **argv) {
p4_initenv (&argc, argv);
if (p4_get_my_id() ==0) p4_create_procgroup();
worker();
p4_wait_for_end(); }
worker (); {
printf("Hello %d\n",p4_get_my_id()); }
iar ^n cazul Solaris:
main() {
thread_ptr = (thrinfo_t *) malloc(NTHREADS sizeof(thrinfo_t));
thread_ptr[0].chunk = 0;
thread_ptr[0].tid=myID;
for(i=1;i < NTHREADS; i++){
thread_ptr[i].chunk=i;
if (thr_create(0, worker, (void*)&thread_ptr[i].chunk.0,
&thread_ptr[i].tid)) { perror("thr_create"); exit(1);} }

401
worker(0);
for(i= 1; i < NTHREADS; ++i)
thr_join(thread_ptr[i].tid, NULL);}
Sicronizarea se poate face de catre utilizator prin utilizarea de steaguri
(while(!flag){}). Majoritatea sistemelor ofera primitive de sincronizare de
nivel ^nalt precum barierele, semafoarele si monitoarele. De exemplu, ^n cazul
relor de control Solaris:
mutex_t mul_lock; barrier_t ba; int sum;
main() {
sync_type USYNC_PROCESS;
mutex_init(&mul_lock, sync_type, NULL);
barrier_init(&ba, NTHREADS, sync_type, NULL
.... /* spawn threaduri ca mai sus*/ }
worker(int me) {
int x=all_do_work(me);
barrier_wait(&ba);
mutex_lock(&mul_lock);
su=+mine;
mutex_unlock(&mul_lock); }
Sistemele de operare Windows 95/98 si NT sunt sisteme de operare mul-
titasking, ^nsa NT permite si multiprocesare cu memorie partajata. Un r
de executie ^n NT partajeaza spatiul de adresare al procesului care l-a creat.
Un proces ^n executie poate crea un nou proces prin apelul CreateProcess
din Win32 API si indicarea executabilului care va lansat (functionalitate
asemanatoare cu fork din Unix). Pentru crearea unui nou r de executie se
apeleaza CreateThread cu argument o functie care va executata. Un segment
de memorie partajata poate creat sau si atasat unui proces folosind functiile
CreateFileMapping, MapViewOfFile si OpenFileMapping (un proces creaza
prin functia de creare, ^l amplaseaza prin mapare ^n spatiul de adresare al pro-
cesului si celelalte procese ataseaza obiectul cu acelasi nume prin deschidere).
Crearea unui semafor se poate face prin CreateSemaphore, functiile de
asteptare ind WaitForSingleObject si WaitForMultipleObjects, iar functia
de eliberare, ReleaseSemaphore. Blocarea se poate face cu CreateMutex si
ReleaseMutex. Pentru exempli care se considera urmatoarea secventa de cod
^n C pentru reducerea concurenta a n elemente dintr-un vector a:
int a[1000],sum=0,i,p=5; HANDLE lock;
lock:=CreateMutex(NULL,FALSE,NULL);
for(i=0; i<p; i++)
CreateThread(NULL,0,(LPTREAD_START_ROUTINE) suma,&argu,0,i);
DWORD suma(LPVOID argu) {
int i=*( int*)argu, s=n/p, partial=0,j;
for(j=s*i; j<s*(i+1); j++) partial=partial+a[j];
WaitForSingleObject(lock,INFINITE);
sum=sum+partial;
ReleaseMutex(lock); return 0; }

402
Cuprins

1 Arhitecturi paralele 1
1.1 Notiuni caracteristice si motivatie . . . . . . . . . . . . . . . . . 1
1.1.1 Ce sunt calculul si calculatorul paralel? . . . . . . . . . 1
1.1.2 Domeniul procesarii concurente . . . . . . . . . . . . . . 6
1.1.3 De ce paralel? . . . . . . . . . . . . . . . . . . . . . . . . 8
1.1.4 Aplicatii ale calculului paralel si distribuit . . . . . . . . 10
1.1.5 Scurta istorie a supercalculatoarelor . . . . . . . . . . . 18
1.1.6 Tendinte tehnologice . . . . . . . . . . . . . . . . . . . . 23
1.2 Organizare hardware . . . . . . . . . . . . . . . . . . . . . . . . 27
1.2.1 Masurarea performantei calculatorului . . . . . . . . . . 27
1.2.2 Modele arhitecturale . . . . . . . . . . . . . . . . . . . . 33
1.3 Clasi carea arhitecturilor . . . . . . . . . . . . . . . . . . . . . 42
1.3.1 Clasi carea Flynn pe baza mecanismului de control . . 42
1.3.2 Exemple de masini paralele . . . . . . . . . . . . . . . . 51
1.3.3 Taxonomii diverse . . . . . . . . . . . . . . . . . . . . . 53
2 Teoria calculului paralel 59
2.1 Masurarea performantei . . . . . . . . . . . . . . . . . . . . . . 59
2.1.1 Timpul de rulare . . . . . . . . . . . . . . . . . . . . . . 59
2.1.2 Accelerare si e cienta . . . . . . . . . . . . . . . . . . . 60
2.1.3 Suprasarcina . . . . . . . . . . . . . . . . . . . . . . . . 63
2.1.4 Cost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.1.5 Reducerea costului de comunicare . . . . . . . . . . . . 67
2.1.6 Legile performantei . . . . . . . . . . . . . . . . . . . . . 68
2.1.7 Modele de performanta . . . . . . . . . . . . . . . . . . 70
2.1.8 Scalabilitate . . . . . . . . . . . . . . . . . . . . . . . . . 74
2.2 Paradigme ale programarii paralele . . . . . . . . . . . . . . . . 82
2.2.1 Compararea modelelor de programare . . . . . . . . . . 83
2.2.2 Niveluri de paralelism . . . . . . . . . . . . . . . . . . . 90
2.2.3 Linii de procesare . . . . . . . . . . . . . . . . . . . . . . 91
2.2.4 Calcul vectorial . . . . . . . . . . . . . . . . . . . . . . . 94
2.2.5 Fluxul datelor . . . . . . . . . . . . . . . . . . . . . . . 104
2.2.6 Paralelism la nivel de instructiune (ILP) . . . . . . . . . 105
2.2.7 Ierarhii de memorii . . . . . . . . . . . . . . . . . . . . . 108
2.3 Modele teoretice ale sistemelor paralele . . . . . . . . . . . . . . 110
2.3.1 Circuite . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
2.3.2 PRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
2.3.3 Modelul LogP . . . . . . . . . . . . . . . . . . . . . . . . 121
2.4 Memorie partajata . . . . . . . . . . . . . . . . . . . . . . . . . 125
2.4.1 Accesul simultan la locatii de memorie partajata . . . . 126
2.4.2 Problema corectitudinii la multiprocesoare bazate pe
magistrala . . . . . . . . . . . . . . . . . . . . . . . . . 127
403
2.4.3 Programarea sistemelor cu memorie partajata . . . .. . 141
2.5 Retea de interconectare . . . . . . . . . . . . . . . . . . . .. . 151
2.5.1 Mesaje . . . . . . . . . . . . . . . . . . . . . . . . . .. . 152
2.5.2 Criterii de clasi care a retelor de interconectare . . .. . 153
2.5.3 Topologia retelei . . . . . . . . . . . . . . . . . . . .. . 155
2.5.4 Rutare . . . . . . . . . . . . . . . . . . . . . . . . . .. . 172
2.6 Transfer de mesaje . . . . . . . . . . . . . . . . . . . . . . .. . 186
2.6.1 Arhitecturi cu transfer de mesaje . . . . . . . . . . .. . 187
2.6.2 Abstractizarea transferului de mesaje . . . . . . . .. . 191
2.6.3 Programarea pe baza transferului de mesaje . . . . .. . 196
2.6.4 Primitive pentru paradigma transfer de mesaje . . .. . 199
3 Algoritmi paraleli 218
3.1 Constructia algoritmilor paraleli . . . . . . . . . . . . .. .. . 218
3.1.1 Reteta unui program paralel . . . . . . . . . . . .. .. . 218
3.1.2 Paralelism ^n rezultate, agenda sau specialist . .. .. . 219
3.1.3 Tehnici algoritmice . . . . . . . . . . . . . . . . .. .. . 220
3.1.4 Clasi carea algoritmilor . . . . . . . . . . . . . .. .. . 225
3.1.5 Etapele crearii unui program paralel . . . . . . .. .. . 227
3.1.6 Descompunerea problemei . . . . . . . . . . . . .. .. . 232
3.1.7 Gruparea sarcinilor ^n procese . . . . . . . . . . .. .. . 237
3.1.8 Mapare prin ^nglobare . . . . . . . . . . . . . . .. .. . 239
3.1.9 Echilibrarea ^ncarcarii . . . . . . . . . . . . . . .. .. . 244
3.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . .. .. . 257
3.2.1 Insumare si operatii asociative . . . . . . . . . .. .. . 258
3.2.2 Sortare paralela . . . . . . . . . . . . . . . . . . .. .. . 264
3.2.3 Operatii concurente asupra numerelor ^ntregi . .. .. . 279
3.2.4 Liste, arbori, grafuri tratati ^n paralel . . . . . .. .. . 284
3.2.5 Algebra liniara . . . . . . . . . . . . . . . . . . .. .. . 304
3.2.6 Algoritmi diversi . . . . . . . . . . . . . . . . . .. .. . 338
4 Programare paralela 346
4.1 Difererentierea uneltelor existente pentru programare paralela . 346
4.2 Masina paralela virtuala: PVM . . . . . . . . . . . . . . . . . . 348
4.2.1 Scop si disponibilitate . . . . . . . . . . . . . . . . . . . 348
4.2.2 Partile si functionarea sistemului PVM . . . . . . . . . . 351
4.2.3 Aplicatii paralele cu ajutorul PVM . . . . . . . . . . . . 354
4.2.4 Medii de programare . . . . . . . . . . . . . . . . . . . . 373
4.3 Standardul interfetelor pentru transfer de mesaje: MPI . . . . 373
4.4 Limbaje pentru paralelism ^n date . . . . . . . . . . . . . . . . 384
4.5 Alte limbaje concurente si biblioteci de functii pentru procese . 388
4.5.1 Ada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
4.5.2 Linda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
4.5.3 Express . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
4.5.4 P4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
4.5.5 Biblioteci de functii pentru re de control . . . . . . . . 400

404

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