Sunteți pe pagina 1din 74

Cap 1.Introducere in problematica calculului parallel.

1.1 Necesitatea calculului parallel


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

1.2 Probleme importante in calculul paralel


Exista o serie de aspcte foarte interesante legate de procesarea paralela:
- Construirea unor calculatoare paralele eficiente. Scalabilitatea arhitecturilor paralele
este un aspect foarte important in construirea de noi calculatoare paralele. Asta
inseamna ca un calculator sa poata suporta un numar mare de procesoare fara o
scadere in eficienta utilizarii acestora. De asemnea retelele de interconectare intre
porcesoare trebuie sa transfere datele la viteze foarte mari.
- 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.
- Existenta unor metrici de evaluare a performantelor algoritimilor paraleli. Problema
la care trebuie sa raspunda aceste metode de evaluare sunt de genul: cat de rapid
poate fi rezolvata o problema cu un calculator paralel, cum trebuie sa varieze
dimensiunea problemei fata de nr de procesoare astfel incat sa se pastreze o
anumita valoare a eficientei rezolvarii.
- 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.
1

Instrumentele pentru programarea paralela. [pentru dezvoltarea programelor


complexe este nevoie de existenta unor medii de programare precum si intrumente
precum debug-ere, profil-ere, simulatoare etc.
Realizarea unor programe portabile. Portabilitatea a fost un impediment major in
raspandirea calcului paralel. De obicei un program scris pentru un anumit tip de
calculator, trebuia modificat substantial pentru a fi putut rulat pe alt calculator.
Odata cu aparitia bibliotecilor(mpi message passage interface, pvm paralel
virtual machine) programele paralele devin portabile astfel incat ele pot fi rulate fara
modificari pe cele mai diverse tipuri de calculatoare, de la clustere de statii de lucru
pana la calculatoare masiv paralele.

Cap 2 Notiuni fundamentale utilizate in procesarea paralela.


2.1 Introducere
Cercetarile care s-au intreprins in domeniul arhitecturii paralele au avut ca scop
depasirea dificultatilor inerente care apar in legatura cu software-ul paralel.
Simultan cu dezvoltarea unei extensii la limbajele de programare clasice au fost
dezvoltate noi limbaje de programare care sa puna mai bine in evidenta paralelismul unui
algoritm. Compilatoarele noi create trebuie sa fie capabile sa exploateze particularitatile
arhitecturale ale masinii pe care ruleaza.
Procesul de dezvoltare a softului este un proces interactiv. Utilizatorii scriu un program
care pe baza unei informatii tot furnizate de utilizator,va fi restructurat de catre
compilator.(fig2.1)

Figura 2.1. Restructurarea automat a programelor

2.2 Concepte de baza in procesarea paralela


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
In general rezolvarea oricarei probleme incepe cu elaborarea unui set de instructiuni
(algoritmul), care va da solutia unei descrieri abstracte a problemei. Problemele pot veni din
foarte multe domenii diferite: matematica, fizica, chimie, bilogie, logica, economie etc. De
3

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:
-

paralelism de granula mare sau grosier


paralelism de granula medie
paralelism de granula fina
4

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.
2.2.3 Timpul de comunicatie intre procesoare
Se pot defini 2 tipuri de timpi de comunicatie. Primul denumit si largime de banda,
reprezinta viteza maxima la care poate avea loc comunicarea in subsitemul de cominicatie al
calculatorului. Al 2-lea denumit latenta, reprezinta timpul efectiv comunicarii intre doua
procesoare, si este in general mult mai mare decat largimea de banda. Latenta depinde foarte
mult de topologia retelei de comunicare si de incarcarea efectiva acestei retele. Existenta unui
punct critic, de gatuire, in retea, poate duce la degradarea performantelor. Proiectantii de
sisteme paralele incearca sa utilizeze in general retele de comunicatie cu grad cat mai mare de
conectivitate, dar acest lucru nu este posibil intotdeauna deoarece duce la cresterea pretului
sistemului de calcul. Pentru a evita situatiile in care timpii mari necesari comunicarii duc la
obtinerea unor performante scazute, programele trebuie scrise astfel incat sa exploateze cat
mai mult princpiul localitatii, efectuand cat mai multe calcule cu date aflate in proximitatea
procesorului. In acest fel se reduce cantitatea totala de informatii care circula prin subsistemul
de comunicatie.
2.2.4 Procese si fire de executie.
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.
5

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.

In orice moment procesele se afla intr-o anumita stare. Ca raspuns la diferite


evenimente care apar in sistem procesele pot trece dintr-o stare in alta conform unei diagrame
de tranzitie a starilor. Simplificand lucrurile, identificam 3 stari de baza in care se poate afla un
proces :
o Ready - gata de executie: procesul este pregatit pentru executie, dar
momentan procesorul este alocat altui proces.
o Running - in executie: procesul utilizeaza procesorul la momentul actual.
o Blocked blocat : procesul asteapta aparitia unui eveniment extern.
Diagrama de tranzitie a starilor e prezentata in fig 2.2.

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.

Figura 2.2. Diagrama de tranziie a strilor proceselor

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.

Paralelismul la nivel de proces este un paralelism de granula grosiera. Pentru a face


posibila exploatarea si a paralelismului in interiorul unui proces s-a introdus notiunea de fir de
executie. Firul de executie este definit ca un obiect dinamic, ce reprezinta un punct de control
intr-un proces si care executa o secventa de instructiuni. Procesul va contine in acest caz doua
componente : un set de fire de executie si o colectie de resurse. Fiecare fir are la randul lui o
6

serie de obiecte private, cum ar fi indicatorul de instructiune(program counter), stiva, un


context hardware etc.
2.3. Arhitecturi pentru procesare paralela
2.3.1 Clasificari ale calculatoarelor paralele
Se va prezenta o metoda de clasificare devenita clasica care apartine lu Michael J. Flynn si are
drept criteriu de clasificare, fluxurile de date si fluxurile de instructiuni. Fluxul de instructiuni este o
secventa de instructiuni asa cum sunt ele executate de procesor, iar fluxul de date reprezinta o secventa
de date ce cuprind datele de intrare, rezultatele temporare sau partiale, prelucrate de fluxul de
instructiuni.
In functie de numarul de fluxuri de date si instructiuni deosebim urmatoarele tipuri de
calculatoare:
-

SISD - Single Instruction Single Data


SIMD - Single Instruction Multiple Data
MISD Multiple Instruction Single Data
MIMD Multiple Instruction Multiple Data

Figura 2.3. Clasificarea Flynn

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.

2.4 Software pentru procesare paralela


2.4.1. Modelarea procesarii paralele
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.

Figura 2.4. Procesul de proiectare a unui algoritm folosind un model de programare

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.

Figura 2.5. Maina PRAM


10

2.4.3 Modelul LogP


Acesta pleaca de la observatia ca in prezent majoritatea calculatoarelor paralele sunt construite
ca un set de procesoare dotate cu memorii locale, interconectate printr-o retea, dupa cum se poate
vedea in figura 2.6.(acesta fiind de fapt modelul general al calculatorului paralel cu memorie distribuita).
LogP este un model de programare pentru sisteme cu memorie distribuita, in care procesoarele
comunica prin schimb de mesaje.

Figura 2.6. Organizarea calculatoarelor paralele cu memorie distribuit


Modelul specifica principalii parametri ai modelului de comunicare intre procesoare, dar nu face
nicio ipoteza asupra topologiei retelei. Parametrii modelului sunt:
1. L limita superioara a latentei, adica a intarzierii unui mesaj intre procesorul sursa
si cel destinatie,mesaj ce contine 1 cuvant.
2. O overhead - masoara perioada in care un procesor este ocupat cu primirea sau
transmiterea unui mesaj. In aceasta perioada procesorul nu poate realiza calcule
propriu-zise.
3. g gap, intervalul minim de timp intre doua transmisii/ receptii consecutive de
mesaje. 1/g reprezinta largimea de banda disponibila per procesor pentru
comunicatie.
4. P numarul de procesoare si module de memorie.
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.

11

Figura 2.7. Descrierea unei maini n modelul LogP


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.
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

Figura 2.8. Tehnica de compilare trace scheduling


Paralelismul la nivel de proces presupune existenta unor facilitati ale limbajelor de programare
care sa permita creaer si terminarea proceselor. O metoda pentru a obtine acest lucru este folosirea
declaratiilor fork() si join(), sau folosirea notatiilor propuse de Dijkstra, cobegin, coend. Executarea
concurenta a unui set de n procese, S1....Sn se poate realiza dupa cum urmeaza:
begin
S0 ;
Cobegin S1;S2;.....Sn; coend
Sn+1;
end
Blocul de declaratii dintre cobegin si coend se executa concurent imediat dupa terminarea lui
S0. Declaratia Sn+1 se executa numai dupa ce S0,......Sn, si-au incheiat toata executia. Graful de
precedenta al executiei este prezentat in figura 2.9.

14

Figura 2.9. Graful de preceden al execuiei concurente


Pe langa mijloacele de creare a proceselor, limbajele de programare concurenta sau paralela
furnizeaza si metode de comunicare si sincronizare.
Arhitecturile bazate pe memorie partajata folosesc variabile partajate pentru comunicarea si
sincronizarea intre procese. Atunci cand se folosesc variabilele partajate pentru comunicarea intre
procese, accesul la acestea trebuie sincronizat, altfel pot aparea inconsistente ca, in situatia in care, spre
exemplu, o variabila este citita de un proces, in timp ce alt proces ii modifica valoarea. Avem nevoie ca
accesul la o variabila partajata sa se realizeze in excluziune mutuala. Partea dintr-un program in care
sunt accesate variabilele partajate poarta denumirea de regiune critica. Pentru a pastra corectitudinea
programelor trebuie sa ne asiguram intotdeauna ca un singur proces se afla in regiunea critica. Acest
lucru se realizeaza utilizand primitivele de sincronizare.

15

Cap 3. Arhitecturi pentru paralelismul la nivel de instructiune


3.1 Introducere
In cadrul acestui capitol se vor studia microprocesoarele organizate in banda de asamblare
(pipe-line) si superscalare, precum si masinile VLIW (Very Long Instruction Word).
3.2 Dependentele dintre instructiuni.
O problema cheie pentru a putea beneficia de avantajele paralelismului la nivel de instructiune
o constituie dependenta dintre instructiuni, deoarece acele instructiuni, care sunt independente unele
fata de altele, pot fi executate simultan. Dependentele dintre instructiuni pot fi de 3 feluri: dependente
de date, de control si de resurse sau structurale.
Sa consideram mai intai dependetele de date vom deosebi in primul rand dependentele dintre
instructiuni dintr-o secventa liniara de cod fata de dependentele prezente in structurile repetitive.
In primul caz, cel al codului liniar, o dependenta de date intre doua instructiuni poate aparea
atunci cand acesta utilizeaza un operand comun. In functie de modul de folosire a operanzilor comuni,
dependentele pot fi:
-

dependente de tip Read After Write (citire dupa scriere) - RAW


dependente de tip Write After Write (scriere dupa scriere) WAW
dependente de tip Write After Read (scriere dupa citire) WAR

Pentru a intelege in ce constau aceste dependente consideram cateva exemple concrete.


Fie urmatoarea secventa de instructiuni:
I: load R1, c

; R1=c

J: add R2, R1, R3

; R2= R1+R3

In instructiunea J, registrul R1 este operand sursa, acesta primeste o valoare in instructiunea I.


Pentru a asigura corectitudinea rezultatului instructiunii J, ea nu poate fi lansata in executie decat dupa
ce instructiunea I a fost executata complet. Aceasta este situatia dependentei RAW: o instructiuni
utilizeaza ca operand sursa(citeste) o valoare definita de o instructiune anterioara. Dependentele de tip
RAW reprezinta o piedica in executia in paralel a doua instructiuni, aceste dependente neputand fi
ocolite. Cea de-a doua instructiune, pentru a putea folosi operandul sursa trebuie sa astepte neaparat
terminarea primei instructiuni, cea care defineste valoarea acestui operand.
Al 2-lea tip de dependenta WAW apare atunci cand doua instructiuni au acelasi operand
destinatie, dupa cum se poate observa in exemplu urmator:
I: add R1, R2,R3

; R1= R2 +R3

J: add R1, R4, R5

; 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

J: add R2, R4, R5

; 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

Figura 3.2. Comparaie ntre procesoarele superscalare i VLIW


3.4.2 Arhitectura procesoarelor superscalare
3.4.2.1 Decodificarea paralela
Prima sarcina pe care o are de rezolvat un procesor superscalar este decodificarea
instructiunilor. In situatia procesoarelor superscalare decodificarea este mult mai dificila decat la
procesoarele obisnuite. Aceasta deoarece trebuie decodificate mai multe instructiuni intr-o singura
perioada de ceas si trebuie identificate atat dependentele dintre instructiunile decodificate la momentul
curent cat si cele dintre acestea si instructiunile care sunt deja in faza de executie. Cum toate
procesoarele superscalare au mai multe unitati de executie, numarul instructiunilor care trebuie
verificate este si el foarte mare.
Pentru a usura sarcina decodificatorului se foloseste de obicei o faza de predecodificare. Intre
memoria cache L2 si L1 pentru instructiuni se introduce un predecodificator, care va adauga pentru
fiecare instructiune un numar de biti ce sunt de regula utilizati la identificarea clasei din care face parte
instructiunea, a resurselor de care are nevoie pentru executie, etc.
In figura 3.7 se poate observa unitatea de predecodificare introdusa la majoritatea
procesoarelor superscalare.

18

Figura 3.7. Predecodificarea instrucinilor


3.4.2.2 Planificarea pentru procesarea instructiunilor
Cel mai important aspect legat de procesarea instructiunilor il constituie planificarea sau
distribuirea spre executie a mai multor instructiuni intr-un singur ciclu de ceas. Problemele care trebuie
rezolvate, la planificare sunt:
-

considerarea dependentelor false intre date (WAW si WAR) :


o tratarea lor prin denumirea registrelor
o lipsa unui mecanism pentru tratarea dependetelor false
considerarea dependentelor de control nerezolvate:
o asteptarea evaluarii conditiei de salt
o utilizarea unei metode de predictie a salturilor si executarea speculativa a
instructiunilor
folosirea bufferelor de instructiuni si statiilor de rezervare:
o planificarea cu blocare: ultimele n instructiuni din buffer-ul de instructiuni (care
formeaza fereastra de planificare) sunt verificate pentru detectarea dependentelor.
Daca ele sunt independente, sunt trimise direct la unitatile de executie. Daca insa
exista dependente intre ele, planificarea este blocata pana la rezolvarea acestora.
o Planificarea fara blocare: in fata fiecarei unitati de executie sunt plasate buffere
locale de instructiuni denumite statii de rezervare. Instructiunile din fereastra de
planificare sunt trimise catre statiile de rezervare fara a efectua vreo verificare a
dependentelor. In continuare fiecare statie de rezervare in parte va efectua aceste
19

verificari si va prezenta unitatilor de executie, instructiunile gasite independente (fig


3.9).
Tratarea blocajelor in planificare: chiar daca se utilizeaza statiile de rezervare, blocaje in
planificare mai pot inca aparea: sa ne gandim numai la faptul ca statiile de rezervare au o
capacitate limitata. Cand o statie de rezervare este .... planificarea noilor instructiuni trebuie
blocata pana la eliberarea unei intrari intr-o statie de rezervare.

Tratarea blocajelor aparute in planificarea instructiunilor implica luarea in considerare a doua


aspecte: ordinea planificarii si alinierea planificarii.
Vom considera ordinea planificarii. Modul cum este tratata o instructiune independenta atunci
cand se face planificarea pentru executie duce la identificarea a 2 scheme de planificare:
-

Planificarea in order: o instructiune neexecutabila la momentul actual va duce la blocarea


instructiunilor anterioare de la planificare chiar daca acestea se pot executa.
Planificarea out of order: o instructiune care nu se poate executa la momentul actual nu
blocheaza de la planificare alte instructiuni care se pot executa.

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).

Figura 3.10. Tabela de mapare a registrelor


Tabela contine un bit denumit valid (care prin valoarea 1 indica faptul ca intrarea de index
contine o valoare valida) si indexul registrului in setul de registre fizice. In acest exemplu registrul
arhitectural R1 este alocat in registrul fizic EF3 iar R2 in RF9.
3.4.2.5 Tratarea instructiunilor de ramificatie
Una din cele mai importante probleme care apar in contextul procesoarelor superpipeline si
superscalare este problema tratarii instructiunilor de ramificatie. Pentru a demonstra dificultatile unei
astfel de instructiuni vom considera cazul cel mai simplu al unei benzi de asamblare cu doar patru nivele:
fetch, decode, execute si write-back. Vom lua in considerare o instructiune de salt neconditionat si vom
presupune ca la sfarsitul nivelului execute este disponibila adresa de salt. In figura 3.11 este prezentata
aceasta situatie.

21

Figura 3.11. Penalitatea la procesarea unei instruciuni de salt


Se poate observa cum instructiunile I3 si I4 care au intrat deja in banda de asamblare vor trebui
anulate. Deci in exemplul considerat de noi, instructiunea de salt a cauzat o penalitate de 2 cicli. Situatia
poate deveni si mai grava in cazul unei instructiuni de salt conditionat. Sa presupunem ca instructiunea
de salt conditionat are la baza testarea rezultatului unei operatii in virgula flotanta. Cum operatiile in
virgula flotata necesita foarte multi ciclii (impartirea poate lua pana la 50 de ciclii), penalitatea va creste
si ea corespunzator. Cazul in care la momentul executiei instructiunii de salt conditionat nu este
cunoscut inca rezultatul expresiei ce sta la baza conditiei de salt poarta denumirea de dependenta de
control nerezolvata. Cele mai importante tehnici de procesare a instructiunilor de salt sunt:
-

Utilizarea metodei delay-branching (salt intarziat)


Tratarea instructiunilor de salt nerezolvate prin: blocarea procesarii pana la rezolvarea
conditiei, executia speculativa si executia multicare.

22

Capitolul 4. Arhitecturi pentru paralelismul la nivel de date


4.1. Introducere
Ideea paralelismului la nivel de date o regasim chiar in procesoarele obisnuite: cu toate ca
majoritatea programatorilor privesc o unitate aritmetico-logica simpla ca efectuand prelucrari seriale
asupra cuvintelor, de fapt ea prelucreaza in paralel bitii unui cuvant. Prin generalizarea acestei idei au
aparut calculatoarele care exploateaza paralelismul la nivel de date elementare. Aceste calculatoare
sunt alcatuite in general dintr-o serie de procesoare (denumite in acest caz si elemente de procesare),
care executa aceeasi instructiune, dar pe elemente de date diferite.
Un prim pas in conturarea unei arhitecturi, capabile sa exploateze paralelismul de date, il
constituie definirea unei entitati de date, de obicei mai complexe decat un simplu cuvant, care va fi
tratata ca o singura unitate de prelucrare. O astfel de multime de date ale carei elemente pot fi
prelucrate in paralel spre exemplu o matrice, caz des intalnit in calculul stiintific, o imagine a carei pixeli
vor fi prelucrati in paralel sau o baza de date ale carei inregistrari se pot prelucra in paralel.
Prelucrarile efecuate asupra acestor date pot fi foarte simple, la nivelul unui singur bit, situatie
intalnita mai ales la prelucrarea imaginilor, sau complexe, situatie intalnita in aplicatii de calcul stiintific
sau ingineresc. In functie de complexitatea prelucrarilor necesare, elementele de procesare vor fi mai
simple sau mai complexe, variind de la o simpla unitate aritmetico-logica, ce poate prelucra un bit de
informatie, pana la procesoare foarte complexe, capabile sa efectueze operatii in virgula mobila.
In majoritatea cazurilor, in timpul efectuarii acestor prelucrari este necesar ca elementele de
procesare sa comunice intre ele in vederea schimbului de date. Modul cum sunt conectate intre ele
elementele de procesare variaza foarte mult.Putem intalni situatii in care procesoarele comunica direct
numai cu vecinii cei mai apropiati, formand astfel o retea bidimensionala de procesoare sau o structura
liniara, daca luam in considerare cazul unidimensional.Aceasta modalitate de interconectare prezinta
avantajul simplitatii si de aici al usurintei implementarii hardware. Interconectarea de tip bidimensionala
de procesoare este folosita mai ales in calculul matriceal si in prelucrarea imaginilor. Apare insa deseori
necesitatea ca doua procesoare, ce nu se invecineaza direct, sa-si transfere date. In acesta situatie
comunicatia are loc transferand datele prin noduri intermediare ceea ce duce la cresterea timpului de
comunicatie.
O alta modalitate de interconectare a unitatilor de procesoare poate fi un arbore sau in cazul
mai general un graf. Retelele de acest tip se potrivesc mai ales pentru aplicatiile in baze de date si
pentru sisteme expert. Modelul de calcul pentru o retea arbore se poate descrie in felul urmator:
procesoarele de la baza arborelui vor efectua prelucrari, rezultatele vor fi transmise catre procesoarele
care la randul lor vor efectua alte prelucrari si vor transmite rezultatele mai sus. Punctul slab al acestui
model in constituie comunicatia dintre doua sau mai multe procesoare de pe acelasi nivel al arborelui,
aceasta comunicatie se poate efectua doar prin nodul imediat superior al arborelui) , care la un moment
dat se poate sufoca daca primeste prea multe mesaje.

23

In prelucrarea imaginilor se mai intalneste si conectarea procesoarelor in forma de piramida.


Aceasta prezinta doua mari avantaje: doua noduri dintr-un nivel al piramidei care nu sunt direct
conectate pot comunica prin noduri de la nivelele superioare, pe langa comunicarea prin nodurile
intermediare de la acelasi nivel; al doilea avantaj provine din faptul ca un nivel din piramida poate
reprezenta imaginea grafica la o anumita rezolutie (cu cat ne indreptam catre baza piramidei, rezolutia
creste, iar spre varf aceasta scade ).
Alte modalitati de interconectare cum ar fi retelele hiper-cub PM2 la i, vor fi prezentate
amanuntit mai incolo.
Daca luam in considerare diferitele caracteristici ale calculatoarelor care exploateaza
paralelismul la nivel de date, putem alcatui o clasificare a acestuia in felul urmator:
-

Calculatoare SIMD.
Arii sistolice.
Arii cu front de unda.
Procesoare asociative
Calculatoare vectoriale

Fiecare dintre aceste tipuri de calculatoare va fi prezentat in continuare evidentiind aspecte


precum aria lor de aplicabilitate, caracteristici hardware, programabilitate, performante.
4.2 Calculatoare SIMD
4.2.1 Arhitectura calculatoarelor SIMD
O directie specifica de dezvoltare a calculatoarelor, care implementeaza paralelismul la nivel de
date, a fost cea a calculatoarelor specializate, proiectate in special pentru prelucrarea masivelor de date.
In acest mod au aparut calculatoarele SIMD, denumite uneori si masive sau arii de procesoare. Ideea
unui astfel de calculator este foarte veche si ii este datorata lui Steven Unger, care in 1958, a imaginat
un calculator alcatuit dintr-o retea bidimensionala de procesoare. Fiecare procesor era conectat cu cei 4
vecini ai sai si toate procesoarele executau aceeasi operatie simultan. Procesoarele erau dotate cu
propria lor memorie si erau programabile. Aceasta idee a ramas multa vreme doar pe hartie, mult mai
tarziu realizandu-se prima implementare practica.
Elementul de baza al arhitecturii unui calculator SIMD este reprezentat de o multime de
procesoare denumite si elemente de procesare (PE), toate aflate sub supervizarea unei singure unitati
de control (CU). Unitatea de control distribuie catre unitatile de procesare o instructiune unica la un
moment dat, care va fi executata cu date diferite de catre fiecare element de procesare.
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

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

Fig. 4.3 Modalitate natural de memorare a matricei A


Se observa usor ca utilizand aceasta schema de memorare se pot accesa in paralel de cate 3
elemente de procesare liniile sau diagonalele matricii A, dar nu se pot accesa in paralel coloanele
matricii. Daca utilizam o schema de memorare, care este prezentata in figura 4.4, modalitatea de
stocare asimetrica, se pot accesa in paralel pe langa linii si diagonale si coloanele matricii.
P1
a11
a23
a32

P2
a12
a21
a33

P3
a13
a22
a31

Fig. 4.4 Schema asimetric de stocare a matricei


Pentru cazul general al unei matrici n x n, cu n un numar par se poate demostra ca nu exista o
modalitate de a memora elementele unei matrici in m = n unitati de memorie astfel incat sa putem
accesa in paralel liniile, coloanele sau diagonalele acesteia. Pentru a fi posibil acest lucru, trebuie sa
dispunem de n unitati de memorie cu m > n. In continuare se ia drept exemplu o matrice 4x4, care
trebuie memorata in m = 5 unitati de memorie. Vom memora elementul a11 in pozitia sa naturala apoi
elementele succesive din coloane le vom memora cu d1 = 2 % m pozitii la dreapta fata de predecesori,
iar elementele succesive din linii le vom memora cu di = 1 % m pozitii la dreapta fata de predecesori, in
figura 4.5 este exemplificata aceasta modalitate de memorare asimetrica.
P1
a11
a24
a32

P2
a12
a33
a41

P3
a13
a21
a34
a42

P4
a14
a22
a43

P5
a23
a31
a44

Fig. 4.5 Schema asimetric de memorare a unei matrice 4 4 n 5 uniti de memorie

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

Fig. 4.6 Calculatorul MPP


Destinatia initiala a calculatorului MPP a fost pentru prelucrarea imaginilor si a fost folosita in
programe de cercetare ale NASA. Pe langa matricea de procesoare mai existau 4 coloane aditionale de
procesoare care puteau inlocui in orice moment un procesor defect, obtinandu-se in acest fel o
toleranta la defecte. 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.

Fig. 4.7 Elementul de procesare al calculatorului MPP


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,

29

separarea intre magistrala de date si cea de control, cele 4 unitati vectoriale de lucru in virgula mobila si
32 Mbiti memorie locala.

Fig. 4.8 Elementul de procesare a calculatorului CM5


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.

Fig. 4.9 Interconectarea procesoarelor CM5


4.2.3 Retele de interconectare la arhitecturile SIMD
Reteaua de comunicatii intre procesoare, memorii si subsisteme de I/O are un mare impact
asupra performantelor calculatoarelor paralele, deoarece in cazul procesarii paralele aceste
performante depind nu numai de frecventa de lucru a procesoarelor individuale, dar si de modul cum
aceste conlucreaza pentru realizarea unui task.
30

Retelele de interconectare folosite in arhitecturile pentru procesarea paralela pot fi imaparitite


in doua categorii importante: retele statice in care legaturile dintre doua procesoare sunt pasive si nu
pot fi reconfigurate pentru a realiza conectarea si cu alte procesoare si retele dinamice care au in
componenta lor comutatoare active ce pot fi reconfigurate. Alte elemente caracteristice ale retelelor de
interconectare sunt : modul de operare (sincron sau asincron), modul in care este realizat controlul
retelei(control centralizat in care exista un singur controller ce gestioneaza toate comutatoarele si
control descentralizat in care fiecare element de comutare poate lua decizii proprii) si tehnica de
comutare (comutare de circuite sau de pachete)
In figura 4.10 sunt prezentate diferite topologii de retele statice: retele liniare, retele stea,
arbore si grila bidimensionala. Retele dinamice se pot imparti in doua tipuri: retele cu un singur nivel si
retele multi-nivel. Retelele dinamice cu un singur nivel pot fi privite d.p.d.v conceptual ca o retea de
comutare cu N intrari si N iesiri ca in figura 4.11. Modul cum sunt conectate intrarile cu iesirile
determina caracteristicile functionale ale retelei.

Fig. 4.10 Reele de interconectare statice

31

Fig. 4.11 Reea cu un singur nivel


Retelele cu un singur nivel mai sunt denumite retele de recirculare, deoarece datele trebuie sa
parcurga de mai multe ori reteaua pentru a ajunge la destinatia finala. Acest numar de treceri succesive
depinde de gradul de conectivitate a retelei. Spre exemplu pe o retea cross-bar unde fiecare intrare este
legata printr-o cale cu o iesire, este nevoie de o singura trecere a datelor prin retea. 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 I f 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 mash este caracterizata prin urmatoarele functii de interconectare:


o M+1(x) = X +1 % N
o M-1(x) = X - 1 % N
o M+n(x) = X +n % N
o M-n(x) = X - n % N
Unde n este radacina patrata a lui N.
Modelul retelei este reprezentat in figura 4.12

32

Fig. 4.12 Reea mesh


-

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

Fig. 4.13 Reea cube 3-D


-

Reteaua shuffle-exchange consta in 2 functii de interconectare: functia shuffle si functia


exchange. Functia shuffle este echivalenta amestecarii perfecte a unui pachet de carti si este
reprezentata formal prin S(bm-1 bm-2 ....bi... b1 b0) = bm-2 ... !bi .... b1 b0 bm-1 0<= i <= m.
Functia exchange corespunde unei interconectari a elementelor a caror adresa
reprezentata binar difera prin bitul cel mai putin semnificativ S(bm-1 bm-2 ....bi... b1 b0) = bm-1 bm-2
... !bi .... b1 ! b0
Reteaua PM2i(+i) este caracterizata prin urmatoarele functii de interconectare
33

o
o

PM2i+i (X) = X+2i % N


PM2i-i (X) = X- 2i % N, 0<= i < m

In figura 4.16 sunt prezentate conexiunile PM2i+i pentru o retea cu N=8.

Fig. 4-16 Reea PM2i


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.

Fig. 4-17 Elemente de interschimbare


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

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.

Fig. 4-18 Reea cube generalizat


Conexiunile realizate de o astfel de retea pot fi de tipul 1 1 sau 1 N. in conexiunile 1 1, intre
o sursa S si o destinatie D, fiecare element de interconectare de la nivelul i este setat pentru pozitia
inainte daca bitii i din adresa sursei si a destinatiei sunt identici, altfel elementul de interconectare este
setat pe pozitia interschimb. Astfel pentru S=3 (011) si D = 1(001) la nivelul 2 se realizeaza conectarea
inainte, bitii cu numarul 2 fiind identici, la nivelul se realizeaza conectare interschimb, bitul 1 difera la
sursa si destinatie, iar la nivelul 0 se realizeaza conectarea inainte. Pentru legaturile 1 N, elementele de
interconectare trebuie sa foloseasca si setarile distribuie sus si distribuie jos.
Retelele data manipulator sunt bazate pe functiile de interconectare PM2i .In figura 4.19 este
prezentata o retea datamanipulator cu N=8 intrari si iesiri. Se observa ca o astfel de retea este alcatuita
din m = log2N niveluri la fiecare nivel existand N comutatoare. Fiecare comutator realizeaza functiile
PM2-i inainte si PM2+i. La fel ca la retelele cube generalizate si acest tip de retea poate realiza conexiuni
1-1 sau 1-N. Datorita numarului mare de functii de interconectare retelele datamanipulator sunt mult
mai scumpe dar ofera o flexibilitate si o fiabilitate mai mare. Ele sunt cunoscute ca retele tolerante la
defecte, deoarece exista mai mult cai posibile intre o sursa si o destinatie, iar atunci cand pe o astfel de
cale apare o defectiune, se poate gasi imediat o alta cale de legatura.

35

Fig. 4-19 Reea data-manipulator


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.
Tabelul 4.1
36

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

Alte proprietati ale retelelor de interconectare sunt partitionarea si reconfigurarea retelelor.


Partitionarea unei retele consta in impartirea sa in subretele independente care pastreaza prorpietatile
unei retele initale. Proprietatea de partitionare este importanta pentru a putea permite mai multor
masini paralele virtuale sa lucreze la diferite task-uri, astfel incat resursele sistemului sa fie cat mai
eficient folosite. Reconfigurarea retelei de interconectare este o caracteristic a de baza care trebuie sa
fie prezenta la calculatoarele paralele. Reconfigurarea se realizeaza de catre sistemul de operare prin
intermediul unor semnale de control transmise de catre toate elementele din retea. In felul acesta SO
37

stabileste o regula de partitionare si aloca diferite task-uri partitiilor. Necesitatea partitionarii si


reconfigurarii retelei rezulta din partitionarea datelor si a modulelor de program si ambele sunt legate
de necesitatea minimizarii costului de comunicatie.
4.3 Procesoare asociative
Notiunea de procesoare asociative este strans legata de memoria asociativa si de aceea incepem
prin a prezenta caracteristicile de baza ale unei memorii asociative.
Principala caracteristica a memoriei asociative, este faptul ca datele stocate intr-o astfel de
memorie pot fi adresate prin continutul lor. Datorita acestei proprietati, memoria asociativa mai este
denumita si memorie multi-acces, memorie cu cautare paralela sau memorie adresabila prin continut.
Avantajul major al memoriei asociative fata de memoria RAM este posibilitatea efectuarii de comparari
sau cautari paralele, dar exista si dezavantajul unui hardware mai costisitor.
Structura de baza a unei memorii asociative este ilustrata in figura 4.20. Memoria este formata
din n cuvinte, fiecare cuvant avand m biti. Fiecare celula elementara este contruita dintr-un circuit flipflop si circuite logice pentru comparare si controlul scrierii/citirii. O coloana verticala formeaza un bit
slice si este alcatuita din n biti. Vom nota cuvintele prin W i = (Bi1 Bi2 Bi3........ Bin), iar bit slice Bj = (B1j B2j
B3j........ Bnj).

Fig. 4-20 Forma de organizare a memoriei 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 bitsliceuri ce vor participa la cautare si care sunt indicate de registrul M si apoi se trimit semnalele

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.

Fig. 4-21 Arhitectur tipic a unui calculator bazat pe memoria asociativ


Modul de functionare al acestui calculator consta in extragerea instructiunilor din memoria
pentru stocarea programelor de catre unitatea de control si apoi prelucrarea datelor, care are loc in
memoria asociativa. Aceasta prelucrare consta de obicei in scrieri, citiri si cautari complexe ale
informatiilor memorate sub forma bazelor de date.
4.4 Arii sistolice si arii cu front de umbra
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
39

simple care pot efectua cateva operatii aritmetice de baza, exista si arii sistolice compuse din arii de
procesare mai puternice programabile.

Fig. 4-22 Arie sistolica

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 :

Complexitatea elementelor de procesare care poate varia de la operatii ce sunt executate pe un


singur bit pana la procesoare multibit;
Conectivitatea - de obicei se folosesc structuri de interconectare ordonate pentru a fi usor de
implementat hardware ; modele de interconectare cel mai des utilizate sunt : reteaua
bidimensionala, structuri hexagonale ;

40

Programabilitatea elementelor de procesare exista o gama larga de tipuri de elemente de


procesare folosite in ariile sistolice a caror programabilitate variaza de la lipsa totala a acesteia
(elementul de procesare executa doar o singura operatie) pana la elemente de procesare total
programabile.

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.

Fig. 4-23 Elementul de procesare i modaliti de interconectare


Procesoarele de la frontiera ariei sistolice vor fi conectate prin memoria principala de unde vor primi
datele ce trebuie prelucrate si unde vor transmite datele prelucrate.
Inmultirea dintre o matrice banda A de dimensiune m x n si lungimea benzii lb=s + p + 1 cu un vector
X de dimensiune r poate fi calculata prin relatia de recurenta :
(1)

=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.

4.5 Calculatoare vectoriale


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.
Se vor prezenta particularitatile instructiunilor vectoriale, se va stabili care sunt componentele
de baza ale unui calculator vectorial si se vor exemplifica aceste notiuni pe unul dintre calculatoarele
care s-au bucurat de un mare succes de la lansarea primei sale versiuni CRAY1 in 1976 pana la cele mai
recente versiuni.

43

Dupa tipul operanzilor si a rezultatelor instructiunile vectoriale pot fi clasificate in 4 categorii


principale.f1 : V-> V, f2 : V-> V, f1 : V-> V, f1 : VxS-> V, unde V este un operand vector, iar S este un
scalar. Exemple de astfel de instructiuni vectoriale ar putea fi:
-

VADD - Z(i) = X(i) + Y(i), i = 1...n. Adunarea a 2 vectori.


VTEST - Z(i) = 0 daca X(i) < Y(i), Z(i) = 1 in caz contrar, i= 1....n
SDIV - Z(i) = X(i)/s, unde s este un scalar , i = 1...n impartirea elementelor vectorului cu un
scalar.

Pentru a usura operatiile vectoriale, majoritatea calculatoarelor vectoriale dispun si de anumite


instructiuni speciale. Acestea se bazazeaza pe un vector bulean care este folosit pentru a activa sau
dezactiva prelucrarile asupra componentelor unui vector dintr-o instructiune vectoriala. Doua tipuri de
instructiuni sunt interclasarea si compresia datelor. De exemplu fiind dati vectorii X = (1,3,5,6,2) si B =
(0,0,1,0,0) , instructiunea de compresie aplicata lui X cu ajutorul lui B va da rezultatul Y = (5,6). Din X se
selecteaza doar componentele care corespund pozitiilor unde se gaseste valoarea 1 in B. analog se
poate obtine si interclasarea a 2 vectori: X = (6,1,3,8,3,9) si Y = (2,1,4,2,6,7) si B =
(0,1,0,1,0,1,1,1,0,0,0,1). Interclasarea vectorilor X si Y controlata de B are rezultat Z =
(2,6,1,1,4,3,8,3,2,6,7,9) primul 0 din B indica faptul ca Z(1) este selectat din Y, urmatorul 1 indica faptul
ca Z(2) selectat din X. Operatiile vectoriale sunt potrivite pentru executarea lor in pipeline, deoarece
presupun executarea aceleiasi functii in mod repetat. Se reduce timpul instructiunilor de control al
ciclarii. De aceea calculatoarele vectoriale sunt construite cu unitati functionale in banda de asamblare.
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

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

1. Marirea numarului de instructiuni vectoriale. Folosind un numar mare de instructiuni


vectoriale(ex: incluzand in setul de instructiuni, instructiuni speciale cum au fost cele de
compresie si interclasare), se poate realiza o utilizare eficienta a resurselor.
2. Combinarea resurselor scalaree de acelasi tip pentru a imbunatatii viteza benzii de
asamblare
3. Alegerea unor algoritimi potriviti. de ex: un alg de interclasare nu este foarte performant pe
un calculator vectorial deoarece acesta poate executa interclasarea printr-o singura
instructiune
4. Folosirea unor compilatoare vectorizante. Acestea pot detecta concurenta dintre
instructiunile vectoriale si pot exploata paralelismul pierdut datorita folosirii unor limbaje de
programare secventiale.
In figura 4.25 sunt prezentate componentele ce intra in arhitectura tipica unui calculator
vectorial.

Fig. 4-25 Arhitectura tipic a unui calculator vectorial


Asa cum se observa din figura orice calculator vectorial are in componenta o unitate de ...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
46

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 :
-

Procesare orizontala prelucrarea este efectuata orizontal de la stanga la dreapta linie cu


linie
Procesare verticala - prelucrarea este efectuata vertical pe coloana
Combinarea celor doua metode

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.

Y12 = zi1+zi2 i = 1....n

2.

Y12 +zi3 i = 1....n

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

Fig. 4-26 Schema-bloc a calculatorului CRAY X-MP

48

Capitolul 5 Arhitecturi pentru paralelismul la nivel de proces.


5.1 Introducere
Calculatoarele ce exploateaza paralelismul la nivel de proces se incadreaza in clasa MIMD, care
constituie si cea mai raspandita clasa de calculatoare paralele. Calculoatoarele MIMD se bazeaza pe o
extindere a modelului von Neumann, extindere ce se realizeaza in doua moduri.
Una dintre versiuni consta in conectarea fiecarui procesor cu o memorie locala apoi setul de
perechi procesor-memorie este conectat prin intermediul unei retele. Procesoarele au acces doar la
memoria locala iar cand doresc sa comunice cu alte procesoare, acest lucru se va realiza prin schimb de
mesaje. Aceasta arhitectura prezentata in fig 5.1a este cunoscuta sub denumirea de arhitectura MIMD
cu memorie distribuita sau multi-procesor slab cuplat, multi-computer. Cealalta varianta de calculator
MIMD este compusa dintr-un set de procesoare si module de memorie, toate conectate intre ele printro retea de interconectare, asa cum se poate observa in figura 5.1b. modulele de memorie alcatuiesc un
spatiu unic de adresa iar toate procesoarele au acces la aceasta memorie. Calculatoarele construite in
acest principiu se numesc calculatoare cu memorie partajata, multi-procesoare puternic conectate.

Fig. 5-1 Calculatoare MIMD


Un rol foarte important in obtinerea unor performante ridicate, indiferent de tipul de calculator,
il are reteaua de interconectare. Aceste retele pot fi statice sau dinamice(SIMD) si trebuie sa aiba
caracteristici diferite in functie de modul de organizare a memoriei. Pentru modelul de memorie
distribuita retele de interconectare trebuie sa transfere mesaje care pot 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.

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.

Fig. 5-2 Utilizarea memoriilor cache locale

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
50

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.

NUMA(Non-Uniform Memory Access), fig. 5.3.a


COMA(Cache Only Memory Access), fig. 5.3.b
CC-NUMA(Cache Coerent Non-Uniform Memory Access), fig.5.3.

Fig. 5-3 Scheme simplificate ale calculatoarelor cu memorie distribuit fizic, dar partajat logic
51

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).

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.

Fig. 5-4 Elementul de procesare la calculatorul HEP

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
54

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).

Fig. 5-5 Calculator paralel cu memorie distribuit

Distinctia dintre elementele ce compun un nod al calculatorului nu a fost foarte clara la


primele tipuri de masini din aceasta clasa. Initial, pentru calcul, comunicatie si realizarea
legaturii cu reteua de comunicare era folosit acelasi procesor. Odata cu dezvoltarea
tehnologiilor cele rei elemente au inceput sa fie separate astfel incat la calculatoarele de
ultima generatie sunt folosite procesoare distincte pentru calcul, comunicatie si rotarea
mesajelor.

55

Un element foarte important la arhitecturile cu memorie distribuita este modul de


organizare a retelei de interconectare. Acestea pot fi:
- Statice-retelele care constau in legaturi punct la punct intre procesoare denumite
uneori si retele directe;
- Dinamice-construite pe baza unor comutatoare cu ajutorul carora retelele se pot
reconfigura in mod dinamic.
De abicei la calculatoarele paralele cu memorie distribuita se utilizeaza mai ales retelele
statice. Pentru descrierea acestor retele se folosesc trei caracteristici: topologia retelei,
topologie care influenteaza durata de transmisie a unui mesaj; metoda de comutare utilizata
(comutare de pachete sau comutare de circuite); si protocoalele de route-are, care au rolul de a
stabili o cale pe care un mesaj o va urma de la procesorul sursa la procesorul destinatie. Aceste
trei caractristici vor fi detaliate in capitolele urmatoare.
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 atmit o granularitate medie.
O caracteristica importanta a calculatoarelor construita pe baza memoriei distribuite o
constituie problema accesului la memorie. Fiecare procesor poate accesa in mod direct (adica
prin instructiuni de tip load/store) numai in memoria proprie nodului sau. De aceea cand doua
sau mai multe procesoare au nevoie sa comunice intre ele, comunicarea nu se poate face prin
intermediul unor locatii de memorie la care sa aiba acces ............. in operatia de comunicare.
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,

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

Fig. 5-6 Reele de interconectare

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);
61

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.

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

**+ reprezint parte ntreag; n numrul de procesoare

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 :

o prima clasificare imparte acesti algoritmi in :


minimali
non-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:
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:

algoritmi ce au la baza rutarea prin definirea unor directii implicite


algoritmi bazati pe orientarea dimensiunilor
algoritmi ce folosesc tabele de rutare

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:

masini NUMA (Non Uniform Memory Access)


masini CC-NUMA (Cache Coerent Non Uniform Memory Access)
masini COMA (Cache Only Memory Access)

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:

procesoare, memorii, dispozitive de intrare/iesire

Studiind arhitectura calculatoarelor paralele existente se contureaza mai multe posibilitati de


aranjare a acestor interconectari : magistrale, retele cross-bar, retele multi-nivel.

Sisteme orientate pe magistrala


Magistrala reprezinta modul cel mai simplu de comunicare. Un sistem bazat pe conectare cu
magistrala este prezentat in fig. 5.8. Sunt prezentate elementele de baza ale unei astfel de arhitecturi, o
serie de procesoare P, module de memorie M si dispozitive I/O, toate acestea conectate la o magistrala
de comunicatie.

67

Fig. 5-8 Comunicaie prin magistral


Performantele sistemului de comunicatie bazat pe magistrala depind de 2 factori:
1. Numarul de procesoare conectate la magistrala;
2. Prezenta sau absenta unei memorii cache atasate fiecarui procesor.
Cresterea numarului de procesoare duce la scaderea performantelor din cauza cererilor de
acces pe magistrala. Sisteme cu cateva zeci de procesoare au performante foarte bune, dar peste acest
numar de procesoare, magistrala devine un punct critic in performanta sistemului. O modalitate de a
micsora numarul cererilor de acces la magistrala este dotarea fiecarui procesor cu o memorie cache
locala astfel incat la aparitia unei cereri de acces la memorie, datele vor fi cautate in memoria cache
prima data si daca nu vor fi gasite aici se va accesa magistrala pentru a aduce sau scrie datele dintrun/intr-un modul de memorie. De ex, o rata de hit ( proportia in care cererile de acces sunt satisfacute
de memoria cache) de 95% va duce la scaderea cererilor de acces la magistrala doar 5%.
Magistrala de comunicatie consta intr-un numar de linii afectate a adreselor,datelor, semnalelor
de control, intreruperilor si comunicatiei exclusive dintr-un dispozitiv master si unul slave. Un aspect
important al sistemelor cu magistrala il reprezinta modalitatea de arbitrare a magistralei, adica
modalitatea de selectare a unui singur dispozitiv care va avea acces la magistrala atunci cand mai multe
dispozitive cer acces la magistrala simultan. Astfel fiecare magistrala are un dispozitiv denumit unitate
de controla sau unitate de arbitrare a magistralei, care are rolul de a implementa la nivel hardware un
algoritm de arbitrare a accesului la magistrala fig.5.9.

68

Fig. 5-9 Controlul magistralei


Cei mai utilizati algoritmi de arbitrare a magistralei sunt:

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

Fig. 5-10 Implementarea metodei de arbitrare rotating daisy-chain


Dupa cum se poate observa din aceasta enumerare, exista doua variante de implementare a
unitatii de arbitrare:
-

arbitrul centralizat ca in cazul Daisy-Chaining


arbitrul descentralizat ca in situatia Rotating Daisy-Chain

Prezentm urmtorul algoritm :


Folosirea alg. Daisy-Chaining ,care e bazat pe proprieti statice duce la timpi foarte mari de ateptare
pentru procesoarele cu o prioritate sczut.De asemenea,nici factorul de echilibrare nu are valori
satisfctoare pentru un numr mare de procesoare conectate la magistral.Acesta crete foarte rapid
odat cu creterea nr. de procesoare.Timpul maxim de ateptare crete i el rapid odat cu scderea
prioritii.
Concluzie!Utilizarea acestui alg. furnizeaz rezultate bune cnd magistrala nu e foarte ncrcat, adic n
cazul unui numr mic de procesoare.
Alg.Round-Robin duce la o ncrcare echilibrat a magistralei deoarece toate procesoarele vor primi
acces la un anumit interval de timp. Experimental se observ c L rmne foarte mic indiferent de nr. de
procesoare N. Timpul mediu de ateptare nu variaz semnificativ cu N.
Alg. Round-Robin duce la timpi medii de ateptare mai mari dect n cazul Daisy-Chaining rezultnd un
factor de utilizare al magistralei mai mic.
Alg. Rotating , Daisy-Chaining i RLU duc la obinerea unei ncrcri bune a magistralei n condiiile unor
timpi de ateptare mai redui,dect n cazurile precedente.Aceti 2 alg. duc la rezultate mai bune dect
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 ncrcare echilibrat a magistralei.Dac
lum n considerare toate elementele care caracterizeaz performana magistralei,putem trage
70

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.

Fig. 5-11 Sistem cu k magistrale


Folosirea mai multor magistrale de comunicaii ridic probleme hardware speciale,cum ar fii : problema
arbitrului de magistral,care n acest caz e mult mai complicat. Mai nti un arbitru 1-din N va rezolva
71

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.

Sisteme cu reele Crossbar

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.

Fig. 5-12 Reea crossbar


Printre avantajele unor astfel de reele se numr simplitatea inferfeelor dintre unitile funcionale i
switch-uri (comutatoare), precum i faptul c se pot efectua transferuri simultane pentru toate
modulurile de memorie.Pentru a putea obine aceste avantaje se impun cteva cerine componentelor
hardware dintr-un comutator. Fiecare comutator trebuie s fie capabil s rezolve problema accesului
concurent la acelai modul de memorie. Aceste conflicte sunt rezolvate de o component de arbitrare a
accesului,care lucreaz cu prioriti acordate fiecrui procesor.
Reelele crossbar cu tot avantajul oferit de lrgimea de band dedicat,devin foarte scumpe pe msur
ce nr. componentelor conectate crete,deoarece nr. de comutatoare din reele crete cu puterea a 2-a a
nr.de procesoare (sau cu produsul dintre nr. de procesoare i cel de module de memorie).

Sisteme cu reele multinivel


72

Reelele multinivel au mai fost prezentate n cazul calc. SIMD.


Practic,aceleai principii sunt folosite i la calc. MIMD cu memorie partajat. Elem. de baz al unei reele
multinivel e comutatorul 2 x 2 (fig. 5.13).

Fig. 5-13 Comutator 2 x 2


Elementul de comutare poate conecta intrarea A la ieirea O la o anumit valoare a semnalului pe linia
de control i la ieirea 1 la o alt valoare a liniei de control. ntr-un mod similar,se comport i intrarea
etichetat cu B. Elem. de comutare trebuie s fie capabil s rezolve i cereri concurente : dac intrrile A
i B trebuie legate la aceeai ieire,atunci comutatorul trebuie s ia o decizie n sensul acceptrii unor
cereri i respingerii celeilalte.
O facilitate suplimentar poate fi existena unor buffere ataate intrrilor pentru a crete performanele
reelei de comutare.
n plus fa de reelele multinivel prezentate anterior la calculatoarele SIMD se va prezenta reeaua
omega. Aceasta e construit pe baza funciei de interconectare perfect shuffle (amestecare perfect).
Modul n care funcia perfect- shuffle conecteaz 2 procesoare : -dac N = 2n e nr. total de procesoare,
atunci adresa fiecrui procesor se poate exprima prin n bii. Procesorul cu adresa s e legat cu procesorul
a crui adres, se obine prin op. de rotire la stnga cu o poziie a reprezentrii primare ale lui s. De ex :
pentru N=8, m=3 , procesorul cu adresa s1,s2,s3 e conectat cu procesorul care are adresa s2,s3,s1.
Reeaua omega e o reea multinivel, n care nivelurile sunt interconectate folosind conexiunea perfectshuffle.Pentru un nr. N= 2n procesoare,reeaua va avea n niveluri. Un comutator de la nivelul i trimite
mesajul fie utiliznd conexiunea nainte,dac bitul i din adresa procesorului surs e egal cu bitul i din
adresa procesorului destinae, fie utiliznd conexiunea interschimb n caz contrar (fig. 4.17).
Modalitatea de rotare a mesajelor din reeaua omega se poate exemplifica uor pentru cazul a 8
procesoare n felul urmtor :
1.
2.
3.
4.
5.
6.
7.
8.

Fie adresa procesorului surs : s1,s2,s3


Dup prima aplicare a funciei shuffle : s2,s3,s1
Dup primul comutator : s2,s3,d1 (nainte dac s1,-d1 ; conexiunea adiacent dac s1d1)
Dup a 2-a aplicaie a funciei Shuffle : s3,d1,s2
Dup al 2-lea comutator : s3,d1,d2 (nainte dac s2=d2,interschimb dac s2=d2)
Dup a 3-a aplicare a funciei shuffle : d1,d2,s3
Dup al 3-lea comutator : d1,d2,d3(nainte : s3=d3, conexiune adiacent : s3=d3)
Procesorul destinaiei : d1,d2,d3
73

Reeaua omega i conexiunea perfect-shuffle : fig. 5.14.

Fig. 5-14 Reeau omega

Examen : 2 subiecte

subiect : cap I
cap II
subiect : restul

74