Procesarea paralela are un impact deosebit asupra multor domenii ale stiintei. Folosind
imensa putere de calcul a procesarii paralele este posibila tratarea unor probleme considerate
pana nu demult, imposibil de rezolvat cu mijloacele de calcul traditionale. Cateva aplicatii din
stiinte si inginerie care necesita putere de calcul foarte mare sunt:
- Modelarea climatului global
- Modelarea atrofizica
- Cautarea informatiilor pe web
- Modelarea cutremurilor de pamant
- Procesarea tranzactiilor
- Proiectarea armelor nucleare
- Modelarea fenomenelor macroeconomice.
- Proiectarea unor algoritmi paraleli eficienti. Daca nu am avea la dispozitie algoritimi paraleli
eficienti, calculatoarele paralele singure nu ar fi de prea mare folos. Problema proiectarii unor
algortimi paraleli eficienti e foarte dificila, iar aceasta dificultate se datoreaza si faptului ca
algoritmii paraleli sunt in mare masura diferiti de cei secventiali.
- Limbajele pentru procesarea paralela. Algoritmii paraleli sunt implementati cu ajutorul unor
limbaje pentru programarea paralela. Aceste limbaje trebuie sa fie flexibile dar si usor de
utilizat.
2.1 Introducere
Se vor defini cateva notiuni si concepte fundamentale necesare pentru intelegerea atat
a arhitecturilor cat si a software-ului pentru procesarea paralela. In acest sens se va stabili care
sunt elementele componente ale unui model computational, vom defini notiuni precum
granularitate, largime de banda, latenta, proces, fir de executie etc.
2.2.1 Modele computationale
Prima notiune mentionata mai sus specifica elementele carora li se aplica operatiile
necesare rezolvarii unei probleme. Aceste elemente pot fi reprezentate prin variabile ca in
modele von neumann si data flow, prin argumente si functii aplicate acestora ca in modelul
aplicativ, sau prin predicate si atomii prin care se aplica predicatele ca in modelul logic.
A doua notiune care intra in definirea unui model computational este modul de
descriere a problemelor. Acesta presupune specificarea atat a stilului de descriere cat si a
metodei de descriere a problemei.Stilul de descriere a unei probleme poate fi procedural sau
declarativ. Stilul procedural implica stabilirea unui algoritm particular care sa rezolve
problema pe cand stilul declarativ presupune declararea faptelor si a relatiilor relevante ale
problemei. Stilul declarativ poate fi exprimat cu ajutorul functiilor sau cu ajutorul
predicatelor.Spre deosebire de stilul procedural stilul declarativ stabileste ceea ce este
problema si nu o metoda particulara de rezolvare a acesteia.
2.2.2 Granularitatea
Aceasta desemneaza dimensiunea unitatii de lucru alocate unui procesor. Daca tinem
seama de acest aspect putem clasifica paralelismul in 3 mari categorii:
- paralelism de granula mare sau grosier
- paralelism de granula medie
- paralelism de granula fina.
Dimensiunea de lucru a unui procesor, deci tipul granularitatii, va duce la numarul si
tipul de procesoare cu care este dotat un calculator paralel.
Calculatoarele cu granula grosiera au putine procesoare dar acestea sunt in general
procesoare complexe. Unitatea de lucru alocata procesoarelor poate fi in acest caz un proces o
procedura sau corpul unei bucle dintr-un program. Calculatoarele din aceasta clasa au
performante foarte bune, dar si costul lor este deosebit de mare.
Calculatoarele cu granula fina presupun existenta paralelismului la nivelul evaluarii
unei expresii sau chiar a executiei unei instructiuni. Ele pot fi dotate cu mii sau zeci de mii de
procesoare ieftine, care pot executa instructiuni simple, in aceasta categorie intrand
calculatoarele SIMD, ariile sistolice, ariile cu front de unda. Tot in aceasta categorie se
incadreaza si procesoarele super scalare si arhitecturile VLIW.
Intre calculatoarele cu granula grosiera si cele cu granula fina se situeaza
calculatoarele cu granula medie. Ele sunt poate cele mai raspandite calculatoare paralele
datorita faptului ca au un raport performanta pret foarte bun.aceste calculatoare pot fi dotate
cu sute de calculatoare ieftine si au performate ridicate.
Definitia clasica a unui proces spune ca acesta este un program in executie . Daca
incercam sa caracterizam un proces, trebuie sa aratam ca el are un spatiu de adresa si un punct
de control. Procesul este entitatea fundamentala de planificare. Toate procesele sunt in
competitie pentru a primi acces la anumite resurse ale calculatorului cum ar fi memoria,
procesorul, dispozitivele de I/O.
Crearea unui proces implica o serie de actiuni din partea sitemului de operare:
- crearea si initializarea structurilor interne ale SO referitoare la proces.
- Alocarea unui spatiu de adresa, eventual si rezervarea unui spatiu de evacuare(SWAP).
- Incarcarea programului in spatiu de adresa alocat.
- Introducerea noului proces creat in coada procese, gata de executie, pentru a putea fi
planificat.
1. Procesul e planificat.
2. Procesul este suspendat
3. Procesul este blocat in asteptarea unui eveniment
4. Evenimentul a avut loc si este gata de executie.
Existenta unui model universal al masinilor de calcul (von Neumann) a fost una dintre
cheile succesului software-ului secvential. Prezenta acestui model a facut posibil ca un
algoritm sa poata fi portat in mod eficient pe orice tip de uni-procesor. Din pacate in calculul
paralel nu a existat un astfel de model generat, iar algoritmii paraleli sunt de regula puternic
dependenti de tipul de arhitectura pentru care au fost proiectati.
In figura 2.4 avem prezentata grafic modalitatea concreta de dezvoltare a software-ului
atunci cand dispunem de un model general de programare. O problema P este rezolvata pentru
un model de programare abstract M. dupa dezvoltarea algoritmului, un translator preia acest
algoritm, precum si o descriere a arhitecturii masinii si produce ca rezultat un cod masina ce
va rezolva problema P.
In cazul algortimilor seriali modelul M la care am facut referire este modelul von
Neumann. Datorita existentei acestui model este posibil ca un algoritm sa poata fi portat, pe
mai multe masini, cu toate ca arhitectura procesorului sau organizarea memoriei difera de la o
masina la alta. Daca algoritmii ar fi terbuit reproiectati pentru fiecare tip nou de procesor
secvential, costul software-ului ar fi fost prea mare, ceea ce ar fi stopat dezvoltarea industriei
calculatoarelor.
Reteaua de comunicatie este presupusa a avea o capacitate finita, egala cu L/g, deci
numai un numar de cel mult L/g mesaje pot fi in tranzit de la un procesor sursa la unul
destinatie. Orice incercare de a transmite mesaje peste aceasta capacitate va duce la blocarea
procesorului in cauza. In acest model spre deosebire de PRAM procesoarele lucreaza
asincron, iar intarzierea in transmiterea unui mesaj nu este constanta, dar este limitata superior
de L. O reprezentare sugestiva a descrierii unei masini in modelul LogP este redata in figura
2.7.
2.4.4 Modelul BSP
Modelul BSP Bulk Syncronous Parallel a fost propus drept un model punte intre
hardware si software. Un calculator BSP este caracterizat prin:
- Un numar de procesoare fiecare dispunand de o memorie local.
- Retea de interconectare astfel incar un procesor sa poata avea acces la memoria altui
procesor. Acesta este considerata ca o cutie neagra, neluandu-se in seama topologia ei,
prorpietate foarte importanta pentru a asigura portabilitate algoritmilor.
- Un mecanism de sincronizare globala, sincronizare ce are loc la intervale de timp
egale cu L, unde L este un parametru de peridiocitate.
Conform acestui model calculul este privit ca o secventa de superpasi. In fiecare super
pas procesoarele executa calcule locale, transmit si primesc mesaje. La fiecare interval de L
unitati de timp, se face o verificare globala pentru a testa daca superpasul curent a fost
terminat de toate procesoarele. Daca acesta s-a incheiat se continua cu urmatorul superpas, iar
daca nu urmatorul interval de L unitati de timp este alocat superpasilor neterminati.
O relatie “h” este o procedura de comunicare intre procesoare, in care orice procesor
trimite cel mult un numar de “h” mesaje catre alte procesoare si primeste cel mult “h“
elemente de date.
2.4.5. Limbaje de programare paralela
Arhitecturile VLIW sunt menite a exploata tot paralelismul la nivel de instructiune dar
sunt foarte diferite de procesoarele superscalare. Instructiunea unei masini VLIW care poate
avea lungimi cuprinse intre cateva sute pana la mii de biti, este impartita in campuri ce contin
coduri de operatii pentru diferite unitati functionale. Calculatoarele VLIW au nevoie de un
compilator special care sa detecteze in program operatiile independente si sa le impacheteze
intr-o instructiuneVLIW.
Compilatoarele obisnuite impart codul in blocuri de baza cuprinse de regula intre doua
instructiuni de salt si optimizeaza numai instructiunile la nivelul acestor blocuri. Statisticile au
aratat ca intr-un bloc de baza pot fi 5 pana la 10 instructiuni, iar daca am exploata
paralelismul numai intre instructiunile unui astfel de bloc am obtine castiguri in viteza de
executie de aproximativ doua sau trei ori. Experimentele arata ca aplicatiile stiintifice prezinta
un volum mult mai mare de paralelism la nivelul instructiunilor care daca este exploatat, se
pot obtine castiguri in viteza de executie de pana la 90 de ori.
3.1 Introducere
Fiecare din aceste operaţii necesare la procesarea unei instrucţiuni este executată de un nivel separate
în banda de asamblare. O instrucţiune va trece succesiv prin toate nivelurile, avansând la fiecare tact al
ceasului. (fig.3.1)
F - fetch
D - decode
E - execute
W - writeback
Procesoarele superscalare şi maşinile VLIW, care reprezintă cea de-a doua variantă a implementării
paralelismului la nivel de instrucţiune, diferă de pipeline prin faptul că folosesc mai multe unităţi de execuţie
ce pot lucra simultan.
Gradul maxim de paralelism atins de aceste procesoare este egal cu numărul de unităţi de execuţie
disponibile, bineînţeles dacă aceste unităţi pot fi alimentate simultan cu instrucţiuni.
Deosebirea dintre procesoarele superscalare şi maşinile VLIW vine de la modul în care sunt
prezentate instrucţiunile spre execuţie.
Astfel, o instrucţiune VLIW are mai multe câmpuri care conţin codul operaţiei destinate fiecărei
unităţi de execuţie. Aceste operaţii trebuie să fie independente, sunt detectate în program şi împachetate într-
o instrucţiune VLIW de către compilator.
În cazul procesoarelor superscalare, instrucţiunile sunt aduse sub forma unui flux secvenţial din
memoria cache şi prezentate unităţii de planificare si codificare. Aici se verifică dependenţa dintre
instrucţiuni, iar cele care sunt independente sunt planificate simultan pentru execuţie într-un singur tact al
ceasului. Instrucţiunile procesorului superscalar sunt instrucţiuni obişnuite (RISC sau CISC) care controlează
o unitate de execuţie. În fig. 3.2 se poate urmări o comparaţie între cele 2 tipuri de arhitecturi.
Figura 3.2. Comparaţie între procesoarele superscalare şi VLIW
Spre deosebire de VLIW unde operaţiile ce compun o instrucţiune trebuie să fie independente, iar de
lucrul acesta se asigură compilatorul, la procesoarele superscalare dependenţele sunt verificate în mod
dinamic chiar de unitatea de codificare.
Prima sarcină pe care o are de rezolvat un procesor superscalar este decodificarea instrucţiunilor. În
situaţia procesoarelor superscalare, decodificarea este mult mai dificilă decât la procesoarele obişnuite
deoarece trebuie decodificate mai multe instrucţiuni într-o singura perioadă de ceas şi trebuie verificate atât
dependenţele dintre instrucţiunile decodificate la momentul current, cât şi cele dintre acestea şi cele care sunt
deja în faza de execuţie. Cum toate procesoarele superscalare au mai multe unităţi de execuţie, numărul
instrucţiunilor care trebuie verificate este foarte mare.
Pentru a uşura sarcina decodificatorului, se foloseşte de obicei o faza de predecodificare. În memoria
cache de nivel 2 şi cea de nivel 1, pentru instrucţiuni se reduce introduce o predecodificator care va adăuga la
fiecare instrucţiune un număr de biţi ce sunt de regulă utilizaţi la identificarea clasei din care face parte
instrucţiunea, a resurselor de care au nevoie pentru execuţie, etc.
În fig. 3.7 se poate observa unitatea de predecodificare introdusă la majoritatea procesoarelor
superscalare.
Cel mai important aspect legat de procesarea instrucţiunilor îl constituie planificarea sau distribuirea
spre execuţie a mai multor instrucţiuni într-un singur ciclu de ceas. Problemele ce trebuie rezolvate la
planificare sunt:
1. considerarea dependenţelor false între date (WAW, WAR – write-after-write, write-after-read)
- tratarea prin redenumirea registrelor.
- lipsa unui mechanism pentru tratarea dependenţelor false
2. considerarea dependenţelor de control nerezolvate (hazard de date, hazard de control)
- aşteptarea evaluării condiţiei de salt
- utilizarea unor metode de predicţie a salturilor şi executarea speculativă a instrucţiunilor
3. folosirea bufferelor de instrucţiuni şi a staţiilor de rezervare (shelbing)
- planificare cu blocare: ultimele n instrucţiuni din bufferul de instrucţiuni (care formeaza starea de
planificare) sunt verificate pentru detectarea dependenţelor. Dacă ele sunt independente, sunt trimise
direct la unităţile de execuţie. Dacă există dependenţe între ele, planificarea este blocată până la rezolvarea
acestora.
- planificare fără blocare: în faţa fiecărei unităţi de execuţie sunt plasate buffere locale de instrucţiuni (staţii
de rezervă). Instrucţiunile din fereastra de planificare sunt trimise către staţiile de rezervare fără a efectua
o verificare a dependenţelor. Fiecare staţie de rezervare va efectua aceste verificări şi va prezenta la
unitatea de execuţie instrucţiunile găsite independente.
Acestea sunt buffere de instrucţiuni plasate în faţa unităţilor de execuţie, care au rolul de a decupla
planificarea instrucţiunilor decodificate de verificarea dependenţelor. Verificarea dependenţelor dintre
instrucţiuni este amânată pentru momentul în care instrucţiunile memorate în staţiile de rezervare vor face
obiectul trimiterii lor către unitatea de execuţie. Folosirea staţiilor de rezervare duce la eliminarea blocajelor
de planificare pe care le poate întâlni unitatea de decodificare / planificare.
Instrucţiunile între care există relaţii de dependenţă vor fi ţinute în staţiile de rezervare până la
rezolvarea dependenţelor. În momentul în care o unitate de execuţie este liberă, toate instrucţiunile
independente prezente în staţia de rezervare pot face obiectul planificării. Instrucţiunea care va fi aleasă
depinde de strategia de planificare pe care o implementează fiecare procesor.
Redenumirea registrelor
Conceptul a fost introdus în legătură cu eliminarea dependenţelor false dintre instrucţiuni. Registrul
destinaţie dintr-o instrucţiune se poate redenumi, adică în locul registrului architectural ce apare în
instrucţiune se va folosi un registru de rezervă destinat special pentru redenumire. Registrul depus în registrul
de rezervă va fi depus în registrul architectural iniţial, în momentul în care ordinea secvenţială a
instrucţiunilor va permite acest lucru.
Redenumirea registrelor are loc dinamic, în timpul execuţiei instrucţiunilor. Această tehnică a fost
introdusă chiar de la apariţia primelor procesoare superscalare. Iniţial, redenumirea registrelor s-a utilizat
doar pentru anumite tipuri de instrucţiuni.
Schema de redenumire lucrează astfel: la un moment dat, presupunem că registrele arhitecturale
reprezintă o submulţime din setul de register fizice. Pentru fiecare instrucţiune ce urmează, registrul
destinaţie va fi alocat într-un nou registru fizic disponibil. Alocarea şi dezalocarea registrelor sunt urmărite
cu ajutorul unei tabele de mapare. (fig. 3.10).
Tabela conţine un bit denumit Valid (valoarea 1 indică faptul că intrarea pe index conţine o valoare
validă) şi Indexul registrului în setul de register fizice. În acest exemplu, registrul architectural R1 este alocat
în registrul fizic RF3, iar R2 în RF9.
Una din cele mai importante probleme care apar în contextul procesoarelor pipeline şi superscalare
este problema tratării instrucţiunilor de ramificaţie. Se va considera cazul cel mai simplu al unei benzi de
asamblare cu 4 nivele: fetch, decode, execute, write-back.
Vom lua în considerare o instrucţiune de salt necondiţionat şi vom presupune că la sfârşitul nivelului
3 este disponibilă adresa de salt (fig.3.11)
Se poate observa cum I3 şi I4 care au intrat deja în banda de asamblare vor trebui anulate.
Instrucţiunea de salt a cauzat o penalitate de 2 cicli. Situaţia poate devein mai gravă în cazul unei instrucţiuni
de salt condiţionat. Să presupunem ca instrucţiunea de salt condiţionat are la bază testatrea rezultatului unei
operaţii în virgulă mobilă. Cum aceste operaţii necesită foarte mulţi cicli (împărţire – 50 cicli), penalitatea va
creşte şi ea corespunzător. Cazul în care la momentul execuţiei instrucţiunii de salt condiţionat nu este
cunoscut încă rezultatul expresiei ce stă la baza condiţiei de salt se numeşte dependenţă de control
nerezolvată.
Cele mai importante tehnici de procesare a instrucţiunilor de salt sunt:
- utilizarea metodei delayed-branching (salt întârziat).
- tratarea instrucţiunii de salt nerezolvate prin:
- blocarea procesării până la rezolvarea condiţiei
- execuţia speculativă
- execuţia multicale
Deosebirea dintre un procesor VLIW şi unul superscalar provine de la modul cum sunt construite
instrucţiunile şi cum sunt planificate pentru execuţie. O instrucţiune VLIW este format din mai multe
câmpuri. Un camp reprezintă codul unei operaţii, fiecare operaţie fiind destinată unei unităţifuncţionale
distinct. (fig. 3.19) Execuţia unei astfel de instrucţiuni este echivalentă cu executarea în paralel a tuturor
operaţiilor care alcătuiesc instrucţiunea.
Datorită modului specific de construcţie a maşinii VLIW, aceasta va avea o lungime mai mare ce
depinde de numărul unităţilor funcţionale disponibile (în general, acest număr este de 5 până la 30 unităţi
funcţionale). O dimensiune uzuală pentru o astfel de instrucţiune este cuprinsă între 256 şi 1024 biţi.
Există şi dezavantaje. Unul din ele este legat de compilatoare. Acestea trebuie să cunoască multe
detalii despre hardware-ul pe care rulează, detalii privind numărul de unităţi funcţionale cu care este echipat
procesorul, informaţii privind timpii de acces la memoria cache, întârzierile provocate de diferite tipuri de
instrucţiuni, etc.
Faptul că un compilator va fi legat de aceste detalii îl va face să nu fie portabil şi odată schimbat ceva
în arhitectura procesorului, tot software-ul va trebui modificat.
Un alt dezavantaj al arhitecturilor VLIW vine de la modul de construire a instrucţiunii. Toate
operaţiile prezente într-o instrucţiune trebuie să fie independente; dacă apare o situaţie în care compilatorul
nu poate găsi atâtea operaţii independente câte încap într-o instrucţiune, atunci anumite câmpuri ale
instrucţiunii vor fi goale (irosire a memoriei).
Un ultim dezavantaj este constituit din faptul că un număr mare de unităţi funcţionale care execută
instrucţiunea în paralel vor necesita şi un număr mare de porturi de scriere / citire la setul de register, ceea ce
înseamnă complexitate sporită din punct de vedere al hardware-ului.
Calculatoarele VLIW au nevoie de un compilator special pentru a putea exploata la nivel maxim
paralelismul. Studiile experimentale au arătat că utlizând paralelismul existent la nivelul unui bloc de bază,
adică al unui bloc cuprins între 2 instrucţiuni de salt, se poate obiţine o creştere în viteza de execuţie de 2-3
ori. Totodată, s-a constatat că în cadrul unui program există un potenţial mult mai mare al paralelismului ce
poate fi exploatat numai de către un compilator capabil să treacă de bariera blocului de bază. Compilatoarele
care pot realiza o astfel de sarcină mai poartă numele de global scheduler (planificator global).
AP - CURS 4
4.1. Introducere
Ariile de procesoare sunt proiectate in general pentru calcule vectoriale sau matriciale.
De obicei ele nu sunt calculatoare propriu-zise ci se folosesc prin interfatarea lor cu un
calculator de uz general.
Calculatorul gazda poate trimite anumite portiuni din programe sa fie executate pe aria
de procesoare atunci cand este necesar sa se obtina rezultate rapide. In figura 4.1 sunt
prezentate doua arhitecturi tipice ariilor de procesoare ce corespund calculatoarelor ILLIAC 4
(figura 4.1a) si BSP (figura 4.1b) care au fost printre primele implementari ale conceptului de
arhitectura SIMD.
Cele doua configuratii constau in N elemente de procesare (PE) aflate sub controlul
aceleiasi unitati de control (CU). Unitatile de control sunt dotate cu propria memorie si au
rolul de a transmite instructiuni catre elementele de procesare in mod sincron.
Aceste configuratii difera doar in doua aspecte:
1. la ILLIAC 4 fiecare unitate de procesare are si o memorie locala (PEM), pe
cand la BSP aceste memorii locale au fost inlocuite cu un numar de module
de memorie cu acces in paralel (MI) care sunt interconectate cu elementele
de procesare printr-o retea de aliniere.
2. A doua diferenta provine din inlocuirea retelei de permutare dintre
elementele de procesare prin reteaua de aliniere controlata de CU. Aceasta
retea are rolul de a permite accesul la memorie fara a interveni conflicte de
acces.
Operanzii acestor instructiuni vectoriale sunt trimisi in memoriile locale PEM, fie prin
magistrala de date, fie prin magistrala de control. La un moment dat, numai anumite elemente
de procesare pot participa la calcule. Care din elementele de procesare vor fi active si care nu,
se stabileste prin intermediul unor masti de biti, ce contin cate un bit pentru fiecare element de
procesare: 1 daca elementul de procesare este activ si 0 in caz contrar.
Structura unui element de procesare este redata in figura 4.2. toate elementele de
procesare contin un set de registre si flag-uri Ai B i C i S i , ALU, un registru index local I i
,un registru de adresa D i si un registru de comanda R i .
Fiecare registru R j al unul element de procesare PEi este conectat cu registru Rj al
elementului de procesare PEj prin intermediul retelei de interconectare. Unele arii de
procesoareau doua registre de comunicare, unul pentru intrare si altul pentru iesire.
Daca presupunem ca numarul total de elemente de procesare N este de forma N= 2n
atunci pentru a reprezenta adresa unui element de procesare avem nevoie de n biti. Acesti n
biti de adresa sunt memorati in registru Di al fiecarui element de procesare. Registru Si va
contine valoarea 0, daca elementul de procesare PEinu este activ la un moment dat si valoare
1 in cazul in care elementul de procesare este activ. Toate valorile registrelor Si sunt retinute
intr-un registru S din interiorul CU, denumit registru de stare global, valoarea lui Si aflandu-
se pe pozitia i din registrul S.
O problema importanta care intervine la ariile de procesoare este modalitatea de
stocare a datelor in memoriile local. Astfel incat elementele ce trebuie procesate sa poata fi
extrase din memorie fara a se creea conflicte de acces. Pentru prelucrarea vectorilor atunci
cand dimensiunea vectorului n nu depaseste numarul de elemente de procesare, acestia pot fi
memorati cate un element in fiecare modul de memorie locala, sau in caz contrar, cand n > N,
vectorul poate fi memorat distribuind n elemente ciclic celor N memorii locale.
In cazul prelucrarilor de matrici, calculele uzuale opereaza cu o linie, o coloana sau o
diagonala a matricii, deci modalitatile de stocare trebuie sa permita extragerea in paralel, a
unei intregi linii, coloane sau diagonale intr-un singur ciclu de memorie. Exista scheme de
memorare a matricilor care permit aceste tipuri de accese, denumite scheme de stocare
asimetrice. Se va exemplifica o astfel de schema de stocare pentru cazul in care avem 3
elemente de procesare, fiecare cate 3 locatii de memorie. Modalitatea naturala de a memora
elementele unei matrici 3x3 este prezentata in figura 4.3.
Chiar daca principiile de baza raman identice la toate calculatoarele SIMD acestea
difera printr-o serie de caracteristici, cum ar fi complexitatea si numarul elementelor de
procesare, tipul si complexitatea retelei de interconectare a elementelor de procesare,
tehnologia de realizare.
Dupa tipul de aplicatii pentru care sunt destinate, elementele de procesare ale unui
calculator SIMD pot fi foarte simple, cum ar fi elemente de procesare capabile sa prelucreze
un singur bit sau pot fi procesoare complexe.
Primul caz, cel al procesoarelor la nivel de un singur bit, se intalneste mai ales in
calculatoarele destinate prelucrarilor de imagini, in timp ce calculatoarele destinate in special
calculului stiintific si ingineresc sunt dotate cu procesoare complexe, capabile sa execute
operatii in virgula mobila.
CLIP4 – alt calculator SIMD alcatuit dintr-un masiv de 64x64 procesoare, care la
momentul realizarii (1980) a fost cel mai mare calculator SIMD al vremii.
In anul 1983 a fost construit calculatorul MPP (Massively Parallel Processor) care
avea in componenta o matrice de 128x128 de procesoare. Procesoarele au fost interconectate
printr-o retea bidimensionala, fiecare procesor fiind direct conectat cu cei 4 vecini ai sai.
Arhitectura simplificata a acestui calculator este prezentata in figura 4.6.
Elementul de procesare al calculatorului MPP (fig 4.7) era foarte simplu, toate
registrele A,B,C,D, unitatile functionale si magistralele de date lucrand la nivel de un bit. Un
registru special notat S era legat cu registrele S ale celorlalte elemente de procesare, formand
astfel un registru Shift, ce poate opera independent, in acest fel obtinandu-se o suprapunere
intre comunicatie si calculele propriu-zise.
Un alt exemplu de calculator SIMD, CM1 se aseamana foarte mult cu predecesorii sai
fiind dotat cu procesoare foarte simple, in timp ce ultima varianta CM5 este dotat cu
procesoare complexe iar fiecare procesor dispune de o memorie de capacitate mare.
Elementul de procesare al CM5 este prezentat in figura 4.8. Principalele sale caracteristici
sunt: microprocesorul SPARK, magistrala pe 64 biti, separarea intre magistrala de date si cea
de control, cele 4 unitati vectoriale de lucru in virgula mobila si 32 Mbiti memorie locala.
Modul de lucru al calculatorului CM5 poate varia de la un mod MIMG in care fiecare
procesor executa fiecare program la un mod SPMD (Single Program Multiple Data), in care
fiecare procesor executa acelasi program dar cu date diferite.
Momentele la care au loc sincronizari intre programe pot varia de la sincronizare dupa
fiecare instructiune (mod de operare SIMD pur) pana la absenta totala a sincronizarii. Metoda
de interconectare a procesoarelor este prezentata in figura 4.9, unde fiecare nod al arborelui
reprezinta de fapt 4 elemente de procesare legate direct intre ele.
AP – CURS 5
Dar in retelele cu grad de conectivitate mai scazut, datele vor fi trecute prin retea de
mai multe ori pentru a ajunge la procesorul destinatie. In practica, cazul retelelor cross-bar
este intalnit mai rar datorita costului foarte mare al unei astfel de retele (O(n2)).
Dintre retelele cu un singur nivel s-au ales pentru prezentarea mai detatliata 4 tipuri:
mash, cube, shuffle-exchange si PM2i. Fiecare retea este caracterizata printr-un set de functii
de interconectare care definesc modul de interconectare intre procesoare. Daca notam cu S =
{0,1,....N-1}, adresele celor N componente care vor fi interconectate, atunci o functie de
interconectare If este o bijectie de la S la S, If : S-> S, X ->If(X), unde X este un element din
S. adresele celor N componente le vom exprima in sistemul binar bm-1 bm-2 ....... b1 b0.
- Reteaua cube este definita prin m functii de interconectare unde m = log2(N). O retea
cube 3D este prezentata in figura 4.13. Se observa ca liniile verticale unesc elemente a caror
adresa reprezentata binar difera prin bitul cel mai semnificativ, iar elementele de pe liniile
orizontale difera prin bitul cel mai putin semnificativ. Acest model poate fi extins la spatiul cu
m dimensiuni rezultand un hypercub m dimensional. Formal functiile de interconectare au
forma:
o Ci(bm-1 bm-2 ....bi... b1 b0) = bm-1 bm-2 ... !bi .... b1b0 0<= i <= m.
Al doilea tip de retele dinamice, retelele multinivel sunt formate prin interconectarea
cu ajutorul unor elemente de interschimbare a mai multor niveluri de retele simple. Fiecare
element de interschimbare are doua intrari, doua iesiri si poate realiza una dintre cele 4 functii
de interschimbare din figura 4.17 : inainte, interschimb, distribuie sus si distribuie jos.
In momentul in care s-a stabilit o conexiune intre o intrare si o iesire si nu se mai poate
stabili o alta conexiune in acelasi timp intre alte doua procesoare se spune ca avem retea
multi-nivel cu blocare. Daca exista posibilitatea de a avea o conexiune fara a bloca realizarea
altor conexiuni reteaua se numeste fara blocare.
In functie de tipul nivelurilor de baza din care este alcatuita o retea multi-nivel, putem
avea doua mari clase de astfel de retele: retele cu generalizare, bazate pe functiile de
interconectare cube si shuffle-exchange si retele cunoscute sub numele de data-manipulator
bazate pe functiile de interconectare PM2i.
Reteaua cube generalizata pentru N=8 este prezentata in figura 4.18. Se observa ca o
astfel de retea este alcatuita din 3 nivele interconectate intre ele prin 4 elemente de
interschimbare. In cazul general vom avea m=log2N niveluri si N/2 elemente de
interschimbare la fiecare nivel. Intrarile si iesirile trebuie astfel etichetate incat la fiecare nivel
i ele sa poate fi obtinute prin aplicarea functiei cube Ci cu i de la 0 la m, de catre fiecare
element de interconectare.
Caracteristicile de baza ale unei retele de interconectare sunt diametrul retelei (nr de
puncte intermediare prin care trebuie sa treca datele intre cele mai indepartate noduri ale
retelei) si capacitatea unei retele de a emula o alta retea. In tabelul 4.1 sunt prezentate
diametrele pentru cateva tipuri de retele.
Capacitatea unei retele de a simula alta retea poate fi ceruta uneori de o aplicatie care
necesita o alta conectivitate decat cea disponibila la nivel hardware. In tabelul 4.2 sunt
prezentate capacitatile celor 4 tipuri de retele prezentate anterior de a simula un alt tip de retea
prin numarul minim si numarul maxim de aplicari ale functiei de interconectare necesare
pentru a obtine interconectarea dorita.
Datele de pe o linie a tabelului reprezinta numarul de executii ale functie de
interconectare cerute de reteaua respectiva pentru a simula reteaua care este reprezentata pe
coloanele tabelului.
4.3 Procesoare asociative
Fiecare celula Bij poate fi scrisa sau comparata cu un model de data externa. Registrul
de comparare C este folosit pentru a retine operandul care trebuie cautat in memoria
asociativa, iar registrul de mascare M este utilizat la activarea sau dezactivarea unor bit slice-
uri care participa la cautarea paralela. Registrul indicator I si unul sau mai multe registre
temporare T sunt folosite pentru a retine pattern-ul gasit la cautare in momentul actual sau
anterior.
La cautare se incarca intai registrul C cu cheia de cautare , se selecteaza apoi doar
acele bit-slice—uri ce vor participa la cautare si care sunt indicate de registrul M si apoi se
trimit semnalele corespunzatoare de interogare a memorie. In momentul gasirii unei potriviri
pentru a retine pozitiile respective se folosesc registrele I si T. Exista doua posibilitati de a
efectua interogarea:
- Paralel pe biti – procesul de cautare se efectueaza intr-o modalitate paralela de
cuvinte si biti. Toate bit-slice-urile care nu sunt dezactivate de registrul de masca vor fi
implicate in procesul de cautare paralel.
- Serial pe biti – se proceseaza la cautare folosind cate un bit-slice la un moment dat
parcurgand serial toate bit-slice-urile nemascate.
O arhitectura tipica a unui calculator bazat pe memoria asociativa este prezentat in
figura 4.21. Dupa cum se observa elementele de baza sunt: memoria asociativa, sistemul de
I/O, o memorie pentru stocarea programului si o unitate de control.
Ariile sistolice sunt alcatuite dintr-un set de procesoare care stiu sa execute doar un nr
limitat de operatii simple. Procesoarele sunt interconectate intr-o structura ordonata, cum ar fi
un arbore, o retea bidimensionala sau o structura liniara. Denumirea acestora provine din
asemanarea lor cu sistemul circulator: asa cum inima pompeaza sange in sistemul circulator,
asa ariile sunt compactate? in aria sistolica. Aceste date sunt supuse unor prelucrari de catre
fiecare element de procesoare.
Comunicatia sistemului sistolic cu exteriorul are loc prin intermediul elementelor de
procesare situate la marginea ariei, acestea fiind si singurele elemente de procesare care
dispun de posibilitatea de a efectua operatii de 1/0.
Datele introduse in aria sistolica prin intermediul procesoarelor de pe frontiera acesteia
« vor curge » intr-o maniera pipeline, fiecare procesor executand anumite prelucrari si
transmitand rezultatele mai departe. Cu toate ca majoritatea ariilor sistolice sunt alcatuite din
arii de procesare simple care pot efectua cateva operatii aritmetice de baza, exista si arii
sistolice compuse din arii de procesare mai puternice programabile.
In figura 4-22 este reprezentata o arie sistolica simpla. Puterea de calcul sporita vine
din faptul ca datele aduse din memorie vor fi supuse cat mai multor prelucrari de catre E.P.,
inainte de a parasi aria sistolica.
In practica se intalnesc destul de des probleme provenite mai ales din algebra liniara
care pot fi mapate intr-o astfel de arie sistolica. Printre avantajele utilizarii ariilor sistolice se
numara faptul ca simplitatea elementelor de procesare (E.P.) si a modelului de interconectare
a acestuia duce la implementari hardware foarte eficiente. Alt avantaj il constituie modalitatea
de calcul utilizata in ariile sistolice unde : operatiile de i/0 efectuate la frontiera ariei se
suprapun cu operatiile de calcul propriu-zise.
Principala caracteristica care deosebeste ariile sistolice de alte arhitecturi cum ar fi
ariile cu front de unda, este modalitatea sincron cu care circula datele. Toate elementele de
procesare sunt sincronizate prin intermediul unui semnal de ceas unic iar la fiecare tact al
ceasului elementele de procesare transmit rezultatele vecinilor sai. Aceasta modalitate
sincrona de a efectua transportul datelor prin aria sistolica este de fapt si un dezavantaj pentru
ca la dimensiuni foarte mari ale ariei intervin probleme legate de asimteria propagarii
semnalului de ceas (va exista un defazaj intre semnalul de ceas primit de diferite elemente de
procesare din cauza distantei dintre ele).
Dintre toate arhitecturile capabile sa exploateze paralelismul la nivel de date, cea mai
mare raspandire au avut-o calculatoarele vectoriale datorita performantelor superioare ale
acestora.
Prelucrarea vectoriala implica date organizate in vectori alcatuiti din n elemente de
acelasi tip. Acesti vectori sunt tratati ca o singura entitate de calcul in timpul prelucrarii
programului. Fiecare instructiune a programului va fi executata pe entitatea vector, eliminand
astfel instructiunile de control de genul buclelor for, care sunt utilizate in prelucrarea scalara.
Pentru a fi posibil acest lucru procesoarele calculatoarelor vectoriale sunt dotate cu registre
vectoriale, care sunt capabile sa memoreze un intreg vector. Caracteristicile specifice
instructiunilor vectoriale fac ca prelucrarea vectoriala sa exploateze la maximum tehnica
pipeline.
Formatul instructiunilor vectoriale este compus din mai multe campuri pentru care se
specifica urmatoarele elemente.
- Codul operatiei
- Adresa de baza din memorie unde trebuie extrasi operanzii vector
- Incrementul folosit la adresarea componentelor vectorilor
- Offset fata de adresa de baza
- Lungimea vectorilor
1
Daca tinem seama de locul de unde operanzii vectori sunt adusi pentru prelucrare vom
putea distinge doua tipuri de calculatoare vectoriale: calculatoare de tip memorie la memorie
(componentele vectorilor implicati intr-o instructiune vectoriala sunt aduse din memorie, iar
rezultatul este stocat tot in memorie) si calculatoare registru la registru ( acestea au registre
vectoriale care sunt capabile sa memoreze operanzii vectori necesari unei instructiuni).
Asa cum se observa din figura orice calculator vectorial are in componenta o unitate
de procesare a instructiunilor, un controller pentru instructiuni vectoriale, registre scalare si
unitati functionale pentru operatii scalare, care alcatuiesc procesorul scalar al calculatorului,
registre vectoriale si unitati functionale dedicate instructiunilor vectoriale ce alcatuiesc
calculatorul vectorial.
Prioritatea de procesare a instructiunilor, are rolul de a extrage instructiunile din
memorie si de a indentifica daca este de tip scalar sau vectorial. Daca este o instructiune
scalara este trimisa catre procesorul scalar, daca insa este o instructiune vectoriala,
supervizarea executiei acesteia va fi plasata controllerului care va decodifica instructiunea si
comanda controllerul de acces sa extraga operanzii din memorie. Totodata controllerul de
operatii are si o sarcina f importanta: de a partitiona un task vectorial, un set de instructiuni
vectoriale coordonate conform unei relatii de precedenta, si a planifica subtask-urile pentru
executie la diferite unitati functionale organizata in banda de asamblare cu un timp de
executie minim.
2
Capitolul 5. Arhitecturi pentru paralelismul la nivel de proces.
5.1 Introducere
3
avea dimensiuni foarte variate, pe cand in cazul memoriei partajate sistemul de comunicatie
va trebui sa faca fata unui numar foarte mare de acces concurent la memorie.
Fiecare din cele doua tipuri de calculatoare MIMD, prezinta caracteristici proprii,
avantaje si dezavantaje. Sistemele bazate pe memorie distribuita sunt sisteme cu un grad mare
de scalabilitate, adica pot fi extinse suportand un numar foarte mare de procesoare. Acest
lucru este posibil datorita faptului ca fiecare procesor are o memorie proprie, iar accesele la
memorie vor fi in general la aceasta memorie locala. Astfel se evita problema concurentei
aparute la sistemele cu memorie partajata. Modelul de programare in cazul memoriei
distribuite este bazat pe tehnica de schimb de mesaje (message passing) care este mult mai
usor de utilizat decat tehnicile prin semafoare sau monitoare, asa cum se intampla in cazul
calculatoarelor cu memorie partajata.
Exista insa si dezavantaje in sistemele cu memorie distribuita. Acestea tin de
incarcarea echilibrata a procesoarelor care nu se poate obtine decat cu mare grija din partea
programatorilor. Alte probleme ce pot aparea sunt legate de schimbul de mesaje care practic
inseamna transferul unor mari cantitati de date prin reteaua de interconectare. De mare
importanta este performanta retelei, ce se afla in stransa legatura cu metoda de routare
folosita.
4
Pentru a rezolva partial problema concurentei la memorie, se poate folosi o memorie
cache locala pentru fiecare procesor (fig. 5.2). Cand are loc o cerere de acces la memorie se
va verifica mai intai daca datele respective se gasesc in memoria cache, iar daca acestea se
gasesc aici se va utilize copia din memoria cache. In acest mod nu mai este nevoie sa se
acceseze memoria principala. Poate aparea insa, o problema, coerenta memoriei cache; daca o
informatie se gaseste in mai multe memorii cache, atunci la modificare unei copii intr-o
memorii cache trebuie informoate si celelalte module de memorie cache pentru a-si
invalida/actualiza propria lor copie. Pentru a mentine coerenta memoriei cache, exista in
prezent atat solutii software cat si hardware, dar aceasta problema suplimentara contribuie la
limitarea performantelor calculatoarelor cu memorie partajata.
O solutie arhitecturala care contine cele doua variante perzentate pana acum o
reperezinta sistemele cu memorie partajata din punct de vedere logic, dar distribuita din punct
de vedere fizic (DSM-Distributed Shared Memory). Modulele de memorie ale unui astfel de
sistem sunt locale fiecarui procesor, dar ele alcatuiesc un spatiu de adersa unic, comportandu-
se ca o memorie partajata global. Utilizarea sau nu a unei memorii cache pentru a spori
performantele unui astfel de sistem duce la o clasificare de genul urmator:
5
Masinile NUMA sunt foarte asemanatoare cu sistemele cu memorie distribuita clasice:
Fiecare procesor are o memorie locala, dar toate modulele din memorie alcatuiesc un
spatiu unic de adresa; drep consecinta, atunci cand un procesor va accesa o variabila ce se afla
chiar in memoria locala, accesul va fi foarte rapid, dar atunci cand variabila respectiva se afla
intr-un alt modul de memorie aflat la distanta, accesul va fi foarte lent datorita faptului ca
datele trebuie sa fie transmise prin reteau de interconectare. Pentru a preveni situatiile in care
se fac accese repetate la date aflate in memorie la distanta, trebuie acordata o atentie deosebita
distribuirii datelor si organizarii algoritmilor astfel incat majoritatea acceselor sa aibe loc la
nivel local.
La sistemele COMA, memoriile locale se comporta ca o memorie cache. In acest caz
datele nu vor fi legate static de o memorie fizica cum se intampla la calculatoarele NUMA, ci
vor migra si vor fi copiate in acea memorie locala unde vor fi mai des folosite. Prin utilizarea
memoriilor locale ca o memorie cache, probabilitatea ca un procesor sa acceseze majoritatea
timpului date numai din memoria locala creste simtitor. Atunci cand un procesor va accesa o
data ce nu se afla in memoria locala, controller-ul de memorie va determina unde se afla
blocul dorit(in ce memorie) si va initia o operatie de aducere a acelui bloc in memoria locala.
Acesta este chiar principiul de operare a unei memorii cache de unde vine si numele acestei
arhitecturi.
Faptul ca nu exista o memorie globala ca in cazul celorlalte calculatoare, induce
probleme suplimentare. Una din probleme este aceea ca lipsind memoria globala, memoria
cache(locala) nu poate opera ca o memorie cache ordinara. Sa ne imaginam situatia uni
procesor P1 care executa o cerere de acces la un bloc de date care nu se afla in memori locala
M1. Controller-ul de memorie va determina locatia acelui bloc de memorie(in care memorie
locala se afla blocul) si-l va aduce memoria procesorului P1. Daca la sosirea acestui bloc
numai este loc liber in memoria locala M1, atunci un alt bloc trebuie evacuat. In cazul cand
exista o memorie globala blocul era copiat pur si simplu in memoria globala. In cazul
calculatoarelor COMA, cum aceasta memorie globala nu exista trebuie gasit un alt nod
procesor-memorie dispus sa accespte blocul de date, chiar daca acest nod procesor accesa
blocul de date primit. Acest nu numai ca va complica controller-ul de memorie, dar va avea si
un impact negativ asupra performantelor calculatorului.
Deoarece calculatoarele COMA nu au o locatie fixa pentru blocurile de memorie,
protocolul de mentinere a coerentei de memorie trebuie sa gaseasca spatiu de memorie locala
a altui nod ori de cate ori un bloc trebuie evacuat din memorie. Odata cu cresterea numarului
de procesoare, problema mutarii de blocuri de memorie si a gasirii de spatiu liber devine tot
mai complicata. Deoarece evacuarea unui bloc se bazeaza pe gasirea unui spatiu liber in alt
nod care putea memora blocul, trebuie luate precautii speciale pentru evitarea situatiei de
deadlock (interblocare).
O alta problema care poate aparea la calculatoarele COMA este legata de utilizarea
paginarii memoriei. Atunci cand sistemul de operare al calculatorului aduce o pagina in
memorie, aceasta este divizata in blocuri, iar blocurile sunt memorate in memoriile locale.
Dupa un anumit timp s-ar putea ca blocurile ce au apartinut unei singure pagini sa se gaseasca
in diferite memorii locale. De aceea atunci cand OS-ul va evacua pagina in memoria
secundara, toate blocurile care compun pagina trebuie „culese” din diferitele memorii locale
unde se afla in momentul evacuarii.
6
AP – CURS 7
Calculatoarele CC-NUMA contin cele doua variante NUMA si COMA dispunand atat
de o memorie locala propriu-zisa cat si de o memorie cache. Prezenta acestei memorii cache
va reduce foarte mult din traficul prin reteua de interconectare, ducand in acelasi timp la o
incarcare cat mai egala. Procesorul acceseaza memoria locala mult mai rapid decat acceseaza
memoria locala alt procesor deoarece o astfel de cerere nu trebuie sa strabata reteaua de
interconectare. Calculatoarele CC-NUMA aduc o imbunatatire fata de calculatoarele NUMA.
Fiecare nod va avea si o memorie cache locala. Astfel, daca un bloc de memorie nu este stocat
local, acest bloc poate fi accesat si adus in memoria locala si stocat in memoria cache locala.
La o cerere ulterioara de acces la acelasi bloc, el nu mai trebuie adus prin reteua de
interconectare (operatie mare consumatoare de timp) si va fi accesata copia aflata in memoria
cache locala. Problemele care apar aici sunt de mentinere a coerentei memoriei cache,
mecanism care contribuie la cresterea traficului prin reteua de interconectare. Folosirea unor
tehnici speciale de alocare a datelor in memoriile locale astfel incat majoritatea acceselor sa
fie locale duce la cresterea performantelor acestor calculatoare, dar in acelasi timp va impune
programatorului sa cunoasca detalii despre arhitectura completa pe care ruleaza programul si
va duce la scaderea portabilitatii programelor.
Spre deosebire de operatia de comutare dintre doua procese, operatia care chiar daca
este suportata in hardwere este mare consumatoare de timp, comutarea intre doua fire trebuie
sa fie foarte rapida. Calculatoarele care realizeaza acest lucru sunt denumite de obicei
calculatoare multithread.
O astfel de arhitectira multithread a fost realizata inca de la sfarsitul anilor 80.
Calculatorul NEP suporta o intretesere fina a firelor de executie. Procesorul acestuia este
realizat in tehnica pipeline cu opt nivele, iar in fiecare tact de ceas in banda de ansamblare
intra o instructiune a unui nou fir. Arhitectura elementului de procesare a calculatorului NEP
este prezentata in fig. 5.4.
1
O componenta de baza a elementului de procesare (EP) o reprezinta structura de date
PSW (process status word) care contine o lista a tuturor firelor de executie. Un fir de executie
este scos din capul listei, instructiunea curenta corespunzatoare acestui fir este adusa din
memorie si in final instructiunea este executata pe una dintre unitatile functionale. Firul de
executie este apoi introdus la sfarsitul listei PSW cu pointer-ul instructiune implementat. Se
optine in acest fel o intretesere a firelor de executie la nivel de instructiune. Procesorul avand
opt nivele in banda de ansamblare, lungimea minima a conzii PSW este de opt fire pentru a
putea introduce cate o instructiune in banda la fiecare tact de ceas.
Calculatorul NEP era dotat cu 16 EP (element de procesare) care putea accesa o
memorie formata din maxim 128 module de memorie partajata. Interconectarea intre
procesoare, memorie si sistemul I/O se realizeaza printr-o retea cu comutare de pachete.
Pentru a rezolva problema acceselor concurente la memorie fiecare cuvand avea un bit
indicator (full/empty). Un acces la un cuvant cu bit-ul in starea empty duce la suspendarea
firului corespunzator instructiunii care a generat cererea de acces la memorie. Acest fir este
introdus intr-o lista mentinuta de unitatea de planificare SFU (scheduler functional unit). Aici
cererea de acces la memorie va fi reiterata pana cand poate fi satisfacuta. In acest moment
firul de executie poate fi introdus inapoi in lista PSW.
Sincronizarea se mai poate realiza si prin intermediul registrelor. Fiecare registru de
comunicare are un indicator (full / empty/ reseaved). Daca tentativa de comunicare nu a reusit
in banda de ansamblare se inroduce o instructiune noua, iar firul este apoi introdus in lista
PSW fara a incrementa pointer-ul de instructiuni. Aceasta maniera de sincronizare (busi-
wainting) impreuna cu faptul ca un element de procesare nu accepta decat maxim 64 de fire a
reprezentat punctul slab al calculatorului. Cu toate acestea NEP a fost o realizare deosebita
avand in vedere anul in care a fost creat.
2
5.2. Calculatoare cu memorie distribuita.
5.2.1. Arhitectura calculatoarelor cu memorie distribuita.
3
Pe langa problema alegerii unui tip de retea de interconectare o decizie importanta in
proiectarea unui calculator paralel o constituie stabilirea tipului de procesor care va fi utilizat.
Granularitatea este un alt aspect cheie care trebuie mentionat atunci cand se caracterizeaza un
astfel de calculator. Daca majoritatea calculatoarelor cu memorie distribuita atmit o
granularitate grosiera, exista si calculatoare ce admit o granularitate medie sau chiar fina.
Solutia in acest caz o reprezinta modelul de comunicare prin schimb de mesaje. Daca
la un moment dat apare situatia in care un procesor are nevoie de date care nu se afla in
memoria locala, atunci el va compune un mesaj in care va cere datele respective si va
directiona mesajul catre nodul unde se afla stocate ele. Pentru operatiile de comunicare prin
schimb de mesaje sunt folosite in general doua primitive:
- Send-pentru trimiterea unui mesaj;
- Receive-pentru primirea unui mesaj.
Exista 2 modalitati de abordare a comunicarii prin schimb de mesaje .
- Una in care procesul ce a executat o astfel de operatie este blocat pana la incheierea
operatie(spre exemplu, cand se executa o operatie SEM, procesul ar putea continua
numai dupa ce destinatarul a primit mesajul si invers, un proces ce executa o operatie
de receive este blocat pana cand receptioneaza un mesaj);
- A doua modalitate, in care procesul poate continua imediat dup ace a apelat una din
cele 2 primitive si va fi instiintat printr-o intrerupere atunci cand aceste operatii s-au
terminat de realizat (bineinteles daca procesul a executat receive, el poate continua
doar pana cand era nevoie efectiv de datele cerute - in acest moment el va fi blocat
pana la primirea datelor).
Datorita faptului ca transmiterea datelor intre procesoare este o operatie mare
consumatoare de timp, problema care se pune aici este de a gasi o partitionare optima a
programelor astfel incat sa se minimizeze cominicarea interprocesor. Acesta problema se
dovedeste a fi dificila mai ales ca o mapare cere este optima pentru o anumita configuratie a
retelei de intercomunicare poate sa nu fie optima pentru o alta configuratie.
Cele mai des intalnite topologii de retele de interconectare sunt prezentate in continuare:
-retea complet conectata(fig.5.6.a)- fiecare procesor este legat direct cu toate celelalte
procesoare ; acesta este tipul ideal de retea, deoarece permite comunicarea intr-un singur pas
intre oricare 2 procesoare; costul foarte mare al acestui tip de retea duce la utilizarea destul de
4
rara in practica; costul ridicat provine din faptul ca fiecare procesor trebuie sa aiba canale de
comunicatie separate cu toate celelalte procesoare;
-retea in forma de stea(fig.5.6.b)- toate procesoarele sunt conectate cu un procesor
central, iar atunci cand are loc o comunicare intre 2 procesoare, mesajele sunt route-ate prin
acest nod central; faptul ca toate mesajele trebuie sa treaca prin procesorul central constituie o
limitare serioasa a performantelor acestei retele, deoarece peste un anumit trafic procesorul
central poate sa nu faca fata cererilor de schimb de mesaje;
-retea liniara(fig.5.6.c)- este o retea foarte simpla in care fiecare procesor este direct
conectat cu cei doi vecini ai sai; comunicarea intre doua procesoare care nu sunt direct
conectate are loc prin transmiterea mesajului prin toate nodurile intremediare dintre sursa si
destinatie;
-retea mesh(retea de tip grila de tip bidimensionala fig.5.6.e)- fiecare procesor va avea
conextiuni cu patru vecini; exista posibiliatatea ca procesoalrele de pe marginea grilei sa fie
interconectate intre ele, obtinandu-se o retea For(!) (fig.5.6.f); aceasta topologie poate fi
extinsa si pentru cazul tridimensional(fig. 5.6.g).
-retea arbore(fig. 5.6.h)- intr-o astfel de retea exista o singura cale de comunicare intre
oricare doua procesoare; nodurile arborelui pot fi intorodeauna procesoare sau in alta varianta
cele de pe niveluri inferioare sunt comutatoare, numai frunzele arborelui fiind procesoare;
retelele arbore au dezavantajul major ca atunci cand, spre exemplu, precesoarea din
subarborele drept dores sa comunice cu cele din subarborele stang, toate measjele vor trebui
sa treaca prin nodul radacina, care s-ar putea sa nu faca fata avalansei de mesaje; o varianta de
retea arbore care remediaza aces neajuns este retea ’FAT-tree’, in care cand avansam spre
nodul radacina, la fiecare nivel numarul de legaturi este dublat(fig. 5.6.i);
-retea hipercub(fig. 5.6.j)- aceasta este o retea multidimensionala; in figura se pot
observa retele hiprecub unidimensionale, bidimensionale, tri si patru-dimensionale; in retelele
hipercub fiecare procesor este legat cu un alt procesor numai daca adresele difera numai pe o
singura pozitie binara; intr-o retea 2D fiecare procesor va avea conexiuni cu doi vecini; intr-o
retea 3D cu trei vecini, intr-o retea p-dimensionala fiecare procesor va fi conectat direct cu p
vecini.
5
6
Pentru a evalua performantele acestor retele de interconectare se folosesc o serie de
indicatori dintre care cei mai importanti sunt:
- Diametrul retelei – se defineste ca fiind maximul distantei minime dintre oricare 2
procesoare (distanta fiind masurata in numarul de noduri intermediare dintre cele 2
procesoare);
- Costul retelei – se defineste ca fiind numarul de lagaturi din retea;
- Conectivitatea – est eo masura a numarului de cazuri posibile dintre oricare 2
procesoare; in general sunt de preferat retele cu o conectivitate mare pentru a putea
face fata unui trafic intens; conectivitatea se poate masura prin numarul de legaturi
care trebuie inlaturate pentru a imparti reteaua in doua subretele disjuncte;
- Latimea de bisectie este definita ca numarul minim de conexiuni care , daca sunt
indepartate se vor obtine 2 subpartitii egale ale retelei initiale.
7
AP – CURS 8
Metoda de comutare utilizata are un impact mare asupra duratei transmisiei unui mesaj
intre un procesor sursa si unul destinatie.
Primele tipuri de calculatoare foloseau metoda comutarii de pachete. Aceasta metoda
preluata de la retelele de calculatoare, presupune impartirea unui mesaj in mai multe pachete
de date, care vor fi apoi transmise independent unul de altul prin retea. In general pachetul
este alcatuit dintr-un antet cu informatii necesare rularii sale prin retea si datele propriu-zise.
Acesta va trece prin mai multe noduri intermediare in drum spre destinatie. Fiecare nod
intermediar are un buffer de memorie unde este trecut intregul pachet. Tinand seama de
principiul „memoreaza si inainteaza”, utilizat la comutarea de pachete, putem deduce timpul
necesar unui pachet pentru a ajunge de la sursa la destinatie:
t=L/B*d
unde :
L-lungimea pachetului;
B-largimea de banda a canalului de comunicatie;
d-u=distanta exprimata in numar de noduri intermediare dintre sursa si
destinatie.
Datorita faptului ca t-direct proportional cu d, diametrul retelei este un factor esential
pentru retelele care folosesc comutarea de pachete.
Alta tehnica des utilizata este comutarea de circuite, care se aseamana cu sistemul
telefonic. Pentru transmiterea unui mesaj prin comutare de circuite sunt necesare trei faze:
- Stabilirea legaturii;
- Transmisia propriu-zisa;
- Faza de eliberare a legaturii.
In prima faza este transmis un scurt pachet pentru realizarea legaturii. Faza 2 - în care
sunt transmise datele propriu-zise, etapă în care canalele de comunicație ce leagă sursa de
destinație sunt utitlizate exclusiv pentru operația curentă de comunicație. Nici un alt procesor
nu poate să mai utilizeze aceste canale până la terminarea operației curente.
Primul avantaj al comunicației de circuite este acela că dispar buffer-ele intermediare
necesare stocării datelor în nodurile intermediare. Mecanismele de rutare fiind implementate
la nivel hardware, timpul de comutare se va reduce și în același timp resursele software
alocate comutației sunt mult diminuate. Alt avantaj este că timpul necesar unui mesaj să
ajungă la destinație, timp exprimat prin:
t= ( L1 / B ) * d + Lm / B
devine dependent de distanța dintre procesoare atunci când L1<< Lm , unde L1 – lungimea
pachetului inițial necesar realizării legăturii, Lm – lungimea mesajului propriu-zis, B-
lungimea de bandă a rețelei.
Independența dintre sursă și destinație a făcut ca la calculatoarele care utilizează
comutarea de circuite problema diametrului rețelei să nu mai fie așa acută. Acesta este si
motivul pentru care retelele de tip hipercub sun din ce in ce mai rar folosite.
O metodă ce combină caracteristici atât ale comutării de circuite, cât și ale comutării
de pachete este metoda diviziunii mesajelor. Mesajele sunt împărțite în mici pachete numite
flit (flow control digits) care sunt trimise către destinație unul după altul într-o manieră
asemănătoare unei benzi de asamblare. Fiecare nod intermediar dispune de un buffer ce poate
stoca aceste flit-uri. Flit-ul va fi reținut în buffer atunci când linia de ieșire este ocupată.
Dimensiuena buffer-ului poate varia ducând la comportări diferite ale tehnicii de rutare prin
diviziunea mesajelor: dacă acestea sunt suficient de mari ele pot memora întregul mesaj,
situație echivalentă cu tehnica comutării de pachete, iar dacă buffer-ele sunt mai mici, mesajul
va fi memorat în mai multe noduri adiacente pe calea dintre sursă și destinație.
Timpul necesar unui mesaj ca să ajungă de la sursă la destinație se poate exprima prin:
t= ( Lh / B ) * d + Lm / B
unde Lh – lungimea primului flit
Lm – lungimea mesajului propriu-zis
Dacă Lh <<Lm se obține independența timpului pe distanța dintre noduri.
În fig 5.7 poate fi urmărită o comparație între comutarea între pachete și cea pe
diviziunea mesajelor.
virtuale pot face posibil ca mesajele independente sa utilizeze aceeasi legatura fizica. Modul
practic de realizare a acestora este destul de simplu. Fiecare nod nu va detine un singur buffer
pentru memorarea unui flit, ci va avea mai multe astfel de buffere impreuna cu un
multiplexor. Fiecare buffer poate fi ocupat de un pachet si va reprezenta de fapt un canal
vertical. Multiplexorul are rolul de a testa care dintre buffer-ele nodului pereche este liber
pentru a accepta un nou mesaj si apoi va alege in conformitate care dintre mesajele memorate
in propriile buffere va fi transmis mai departe.
Situatia de live – lock apare atunci cand mesajele se propaga la infinit fara a ajunge la
destinatie. In retelele care folosesc comutarea de pachete pot aparea mai usor situatii de live –
lock in timp ce utilizarea comutarii de circuite sau tehnicii ware – work duce la posibilitatea
de disparitie a unui live – lock.
Algoritmii de rutare au un rol important in retelele de rutare ale calculatoarelor cu
memorie distribuita. Algoritmii de rutare stabilesc calea care va fi urmata de un mesaj de la
sursa catre nodul destinatie si pot fi implementati atat la nivel hardware cat si software. Pot fi
clasificati astfel :
-minimali
Algoritmii minimali aleg intotdeauna calea cea mai scurta intre sursa si destinatie. La
fiecare pas mesajul se apropie de destinatie, dar nu se tine seama de faptul ca pot aparea
supraincarcari a unor secvente de retea.
Algoritmii non-minimali iau in considerare aspecte precum evitarea congestionarii
retelei atunci cand stabilesc calea pe care va trebui sa o urmeze un mesaj.
O alta clasificare a algoritmilor de rutare poate fi obtinuta daca este luat in considerare
modul cum acestia utilizeaza informatiile privind starea retelei. Putem avea astfel:
Prima clasa se poate descrie astfel: modul sursa construieste un antet al mesajului in
care se va introduce informatia de rutare pentru nodurile intermediare. Aceste informatii
defines o directie implicita, precum si nodurile in care trebuie schimbata directia. Fiecare nod
care primeste un mesaj va citi informatiile din antet si va compara adresa proprie cu cea gasita
in antet. Daca adresele nu coincide, mesajul va fi trimis mai departe pe directia implicita, iar
in cazul in care adresele coincide mesajul va fi trimis pe noua directie definite in antet.
Al 2-lea tip de algoritmi deterministi presupune definirea unei ordini a dimensiunilor,
dupa care va fi rutat un mesaj. Spre ex, intr-o retea de tip grila bidimensionala de procesoare,
un mesaj poate fi transmis de-a lungul directiei OX pana cand atinge abscisa corespunzatoare
nodului destinatie, dupa care va fi trimis pe OY. La fel se poate proceda si pe o retea
tridimensionala. Se trimite mesajul pe OX, apoi pe OY si in final pe OZ.
Pe langa algoritmii deterministi, care nu iau in considerare starea retelei, mai exista o a
2-a categorie denumiti adaptive, care tin seama de starea retelei. Acestia pot fi diferentiati
dupa modul cum iau decizia de rutare. Exista algoritmi care trimit un mesaj numai pe un canal
de iesire care se stie dinainte ca va duce mesajul mai aproape de destinatie, si algoritmi care
evita congestionarea unor segmente de retea, cu toate ca mesajele vor urma o cale mai lunga.
O alta diferentiere poate fi pusa in evidenta daca tinem seama ca exista algoritmi are
permit unui mesaj sa treaca printr-un nod prin care a mai trecut odata (alg. backtracking) sau
care nu permit unui mesaj sa mai treaca a 2-a oara printr-un nod (alg. progresivi).
5.3 Calculatoare cu memorie partajata
Folosirea alg. Daisy-Chaining ,care e bazat pe proprietăți statice duce la timpi foarte
mari de așteptare pentru procesoarele cu o prioritate scăzută.De asemenea,nici factorul de
echilibrare nu are valori satisfăcătoare pentru un număr mare de procesoare conectate la
magistrală.Acesta crește foarte rapid odată cu creșterea nr. de procesoare.Timpul maxim de
așteptare crește și el rapid odată cu scăderea priorității.
Utilizarea acestui alg. furnizează rezultate bune când magistrala nu e foarte încărcată,
adică în cazul unui număr mic de procesoare.
Alg.Round-Robin duce la o încărcare echilibrată a magistralei deoarece toate
procesoarele vor primi acces la un anumit interval de timp. Experimental se observă că L
rămâne foarte mic indiferent de nr. de procesoare N. Timpul mediu de așteptare nu variază
semnificativ cu N.
Alg. Round-Robin duce la timpi medii de așteptare mai mari decât în cazul Daisy-
Chaining rezultând un factor de utilizare al magistralei mai mic.
Alg. Rotating , Daisy-Chaining și RLU duc la obținerea unei încărcări bune a
magistralei în condițiile unor timpi de așteptare mai reduși,decât în cazurile precedente.Acești
2 alg. duc la rezultate mai bune decât Round-Robin sau Daisy-Chaining, deci vor fi de
preferat în practică.
Alg.FCFS(first come first set)e un alg.simetric și deci va duce la o încărcare
echilibrată a magistralei.Dacă luăm în considerare toate elementele care caracterizează
performanța magistralei,putem trage concluzia că acest alg. e foarte bun,dar în schimb apar
dificultăți foarte mari la implementarea hardware a acestuia,deoarece arbitrul de magistrală
trebuie să mențină o listă cu toate cererile primite .Această listă înseamnă de fapt : spațiu de
memorie și procedure pt. gestionarea ei.
Un alt factor care contribuie la obținerea unor performanțe bune e modul de lucru al
magistralei. Primele magistrale pt calculatoare paralele funcționau pe baza unui principiu
denumit magistrală cu blocare. O operație de acces la memorie implicat de obicei 2 faze :
transformarea adresei și a datelor și respectiv operația propriu-zisă de citire sau scriere
executată de controlerul de memorie. La magistralele cu blocare,cele 2 faze se execută
secvențial.Magistrala e deci blocată până când operația de scriere/citire e terminată.
A 2-a generație de magistrale denumite pended-bus,permit suprapunerea celor 2
faze,astfel după încheierea fazei de transfer al adresei sau a datelor pe magistrală,alt procesor
poate starta imediat o nouă operație de citire/scriere în timp ce prima cerere e tratată de către
controlerul de memorie.Pentru a implementa o astfel de strategie,de utilizare a
magistralei,controlerul de memorie va trebui să fie dotat cu un buffer în care să memoreze
cererile transmise.
A 3-a generație de magistrale : merg mai departe cu optimizarea op.de citire.Se
observă că op.de citire necesită mai întâi transferarea adresei locației de memorie,utilizând
magistrala de adrese,apoi citirea propriu-zisă executată de controlerul de memorie și în final
transferarea datelor citite utilizând magistrala de date. Prima si a 3-a op. se pot executa
simultan pentru cereri care diferite, deoarece ele folosesc fie magistrală de date,fie cea de
adrese. Magistralele cele mai moderne permit separarea acestor 3 faze și execuția lor în mod
suprapus,astefel încât se permite unui procesor să execute o nouă cerere de citire înainte ca
cererea precedentă să se fi încheiat.Aceste magistrale au primit numele de split-transaction-
bus(magistrale ce tranzacții divizate).
Pe lângă cererile de acces concurent,un alt dezavantaj major al sistemelor bazate pe o
singură magistrală de comunicații e faptul că o defecțiune apărută la magistrală duce căderea
întregului sistem.
O modalitate de îmbunătățire a performanței sistemelor bazate pe o magistrală e
folosirea mai multor magistrale de comunicații. În acest caz fiecare dispozitiv va fi conectat la
toate aceste magistrale ca in fig. 5.11.
Crescând nr. de magistrale din ex. precedent se poate ajunge la situația în care există o
cale de acces separată pentru fiecare modul(fig. 5.12). În această situație sistemul de
comunicații devine o rețea de tip crossbar.
Modalitatea de rotare a mesajelor din rețeaua omega se poate exemplifica uşor pentru
cazul a 8 procesoare în felul următor :
1. Fie adresa procesorului sursă : s1,s2,s3
2. După prima aplicare a funcţiei shuffle : s2,s3,s1
3. După primul comutator : s2,s3,d1 (înainte dacă s1,-d1 ; conexiunea adiacentă dacă
s1≠d1)
4. După a 2-a aplicație a funcţiei Shuffle : s3,d1,s2
5. După al 2-lea comutator : s3,d1,d2 (înainte dacă s2=d2,interschimb dacă s2=d2)
6. După a 3-a aplicare a funcţiei shuffle : d1,d2,s3
7. După al 3-lea comutator : d1,d2,d3(înainte : s3=d3, conexiune adiacentă : s3=d3)
8. Procesorul destinației : d1,d2,d3 .
Rețeaua omega și conexiunea perfect-shuffle : fig. 5.14: