Documente Academic
Documente Profesional
Documente Cultură
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 grace).
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, identicator 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 denitii si sisteme de clasi-
care. O denitie 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. Denitia 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 dicila 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 ecient o anumita aplicatie.
Ecienta 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 identicator de proces (identica-
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 sosticat
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 geograca,
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 ecient si paralel
Limbaj sa exprime algoritmul fara a ascunde paralelismul
Compilator sa trateze particularitatile limbajului si ale arhitecturii
Architectura comunicatii eciente, 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 ecienta si corecta a problemei de interes. Preocuparile
unui programator al unui calculator paralel sunt acelea ale oricarui alt pro-
gramator: designul algoritmului, modalitatea exprimarii, ecienta 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, prolatori de
performanta) care permit diagnosticarea si corectarea erorilor si problemelor
de performanta; formulari convenabile ale algoritmilor ecienti 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 dicila 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 ecient 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
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
graca. 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 ecient 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 geograca
imensa, si calcule semnicative 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 planicate 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
stiintic 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 geograca. Aplicatia poate implica mai multe piese ale unui echipa-
ment specializat sau oameni localizati ^n pozitii geograc 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 simplica
rationamentul asupra unui sistem software. Aceasta este ratiunea pentru
care interfetele grace 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 ecienta (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 dicila.
Un singur procesor poate atinge astazi sute de milioane de operatii^n virgula
otanta per secunda (M
ops). Totusi multe probleme stiintice 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
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
luminii, c = 3 10 m/s. Astfel r < c=10 = 0:3 mm. Deci memoria de 1TB
8 12
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 stiintico-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 grace; 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 stiintice si ingineresti.
Nu se identica 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 stiintic 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 justicat
a la rezolvarea unor probleme
stiintice 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: graca (redare scene), simulare (prevestirea vremii, di-
namica moleculara), inteligenta articiala (retele neuronale, cautare), biologie
(cautarea genelor), design hardware (vericarea cipurilor), geozica, astrozica,
optimizare neliniara, dinamica
uidelor si a aerului, chimie computationala,
modelarea materialelor, modelarea neuronala, baze de date, medicina (tomo-
grai 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 stiintic, care poate avansa prin
aplicarea resurselor de calcul de ^nalta performanta. Marile provocari sunt
acele proiecte care sunt prea dicil 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, graca sau animata (vizualizare stiintica). 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 stiintice 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 suciente 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
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
dec^at ^i este necesar naturii. Daca calculatorul are 1000 de procesoare care lu-
creaza cu o ecienta 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
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 specice pentru oceanograa 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, astrozica 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 semnicativ utilitatea datelor. Printre marile provocari
din domeniul astrozicii 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 ecacitatii unui
medicament poate realizata astazi prin simulare; pentru aceasta este nece-
sara cunoasterea conguratiei 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 specica. 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 suciente ^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 dicila. O alta abordare este aceea de a asigna procesoare
la regiuni specice 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, ecienta combustiei), aeronautica (ana-
liza curentilor de aer, ecienta motoarelor, mecanica structurii, electromag-
netism), design asistat de calculator, farmaceutica (modelare moleculara),
vizualizare, cinematograe (lme precum Toy Story), arhitectura (plimbari
virtuale si redarea imaginii), modelare nanciara (analiza productiei), ana-
liza elementului-nit, inteligenta articiala (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 ecienta 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 trac etc. Cele mai
mari benecii 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 gracii 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, ecienta 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 ecient poate conduce
de asemenea la costuri reduse de combustibili. Pentru a atinge ^mbunatatiri
semnicative ^n ecienta 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
benecia 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 geograc). 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
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
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
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) denit 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 dicila compararea mips a
doua masini diferite chiar daca utilizeaza acelasi program.
Mops. Acest termen deneste 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
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 verica 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 simplicata a codului
original, neind ^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 clasicate 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
stiintic, 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 modicarea 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 specica.
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-
tica 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 vericat 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 modicate 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 sucient 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
modicata), 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
42
Figura 1.31: (a) SISD; (b) MISD; (c) SIMD; (d) MIMD
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 ramicatiilor (Figura 1.38).
MIMD. Este cea mai generala si mai puternica masina din clasicarea 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: Clasicare 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
47
Figura 1.39: MIMD
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
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 identica doua tipuri dis-
tincte de calculatoare paralele corespunzator modalitatii ^n care respecta
instructiunile: sincron sau asincron. Ulterior aceastea pot clasicate 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 prota 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 prota 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.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 modicarea 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 clasicarea Handler
Tabelul
58
2. Teoria calculului paralel
2.1 Masurarea performantei
Pentru a cuantica performanta algoritmilor concurenti este necesara denirea
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
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 dicil 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 ecienta
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. Ecienta
indica gradul de utilizare a procesoarelor disponibile pentru o aplicatie data. Sunt de preferat
valorile ridicate ale accelerarii si ecientei.
60
Figura 2.1: Accelerare: (a) Sub-liniara; (b) Pentru un numar dat de procesoare,
accelerarea creste cu dimensiunea problemei n
Sursele de inecienta care contribuie la accelerarea subliniara (Figura 2.1) sunt
concurenta insucienta,^nt^arzieriile^n comunicatii sau datorate sincronizarilor.
Daca accelerarea unui program paralel depaseste p, programul este numit
supra-liniar (sau super-liniar). Desi armatiile 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 ramicare 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 protabile, 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 denita 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
62
Tabelul 2.1: Accelerarea teoretica si ecienta ^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 ecientei sunt prezentate ^n Tabelul 2.1.
2.1.3 Suprasarcina
Daca ecienta, 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, ecienta 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
ecientei 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 insucient (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 sucient 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
fel o sarcina de O(n log n); nu este ecient ^n lucru deoarece sortarea seriala
2
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
67
Figura 2.6: Competitie: (a) Structurare stap^an-sclavi; (b) Structurare tip ar-
bore
individuale, inechilibru ^ntre procesoare, probleme perde 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 justice 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 prolul 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 justicata.
Legea lui Gustafson. Arma 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. Arma ca algoritmii precum cautarea binara,
ramicare 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
denit un algoritm paralel ca ind ecient 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 armatie nu a fost dovedita ^n general, dar poate
utilizata pentru a determina daca modelul calculului paralel este rezonabil.
Problemele care sunt rezolvate ecient pe masina paralela trebuie sa e
rezolvabile ^ntr-un numar polinomial de pasi. Un algoritmk paralel rapid este
denit drept unul ce necesita timp polilogaritmic (O(log (n))) utiliz^and un
numar polinomial de procesoare. Se poate formaliza aceasta denitie 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 denita drept NC =
k NC . Majoritatea problemelor interesante exista ^n primele c^ateva nivele
NCk , de exemplu sortarea paralela, invertirea matricelor, planicarea joburilor
de marime xa, probleme de cale cea mai scurta, etc. Problemele din ierarhia
NC sunt problemele care pot rezolvate ecient ^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 identicarea
inecientelor ^nainte de implementare si a optimizarilor potentiale. Modelele
pot considera numai anumite aspecte: costul executiei sau scalabilitatea.
Se reamintesc metricele de performanta anterior denite: complexitatea
secventiala TS (n), timpul de rulare concurent TC (n; p), accelerarea S (n; p) =
TS (n)=TC (n; p), ecienta 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
Ecienta 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 verica acuratetea potrivirii si fazele
sunt ranate 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
performanta = tn = 1 + rn1 =n ;
n =
1 2
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 modica
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
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 ranat
0
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-denit 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, graca,
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 congurare 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 denirea 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 identica parametrii relevanti ai problemei. Se identica parametrii de
resurse. Se decide care abordare sa e considerata. Apoi se planica, exe-
cuta si analizeaza experimentele.
Scalabilitatea sistemului de calcul
Data ind o problema de marime xa, ecienta procesorului descreste cu
cresterea numarul de procesoare. Data ind o problema rezolvabila pe un
numar x de procesoare, ecienta creste c^and dimensiunea problemei creste.
Performanta este astfel relationata de numarul de procesoare si dimensiunea
datelor. Un sistem paralel este scalabil daca ecienta 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 tracul, ^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 ecienta 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
Denitia 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, izoecienta pentru ecienta paralela xata, sau
izoviteza pentru viteza xata. Se considera urmatoarele notatii. Metrica pri-
mara pentru evaluarea performantei este timpul de rulare Tp. Ecienta pa-
ralela este calculata relativ la timpul celui mai bun algoritm secvential, Ts.
Cantitatea de lucru este Wp . Rata de operatii per secunda este denita prin
r = Wp =Tp. Accelerarea absoluta este Sa (p) = Ts =Tp(p). Accelerarea rel-
ativa este Sr (p) = Tp(1)=Tp(p). Viteza este denita prin V (p) = r(p)=p.
Ecienta absoluta este Ea(p) = Sa(p)=p = Ts=(Tp(p)p), iar ecienta 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), ecienta 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
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 ecientei
la cresterea dimensiunii problemei si numarului de procesoare. Dimensiunea
76
Figura 2.8: Algoritmi nescalabili, scalabili si ecient 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 ecient daca este scalabil si este ecient ^n lucru
(Figura 2.8). Un algoritm este perfect scalabil daca ecienta 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 ecienta 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 denirea ecientei, 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
deneste 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 denirea
accelerarii, ecientei, 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
N (p) p Sm (p) 1
Sm (p) = m =
tm (p) 1 + n1 log p ; Em (p) = p = 1 + n1 log p :
1 1
de memorie per procesor este k =p, care se diminueaza cu radacina cubica din
2
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
ecienta E = S=p = W=(W + T (W; p)) = 1=(1 + T (W; p)=W ). Daca W este
0 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
denire este pe baza ^ndeplinirii conditiilor T (W; p) = O(W ); W = O(f (p))
unde f este functia de izoecienta.
0
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
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 denite 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 specica 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
Exemplicare. Se considera problema determinarii sumei in f (A[i]). 1
Se observa ca, pentru evaluare paralela, ecare evaluare de termen sau suma=0
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
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 specica 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 specicarea explicita a comunicarii datelor
de la producatori la consumatori. Desi apare necesitatea utilizarii blocajelor si
monitoarelor, modelul simplica dezvoltarea programelor. Totusi ^ntelegerea
si managementul localitatii pot mai dicile 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 identicat 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 ecient 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 clasicate 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 clasicate dupa modul ^n care suporta explicit sau implicit mod-
elele de programare paralele. Un sistem paralel explicit cere ca programa-
torul sa specice direct activitatile unor re de control concurente multiple
(programatorul specica maparea datelor si lucrul). In contrast, un sistem
paralel implicit permite programatorului sa specice, la un nivel ^nalt, com-
portarea programului ^n care paralelismul este reprezentat direct; este res-
ponsabilitatea compilatorului sau bibliotecii sa implementeze acest paralelism
ecient si corect (se utilizeaza un limbaj secvential pentru specicarea 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 simplica 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 prota 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 sosticate 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 clasicate 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 clasicarea 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
ramicari, 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 sucient 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 clasicate 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 planicare ^n ordinea data ^n timpul
cel mai scurt si determinarea celei mai bune planicari 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 planicare 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: Planicarea joburilor: (a) P
astr^and ordinea; (b) Planicarea 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. Planicatoarele 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
grace, 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 planica 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: Denitii
Denumire Inteles
Coliziune competitia pentru unitatea functionala
Initiere timp specic pentru o instanta
Latenta numarul de pasi de timp ^ntre initializari
Ciclul latentei o iteratie repetitiva
Latenta interzisa multime de sarcini care cauzeaza coliziunea
Figura2.14: (a) Tabel de rezervare; (b) Managementul resurselor ^n cazul seg-
mentelor unui sarcini A
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
Ecienta 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 dicila echilibrarea sarcinilor. Astfel frecventa
1=Tcl 1= maxifTig. Int^arzierea liniei (latenta; timpul petrecut ^n linie) cu
k faze este kTcl. Inecientele sunt datorate ^ntreruperilor, inechilibrului si
timpului de umplere a liniei. Intreruperile pot apare de exemplu ^n ramicari
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. Ecienta 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.
Clasicarea 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 ecient operatiile aritmetice pe elemente de date numite vectori.
Asemenea masini sunt utile^n mod special^n calculul stiintic^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: Clasicare pipeline
Criteriu Clasicare Exemple
Ierarhie Aritmetic Pipeline ALU
Instructiune Suprapunere ^naintare/executie
Procesor Un procesor per etapa
Functie Uni-functie Adunator
Multi-functie Recongurabil pentru diverse functii
Recongurabilitate 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
ecient 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 vericari 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
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 congurati 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 eciente 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 eciente 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
ecienta 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
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 denita ^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 verice
daca exista o dependenta ^ntre iteratiile ciclului. Majoritatea compilatoarelor
vectoriale si paralele includ analiza anumitor dependente ale codului. Analiza
include si vericarea aparitiei operatiilor de reducere si relatiilor de recurenta.
2.2.5 Fluxul datelor
In modelul de programare bazat pe
uxul (tracul, 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 ecienta 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 modicarea 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 ramicare (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 ramicare 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 ramicare 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, planicarea pipeline de baza, plani-
carea dinamica cu tabla de scor, planicare dinamica cu redenumirea registrilor,
pronosticarea dinamica a ramicarii, ^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 planica 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. Planicatorul 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).
Planicarea instructiunilor. Procesarea pipeline avansata este reprezen-
tata prin planicarea dinamica ce admite hazardul (dependenta datelor), al-
goritmul Tomasulo si predictia dinamica a ramicarii. Printr-o planicare 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 vericata 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 (ramicari sau alte
instructiuni care pot schimba controlul programului). Planicarea 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.
Planicarea 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
planicarii 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 claricat 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 vericata, 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, notica
tabla de scoruri.
5. La scrierea rezultatelor se verica 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 suciente 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 prota 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
eciente 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
111
Figura 2.26: Insumarea a 16 numere pe baza unui arbore
Ad^ancimea unui circuit c, notata depth(c), este lungimea celui mai lung
1 2 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
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
+
113
Figura 2.28: Arhitectura PRAM
clasicate ^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
identicator unic ^n domeniul 1 p. La ecare unitate de timp, un procesor
este e activ e inactiv depinz^and de identicator. 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 specice 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
riile locale ale procesoarelor. Aceste trei modele de stocare a intrarilor sunt
echivalente, data ind o memorie sucienta (daca n m). Iesirile pot
denite ^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 ramicare 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 predente, 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, denit 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 clasicarea 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 clasicare 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
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
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 dicila. 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 identica-
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):
( )
121
Figura 2.30: Studiul sortarii pe o masina paralela reala
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)
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 ecient 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
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
126
Figura 2.38: Solut
ionarea unei conditii de concurenta prin ordinea program si
ordinea dependentelor
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 denit (^n multiprocesare se poate
stabili doar o ordine partiala nu una totala). "Ultimul" trebuie denit ^n ter-
meni de ordine program, nu timp precum ^n programele secventiale (ordinea
operatiilor denita de limbajul masina). "Urmator" trebuie denit^n mod ana-
log. In cazul paralel, ordinea program este denita ^n cadrul unui proces, si
trebuie redenita 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 indenit 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 modicat ("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 trac. 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 modica BusRd, cererea
unei copii exclusive cu intentia de a o modica 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 modicata (D; S D)^n L este^n starea modicata ^n L (la BusRd, L
1 2
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
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
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). Tracul 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
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 sucienta 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 sucient 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 specica 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
specica 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
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 verice 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
predenit 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
denite 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 denit V , nu specica
procesele suspendate care vor trezite. Urmatoarele relatii sunt valabile:
S 0; S = S + N (V ) N (P )
0
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 armatie 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
denitii. 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 armatie, 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
143
Figura 2.56: Masa lozolor
Daca tamponul este innit, atunci N (elemente) 0 si N (elemente)= 0+
in_pointer out_pointer, din denitia semaforului elemente, cu valoarea
initiala 0. Procedurile de mai sus pot modicate 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 lozolor. O institutie angajeaza cinci lozo pentru a
rezolva o problema foarte dicila. 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. Filozoi, neind 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 ecienta ^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 indenit. 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
lozoi 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 denite 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 planicat 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 } }
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 lozolor 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 lozoi 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.
Dicultatea 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 verica 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 ecient. 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 tracul.
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 dicultatii 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
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 tracul 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 clasicare 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 identicator 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: Clasicarea 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
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 identicate 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 deneste 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 denit 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
denita 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 tracului
=0
actual generat de aplicatiile care ruleaza pe retea si pentru a estimat aprioric
se presupune o distributie uniforma a tracului.
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), ecienta prin alocare optimala.
Conectivitatea este o masura a multiplicitatii drumurilor ^ntre oricare doua
procesoare din retea. Conectivitatea unui graf este denita 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 ecient 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.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
^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
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
din B B , sau-ul exclusiv ^ntre B si B ). De exemplu, pentru 011 si 101,
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.70: Trei partitionari distincte ale unui hipercub 3-dimensional ^n doua
hipercuburi 2-dimensionale
Hamming a reprezentarii identicatorilor 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 denita 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
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)
Congurarea comutatoarelor
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 semnicativ 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
v = v : : : vr este: u ur ! u : : : ur v ! u ur v v ! u ur v v
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
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
( ) ( )
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
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
171
2.29: Hopuri
Tabelul
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 specica 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 sucienta 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 tracul 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.
Clasicarea 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 buer 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 nesemnicativ 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 buer 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
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
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 trac 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 tracului,
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 trac 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
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
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 sucient, el trebuie ^ntretinut
(datorita unor schimbari de cost sau esecuri de legaturi). Pentru a realiza
aceasta ecient, toate nodurile trebuie noticate 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 prexate 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 prote
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 denitie
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 identicator crescator ^n post-ordine. Nodurile parinte vor
avea ^ntotdeauna o valoare mai mare dec^at valorile ilor. Nodurile expediaza
cel mai mic identicator 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
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 tracului. In
retea, distribuirea tampoanelor de-a lungul unor canale virtuale multiple este
mai ecienta 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 deneste 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 trac ^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 modicate; (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, simplica 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 specicate ^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
verica 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
188
Tabelul 2.33: Tranzactii pe retea
Tema Translatarea de la virtual la zic si vericarea 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
Specicarea 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
(verica daca coada de iesire nu este plina). Asistentul ^n comunicare verica,
translateaza, planica, 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 identicator 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 aseaza identicatorul 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 specic de la
un proces la altul, si primitiva de receptionare care receptioneaza un mesaj
pe un canal specic 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 specica tamponul care va transmis (numirea
datei locale de catre procesul utilizator). La receptionare se specica 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 vericare 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 vericare a datei si o adauga la cu suma de vericare 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 conrmare 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 { vericare 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 specica.
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.
Denirea formala a modelului. Calculele ^ntr-un sistem cu transfer de
mesaje trec printr-o secventa de conguratii. In conguratia 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
conguratia 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
innita) 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
Intr-un model asincron, o executie este admisibila daca ecare procesor are
+1
196
Tabelul 2.35: Monitor contra transfer de mesaje
Programe bazate pe monitoare Programe bazate pe mesaje
variabile permanente variabile server locale
identicatori 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 ramicare 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-
cica 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
pozitiile corecte ^n listele proprii de numere sortate. Deoarece expedierea si
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
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 modicat cele
n=k valori; daca nici un proces nu a modicat lista sa atunci controlorul cen-
tral replica printr-un mesaj de terminare. A doua varianta este executia unui
numar sucient de iteratii pentru a garanta ca lista va sortata (k iteratii).
Exemplu 2: problema cinei lozolor 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 lozolor 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, verica daca nu a fost utilizata si este murdara. Protocolul curata
198
furculita, o da la procesul care o cere si previne ^nfometarea lozolor de catre
procesele de asteptare care elimina o furculita ^nainte ca cealalta furculita sa
apara. Acest algoritm este numit algoritmul igienic al lozolor.
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] } }
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 conrmarii
202
Figura 2.111: Expediere/receptionare ^ntr-un inel
2.37: Operatii de informare
Tabelul
203
Figura 2.112: (a) Difuzare; (b) Comunicare unul-la-mai-multi
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
Comunicarea porneste de la cel mai semnicativ bit. In total sunt log p pasi de
comunicare. La pasul i, nodurile cu cel mai semnicativ 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
208
Figura 2.122: Comunicare personalizata unu-la-toti ^ntr-un (tor,SF): (a)
Distributia initiala a datelor; (b) Distributia dupa comunicarea pe linii
Xp
log
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
i=1
Drept aplicatie se considera calculul sumei prexate (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
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
( )
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
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), identicarea 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
specica 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 denind 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 identicarea
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
graca 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 denitii
specice 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
denit recursiv TS (n) = aTS (n=b) + nc. Solutia ecuatiei recursive este
O(n b a ); daca logb a > c
( log
r = g(f (x ); f (x ); : : : ; f (xl ))
1 2
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
asteapta asa ca este posibil sa utilizeaze a pentru a calcula F , adica F = F .
1 2
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
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
Ci indica faptul ca procesorul utilizeaza xi ^n calculele sale. Timpul per iteratie
3
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 specice masi-
nii si se stabilesc procesele ce efectueaza sarcinile; subetapele sunt:
D: identicarea concurentei si descompunerea problemei ^n sarcini con-
sistente,
A: denirea asignarii sarcinilor (si datelor) la procese.
O: orchestrarea dependentelor prin:
C: identicarea 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
identica concurenta si se decide la ce nivel va exploatata. Concurenta poate
denita static sau poate varia dinamic. Poate sa depinda de dimensiunea
problemei sau de datele particulare de intrare. Numarul de sarcini trebuie sa
e sucient 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 sucienta 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 specica 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 ecienta.
Partitionarea (descompunerea si asignarea) este uzual independenta de arhi-
tectura sau modelul de programare.
Se considera exemplul simplicat 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
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 planicarea ^n timp a proceselor. Este o etapa apropiata de arhitectura, iar
alegerile pot depinde de abstractizarea comunicarilor si ecienta 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
denesc variabilele partajate si structurile de date (structuri globale explicite,
comunicare implicita), nu este necesara vericarea 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, planicarea 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 specice 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-
cica 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 modicat. 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
232
Figura 3.9: Cre sterea timpului de executie datorat: (a) Fractiei seriale a algo-
ritmului; (b) Concurentei insucienta; (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 verica 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 semnicativa 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 stiintica
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
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
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
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
237
Figura 3.15: Distribuirea unei matrice pe blocuri
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 identicarea fazelor sincrone
logic de comunicare si calcul.
Granularitatea unei sarcini este denita 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 ecienta 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 identicare 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
identica 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 dente recursiv astfel: dat un cod Gray de d-biti,
codul Gray de (d +1)-biti poate construit prin listarea codului Gray pe d-biti
prexat de 0, urmat de codul Gray pe d-biti ^n ordine inversa prexat 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.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 simplicata a
unui SE ; (b) SE pe un tor 3 4; (c) SE pe un tor 4 4; (d) Un arbore
(3) (3) (3)
cel al parintelui ^n exact un bit. In mod similar, nodul 1 = (0001) are i 3 =
2 2 2
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.
Denirea 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 denita
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 planicarea proceselor alocate la un procesor. Imaginea curenta este aceea ca
alocarea este mai importanta dec^at planicarea, ^n particular pentru anumite
conguratii 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
denite 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.
Denirea unui algoritm tipic pentru echilibrarea ^ncarcarii are trei politici
245
inerente: politica de informare ce specica cantitatea de informatii de^ncarcare
disponibila proceselor de decizie a plasamentului, politica de transfer ce spe-
cica 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 specica 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 cuanticata 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 verica 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 planicare dinamica si o migrare a proceselor.
246
Figura 3.22: Clasicarea Casavant-Kuhl a algoritmilor de echilibrare a^ncarcarii
Clasicarea 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 planicarea pe baza de prag.
Intr-o planicare 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 planicari 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 planicate pe l^anga acesta.
Planicarea 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.
Planicarea optimala ^n cazuri speciale poate produsa prin solutii opti-
male locale sau metode suboptimale. Metodele de planicare cu solutiile locale
optimale se bazeaza pe tehnici de cautare eciente 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 planicarea initiala, evalueaza noua planicare, 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 planicare; procesul consta ^n denirea unei functii obiec-
tiv care trebuie minimizata, de exemplu timpul de executie al programului si
^nt^arzierile ^n comunicare, apoi denirea 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 ramicare si limitare
pentru a conduce o cautare a unei solutii de planicare pe o arhitectura data;
aceasta este realizata prin construirea unui arbore de cautare a planicarilor
posibile, denind o functie de evaluare a costului si cautarea arborelui pentru
cea mai buna planicare. 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 planicare este cooperativ sau necooperativ (planicare aleatoare).
Intr-o politica centralizata, un element de procesare este desemnat drept
planicator 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 planicatorul 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 clasicati ^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 clasicare neierarhica este cea a algoritmilor
adaptivi sau neadaptivi: un algoritm este adaptiv daca parametrii algoritmu-
249
Figura 3.24: Exemplu pentru algoritmul lui Coman
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 Coman. 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 deneste l(x) ca ind secventa descrescatoare de etichete a succesorilor
imediati ai0 lui x. Se eticheteaza x cu j daca l(x) l(x0) (lexicograc) 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 eciente 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 eciente 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 identica 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 justicat 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 planicarea dinamica fara eliminare (numita si plasare
dinamica) procesele sunt eligibile pentru redistribuire numai^nainte de pornirea
executiei lor. In planicarea 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.
Planicarea proceselor
Una dintre temele cele mai dicile 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 planicarea 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.
Planicarea locala efectuata de sistemul de operare al unui element de proce-
sare consista ^n asignarea proceselor la intervale de timp. Planicarea 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 planicarii sarcinilor. Teoria planicarii 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
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
^n cazul unui sistem de joburi, iar 2 f;; no waitg se refera la timpul de
7
maxfrj ; CU 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
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
planica (T ; T ; T ; T ; T ; T ; T ) pe o lungime 53. Planicarea 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
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 prexate, ^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-prexate). 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 ecient. 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 prexata)
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
ciativa, nu necesar XOR; poate orice operator precum ^; _; max; min; etc).
1
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
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
sucient 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
procesoare. Baleiajul poate realizat ^n timp O(log n), dar lucrul total este
O(n ), astfel ^nc^at algoritmul nu este cost-optimal.
2
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
problemei initiale.
6 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 (prexele pentru lungime impara), iar G(2n) = G(n) + n
(sumele perechi initiale) +(n 1) (prexele 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-ecienti. 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 ecient
un algoritm paralel ecient ^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 prota de beneciile 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 ecient ^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
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
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 modicare 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
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 : ( )
Intr-o operatie compara si despica, ecare proces are un bloc de marime
=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 semnicativ 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
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
al lui S este mai mic sau egal cu ecare element al lui S . Prin aceasta
1 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
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 izoecienta este
2
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
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
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 izoecienta este O(p p log p).
log log 2
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
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
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
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 ecient pentru
numere prime se cauta ^n primul r^and un algoritm secvential ecient.
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
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
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
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-ecient 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
O(m) pentru celelalte doua reprezentari. Grafurile rare sunt reprezentate mai
ecient 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 articiala, ^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
ecienti. Pentru alte probleme, precum drumul cel mai scurt cu o singura
sursa, nu exista algoritmi cunoscuti paraleli ecienti, 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 dicila, 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 exemplicare; (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; j ) este ^n MWST daca si numai daca wij < wijn .
( )
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
Algoritmul este cost-optimal daca p = O(n= log n); cu izoecienta 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 izoecienta
Inel O( n) O(n ) = O(p )3 2 4
Grila O(n = ) 2 3
O(n = ) O(p )4 3 3
O(n2 ) 1
Tp = O
n2
p
+ O(npp); S=
O(n =p) + O(npp)
2
; E=
1 + O(p : =n) : 15
(dijk ), unde dijk este lungimea celui mai scurt drum de la i la j care trece prin
( ) ( )
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
( )
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 dicila. 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 ecienta 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
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
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
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)
dlog(n 1)e multiplicari modicate. Algoritmul secvential necesita O(n ) pen-3
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 ecient-^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 identica 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
298
Figura 3.76: Algoritmul RM: (a) Clasicarea 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
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
aijk = 1 daca j poate atins din i trec^and prin mai putin de k noduri
( )
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
( )
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
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 deneste implicit muchia directa (u; vi ). Unul dintre pointerii sai pointeaza
spre v^arful v i mod d (care deneste implicit muchia directa (u; v i mod d),
( +1) ( +1)
303
Figura 3.83: Determinarea ad^ancimii v^arfurilor unui arbore: (a) Exemplicare;
(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 deneste implicit
muchia directa (vi ; u)). Astfel exista sucienta informatie pentru a calcula
functia succesor denita anterior, ce poate evaluata pe un PRAM EREW ^n
O(1) pasi cu complexitatea lucrului O(n), ceea ce este ecient ^n lucru.
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 2n=( + ). 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 stiintice.
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 exemplicare 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 specica 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
Figura 3.86: (a) Pasul de comunicare ^n cazul p = n = 16; (b) Conguratia
2
nala ^n cazul p = n ; (c) Pasul de comunicare ^n cazul p = 16 < n = 64; (d)
2 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) conguratia
nala
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
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
necesita un timp n =(2p ). Deoarece ecare procesor are p blocuri, este necesar
2 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
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
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
310
Figura 3.93: Variante ale multiplicarii matriceale secventiale
Daca m este numarul de referiri la memoria lenta, m = 3n + n . Numarul de
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
de n ori, si ecare linie a lui A o data pentru ecare i), si 2n citiri si scrieri
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
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
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
313
Figura 3.96: Agoritmul lui Canon: (a)-(b) Inclinare; (c)-(f) Multiplicari si de-
plasari
este la fel de ecient, ^nsa poate utilizat daca exista suciente 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
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
apoi se efectueaza o difuzare unu-la-toti a lui Bi;j de-a lungul axei i (adica se
0
primei coloane a lui B. Valorile Ai;k si Bk;j sunt multiplicate de procesorul
Pi;j;k . Fiecare element al sumei denitorii 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
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
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
O(n ) = O(n : ) dar necesita mai multa memorie dec^at algoritmul standard
log 7 2 81
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
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
i j . Putem verica 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
Daca aii 6= 1 se deneste 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
A = A 0 1 1
1
A 3 A2 A1 1 A3 1
1
inversei are log n faze de divizare (jos) si de revenire (sus). Timpul este T (n) =
3 2 1
1
xi = (bi ai xi ai;j xi )
aii 1 1 1
317
Figura 3.99: Implementarea substitutiei regresive
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 prexat. 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 deneste 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
Se utilizeaza calculul prexat 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 identica 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
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)
Cjki ( )
= Cjki
( 1)
Cik(i 1)
Cii(i 1)
Utiliz^and n procesoare, se pot gasi ntoate intrarile lui C i ^n trei unitati de
2 ( )
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)
dt dx2
Pentru simplicitate se presupune ca C = 1. Se discretizeaza at^at timpul c^at
si pozitia. Se utilizeaza diferentele nite cu Uij denind 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
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
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
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 :
Figura 3.114: Graf si tipar { ecuatia caldurii: (a) 1D; (b) 2D
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
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)
(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
(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)
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
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
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. Ecienta este E (p) = 1=[1 + =(3g)] si supra^ncarcarea
f = =(3g). Cum ecienta 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
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
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 dicila 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 innita 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 coecientii 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
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.127: Re-etichetare: (a) Initial; (b) Sortat; (c) Numai o componenta;
(d) Re-etichetat
iar W (n) = 2W (n=2) + O(n) = O(n log n); algoritmul este lucru-ecient.
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 exemplicarea primei tehnici, relatia recursiva xi = axi + bixi ; i
2, unde valorile x ; ai ; bi sunt cunoscute. Relatia recursiva poate formulata
1 2
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 exemplicarea 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)
Atunci xn = ank +bnk xn k ; unde k = dlog ne. Valorile ank ; bnk se pot calcula
( ) ( ) ( ) ( )
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 dicila. 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 verica 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 congurare 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
351
Figura 4.4: Programul consol a pentru congurarea masinii virtuale, comenzile
disponibile si asarea 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 identicatori 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, noticare, 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 identicatori 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
354
Tabelul 4.4 (continuare)
Apel PVM Semnicatie
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 identicatorul asteptat al unui mesaj
pvm getopt, pvm setopt
returneaza/seteaza valorile optiunilor libpvm
pvm getrbuf identicatorul tamponului de mesaje activ de receptionare
pvm getsbuf identicatorul tamponului de mesaje activ de expediere
pvm gettid identicatorul procesului identicat 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 specica 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 specicat
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 buer de mesaje
pvm mstat returneaza starea unei gazde ^n masina virtuala
pvm mytid returneaza identicatorul procesului apelant
pvm newcontext cere un nou context
pvm notify cere noticarea unui eveniment PVM precum esecul gazdei
pvm nrecv receptionare fara blocare
pvm pack ^mpacheteaza tamponul de mesaje activ cu tip prescris
pvm parent identicatorul 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 verica daca mesajul a sosit
pvm psend ^mpacheteaza si expediaza data ^ntr-un singur apel
pvm pstat returneaza starea unui proces PVM specicat
pvm putinfo, pvm recvinfo, pvm getmboxinfo, pvm delinfo
stocheaza si ofera mesaje ^ntr-o cutie postala comuna
pvm recv receptioneaza un mesaj
pvm recvf redeneste functia de comparare pentru acceptarea mesajelor
355
Tabelul 4.4 (continuare)
Apel PVM Semnicatie
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 specicat 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 identicatorii 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 specicat
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
identica TID-ul procesului si lanseaza procesul ^n cadrul masinii vir-
tuale, pvm_parent() ce identica 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 conguratiei 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 identicarea procesului-ului, prin analogie cu PID (identicator 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: Codicare 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 indenticatorul 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
360
Figura 4.9: Modele de formatare
Toate mesajele sunt construite initial ^ntr-o zona tampon { aceasta permite
utilizarea XDR ce suporta conguratii 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 recongureaza
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
Noticarea este cea mai buna metoda de utilizat. Procesele care urmeaza a
noticate 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 dicultati,
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 identicatorului unui
proces din grup prin
int tid = pvm_gettid(char *grup, int inum);
unde inum face referire la procesul ce se identica, 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 specica 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 specica un nume denit, 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 predenite
(PvmSum, PvmMax, PvmMin, PvmProd) sau denite 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 identicatori
/* 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 identicare 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
373
Scopul initial al Forumului MPI a fost dezvoltarea unui standard extensibil,
ecient, 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 eciente; 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 sosticate. 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 ramicat ^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 prolului 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 denitii #include <mpi.h>
Format functie MPI eroare=MPI_xxxxx(parametru, ...)
Initializarea MPI int MPI_Init(int *argc, char ***argv)
Identicarea 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()
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-
ticatorul 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 specicat 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 predenit 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 denite 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 identicat 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 specicate ^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-
icate ^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 specica modul sincron, iar ambele procese asteapta p^ana
c^and tranzactia este completata. Pentru ca o comunicatie sa aiba succes, ex-
peditorul trebuie sa specice un rang al destinatiei valid. De asemenea re-
ceptorul trebuie sa specice un rang valid al sursei, iar comunicatorul si tipul
mesajului trebuie sa e aceleasi. Zona tampon a receptorului trebuie sa e
sucient 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 specica 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 specica un tampon ^n memoria expeditorului de la care este
extrasa data (contine mesaj). Locatia, marimea si tipul sunt specicate de
primii 3 parametrii ai operatiei de exepediere. Ultimii trei parametrii specica
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 specica
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 vericarea 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 simplicarea 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 predenite
Tabelul
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 identicatori 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 specica 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
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
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 denire a distributiei datelor si
aliniament. Permite denirea 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 specice
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 specice. 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 deni asignarea elementelor
matriceale la diferite procesoare. In CM Fortran asemenea directive sunt
folosite pentru a specica locatia relativa a elementelor matriceale si a specica
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 specice, 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 specicare si un corp. Specicarea 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 identicare
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 denita 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 innit ^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;
391
Parametrii si toate partile specicatiei si corpului sunt optionale, precum si
numele resursei ce urmeaza dupa end. O resursa stiva este denita 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 specica 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 specicate ^n partea de specicatii 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 specicare 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. Cuantica-
torii au aceeasi forma ca si cuaticatorii 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 aseaza 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 planicatorul 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 deneste 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 denesc 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 specic^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 specica 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 specica forme, atunci un tuplu cu aceleasi ele-
mente specicate 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.
Filozoa 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 grac care permite ca progre-
sul algoritmilor secventiali sa e asat ^n maniera dinamica. Actualizarile si
3 Rezumat: Sistemul Express contine o multitudine de interfete grace ce permit progra-
marea rapida a calculatoarelor paralele si analiza aplicatiilor realizate.
398
referintele la structuri de date individuale pot asate 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
graca 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 denita 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 congurare care specica
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 eciente 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 sucient 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. Planicarea este realizata pe baza threadurilor. Astfel modelul
proces-thread este un model de planicare 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 ecient utilizate (structura procesului este partajata
de catre threaduri) si structura programelor este simplicata.
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, ramicarea 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 exemplicare 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 Clasicarea arhitecturilor . . . . . . . . . . . . . . . . . . . . . 42
1.3.1 Clasicarea 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 ecienta . . . . . . . . . . . . . . . . . . . 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 clasicare 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 Clasicarea 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