Documente Academic
Documente Profesional
Documente Cultură
aceea este nevoie sa existe ceva care sa faciliteze translatarea desrierii abstracte a unei
probleme intr-un algoritm. Acest ceva este chiar modelul computational.
Studiind diversele arhitecturi de calculatoare si limbaje de programare, s-a constat ca exista o
stransa legatura intre acestea, legatura realizata tocmai prin modelul computational, care sta la
baza lor. Astfel calculatoarele von Neumann impreuna cu limbajele imperative, au la baza
modelul computational vou Neumann, limbajele functionale si arhitecturile reduction au la
baza modelul aplicativ si asa mai departe. Putem privi modelul computational ca o notiune
abstracta ce inglobeaza atat arhitecturile cat si limbajele de programare. Pornind de la acest
concept, limbajele de programare reprezinta un instrument cu ajutorul caruia se pot specifica
problemele care trebuie rezolvate, iar arhitectura calculatorului o putem vedea ca un intrument
pentru implementarea modulului computational.
Pentru a defini un model computational este necesara specificarea a 3 concepte:
1. Elementele de baza supuse prelucrarilor.
2. Modelul de descriere a problemei
3. Modul de executie.
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:
-
Crearea unui proces implica o serie de actiuni din partea sitemului de operare:
-
1.
Procesul este planificat.
2.
Procesul este suspendat.
3.
Procesul este blocat n ateptarea unui eveniment.
4.
Evenimentul a avut loc i procesul este gata de
execuie.
1.
2.
3.
4.
Procesul e planificat.
Procesul este suspendat
Procesul este blocat in asteptarea unui eveniment
Evenimentul a avut loc si este gata de executie.
Arhitectura SISD prezenta in figura 2.3a corespunde calculatoarelor secventiale in care exista un
singur flux de instructiuni si un singur flux de date. Cu toate acestea chiar si la calculatoarele SISD poate
exista un anumit grad de paralelism prin organizarea unitatii de procesare in arhitectura pipe-line sau
prin introducerea mai multor unitati functionale.
Calculatoarele SIMD mai sunt denumite si arii de procesoare. Ele au o singura unitate de control,
care distribuie aceeasi instructiune catre toate elementele de procesare. Fiecare element de procesare
va executa aceasta instructiune in mod sincron dar cu datele proprii. Din figura se observa ca memoria
partajata de toate elementele de procesare poate fi alcatuita din mai multe module de memorie.
In fig 2.3c este prezentata arhitectura calculatoarelorMISD. Acestea au m elemente de
procesare si n unitati de control, fiecare element de procesare primind de la unitatea de control asociata
un flux propiu de instructiuni, dar toate lucreaza la acelasi flux de date. Din punct de vedere practic nu
exista la momentul actual calculatoare paralele care sa fie construite dupa acest model.
Arhitectura MIMD ( 2.3d ) este caracterizata prin existenta a n unitati de control, care distribuie
cate un flux de instructiuni separat pentru cele n unitati de procesare. Fiecare unitate de procesare are
propriul flux de date. Calculatoarele MIMD constituie de fapt clasa in care se incadreaza marea
majoritate a calculatoarelor paralele construite in prezent. In ceea ce priveste diferentierea dupa
organizarea memoriei in calculatoare cu memorie partajata si calculatoare cu memorie distribuita, se
poate merge in continuare cu clasificarea daca tinem seama de modul cum este implementata practic
memoria partajata sau distribuita, si de modul cum se pot accesa aceste memorii.
Alt aspect foarte important care trebuie avut in vedere pentru a obtine performante deosebite,
cand constituie subsistemul de comunicatie care leaga procesoarele, memoriile si dispozitivele de I/O.
Se disting in principiu doua solutii pentru realizarea subsistemului de comunicatie: folosirea unei
magistrale sau a unei retele de comunicatie.
Magistralele au avantajul simplitatii dar nu permit conectarea unui numar foarte mare de
procesoare, datorita faptului ca sporirea acestui numar determina aparitia unor conflicte de acces care
duc la degradarea performantelor. Problemele care trebuie tratate la proiectarea unei magistrale includ:
alegerea unui algortim de arbitrare a magistralei, stabilirea modului de operare a magistralei(modul in
care se realizeaza tranzactiile pe magistrala), fiabilitatea si toleranta la defecte, posibilitatea de a
suporta protocoale de realizare a coerentei memoriei cache. Pentru a elimina dezavantajul numarului
scazut de procesoare, ce pot fi conectate la o magistrala s-au propus diferite solutii, dintre care amintim
sistemele bazate pe o ierarhie de magistrale, si sistemele bazate pe clusterele de procesoare.
Folosirea unei retele de interconectare, procesor memorie, face sa dispara limitarea impusa
numarului de procesoare, prezente la magistrala. Exista astfel posibilitatea de a realiza sistem cu sute
pana la mii de procesoare. Aceste sisteme sunt numite de obicei sisteme masiv paralele. In alegerea
unui tip de retea de comunicare trebuie tinut seama de o serie de aspecte legate de topologia retelei,
protocoalele de comunicatie folosite, metodele de operare, tehnicile de rutare. Partitionarea si
configurarea unui sistem de retea reprezinta o problema cheie legata de maparea datelor si a
programelor pe diferite module de memorie si procesoare si in realizarea unui timp de comunicatie
8
minim. Nu trebuie neglijate nici aspecte hardware legate de implementarea efectiva a comutatoarelor,
partitionarea retelei in mai multe chip-uri, analiza timpilor de intarziere.
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.
Domeniul calcului paralel nu a cunoscut un astfel de model general acceptat care sa poata fi
folosit la proiectarea algoritmilor pentru un numar mare de arhitecturi paralele. Un model general al
calculului paralel ar trebui sa tina seama de doua aspecte:
1. Sa reflecte caracteristicile specifice calculatoarelor paralele
2. Programele dezvoltate folosind acest model ar trebui sa poata fi executate eficient pe toate
tipurile de calculatoare paralele.
Din pacate aceste doua obiective se exclud unul pe altul. Un model general al calculatorului
paralel ar trebui sa inglobeze gradul de conectivitate. Daca modelul porneste de la ipoteza ca acest grad
este mic, atunci algoritmii proiectati vor rula bine pe calculatoare ce respecta ipoteza de plecare, dar ei
vor fi sub-optimali. Daca vor fi rulati pe calculatoare cu grad mare de conectivitate intre procesoare,
resursele de comunicatie vor fi sub-utilizate.
Eforturile depuse pentru gasirea unui modul independent de arhitectura al calculatorului paralel
nu a condus pana in prezent la definitivarea unui astfel de model. Totusi s-au conturat, mai multe
modele de calcul paralel, fiecare avand insa, un grad limitat de aplicabilitate. Se vor prezenta in
continuare 3 modele de calcul paralel: PRAM, BSP, LogP. Acestea sunt clasificate dupa forma de
organizare a memoriei calculatoarelor paralele in modele cu memorie partajata si modele cu memorie
distribuita.
2.4.2. Modelul PRAM
Modelul PRAM Paralel Random Access Machine este o generalizare a modelului RAM (Random
Access Machine) de calcul secvential. Pe scurt o masina PRAM poate fi privita ca p masini RAM,
secventiale, ce partajeaza o memorie comuna, fiecare putand accesa memoria independent si intr-o
perioada constanta. Comunicarea intre procesoare are loc prin intermediul memoriei comune. Orice
operatie de comunicare implica o scriere si o citire a unei locatii de memorie, operatie care are loc de
asemenea intr-un timp constant. In fig 2.5 este prezentata schema de baza a masinii PRAM.
11
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.
Termenul Bulk Syncronous provine de la caracterul modelului care se situeaza intre un model
total sincron (PRAM) si unul total asincron in care procesoarele lucreaza independent unul de altul si se
sincronizeaza doar atunci cand are loc un schimb de mesaje. Modelul BSP se situeaza undeva intre
aceste doua extreme: in interiorul unui superpas procesoarele lucreaza asincron, dar sunt sincronizate la
sfarsitul fiecarui superpas.
Exista mai multe variante, usor diferite, pentru calculul complexitatii unui algoritm paralel
folosind modelul BSP, variante din care se va prezenta doar una, datorita simplitatii ei. Particularitatea
aceste variante consta in aceea ca orice algoritm este alcatuit dintr-o secventa de superpasi in care
fiecare procesor, fie calculeaza ceva, fie participa la o relatie h, ambele urmate de o sincronizare
globala. Pe ipoteza ca superpasii sunt destinati fie calculelor, fie comunicarii, (deci nu putem avea si
calcule si comunicare intr-un superpas) se pierde oarecum ceva din generalitatea modelului, dar se
12
simplifica analiza acestuia. 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
Limbajele de programare paralela trebuie sa dispuna de niste facilitati pentru a fi capabile sa
exploateze paralelismul existent la nivelul unei aplicatii. In general pentru exprimarea explicita a
paralelismului la nivelul unei aplicatii sunt disponibile doua metode: prima presupune descrierea
structurilor de date care sa exprime paralelismul (structural sau la nivel de date), iar a doua presupune
folosirea unei descrieri adecvate a programului pentru exprimarea paralelismului (la nivel de proces).
Granularitatea celor doua tipuri de paralelism difera de la granularitatea unei singure operatii, in primul
caz, la granularitate medie sau grosiera, la nivel de proces, in al 2-lea caz.
Procesoarele pipeline si superscalare care exploateaza paralelismul la nivel de instructiune, nu
au nevoie de constructii de limbaj special. Procesoarele superscalare analizeaza dinamic, chiar in timpul
executiei programului secventa de instructiuni pentru a determina care din ele sunt independente si se
pot executa in paralel. Pentru a usura munca procesorului un compilator inteligent va face o analiza a
codului si il va optimiza in vederea evitarii unor blocaje datorate dependentelor unor instructiuni si
imbunatatirii performantelor.
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.
Compilatoarele pentru arhitecturile VLIW folosesc tehnica trace scheduling, care cauta sa
optimizeze codul dincolo de limita unui bloc de baza. Compilatorul parcurge programul si folosind criterii
euristice, prezice cum vor avea loc salturile cautand apoi de-a lungul caii prezise sa compacteze
operatiile si sa le impacheteze intr-o instructiune VLIW. Procesul continua pana cand tot programul a
fost inclus in astfel de cai. Acest lucru poate fi urmarit in figura 2.8.
13
14
15
; R1=c
; R2= R1+R3
; R1= R2 +R3
; R1= R4+R5
16
Observam ca R1, operand comun in cele doua instructiuni operand destinatie.In acest caz
spunem ca I si J se afla in dependenta WAW, pentru ca ambele scriu o valoare in acelasi operand
destinatie.
Dependenta WAR poate fi exemplificata astfel:
I: add R1, R2,R3
; R1= R2 +R3
; R2= R4+R5
A doua instructiune are drept operand destinatie R2, care apare ca sursa in prima instructiune.
Dependenta WAR apare atunci cand o instructiune are drept destinatie un operand care este sursa intro instructiune anterioara.
Spre deosebire de dependetele RAW, dependentele WAR si WAW, pot fi rezolvate prin tehnica
denumita redenumirea registrelor. Daca in exemplul dependentei WAR, in instructiunea J, in loc de R2
se foloseste un registru de rezerva R2a, atunci executia celor doua instructiuni se poate porni in paralel
fara a altera corectitudinea lor. Singura conditie necesara pentru executia paralela a celor doua
instructiuni este aceea de a avea la dispozitie doua unitati functionale de adunare. In mod asemanator,
prin redenumirea registrelor se poate rezolva si dependenta de tip WAW. Metoda redenumirii
registrelor presupune o complexitate hardware ridicata datorita cerintei de existenta a unui set de
registre de rezerva si a unor precautii in utilizarea acestora.
3.3 Procesoare pipeline
Tehnica de procesare in banda de asamblare denumita tehnica pipeline, reprezinta o modalitate
importanta de crestere a performantelor procesoarelor. Datorita avantajelor acestor modalitati, de
procesare a instructiunilor, toate procesoarele moderne sunt organizate sub forma unor benzi de
asamblare.
3.4 Procesoare superscalare
Pe langa tehnica pipeline, o alta modalitate de imbunatatii performantele procesoarelor este
aceea de a introduce mai multe unitati functionale care pot lucra in paralel. Astfel un procesor va putea
executa simultan doua sau mai multe instructiuni.
3.4.1. Introducere
Datorita caracteristicii sale de a executa doua sau mai multe instructiuni in paralel, un procesor
superscalar are de rezolvat o serie de probleme care nu apareau la procesoarele scalare.(fig 3.2.b)
Printre aceste probleme se numara: decodificarea paralela a instructiunilor, planificarea instructiunilor
in executie, folosirea unor tehnici de evitare a blocajelor, de planificare datorate dependentelor dintre
instructiuni, executia paralela a mai multor instructiuni, mentinerea serialitati programelor si a tratarii
exceptiilor. Toate aceste probleme specifice vor fi detaliate in urmatoarele subcapitole.
17
18
In figura 3.8 pot fi urmarite cele doua moduri de planificare a instructiunilor. In primul caz se
poate urmari cum instructiunea I2 blocheaza de la planificare pe I3 cu toate ca I3 nu depinde de nicio
alta instructiune si s-ar putea executa. In cazul planificarii out of order instructiunea I3 a fost planificata
inaintea instructiunii I2, care fiind intr-o relatie de dependenta cu o alta instructiune nu poate fi
planificata. Pe langa aceste doua metode de planificare mai exista si o metoda intermediara,
planificarea partiala out of order. In aceasta situatie unele unitati de executie ale procesorului
utilizeaza planificarea in order, in timp ce alte unitati de executie utilizeaza out of order.
3.4.2.3 Utilizarea spatiilor de rezervare
Acestea sunt buffere de instructiuni plasate in fata unitatilor de executie, care au rolul de a
decupla planificarea instructiunilor decodificate de verificare a dependentelor. Verificarea
dependentelor intre instructiuni este amanata pentru momentul in care instructiunile memorate in
spatiile de rezervare vor face obiectul trimiterii lor catre unitatile de executie. Folosirea statiilor de
rezervare duce la eliminarea blocajelor de planificare pe care le poate intalni unitatea de decodificare/
planificare. Instructiunile intre care exista relatie de dependenta vor fi tinute in statiile de rezervare
pana la rezolvarea dependentelor. In momentul in care o unitate de executie este libera, toate
instructiunile independente prezente in statia de rezervare pot face obiectul planificarii. Instructiunea
care va fi aleasa depinde de strategia de planificare, pe care o implementeaza fiecare procesor.
3.4.2.4 Redenumirea registrelor
Acest concept a fost introdus in legatura cu eliminarea dependentelor false (WAW si WAR)
dintre instructiuni. In situatia unei situatii WAW, registrul destinatiei dintr-o instructiune se poate
redenumi, adica in locul registrului arhitectural ce apare in instructiune se va folosi un registru de
rezerva destinat special pentru redenumire. Rezultatul depus in registrul de rezerva va fi transferat in
20
registrul arhitectural initial in momentul in care ordinea secventiala a instructiunilor va permite acest
lucru.
Redenumirea registrilor are loc dinamic in timul executiei instructiunilor, aceasta tehnica fiind
introdusa chiar de la primele procesoare superscalare. Initial redenumirea registrelor s-a utilizat doar
pentru anumite tipuri de instructiuni. Schema de redenumire lucreaza dupa cum urmeaza: la un
moment dat presupune ca registrele arhitecturale reprezinta o submultime a registrelor fizice. Pentru
fiecare instructiune ce urmeaza registrul destinatie va fi salvat intr-un nou registru fizic disponibil.
Alocarea si dezalocarea registrelor sunt urmarite cu ajutorul unei tabele de mapare (fig 3.10).
21
22
23
Calculatoare SIMD.
Arii sistolice.
Arii cu front de unda.
Procesoare asociative
Calculatoare vectoriale
24
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.
Fig. 4-1
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: 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
25
memorie cu acces in paralel (MI) care sunt interconectate cu elementele de procesare printr-o retea de
aliniere. 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.
Fiecare element de procesare consta in principal intr-o unitate aritmetico-logica (ALU) si un se
de registri de lucru. Unitatea de control are proria memorie stocheaza programele ce vor fi executate.
Aceasta decodifica instructiunile din memoria proprie si decide unde vor si executate instructiunile
decodificate: chiar in interiorul CU daca sunt instructiuni scalare sau acestea vor fi distribuite catre
elementele de procesare daca sunt instructiuni vectoriale. 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 .
Fig. 4-2
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
26
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.
P1
a11
a21
a31
P2
a12
a22
a32
P3
a13
a23
a33
P2
a12
a21
a33
P3
a13
a22
a31
P2
a12
a33
a41
P3
a13
a21
a34
a42
P4
a14
a22
a43
P5
a23
a31
a44
27
Aceasta schema de memorare este denumita schema asimetrica (d1,d2) si se poate foarte usor
generaliza pentru cazul unui masiv de date k dimensional, obtinandu-se o schema de memorare
(d1,d2....dk).
4.2.2 Exemple de calculatoare SIMD
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.
Numarul de procesoare prezente intr-un calculator SIMD este in stransa legatura cu nivelul de
complexitate al acestora si cu costul lor. De obicei calculatoarele cu procesoare complexe au un numar
mai mic de procesoare, in timp ce calculatoarele la nivel de procesare de un singur bit sunt dotate cu mii
de procesoare.
Printre primele implementari ale calculatoarelor SIMD au fost calculatoarele ILLIAC si BSP.
ILLIAC3 a fost proietat inital ca o matrice de 32x32 procesoare. Urmatoarea versiune ILLIAC4 a avut mai
putine procesoare (8x8) dar de complexitate mai mare. Principalele aplicatii pentru care a fost proiectat
calculatorul constau in calculul matriceal si rezolvarea ecuatiilor cu derivate partiale.
BSP, un calculator comercial, a venit ca o imbunatatire a predecesorului sau, ILLIAC, pentru a
raspunde cererii de putere de calcul tot mai mare, necesitatea de aplicatii stiintifice si ingineresti.
Performantele atinse de BSP au fost de 50 Mflops iar aplicatiile rulate pe acest calculator au fost din
domeniul prognozei vremii, energiei nucleare, studierii modelelor seismice.
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.
28
29
separarea intre magistrala de date si cea de control, cele 4 unitati vectoriale de lucru in virgula mobila si
32 Mbiti memorie locala.
31
32
Reteaua cube este definita prin m functii de interconectare unde m = log 2(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.
Reprezentarea acestor functii de inteconectare este reprezentata in figura 4.14, pentru
cazul N = 8. Se observa ca recompunand cele 3 module de interconectare se obtine cubul 3D din
figura 4.13
o
o
34
trebuie astfel etichetate incat la fiecare nivel i ele sa poate fi obtinute prin aplicarea functiei cube C i cu i
de la 0 la m, de catre fiecare element de interconectare.
35
Tipul de reea
Mesh
Diametrul
2N
Arbore binar
Piramid
21ogN
21ogN
Hipercub
Cub generalizat
Diametrul reelelor de interconectare
logN
1
Tabelul 4.2
PM2i
PM2 i
Cube
Mesh
Shuffle-exchange
Cube
Mesh
Shuffle-exchange
nr. minim
nr. maxim
m+1
nr. minim
nr. maxim
nr. minim
n/2
(n/2)+l
2n-4
nr. maxim
n/2
(n/2)+l
2n-4
nr. minim
2m-l
m+1
2m-l
nr. maxim
2m
m+1
2m
Capacitatea unei reele de a simula alt reea m = log2N, n = N, N este numrul de procesoare
38
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.
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 propriuzise.
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).
Alte elemente care caracterizeaza o arie sistolica sunt :
40
Pentru a intelege mai bine modul de lucru a ariilor sistolice se va simplifica in continuare o
modalitate de a inmulti o matrice banda cu un vector. Elementele de procesare ale ariei sistolice vor
avea 3 registre : Ra, Rb, Rc. Fiecare registru are o conexiune cu exteriorul, pentru a primi date si una
pentru a transmite mai departe rezultatul. Operatia pe care trebuie sa o execute elementul de procesare
este foarte simpla. In fiecare unitate de timp se vor citi datele prin IP (perimetrul de intrare), prin acesta
se vor memora cele trei registre, se va executa operatia Rc=Rc + Ra + Rb si se vor pune apoi valorile din
registre pe liniile de iesire. Aria sistolica va fi alcatuita dintr-o multitudine de astfel de elemente de
procesare interconectate in diverse moduri dupa cum se poate observa in figura 4-23.
=0
(+1)
()
(+1)
, unde = (t transpus ).
Cazul particular considerat are s=2, p=3.
41
Folosind un numar lb de elemente de procesare conectate linear produsul de mai sus se poate
calcula prin introducerea in aria sistolica a componentelor pe la extremitatea din stanga, a
componentelor (care initial au valoarea 0) pe cealalta extremitate iar a elementelor matricii A prin cel
de-al treilea port de intrare al fiecarui element de procesare. La fiecare unitate de timp, elementele de
procesare vor efectua inmultirea si adunarea respectiva dupa care vor transmite mai departe rezultatul.
Desfasurarea calculelor si curgerea datelor printr-o arie sistolica cu 4 elemente de procesare sunt
prezentate in figura 4-24.
Fig. 4-24 nmulirea unei matrice band cu un vector ntr-o arie sistolic
Succesiunea de operatii ce au loc in fiecare element de procesare este ilustrata in tabelul de mai jos
(pe coloanele tabelului sunt reprezentate elementele de procesare iar pe randuri sunt reprezentate
operatiile efectuate de fiecare procesor).
Timp
t0
t1
t2
t3
t4
t5
P1
P2
x1
P3
b1
b1=a11x1
b1=a11x1+a12x2
b2
b2=a21x1
b2=a21x1+a22x2
b2=a21x1+a22x2+a23x3
P4
b1
b3=a31x1
b3=a31x1+a32x2
42
Unul dintre dezavantajele majore ale ariilor sistolice este ca la dimensiuni foarte mari exista
probleme de sincronizare a elementelor de procesare din cauza intarzierilor aparute a semnalului de
ceas. Pentru a depasi acest obstacol a fost propus un alt tip de arhitectura denumit arie cu front de unda
care lucreaza intr-o maniera asincrona.
Comunicari intre elementele de procesare dintr-o arie cu front de unda, au loc pe baza unui protocol
foarte simplu atunci cand datele sunt disponibile, elementele de procesare sursa vor informa
procesorul destinatie. Acesta va accepta primirea datelor numai daca este pregatit de primire, adica in
momentul in care nu are alte calcule de efectuat. Aceasta abordare implica un hardware pentru a
implementa protocolul de comunicatie dar se dovedeste a fi o arhitectura foarte scalabila. Denumirea ei
provine de la modul cum se propaga datele prin aria elementelor de procesare, mod care se aduna prin
propagarea unei unde.
In comparatie cu ariile sistolice la un numar foarte mare de procesoare, intarzierile datorate
comunicatiei asincrone sunt neglijate in comparatie cu distributia semnalelor de ceas. Toleranta la
defecte este un aspect avut in vedere la structurile masiv paralele ca cele prezentate. Ariile cu front de
unda trateaza aceasta problema foarte simplu un element de procesare care s-a defectat nu va mai
putea transmite date in continuare ceea ce va duce la oprirea fronturilor de unda si implicit a calculelor.
In schimb la ariile sistolice este necesara transmiterea unui semnal global de eroare catre toate
procesoarele ceea ce complica putin lucrurile.
43
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
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). Pentru a sublinia avantajele prelucrarii vectoriale
in comparatie cu operatia scalara, vom considera urmatorul exemplu:
For(i= 1 to n) do
x(i) = y(i) + z(i)
y(i) = x(i+1) * x(i+1)
end for
44
Acesta bucla for poate fi implementata pe un calculator scalar astfel (implementarea este data intr-un
pseudo limbaj de asamblare):
Mov i, 1
Et1:
mov r1,y(i)
mov r2,z(i)
add r4, r1, r2
mov x(i),r4
mov r3, x(i+1)
mul r5, r3,r3
mov y(i),r5
inc i
if i< n goto et1
Intr-un calculator vectorial aceeasi secventa de cod poate fi reprezentata prin 3 instructiuni.
X(1:n) = y(1:n) + z(1:n)
temp(1:n) = x(2:n+1)
y(1:n) = temp(1:n) * temp(1:n)
reducerea la doar 3 instructiuni este posibila pentru ca fiecare vector va fi memorat intr-un registru
vectorial, iar adunarea a doua registre vectoriale este echivalenta cu adunarea a 2 vectori. Se observa
cum prin folosirea unor instructiuni vectoriale numarul total necesari executarii acestei bucle a fost
redus. Executia instructiunilor scalare prin tehnica benzii de asamblare, mai introduce un timp
suplimentar (overhead) la fiecare iteratie datorita instructiunii de control a buclei. Aceasta problema nu
mai apare la procesarea vectoriala, unde se poate folosi un registru care contine lungimea vectorilor
pentru a controla instructiunile vectoriale. In cazul procesarii vectoriale timpul suplimentar care apare
este format din timpul necesar routarii operanzilor prin unitatile functionale si timpul scurs de la
decodificare pana cand primul rezultat iese de pe banda de asamblare. Lungimea vectorilor este un
factor ce poate aducce un timp suplimentar aditional prin subdivizarea unor vectori foarte lungi ce nu
pot fi memorati intr-un registru vectorial in portiuni mai mici. Pentru a creste performantele procesarii
vectoriale, trebuie folosite compilatoare ce folosesc un cod optimizat menit sa utilizeze la maxim
resursele calculatorului. Au fost propuse mai multe cai de a obtine un astfel de cod optimizat:
45
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.
Problema planificarii unui sistem de taskuri vectoriale pentru executie pe n unitati functionale
poate fi formulata astfel: dandu-se un sistem de taskuri vectoriale V, un calculator vectorial cu n unitati
pipeline si un termen limita T, sa se determine o planificare paralela pentru sistemul de task-uri cu un
timp de executie t < T. aceasta problema a fost foarte mult studiata, iar pentru rezolvarea acesteia se
folosesc algoritmi euristici de planificare.
Operanzii odata adusi in memorie in registre vor fi prelucrati de catre unitatile pipeline.
Domeniul de aplicatie pentru care se poate aplica procesarea vectoriala este reprezentat de prelucrarea
masivelor de date. Prin ordonarea prelucrarilor succesive ale masivelor, putem impartii metodele de
procesare vectoriala in :
-
Se exemplifica cele 3 metode de calcul pentru expresia: Y = a1 x1 + ......+ an xn unde y si x 1....n sunt vectori
de dimensiune m, iar ai sunt scalari.
Metoda de procesare pe orizontala presupune calcularea celor n componente ale vectorului Y intr-o
maniera secventiala Yi = Suma zij pentru i = 1...n , zij = aj * xj.
Procesarea verticala implica urmatorii pasi:
1.
2.
3. repeta 2.
In procesarea verticala se aplica adunarea combinata pentru a calcula primele k componente din y, apoi
se repeta pentru calcularea celor n-k elemente ramase din y. din analiza acestor metode se poate trage
concluzia ca pentru calculatoarele vectoriale cele mai atractive metode, care vor da performantele cele
mai bune sunt metoda procesarii verticale si cea combinata. Pentru a demostra vom alege toate
notiunile legate de arhitectura calculatoarelor vectoriale, CRAY1. Acesta este primul calculator vectorial
care a dobandit o larga acceptare in lumea supercalculatoare. Era dotat cu 12 unitati functionale unitati
separate pentru calculul scalar si vectorial care functiona la o perioada de ceas de 12,5 ns. In arhitectura
CRAY1 mai regasim un sistem complicat de I/O, alcatuit din 12 canale de intrare si 12 de iesire si un
sistem de memorie organizat in bancuri cu 72 de module/banc. Memoria avea cel mult 1M de cuvinte
de memorie de dimensiune 72 biti. Din cei 72 biti ai unui cuvant doar 64 erau utilizati la memorarea
datelor iar restul de 8 erau de paritate si corectare a erorilor.
47
A doua versiune CRAY XMP, era intr-o varianta cu doua procesoare 1982, si cu 4 procesoare
1984. Dimensiunile acestui calculator a fost considerat la acea vreme foarte reduse. Ocupa doar 15 mp
si cantarea 15,25 tone. Arhitectura CRAY XMP cu doua procesoare este prezentata in figura 4.26
48
49
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. Utilizarea unei metode de routare worm-hole a
dus la imbunatatirea substantiala a performantelor, in comparatie cu metodele de routare memoreaza
si inainteaza (store and forward).
Sistemele cu memorie partajata prezinta avantajul ca nu se confrunta cu transferul de date sau
partajarea datelor in vederea obtinerii unei incarcari echilibrate: toate datele presupuse in vederea
prelucrarii se afla in memoria comuna unde poate fi accesata de toate procesoarele. Datorita faptului ca
toate procesoarele pot accesa orice zona de memorie intr-un timp egal, aceste calculatoare mai poarta
denumirea de calculatoare UMA (Uniform Memory Access). Programarea sistemelor cu memorie
comuna se bazeaza pe utilizarea unor primitive de sincronizare cum sunt semafoarele monitoarele,
regiunile critice.Aceste primitve de sincronizare daca nu sunt folosite foarte atent pot duce la erori
foarte greu detectabile. Dar dezavantajul major al acestui tip de arhitectura provine de la lipsa de
scalabilitate. Cele mai performante calculatoare cu memorie partajata nu au mai mult de cateva zeci de
procesoare, deoarece cu cat nr de procesoare este mai mare, cu atat apar mai multe accese la memorie,
ceea ce inseamna timpi foarte mari de asteptare adica performante reduse.
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, comportanduse 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:
1.
2.
3.
Fig. 5-3 Scheme simplificate ale calculatoarelor cu memorie distribuit fizic, dar partajat logic
51
52
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.
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.
Principala problema cu care se confrunta calculatoarele bazate pe memorie distribuita,
fie ca este vorba de un sistem clasic cu memorie distribuita, fie ca este vorba de o varianta CCNUMA sau COMA este problema intarzierii ce poate aparea la accesarea unei date care nu este
stocata in memoria locala. Procesorul care a generat cererea de acces va fi blocat pana cand
datele sunt aduse de la memoria de la distanta. Una dintre solutiile propuse pentru a rezorva
aceasta situatie este introducerea firelor de executie si a procesoarelor capabile sa execute
schimbari de context foarte rapid.
Deosebirea de un sistem multitasking obisnuit vine din faptul ca in timp ce in operatia de
comutare intre doua procese are loc atunci cand un proces este blocat in asteptarea unui
eveniment cum ar fi o operatie de I/O, care poate dura foarte mult, comutarea intre doua fire
de executie trebuie sa aiba loc si in cazul acceselor la memoriile locale, accese a caror durata
depinde, in general de distanta dintre procesorul ce a generat cererea si memoria respectiva
daca aceasta distanta este foarte mica, intarzierea un aducerea datelor poate fi doar de cateva
perioade de ceas. De aceea procesorul trebuie sa execute schimbarea de context intre fire
foarte rapid: firul ce a generat va fi suspendat si alt fir gata de executie va fi activat.
53
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.
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 (busiwainting) 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.
5.2. Calculatoare cu memorie distribuita
5.2.1. Arhitectura calculatoarelor cu memorie distribuita.
Un sistem cu memorie distribuita este alcatuit dintr-un set de noduri de calcul
interconectate printr-o retea de intercomunicare. Fiecare nod de calcul dipune de un procesor
destinat calculelor propriu-zise, o memorie privata, un procesor care este specializat pe
operatiile de comunicatie si un comutator cu rol de router ce realizeza interfata dintre nodul
de calcul (NC) si reteaua de interconectare (fig.5.5).
55
56
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.
5.2.2. Sistemul de comunicatie
Sistemele de calcul cu memorie distribuita utilizeaza retele de interconectare de tip
static. Pentru a caracteriza o astfel de retea se utilizeaza 3 elemente fundamentale:
Topologia retelei;
Metoda de comutare;
Tehnica de route-are.
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
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 in forma de inel(fig. 5.6.d)- se obtine foarte usor din reteau liniara prin conectarea
celor doua precesoare de la capete;
-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).
57
-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.
58
59
60
In tabelul 5.1 sunt trecute valorile acestor indicatori pentru toate tipurile de retele
prezentate.
Tab. 5.1 Indicatori ai performanelor reelelor de interconectare
Tipul Reelei
Complet conectat
Stea
Liniar
Inel
Gril 2D
Tor 2D
Arbore
Hipercub
Diametrul
1
2
n-1
[n/2]*
2(n 1)
2*n/2+*
2log((n+1)/2)
log n
Costul
n(n-1)/2
n-1
n-1
n
2(n-n)
2n
n-1
(n log n)/2
Conectivitatea
n-1
1
1
2
2
4
1
log n
Limea de bisecie
n2/4
1
1
2
n
2n
1
n/2
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.
62
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. Dupa stabilirea
acesteia .....
Comutarea de circuite
Alt tehnic des utilizat este comutarea de circuite care se aseamn cu sistemul telefonic.
Pentru transmiterea unui mesaj prin comutare de circuite sunt necesare 3 faze:
1. Stabilirea legturii
2. Transmisia propriu-zis
3. Faza de eliberare a legturii
n prima faz este transmis un scurt pachet pentru realizarea legturii. Dup stabilirea acesteia
urmeaz etapa 2 n care sunt transmise datele propriu-zise. Etap n care canalele de comunicaie ce
leag sursa de destinaie sunt utitlizate exclusiv pentru operaia curent de comunicaie. Nici un alt
procesor nu poate s mai utilizeze aceste canale pn la terminarea operaiei curente.
Primul avantaj al comunicaiei de circuite este acela c dispar buffer-ele intermediare necesare
stocrii datelor n nodurile intermediare. Mecanismele de rutare fiind implementate la nivel hardware,
timpul de comutare se va reduce i n acelai timp resursele software alocate comutaiei sunt mult
diminuate. Alt avantaj este c timpul necesar unui mesaj s ajung la destinaie, timp exprimat prin:
t= ( L1 / B ) * d + Lm / B
devine dependent de distana dintre procesoare atunci cnd L1<< Lm , unde L1 lungimea pachetului
iniial necesar realizrii legturii, Lm lungimea mesajului propriu-zis, B- lungimea de band a reelei.
Independena dintre surs i destinaie a fcut ca la calculatoarele care utilizeaz comutarea de
circuite problema diametrului reelei s nu mai fie aa acut.
O metod ce combin caracteristici att ale comutrii de circuite, ct i ale comutrii de pachete
este metoda diviziunii mesajelor. Mesajele sunt mprite n mici pachete numite flit (flow control digits)
care sunt trimise ctre destinaie unul dup altul ntr-o manier asemntoare unei benzi de asamblare.
Fiecare nod intermediar dispune de un buffer ce poate stoca aceste flit-uri. Flit-ul va fi reinut n buffer
atunci cnd linia de ieire este ocupat. Dimensiuena buffer-ului poate varia ducnd la comportri
diferite ale tehnicii de rutare prin diviziunea mesajelor: dac acestea sunt suficient de mari ele pot
63
memora ntregul mesaj, situaie echivalent cu tehnica comutrii de pachete, iar dac buffer-ele sunt
mai mici, mesajul va fi memorat n mai multe noduri adiacente pe calea dintre surs i destinaie.
Timpul necesar unui mesaj ca s ajung de la surs la destinaie se poate exprima prin:
t= ( Lh / B ) * d + Lm / B
unde Lh lungimea primului flit
Lm lungimea mesajului propriu-zis
Dac Lh <<Lm se obine independena timpului pe distana dintre noduri. n fig 5.7 poate fi urmrit o
comparaie ntre comutarea ntre pachete i cea pe diviziunea mesajelor.
Fig. 5-7 Comutare de tip memoreaz-i-nainteaz (store and forward) (a) si comutare prin diviziunea
mesajelor (virtual cut-through) (b)
Se observ c n cazul comutrii de tip memoreaz i nainteaz nodurile intermediare stocheaz
ntregul pachet nainte de a-l trimite mai departe. n al doilea caz pachetul este mprit n 2 pri i
transmisia lui are loc ntr-o manier asemntoare cu o banda de asamblare, reducndu-se astfel timpul
de comunicaie.
O situatie speciala este aceea in care buffer-ele dintre nodurile intermediare au exact aceeasi
dimensiune cu a unui flit. In acest caz spunem ca avem o metoda de rutare de tip ware-work. Avantajul
acestei tehnici este acela ca spre deosebire de comutarea de circuite se pot transmite pachete de date
pe mai multe cai de iesire ale unui nod pentru a usura implementarea unor operatii de tip broadcast sau
multicast (adica transmiterea unui mesaj catre toate celelalte procesoare sau catre un grup de
procesoare).
Pentru functionarea corecta a unei astfel de retele trebuie luate masuri speciale pentru a evita
cazurile in care poate aparea un dead-lock sau live-lock. O situaie de dead-lock apare atunci cand un set
64
de mesaje se blocheaza reciproc, astepand fiecare eliberarea unui buffer detinut de alt mesaj. Exista mai
multe metode de editare a acestor probleme:
premtia unui mesaj prin re-rutarea acestuia sau prin anularea lui;
o tehnica speciala de folosire a unor canale virtuale de comunicare. Canalele 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
allege 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 :
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:
algoritmi deterministi care stabilesc calea unui mesaj numai pe baza adreselor nodurilor
sursa si destinatie, neluand in considerare si starea diferitelor segmente de retea.
In categoria alg. deterministi intra in principal 3 subclase de algoritmi:
65
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
5.3.1 Prezentare generala
Datorita costurilor reduse, calculatoarele cu memorie partajata reprezinta una dintre variantele
de calculatoare paralele cu raspuns foarte mare. Structura de baza a acestora a fost prezentata anterior
fig 5.1, 5.2.
Caracteristica principala este reprezentata de spatiul unic de adresa. Indiferent de numarul de
module de memorie sau de tipul de retea de interconectare intre memorie si procesoare, toate
procesoarele vor avea acces la intreaga memorie si in mod uniform. Din aceasta caract. deriva si un
dezavantaj important: lipsa de scalabilitate.
Numarul de procesoare nu poate fi marit prea mult pentru ca apare o problema a accesului
concurent la memorie. Cu cat vor fi mai multe procesoare cu atat probabilitatea de acces concurent la
acelasi modul de memorie va fi mai mare, iar acest fapt duce la timpi de asteptare mari, adica puterea
de calcul a procesoarelor nu va fi utilizata eficient. Astfel au fost propuse solutii in care se utilizeaza
memorii cache locale, care sa reduca numarul de accese concurente.
O alta propunere a cresterii gradului de scalabilitate se refera la modul propriu-zis de organizare
a memoriei comune. Astfel au aparut noi variante de calculatoare in care memoria cu toate ca este
partajata d.p.d.v logic de catre toate procesoarele existente in sistem, d.p.d.v fizic este distribuita
66
devenind o memorie locala a fiecarui procesor. Denumirea exacta a acestor tipuri de calculatoare este
Distributed Shared Memory. Dupa modalitatea completa de realizare prezentata in sect. 5.1, o
clasificare a calculatoarelor de acest tip este:
Daca primele versiuni de calculatoare cu memorie partajata suportau un numar de aprox. 20-30
procesoare in cazul conectarii printr-o magistrala sau 200-300 in cazul utilizarii retelei multi-nivel, in
prezent calculatoarele CC-NUMA sau NUMA suporta mii de procesoare.
Principalele aspecte care se vor prezenta vor fi legate de subsistemul de comunicatie utilizat in
aceste calculatoare si de organizarea memoriile cache care este de mare importanta pentru obtinerea
unor performante bune.
Un accent deosebit cade pe subsistemul de comunicatie intrucat s-a dovedit de-a lungul
evolutiei paralele a calculatoarelor ca principalul impediment in dezvoltarea sistemelor cu memorie
partajata il reprezinta concurenta acceselor la memorie si implicit concurenta in utilizarea acceselor de
comunicatie. In ceea ce priveste memoria cache problema de baza este cea a asigurarii coerentei. In
prezent exista protocoale de asigurare a coerentei implementate atat la nivel hardware cat si software.
5.3.2 Subsistemul de comunicatie
O caracteristica de baza a unui sistem multiprocesor este abilitatea de a interconecta diferite
elemente componente:
67
68
alg. Daisy-Chaining algoritm de arbitrare cu prioritate statica, acorda cate o prioritate fiecarui
dispozitiv conectat la magistrala; aceasta prioritate este cu atat mai mare cu cat respectivul
dispozitiv se afla fizic mai aproape de unitatea de arbitrare a magistralei. Cand exista cereri de
acces la magistrala, unitatea de arbitrare va determina prioritatea asociata fiecarei cereri si va
acorda dreptul de acces la magistrala dispozitivului cu prioritatea mai mare.
alg. Round Robin - impare timpul in cuante egale si ofera secvential, intr-o maniera circulara
aceste cuante fiecarui dispozitiv conectat la magistrala.
alg. LRU (last recently used) cel mai putin utilzat acorda prioritatea cea mai mare
dispozitivului care nu a mai accesat magistrala pentru intrevalul de timp cel mai lung.
alg. Polling foloseste o magistrala cu log2N linii pe care transmite adresa unui dintre cele N
dispozitive conectate. Dispozitivul care isi va recunoaste adresa va capta accesul la magistrala.
Aceste adrese sunt transmise intr-o modalitate Round Robin.
alg. FCFS (first coming first serverd) mentine o lista cu toate cererile primite si le serveste in
ordinea in care acestea au venit.
alg. Rotating Daisy-Chain reprezinta o varianta dinamica a primului algoritm prezentat. In acest
caz nu exista un arbitru de magistrala unic, ci fiecare dispozitiv conectat are un circuit de control
care se comporta ca un arbitru fig. 5.10.
69
concluzia c acest alg. e foarte bun,dar n schimb apar dificulti foarte mari la implementarea hardware
a acestuia,deoarece arbitrul de magistral trebuie s menin o list cu toate cererile primite .Aceast
list nseamn de fapt : spaiu de memorie i procedure pt. gestionarea ei.
Un alt factor care contribuie la obinerea unor performane bune e modul de lucru al magistralei.
Primele magistrale pt calculatoare paralele funcionau pe baza unui principiu denumit magistral cu
blocare. O operaie de acces la memorie implicat de obicei 2 faze : transformarea adresei i a datelor i
respectiv operaia propriu-zis de citire sau scriere executat de controlerul de memorie. La
magistralele cu blocare,cele 2 faze se execut secvenial.Magistrala e deci blocat pn cnd operaia de
scriere/citire e terminat.
A 2-a generaie 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 operaie de citire/scriere n timp ce prima cerere e tratat de ctre 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 generaie de magistrale : merg mai departe cu optimizarea op.de citire.Se observ c op.de citire
necesit mai nti transferarea adresei locaiei de memorie,utiliznd magistrala de adrese,apoi citirea
propriu-zis executat de controlerul de memorie i n final transferarea datelor citite utiliznd
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 execuia lor n mod suprapus,astefel nct 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 tranzacii divizate).
Pe lng cererile de acces concurent,un alt dezavantaj major al sistemelor bazate pe o singur
magistral de comunicaii e faptul c o defeciune aprut la magistral duce cderea ntregului sistem.
O modalitate de mbuntire a performanei sistemelor bazate pe o magistral e folosirea mai multor
magistrale de comunicaii. n acest caz fiecare dispozitiv va fi conectat la toate aceste magistrale ca in
fig. 5.11.
confictele n care mai multe procesoare acceseaz acelai modul de memorie. n etapa a 2-a n
procesoare capt drept de acces la cele m module de memorie. Dac n > k, k-nr. de magistrale, atunci
un arbitru k-din-m va selecta k procesoare care vor putea accesa memoria.
Crescnd nr. de magistrale din ex. precedent se poate ajunge la situaia n care exist o cale de acces
separat pentru fiecare modul(fig. 5.12). n aceast situaie sistemul de comunicaii devine o reea de tip
crossbar.
Examen : 2 subiecte
subiect : cap I
cap II
subiect : restul
74