Sunteți pe pagina 1din 63

AP –CURS 1

Cap 1. Introducere in problematica calculului paralel.

1.1 Necesitatea calculului paralel

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.

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

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
aceea este nevoie sa existe ceva care sa faciliteze translatarea desrierii abstracte a unei
probleme intr-un algoritm. Acest “ceva” este chiar modelul computational.
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.
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.

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 e planificat.
2. Procesul este suspendat
3. Procesul este blocat in asteptarea unui eveniment
4. 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 serie de obiecte private, cum ar fi indicatorul
de instructiune(program counter), stiva, un context hardware etc.
AP – CURS 2

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

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

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.
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 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.
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.
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.
AP-curs3
Cap. 3 Arhitecturi pentru paralelismul la nivel de instrucţiune

3.1 Introducere

În cadrul arhitecturilor care exploatează paralelismul la nivel de instrucţiune se vor studia


procesoarele realizate în bandă de asamblare (pipeline) şi superscalare precum şi maşinile VLIW (Very
Large Instruction Word).
Folosirea pipeline a fost una din primele metode utilizate pentru a îmbunătăţi performanţele unui
processor. Prelucrarea pipeline presupune ca procesarea unei instrucţiuni să fie descompusă în mai multe
etape. Procesorul va fi alcătuit din mai multe component separate, organizate sub forma unei benzi de
asamblare în care fiecare unitate are rolul de a executa o sarcină specifică.
O instrucţiune se poate descompune în:
- extragerea instrucţiunii din memoria cache – fetch
- decodificarea instrucţiunii – decode
- executarea instrucţiunii – execute
- scrierea rezultatului în registrul destinaţie – write back

Fiecare din aceste operaţii necesare la procesarea unei instrucţiuni este executată de un nivel separate
în banda de asamblare. O instrucţiune va trece succesiv prin toate nivelurile, avansând la fiecare tact al
ceasului. (fig.3.1)
F - fetch
D - decode
E - execute
W - writeback

Figura 3.1. Executarea instrucţiunilor în tehnica


pipeline

Procesoarele superscalare şi maşinile VLIW, care reprezintă cea de-a doua variantă a implementării
paralelismului la nivel de instrucţiune, diferă de pipeline prin faptul că folosesc mai multe unităţi de execuţie
ce pot lucra simultan.
Gradul maxim de paralelism atins de aceste procesoare este egal cu numărul de unităţi de execuţie
disponibile, bineînţeles dacă aceste unităţi pot fi alimentate simultan cu instrucţiuni.
Deosebirea dintre procesoarele superscalare şi maşinile VLIW vine de la modul în care sunt
prezentate instrucţiunile spre execuţie.
Astfel, o instrucţiune VLIW are mai multe câmpuri care conţin codul operaţiei destinate fiecărei
unităţi de execuţie. Aceste operaţii trebuie să fie independente, sunt detectate în program şi împachetate într-
o instrucţiune VLIW de către compilator.
În cazul procesoarelor superscalare, instrucţiunile sunt aduse sub forma unui flux secvenţial din
memoria cache şi prezentate unităţii de planificare si codificare. Aici se verifică dependenţa dintre
instrucţiuni, iar cele care sunt independente sunt planificate simultan pentru execuţie într-un singur tact al
ceasului. Instrucţiunile procesorului superscalar sunt instrucţiuni obişnuite (RISC sau CISC) care controlează
o unitate de execuţie. În fig. 3.2 se poate urmări o comparaţie între cele 2 tipuri de arhitecturi.
Figura 3.2. Comparaţie între procesoarele superscalare şi VLIW

Spre deosebire de VLIW unde operaţiile ce compun o instrucţiune trebuie să fie independente, iar de
lucrul acesta se asigură compilatorul, la procesoarele superscalare dependenţele sunt verificate în mod
dinamic chiar de unitatea de codificare.

3.2 Procesoarele pipeline

Tehnica de procesare în bandă de asamblare (pipeline) reprezntă o modalitate important de creştere a


performanţelor procesoarelor. Datorită avantajelor acestei modalităţi de prelucrare a instructiunilor, toate
procesoarele modern sunt organizate sub forma unei benzi de asamblare.
Modalitatea pipeline a fost preluată în proiectarea calculatoarelor de la benzile de asamblare din
întreprinderi. Prelucrarea pipeline poate realiza un parallelism temporal prin suprapunerea în timp a
procesării instrucţiunilor.
În general, pentru a aplica tehnica pipeline, problema care trebuie rezolvată se divide în subprobleme.
Fiecare din ele se atribuie unui segment (nivel) separate din banda de asamblare, segment care lucrează în
paralel cu celelalte segmente. Rezultatele prelucrării unui segment din banda de asamblare se vor constitui în
date de intrare pentru segmental următor. De obicei, toate segmentele dintr-o banda de asamblare trebuie sa
aibă aceeaşi viteză de prelucrare, altfel segmentul cu cea mai mică viteză devine un punct crit ic în fluxul de
date. Structura unei benzi de asamblare liniară este prezentată în fig. 3.3.

Figura 3.3. Structura unei benzi de asamblare liniare

3.3 Procesoare superscalare

O altă modalitate de a îmbunătăţi performanţele procesoarelor este de a


introduce mai multe unităţi funcţionale care pot lucre în paralel. Astfel, un
procesor ar putea executa simultan 2 sau mai multe instrucţiuni. Datorită
caracteristicii sale de a executa mai multe instrucţiuni în paralel, un procesor
superscalar rezolvă o serie de probleme care nu apăreau la procesoarele scalare.
Exemplu:
- decodificarea paralelă a instrucţiunilor
- planificarea instrucţiunilor spre execuţie
- folosirea unor tehnici de evitare a blocajelor de planificare datorate
dependenţelor dintre instrucţuni (shelbing, redenumirea registrelor, execuţia
speculativă)
- execuţia paralelă a mai multor instrucţiuni
- menţinerea secvenţialităţii programelor şi a tratării excepţiilor
Decodificarea paralelă

Prima sarcină pe care o are de rezolvat un procesor superscalar este decodificarea instrucţiunilor. În
situaţia procesoarelor superscalare, decodificarea este mult mai dificilă decât la procesoarele obişnuite
deoarece trebuie decodificate mai multe instrucţiuni într-o singura perioadă de ceas şi trebuie verificate atât
dependenţele dintre instrucţiunile decodificate la momentul current, cât şi cele dintre acestea şi cele care sunt
deja în faza de execuţie. Cum toate procesoarele superscalare au mai multe unităţi de execuţie, numărul
instrucţiunilor care trebuie verificate este foarte mare.
Pentru a uşura sarcina decodificatorului, se foloseşte de obicei o faza de predecodificare. În memoria
cache de nivel 2 şi cea de nivel 1, pentru instrucţiuni se reduce introduce o predecodificator care va adăuga la
fiecare instrucţiune un număr de biţi ce sunt de regulă utilizaţi la identificarea clasei din care face parte
instrucţiunea, a resurselor de care au nevoie pentru execuţie, etc.
În fig. 3.7 se poate observa unitatea de predecodificare introdusă la majoritatea procesoarelor
superscalare.

Figura 3.7. Predecodificarea instrucţinilor

Planificarea instrucţiunilor pentru execuţie

Cel mai important aspect legat de procesarea instrucţiunilor îl constituie planificarea sau distribuirea
spre execuţie a mai multor instrucţiuni într-un singur ciclu de ceas. Problemele ce trebuie rezolvate la
planificare sunt:
1. considerarea dependenţelor false între date (WAW, WAR – write-after-write, write-after-read)
- tratarea prin redenumirea registrelor.
- lipsa unui mechanism pentru tratarea dependenţelor false
2. considerarea dependenţelor de control nerezolvate (hazard de date, hazard de control)
- aşteptarea evaluării condiţiei de salt
- utilizarea unor metode de predicţie a salturilor şi executarea speculativă a instrucţiunilor
3. folosirea bufferelor de instrucţiuni şi a staţiilor de rezervare (shelbing)
- planificare cu blocare: ultimele n instrucţiuni din bufferul de instrucţiuni (care formeaza starea de
planificare) sunt verificate pentru detectarea dependenţelor. Dacă ele sunt independente, sunt trimise
direct la unităţile de execuţie. Dacă există dependenţe între ele, planificarea este blocată până la rezolvarea
acestora.
- planificare fără blocare: în faţa fiecărei unităţi de execuţie sunt plasate buffere locale de instrucţiuni (staţii
de rezervă). Instrucţiunile din fereastra de planificare sunt trimise către staţiile de rezervare fără a efectua
o verificare a dependenţelor. Fiecare staţie de rezervare va efectua aceste verificări şi va prezenta la
unitatea de execuţie instrucţiunile găsite independente.

Tratarea blocajelor apărute în planificarea instrucţiunilor implică luarea în considerare a ordinii


planificării. Modul cum este tratată o instrucţiune dependentă atunci când se face planificarea pentru execuţie
duce la identificarea a 2 scheme de planificare:
- planificare in-order: o instructiune executabilă la momentul actual va duce la blocarea instrucţiunilor
ulteroare de la planificare, chiar dacă acestea se pot executa
- planificare out-of-order: o instrucţiune ce nu se poate executa la momentul actual blochează de la
planificare a altor instrucţiuni ulterioare ce nu se pot executa.

În fig. 3.8 pot fi urmărite cele 2 moduri de planificare a instrucţiunii:


1. se poate observa că instrucţiunea I2 blochează de la planificare pe I3 cu toate că I3 nu depinde de nici o
altă instrucţiune şi s-ar putea executa.
2. I3 a fost planificată înaintea lui I2 care fiind într-o relaţie de dependenţăcu o altă instrucţiune, nu poate fi
planificată.

Fig. 3.8. Planificarea in-order şi out-of-order

Utilizarea staţiilor de rezervare

Acestea sunt buffere de instrucţiuni plasate în faţa unităţilor de execuţie, care au rolul de a decupla
planificarea instrucţiunilor decodificate de verificarea dependenţelor. Verificarea dependenţelor dintre
instrucţiuni este amânată pentru momentul în care instrucţiunile memorate în staţiile de rezervare vor face
obiectul trimiterii lor către unitatea de execuţie. Folosirea staţiilor de rezervare duce la eliminarea blocajelor
de planificare pe care le poate întâlni unitatea de decodificare / planificare.
Instrucţiunile între care există relaţii de dependenţă vor fi ţinute în staţiile de rezervare până la
rezolvarea dependenţelor. În momentul în care o unitate de execuţie este liberă, toate instrucţiunile
independente prezente în staţia de rezervare pot face obiectul planificării. Instrucţiunea care va fi aleasă
depinde de strategia de planificare pe care o implementează fiecare procesor.

Redenumirea registrelor

Conceptul a fost introdus în legătură cu eliminarea dependenţelor false dintre instrucţiuni. Registrul
destinaţie dintr-o instrucţiune se poate redenumi, adică în locul registrului architectural ce apare în
instrucţiune se va folosi un registru de rezervă destinat special pentru redenumire. Registrul depus în registrul
de rezervă va fi depus în registrul architectural iniţial, în momentul în care ordinea secvenţială a
instrucţiunilor va permite acest lucru.
Redenumirea registrelor are loc dinamic, în timpul execuţiei instrucţiunilor. Această tehnică a fost
introdusă chiar de la apariţia primelor procesoare superscalare. Iniţial, redenumirea registrelor s-a utilizat
doar pentru anumite tipuri de instrucţiuni.
Schema de redenumire lucrează astfel: la un moment dat, presupunem că registrele arhitecturale
reprezintă o submulţime din setul de register fizice. Pentru fiecare instrucţiune ce urmează, registrul
destinaţie va fi alocat într-un nou registru fizic disponibil. Alocarea şi dezalocarea registrelor sunt urmărite
cu ajutorul unei tabele de mapare. (fig. 3.10).
Tabela conţine un bit denumit Valid (valoarea 1 indică faptul că intrarea pe index conţine o valoare
validă) şi Indexul registrului în setul de register fizice. În acest exemplu, registrul architectural R1 este alocat
în registrul fizic RF3, iar R2 în RF9.

Figura 3.10. Tabela de mapare a registrelor

Tratarea instrucţiunilor de ramificaţie

Una din cele mai importante probleme care apar în contextul procesoarelor pipeline şi superscalare
este problema tratării instrucţiunilor de ramificaţie. Se va considera cazul cel mai simplu al unei benzi de
asamblare cu 4 nivele: fetch, decode, execute, write-back.
Vom lua în considerare o instrucţiune de salt necondiţionat şi vom presupune că la sfârşitul nivelului
3 este disponibilă adresa de salt (fig.3.11)

Figura 3.11. Penalitatea la procesarea unei instrucţiuni de salt

Se poate observa cum I3 şi I4 care au intrat deja în banda de asamblare vor trebui anulate.
Instrucţiunea de salt a cauzat o penalitate de 2 cicli. Situaţia poate devein mai gravă în cazul unei instrucţiuni
de salt condiţionat. Să presupunem ca instrucţiunea de salt condiţionat are la bază testatrea rezultatului unei
operaţii în virgulă mobilă. Cum aceste operaţii necesită foarte mulţi cicli (împărţire – 50 cicli), penalitatea va
creşte şi ea corespunzător. Cazul în care la momentul execuţiei instrucţiunii de salt condiţionat nu este
cunoscut încă rezultatul expresiei ce stă la baza condiţiei de salt se numeşte dependenţă de control
nerezolvată.
Cele mai importante tehnici de procesare a instrucţiunilor de salt sunt:
- utilizarea metodei delayed-branching (salt întârziat).
- tratarea instrucţiunii de salt nerezolvate prin:
- blocarea procesării până la rezolvarea condiţiei
- execuţia speculativă
- execuţia multicale

3.4 Maşini VLIW

Deosebirea dintre un procesor VLIW şi unul superscalar provine de la modul cum sunt construite
instrucţiunile şi cum sunt planificate pentru execuţie. O instrucţiune VLIW este format din mai multe
câmpuri. Un camp reprezintă codul unei operaţii, fiecare operaţie fiind destinată unei unităţifuncţionale
distinct. (fig. 3.19) Execuţia unei astfel de instrucţiuni este echivalentă cu executarea în paralel a tuturor
operaţiilor care alcătuiesc instrucţiunea.

Figura 3.19. Instrucţiunea VLIW

Datorită modului specific de construcţie a maşinii VLIW, aceasta va avea o lungime mai mare ce
depinde de numărul unităţilor funcţionale disponibile (în general, acest număr este de 5 până la 30 unităţi
funcţionale). O dimensiune uzuală pentru o astfel de instrucţiune este cuprinsă între 256 şi 1024 biţi.
Există şi dezavantaje. Unul din ele este legat de compilatoare. Acestea trebuie să cunoască multe
detalii despre hardware-ul pe care rulează, detalii privind numărul de unităţi funcţionale cu care este echipat
procesorul, informaţii privind timpii de acces la memoria cache, întârzierile provocate de diferite tipuri de
instrucţiuni, etc.
Faptul că un compilator va fi legat de aceste detalii îl va face să nu fie portabil şi odată schimbat ceva
în arhitectura procesorului, tot software-ul va trebui modificat.
Un alt dezavantaj al arhitecturilor VLIW vine de la modul de construire a instrucţiunii. Toate
operaţiile prezente într-o instrucţiune trebuie să fie independente; dacă apare o situaţie în care compilatorul
nu poate găsi atâtea operaţii independente câte încap într-o instrucţiune, atunci anumite câmpuri ale
instrucţiunii vor fi goale (irosire a memoriei).
Un ultim dezavantaj este constituit din faptul că un număr mare de unităţi funcţionale care execută
instrucţiunea în paralel vor necesita şi un număr mare de porturi de scriere / citire la setul de register, ceea ce
înseamnă complexitate sporită din punct de vedere al hardware-ului.
Calculatoarele VLIW au nevoie de un compilator special pentru a putea exploata la nivel maxim
paralelismul. Studiile experimentale au arătat că utlizând paralelismul existent la nivelul unui bloc de bază,
adică al unui bloc cuprins între 2 instrucţiuni de salt, se poate obiţine o creştere în viteza de execuţie de 2-3
ori. Totodată, s-a constatat că în cadrul unui program există un potenţial mult mai mare al paralelismului ce
poate fi exploatat numai de către un compilator capabil să treacă de bariera blocului de bază. Compilatoarele
care pot realiza o astfel de sarcină mai poartă numele de global scheduler (planificator global).
AP - CURS 4

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.
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 in contextul calculatoarelor SIMD.

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.

4.2 Calculatoare SIMD

4.2.1 Arhitectura calculatoarelor SIMD

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 tipice ariilor de procesoare ce corespund calculatoarelor ILLIAC 4
(figura 4.1a) si BSP (figura 4.1b) care au fost printre primele implementari ale conceptului de
arhitectura SIMD.
Cele doua configuratii constau in N elemente de procesare (PE) aflate sub controlul
aceleiasi unitati de control (CU). Unitatile de control sunt dotate cu propria memorie si au
rolul de a transmite instructiuni catre elementele de procesare in mod sincron.
Aceste configuratii difera doar in doua aspecte:
1. la ILLIAC 4 fiecare unitate de procesare are si o memorie locala (PEM), pe
cand la BSP aceste memorii locale au fost inlocuite cu un numar de module
de memorie cu acces in paralel (MI) care sunt interconectate cu elementele
de procesare printr-o retea de aliniere.
2. A doua diferenta provine din inlocuirea retelei de permutare dintre
elementele de procesare prin reteaua de aliniere controlata de CU. Aceasta
retea are rolul de a permite accesul la memorie fara a interveni conflicte de
acces.

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 .
Fiecare registru R j al unul element de procesare PEi este conectat cu registru Rj al
elementului de procesare PEj prin intermediul retelei de interconectare. Unele arii de
procesoareau doua registre de comunicare, unul pentru intrare si altul pentru iesire.
Daca presupunem ca numarul total de elemente de procesare N este de forma N= 2n
atunci pentru a reprezenta adresa unui element de procesare avem nevoie de n biti. Acesti n
biti de adresa sunt memorati in registru Di al fiecarui element de procesare. Registru Si va
contine valoarea 0, daca elementul de procesare PEinu este activ la un moment dat si valoare
1 in cazul in care elementul de procesare este activ. Toate valorile registrelor Si sunt retinute
intr-un registru S din interiorul CU, denumit registru de stare global, valoarea lui Si aflandu-
se pe pozitia i din registrul S.
O problema importanta care intervine la ariile de procesoare este modalitatea de
stocare a datelor in memoriile local. Astfel incat elementele ce trebuie procesate sa poata fi
extrase din memorie fara a se creea conflicte de acces. Pentru prelucrarea vectorilor atunci
cand dimensiunea vectorului n nu depaseste numarul de elemente de procesare, acestia pot fi
memorati cate un element in fiecare modul de memorie locala, sau in caz contrar, cand n > N,
vectorul poate fi memorat distribuind n elemente ciclic celor N memorii locale.
In cazul prelucrarilor de matrici, calculele uzuale opereaza cu o linie, o coloana sau o
diagonala a matricii, deci modalitatile de stocare trebuie sa permita extragerea in paralel, a
unei intregi linii, coloane sau diagonale intr-un singur ciclu de memorie. Exista scheme de
memorare a matricilor care permit aceste tipuri de accese, denumite scheme de stocare
asimetrice. Se va exemplifica o astfel de schema de stocare pentru cazul in care avem 3
elemente de procesare, fiecare cate 3 locatii de memorie. Modalitatea naturala de a memora
elementele unei matrici 3x3 este prezentata in figura 4.3.

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

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.

CLIP4 – alt calculator SIMD alcatuit dintr-un masiv de 64x64 procesoare, care la
momentul realizarii (1980) a fost cel mai mare calculator SIMD al vremii.

In anul 1983 a fost construit calculatorul MPP (Massively Parallel Processor) care
avea in componenta o matrice de 128x128 de procesoare. Procesoarele au fost interconectate
printr-o retea bidimensionala, fiecare procesor fiind direct conectat cu cei 4 vecini ai sai.
Arhitectura simplificata a acestui calculator este prezentata in figura 4.6.

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.
Un alt exemplu de calculator SIMD, CM1 se aseamana foarte mult cu predecesorii sai
fiind dotat cu procesoare foarte simple, in timp ce ultima varianta CM5 este dotat cu
procesoare complexe iar fiecare procesor dispune de o memorie de capacitate mare.
Elementul de procesare al CM5 este prezentat in figura 4.8. Principalele sale caracteristici
sunt: microprocesorul SPARK, magistrala pe 64 biti, separarea intre magistrala de date si cea
de control, cele 4 unitati vectoriale de lucru in virgula mobila si 32 Mbiti memorie locala.
Modul de lucru al calculatorului CM5 poate varia de la un mod MIMG in care fiecare
procesor executa fiecare program la un mod SPMD (Single Program Multiple Data), in care
fiecare procesor executa acelasi program dar cu date diferite.
Momentele la care au loc sincronizari intre programe pot varia de la sincronizare dupa
fiecare instructiune (mod de operare SIMD pur) pana la absenta totala a sincronizarii. Metoda
de interconectare a procesoarelor este prezentata in figura 4.9, unde fiecare nod al arborelui
reprezinta de fapt 4 elemente de procesare legate direct intre ele.
AP – CURS 5

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.

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.
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 If este o bijectie de la S la S, If : S-> S, X ->If(X), unde X este un element din
S. adresele celor N componente le vom exprima in sistemul binar bm-1 bm-2 ....... b1 b0.

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

- Reteaua cube este definita prin m functii de interconectare unde m = log2(N). O retea
cube 3D este prezentata in figura 4.13. Se observa ca liniile verticale unesc elemente a caror
adresa reprezentata binar difera prin bitul cel mai semnificativ, iar elementele de pe liniile
orizontale difera prin bitul cel mai putin semnificativ. Acest model poate fi extins la spatiul cu
m dimensiuni rezultand un hypercub m dimensional. Formal functiile de interconectare au
forma:
o Ci(bm-1 bm-2 ....bi... b1 b0) = bm-1 bm-2 ... !bi .... b1b0 0<= i <= m.

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
- 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
o PM2i+i (X) = X+2i % N
o PM2i-i (X) = X- 2i % N, 0<= i < m
In figura 4.16 sunt prezentate conexiunile PM2i+i pentru o retea cu N=8.

Al doilea tip de retele dinamice, retelele multinivel sunt formate prin interconectarea
cu ajutorul unor elemente de interschimbare a mai multor niveluri de retele simple. Fiecare
element de interschimbare are doua intrari, doua iesiri si poate realiza una dintre cele 4 functii
de interschimbare din figura 4.17 : inainte, interschimb, distribuie sus si distribuie jos.
In momentul in care s-a stabilit o conexiune intre o intrare si o iesire si nu se mai poate
stabili o alta conexiune in acelasi timp intre alte doua procesoare se spune ca avem retea
multi-nivel cu blocare. Daca exista posibilitatea de a avea o conexiune fara a bloca realizarea
altor conexiuni reteaua se numeste fara blocare.
In functie de tipul nivelurilor de baza din care este alcatuita o retea multi-nivel, putem
avea doua mari clase de astfel de retele: retele cu generalizare, bazate pe functiile de
interconectare cube si shuffle-exchange si retele cunoscute sub numele de data-manipulator
bazate pe functiile de interconectare PM2i.
Reteaua cube generalizata pentru N=8 este prezentata in figura 4.18. Se observa ca o
astfel de retea este alcatuita din 3 nivele interconectate intre ele prin 4 elemente de
interschimbare. In cazul general vom avea m=log2N niveluri si N/2 elemente de
interschimbare la fiecare nivel. Intrarile si iesirile trebuie astfel etichetate incat la fiecare nivel
i ele sa poate fi obtinute prin aplicarea functiei cube Ci cu i de la 0 la m, de catre fiecare
element de interconectare.

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.

Caracteristicile de baza ale unei retele de interconectare sunt diametrul retelei (nr de
puncte intermediare prin care trebuie sa treca datele intre cele mai indepartate noduri ale
retelei) si capacitatea unei retele de a emula o alta retea. In tabelul 4.1 sunt prezentate
diametrele pentru cateva tipuri de retele.

Capacitatea unei retele de a simula alta retea poate fi ceruta uneori de o aplicatie care
necesita o alta conectivitate decat cea disponibila la nivel hardware. In tabelul 4.2 sunt
prezentate capacitatile celor 4 tipuri de retele prezentate anterior de a simula un alt tip de retea
prin numarul minim si numarul maxim de aplicari ale functiei de interconectare necesare
pentru a obtine interconectarea dorita.
Datele de pe o linie a tabelului reprezinta numarul de executii ale functie de
interconectare cerute de reteaua respectiva pentru a simula reteaua care este reprezentata pe
coloanele tabelului.
4.3 Procesoare asociative

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 flip-flop 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 Wi
= (Bi1 Bi2 Bi3........ Bin), iar bit slice Bj = (B1j B2j B3j........ Bnj).

Fiecare celula Bij poate fi scrisa sau comparata cu un model de data externa. Registrul
de comparare C este folosit pentru a retine operandul care trebuie cautat in memoria
asociativa, iar registrul de mascare M este utilizat la activarea sau dezactivarea unor bit slice-
uri care participa la cautarea paralela. Registrul indicator I si unul sau mai multe registre
temporare T sunt folosite pentru a retine pattern-ul gasit la cautare in momentul actual sau
anterior.
La cautare se incarca intai registrul C cu cheia de cautare , se selecteaza apoi doar
acele bit-slice—uri ce vor participa la cautare si care sunt indicate de registrul M si apoi se
trimit semnalele corespunzatoare de interogare a memorie. In momentul gasirii unei potriviri
pentru a retine pozitiile respective se folosesc registrele I si T. Exista doua posibilitati de a
efectua interogarea:
- Paralel pe biti – procesul de cautare se efectueaza intr-o modalitate paralela de
cuvinte si biti. Toate bit-slice-urile care nu sunt dezactivate de registrul de masca vor fi
implicate in procesul de cautare paralel.
- Serial pe biti – se proceseaza la cautare folosind cate un bit-slice la un moment dat
parcurgand serial toate bit-slice-urile nemascate.
O arhitectura tipica a unui calculator bazat pe memoria asociativa este prezentat in
figura 4.21. Dupa cum se observa elementele de baza sunt: memoria asociativa, sistemul de
I/O, o memorie pentru stocarea programului si o unitate de control.

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 simple care pot efectua cateva operatii aritmetice de baza, exista si arii
sistolice compuse din arii de procesare mai puternice programabile.
In figura 4-22 este reprezentata o arie sistolica simpla. Puterea de calcul sporita vine
din faptul ca datele aduse din memorie vor fi supuse cat mai multor prelucrari de catre E.P.,
inainte de a parasi aria sistolica.

In practica se intalnesc destul de des probleme provenite mai ales din algebra liniara
care pot fi mapate intr-o astfel de arie sistolica. Printre avantajele utilizarii ariilor sistolice se
numara faptul ca simplitatea elementelor de procesare (E.P.) si a modelului de interconectare
a acestuia duce la implementari hardware foarte eficiente. Alt avantaj il constituie modalitatea
de calcul utilizata in ariile sistolice unde : operatiile de i/0 efectuate la frontiera ariei se
suprapun cu operatiile de calcul propriu-zise.
Principala caracteristica care deosebeste ariile sistolice de alte arhitecturi cum ar fi
ariile cu front de unda, este modalitatea sincron cu care circula datele. Toate elementele de
procesare sunt sincronizate prin intermediul unui semnal de ceas unic iar la fiecare tact al
ceasului elementele de procesare transmit rezultatele vecinilor sai. Aceasta modalitate
sincrona de a efectua transportul datelor prin aria sistolica este de fapt si un dezavantaj pentru
ca la dimensiuni foarte mari ale ariei intervin probleme legate de asimteria propagarii
semnalului de ceas (va exista un defazaj intre semnalul de ceas primit de diferite elemente de
procesare din cauza distantei dintre ele).

Alte elemente care caracterizeaza o arie sistolica sunt :

executate pe un singur bit pana la procesoare multibit;


- 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 ;
– 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.
AP - CURS 6

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.

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

1
Daca tinem seama de locul de unde operanzii vectori sunt adusi pentru prelucrare vom
putea distinge doua tipuri de calculatoare vectoriale: calculatoare de tip memorie la memorie
(componentele vectorilor implicati intr-o instructiune vectoriala sunt aduse din memorie, iar
rezultatul este stocat tot in memorie) si calculatoare registru la registru ( acestea au registre
vectoriale care sunt capabile sa memoreze operanzii vectori necesari unei instructiuni).

In figura 4.25 sunt prezentate componentele ce intra in arhitectura tipica unui


calculator vectorial.

Asa cum se observa din figura orice calculator vectorial are in componenta o unitate
de procesare a instructiunilor, un controller pentru instructiuni vectoriale, registre scalare si
unitati functionale pentru operatii scalare, care alcatuiesc procesorul scalar al calculatorului,
registre vectoriale si unitati functionale dedicate instructiunilor vectoriale ce alcatuiesc
calculatorul vectorial.
Prioritatea de procesare a instructiunilor, are rolul de a extrage instructiunile din
memorie si de a indentifica daca este de tip scalar sau vectorial. Daca este o instructiune
scalara este trimisa catre procesorul scalar, daca insa este o instructiune vectoriala,
supervizarea executiei acesteia va fi plasata controllerului care va decodifica instructiunea si
comanda controllerul de acces sa extraga operanzii din memorie. Totodata controllerul de
operatii are si o sarcina f importanta: de a partitiona un task vectorial, un set de instructiuni
vectoriale coordonate conform unei relatii de precedenta, si a planifica subtask-urile pentru
executie la diferite unitati functionale organizata in banda de asamblare cu un timp de
executie minim.

2
Capitolul 5. Arhitecturi pentru paralelismul la nivel de proces.

5.1 Introducere

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

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

3
avea dimensiuni foarte variate, pe cand in cazul memoriei partajate sistemul de comunicatie
va trebui sa faca fata unui numar foarte mare de acces concurent la memorie.

Fiecare din cele doua tipuri de calculatoare MIMD, prezinta caracteristici proprii,
avantaje si dezavantaje. Sistemele bazate pe memorie distribuita sunt sisteme cu un grad mare
de scalabilitate, adica pot fi extinse suportand un numar foarte mare de procesoare. Acest
lucru este posibil datorita faptului ca fiecare procesor are o memorie proprie, iar accesele la
memorie vor fi in general la aceasta memorie locala. Astfel se evita problema concurentei
aparute la sistemele cu memorie partajata. Modelul de programare in cazul memoriei
distribuite este bazat pe tehnica de schimb de mesaje (message passing) care este mult mai
usor de utilizat decat tehnicile prin semafoare sau monitoare, asa cum se intampla in cazul
calculatoarelor cu memorie partajata.
Exista insa si dezavantaje in sistemele cu memorie distribuita. Acestea tin de
incarcarea echilibrata a procesoarelor care nu se poate obtine decat cu mare grija din partea
programatorilor. Alte probleme ce pot aparea sunt legate de schimbul de mesaje care practic
inseamna transferul unor mari cantitati de date prin reteaua de interconectare. De mare
importanta este performanta retelei, ce se afla in stransa legatura cu metoda de routare
folosita.

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.

4
Pentru a rezolva partial problema concurentei la memorie, se poate folosi o memorie
cache locala pentru fiecare procesor (fig. 5.2). Cand are loc o cerere de acces la memorie se
va verifica mai intai daca datele respective se gasesc in memoria cache, iar daca acestea se
gasesc aici se va utilize copia din memoria cache. In acest mod nu mai este nevoie sa se
acceseze memoria principala. Poate aparea insa, o problema, coerenta memoriei cache; daca o
informatie se gaseste in mai multe memorii cache, atunci la modificare unei copii intr-o
memorii cache trebuie informoate si celelalte module de memorie cache pentru a-si
invalida/actualiza propria lor copie. Pentru a mentine coerenta memoriei cache, exista in
prezent atat solutii software cat si hardware, dar aceasta problema suplimentara contribuie la
limitarea performantelor calculatoarelor cu memorie partajata.
O solutie arhitecturala care contine cele doua variante perzentate pana acum o
reperezinta sistemele cu memorie partajata din punct de vedere logic, dar distribuita din punct
de vedere fizic (DSM-Distributed Shared Memory). Modulele de memorie ale unui astfel de
sistem sunt locale fiecarui procesor, dar ele alcatuiesc un spatiu de adersa unic, comportandu-
se ca o memorie partajata global. Utilizarea sau nu a unei memorii cache pentru a spori
performantele unui astfel de sistem duce la o clasificare de genul urmator:

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


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

5
Masinile NUMA sunt foarte asemanatoare cu sistemele cu memorie distribuita clasice:
Fiecare procesor are o memorie locala, dar toate modulele din memorie alcatuiesc un
spatiu unic de adresa; drep consecinta, atunci cand un procesor va accesa o variabila ce se afla
chiar in memoria locala, accesul va fi foarte rapid, dar atunci cand variabila respectiva se afla
intr-un alt modul de memorie aflat la distanta, accesul va fi foarte lent datorita faptului ca
datele trebuie sa fie transmise prin reteau de interconectare. Pentru a preveni situatiile in care
se fac accese repetate la date aflate in memorie la distanta, trebuie acordata o atentie deosebita
distribuirii datelor si organizarii algoritmilor astfel incat majoritatea acceselor sa aibe loc la
nivel local.
La sistemele COMA, memoriile locale se comporta ca o memorie cache. In acest caz
datele nu vor fi legate static de o memorie fizica cum se intampla la calculatoarele NUMA, ci
vor migra si vor fi copiate in acea memorie locala unde vor fi mai des folosite. Prin utilizarea
memoriilor locale ca o memorie cache, probabilitatea ca un procesor sa acceseze majoritatea
timpului date numai din memoria locala creste simtitor. Atunci cand un procesor va accesa o
data ce nu se afla in memoria locala, controller-ul de memorie va determina unde se afla
blocul dorit(in ce memorie) si va initia o operatie de aducere a acelui bloc in memoria locala.
Acesta este chiar principiul de operare a unei memorii cache de unde vine si numele acestei
arhitecturi.
Faptul ca nu exista o memorie globala ca in cazul celorlalte calculatoare, induce
probleme suplimentare. Una din probleme este aceea ca lipsind memoria globala, memoria
cache(locala) nu poate opera ca o memorie cache ordinara. Sa ne imaginam situatia uni
procesor P1 care executa o cerere de acces la un bloc de date care nu se afla in memori locala
M1. Controller-ul de memorie va determina locatia acelui bloc de memorie(in care memorie
locala se afla blocul) si-l va aduce memoria procesorului P1. Daca la sosirea acestui bloc
numai este loc liber in memoria locala M1, atunci un alt bloc trebuie evacuat. In cazul cand
exista o memorie globala blocul era copiat pur si simplu in memoria globala. In cazul
calculatoarelor COMA, cum aceasta memorie globala nu exista trebuie gasit un alt nod
procesor-memorie dispus sa accespte blocul de date, chiar daca acest nod procesor accesa
blocul de date primit. Acest nu numai ca va complica controller-ul de memorie, dar va avea si
un impact negativ asupra performantelor calculatorului.
Deoarece calculatoarele COMA nu au o locatie fixa pentru blocurile de memorie,
protocolul de mentinere a coerentei de memorie trebuie sa gaseasca spatiu de memorie locala
a altui nod ori de cate ori un bloc trebuie evacuat din memorie. Odata cu cresterea numarului
de procesoare, problema mutarii de blocuri de memorie si a gasirii de spatiu liber devine tot
mai complicata. Deoarece evacuarea unui bloc se bazeaza pe gasirea unui spatiu liber in alt
nod care putea memora blocul, trebuie luate precautii speciale pentru evitarea situatiei de
deadlock (interblocare).
O alta problema care poate aparea la calculatoarele COMA este legata de utilizarea
paginarii memoriei. Atunci cand sistemul de operare al calculatorului aduce o pagina in
memorie, aceasta este divizata in blocuri, iar blocurile sunt memorate in memoriile locale.
Dupa un anumit timp s-ar putea ca blocurile ce au apartinut unei singure pagini sa se gaseasca
in diferite memorii locale. De aceea atunci cand OS-ul va evacua pagina in memoria
secundara, toate blocurile care compun pagina trebuie „culese” din diferitele memorii locale
unde se afla in momentul evacuarii.

6
AP – CURS 7
Calculatoarele CC-NUMA contin cele doua variante NUMA si COMA dispunand atat
de o memorie locala propriu-zisa cat si de o memorie cache. Prezenta acestei memorii cache
va reduce foarte mult din traficul prin reteua de interconectare, ducand in acelasi timp la o
incarcare cat mai egala. Procesorul acceseaza memoria locala mult mai rapid decat acceseaza
memoria locala alt procesor deoarece o astfel de cerere nu trebuie sa strabata reteaua de
interconectare. Calculatoarele CC-NUMA aduc o imbunatatire fata de calculatoarele NUMA.
Fiecare nod va avea si o memorie cache locala. Astfel, daca un bloc de memorie nu este stocat
local, acest bloc poate fi accesat si adus in memoria locala si stocat in memoria cache locala.
La o cerere ulterioara de acces la acelasi bloc, el nu mai trebuie adus prin reteua de
interconectare (operatie mare consumatoare de timp) si va fi accesata copia aflata in memoria
cache locala. Problemele care apar aici sunt de mentinere a coerentei memoriei cache,
mecanism care contribuie la cresterea traficului prin reteua de interconectare. Folosirea unor
tehnici speciale de alocare a datelor in memoriile locale astfel incat majoritatea acceselor sa
fie locale duce la cresterea performantelor acestor calculatoare, dar in acelasi timp va impune
programatorului sa cunoasca detalii despre arhitectura completa pe care ruleaza programul si
va duce la scaderea portabilitatii programelor.

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

Spre deosebire de operatia de comutare dintre doua procese, operatia care chiar daca
este suportata in hardwere este mare consumatoare de timp, comutarea intre doua fire trebuie
sa fie foarte rapida. Calculatoarele care realizeaza acest lucru sunt denumite de obicei
calculatoare multithread.
O astfel de arhitectira multithread a fost realizata inca de la sfarsitul anilor 80.
Calculatorul NEP suporta o intretesere fina a firelor de executie. Procesorul acestuia este
realizat in tehnica pipeline cu opt nivele, iar in fiecare tact de ceas in banda de ansamblare
intra o instructiune a unui nou fir. Arhitectura elementului de procesare a calculatorului NEP
este prezentata in fig. 5.4.

1
O componenta de baza a elementului de procesare (EP) o reprezinta structura de date
PSW (process status word) care contine o lista a tuturor firelor de executie. Un fir de executie
este scos din capul listei, instructiunea curenta corespunzatoare acestui fir este adusa din
memorie si in final instructiunea este executata pe una dintre unitatile functionale. Firul de
executie este apoi introdus la sfarsitul listei PSW cu pointer-ul instructiune implementat. Se
optine in acest fel o intretesere a firelor de executie la nivel de instructiune. Procesorul avand
opt nivele in banda de ansamblare, lungimea minima a conzii PSW este de opt fire pentru a
putea introduce cate o instructiune in banda la fiecare tact de ceas.
Calculatorul NEP era dotat cu 16 EP (element de procesare) care putea accesa o
memorie formata din maxim 128 module de memorie partajata. Interconectarea intre
procesoare, memorie si sistemul I/O se realizeaza printr-o retea cu comutare de pachete.
Pentru a rezolva problema acceselor concurente la memorie fiecare cuvand avea un bit
indicator (full/empty). Un acces la un cuvant cu bit-ul in starea empty duce la suspendarea
firului corespunzator instructiunii care a generat cererea de acces la memorie. Acest fir este
introdus intr-o lista mentinuta de unitatea de planificare SFU (scheduler functional unit). Aici
cererea de acces la memorie va fi reiterata pana cand poate fi satisfacuta. In acest moment
firul de executie poate fi introdus inapoi in lista PSW.
Sincronizarea se mai poate realiza si prin intermediul registrelor. Fiecare registru de
comunicare are un indicator (full / empty/ reseaved). Daca tentativa de comunicare nu a reusit
in banda de ansamblare se inroduce o instructiune noua, iar firul este apoi introdus in lista
PSW fara a incrementa pointer-ul de instructiuni. Aceasta maniera de sincronizare (busi-
wainting) impreuna cu faptul ca un element de procesare nu accepta decat maxim 64 de fire a
reprezentat punctul slab al calculatorului. Cu toate acestea NEP a fost o realizare deosebita
avand in vedere anul in care a fost creat.

2
5.2. Calculatoare cu memorie distribuita.
5.2.1. Arhitectura calculatoarelor cu memorie distribuita.

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

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.

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.

3
Pe langa problema alegerii unui tip de retea de interconectare o decizie importanta in
proiectarea unui calculator paralel o constituie stabilirea tipului de procesor care va fi utilizat.
Granularitatea este un alt aspect cheie care trebuie mentionat atunci cand se caracterizeaza un
astfel de calculator. Daca majoritatea calculatoarelor cu memorie distribuita atmit o
granularitate grosiera, exista si calculatoare ce admit o granularitate medie sau chiar fina.

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 toate procesoarele implicate 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, 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
4
rara in practica; costul ridicat provine din faptul ca fiecare procesor trebuie sa aiba canale de
comunicatie separate cu toate celelalte procesoare;
-retea in forma de stea(fig.5.6.b)- toate procesoarele sunt conectate cu un procesor
central, iar atunci cand are loc o comunicare intre 2 procesoare, mesajele sunt route-ate prin
acest nod central; faptul ca toate mesajele trebuie sa treaca prin procesorul central constituie o
limitare serioasa a performantelor acestei retele, deoarece peste un anumit trafic procesorul
central poate sa nu faca fata cererilor de schimb de mesaje;
-retea liniara(fig.5.6.c)- este o retea foarte simpla in care fiecare procesor este direct
conectat cu cei doi vecini ai sai; comunicarea intre doua procesoare care nu sunt direct
conectate are loc prin transmiterea mesajului prin toate nodurile intremediare dintre sursa si
destinatie;
-retea mesh(retea de tip grila de tip bidimensionala fig.5.6.e)- fiecare procesor va avea
conextiuni cu patru vecini; exista posibiliatatea ca procesoalrele de pe marginea grilei sa fie
interconectate intre ele, obtinandu-se o retea For(!) (fig.5.6.f); aceasta topologie poate fi
extinsa si pentru cazul tridimensional(fig. 5.6.g).
-retea arbore(fig. 5.6.h)- intr-o astfel de retea exista o singura cale de comunicare intre
oricare doua procesoare; nodurile arborelui pot fi intorodeauna procesoare sau in alta varianta
cele de pe niveluri inferioare sunt comutatoare, numai frunzele arborelui fiind procesoare;
retelele arbore au dezavantajul major ca atunci cand, spre exemplu, precesoarea din
subarborele drept dores sa comunice cu cele din subarborele stang, toate measjele vor trebui
sa treaca prin nodul radacina, care s-ar putea sa nu faca fata avalansei de mesaje; o varianta de
retea arbore care remediaza aces neajuns este retea ’FAT-tree’, in care cand avansam spre
nodul radacina, la fiecare nivel numarul de legaturi este dublat(fig. 5.6.i);
-retea hipercub(fig. 5.6.j)- aceasta este o retea multidimensionala; in figura se pot
observa retele hiprecub unidimensionale, bidimensionale, tri si patru-dimensionale; in retelele
hipercub fiecare procesor este legat cu un alt procesor numai daca adresele difera numai pe o
singura pozitie binara; intr-o retea 2D fiecare procesor va avea conexiuni cu doi vecini; intr-o
retea 3D cu trei vecini, intr-o retea p-dimensionala fiecare procesor va fi conectat direct cu p
vecini.

5
6
Pentru a evalua performantele acestor retele de interconectare se folosesc o serie de
indicatori dintre care cei mai importanti sunt:
- Diametrul retelei – se defineste ca fiind maximul distantei minime dintre oricare 2
procesoare (distanta fiind masurata in numarul de noduri intermediare dintre cele 2
procesoare);
- Costul retelei – se defineste ca fiind numarul de lagaturi din retea;
- Conectivitatea – est eo masura a numarului de cazuri posibile dintre oricare 2
procesoare; in general sunt de preferat retele cu o conectivitate mare pentru a putea
face fata unui trafic intens; conectivitatea se poate masura prin numarul de legaturi
care trebuie inlaturate pentru a imparti reteaua in doua subretele disjuncte;
- Latimea de bisectie este definita ca numarul minim de conexiuni care , daca sunt
indepartate se vor obtine 2 subpartitii egale ale retelei initiale.

7
AP – CURS 8
Metoda de comutare utilizata are un impact mare asupra duratei transmisiei unui mesaj
intre un procesor sursa si unul destinatie.
Primele tipuri de calculatoare foloseau metoda comutarii de pachete. Aceasta metoda
preluata de la retelele de calculatoare, presupune impartirea unui mesaj in mai multe pachete
de date, care vor fi apoi transmise independent unul de altul prin retea. In general pachetul
este alcatuit dintr-un antet cu informatii necesare rularii sale prin retea si datele propriu-zise.
Acesta va trece prin mai multe noduri intermediare in drum spre destinatie. Fiecare nod
intermediar are un buffer de memorie unde este trecut intregul pachet. Tinand seama de
principiul „memoreaza si inainteaza”, utilizat la comutarea de pachete, putem deduce timpul
necesar unui pachet pentru a ajunge de la sursa la destinatie:
t=L/B*d
unde :
L-lungimea pachetului;
B-largimea de banda a canalului de comunicatie;
d-u=distanta exprimata in numar de noduri intermediare dintre sursa si
destinatie.
Datorita faptului ca t-direct proportional cu d, diametrul retelei este un factor esential
pentru retelele care folosesc comutarea de pachete.

Alta tehnica des utilizata este comutarea de circuite, care se aseamana cu sistemul
telefonic. Pentru transmiterea unui mesaj prin comutare de circuite sunt necesare trei faze:
- Stabilirea legaturii;
- Transmisia propriu-zisa;
- Faza de eliberare a legaturii.
In prima faza este transmis un scurt pachet pentru realizarea legaturii. Faza 2 - în care
sunt transmise datele propriu-zise, etapă în care canalele de comunicație ce leagă sursa de
destinație sunt utitlizate exclusiv pentru operația curentă de comunicație. Nici un alt procesor
nu poate să mai utilizeze aceste canale până la terminarea operației curente.
Primul avantaj al comunicației de circuite este acela că dispar buffer-ele intermediare
necesare stocării datelor în nodurile intermediare. Mecanismele de rutare fiind implementate
la nivel hardware, timpul de comutare se va reduce și în același timp resursele software
alocate comutației sunt mult diminuate. Alt avantaj este că timpul necesar unui mesaj să
ajungă la destinație, timp exprimat prin:
t= ( L1 / B ) * d + Lm / B
devine dependent de distanța dintre procesoare atunci când L1<< Lm , unde L1 – lungimea
pachetului inițial necesar realizării legăturii, Lm – lungimea mesajului propriu-zis, B-
lungimea de bandă a rețelei.
Independența dintre sursă și destinație a făcut ca la calculatoarele care utilizează
comutarea de circuite problema diametrului rețelei să nu mai fie așa acută. Acesta este si
motivul pentru care retelele de tip hipercub sun din ce in ce mai rar folosite.
O metodă ce combină caracteristici atât ale comutării de circuite, cât și ale comutării
de pachete este metoda diviziunii mesajelor. Mesajele sunt împărțite în mici pachete numite
flit (flow control digits) care sunt trimise către destinație unul după altul într-o manieră
asemănătoare unei benzi de asamblare. Fiecare nod intermediar dispune de un buffer ce poate
stoca aceste flit-uri. Flit-ul va fi reținut în buffer atunci când linia de ieșire este ocupată.
Dimensiuena buffer-ului poate varia ducând la comportări diferite ale tehnicii de rutare prin
diviziunea mesajelor: dacă acestea sunt suficient de mari ele pot memora întregul mesaj,
situație echivalentă cu tehnica comutării de pachete, iar dacă buffer-ele sunt mai mici, mesajul
va fi memorat în mai multe noduri adiacente pe calea dintre sursă și destinație.
Timpul necesar unui mesaj ca să ajungă de la sursă la destinație se poate exprima prin:
t= ( Lh / B ) * d + Lm / B
unde Lh – lungimea primului flit
Lm – lungimea mesajului propriu-zis
Dacă Lh <<Lm se obține independența timpului pe distanța dintre noduri.
În fig 5.7 poate fi urmărită o comparație între comutarea între pachete și cea pe
diviziunea mesajelor.

Se observă că în cazul comutării de tip memorează și înaintează nodurile intermediare


stochează întregul pachet înainte de a-l trimite mai departe. În al doilea caz pachetul este
împărțit în 2 părți și transmisia lui are loc într-o manieră asemănătoare cu o banda de
asamblare, reducându-se astfel timpul de comunicație.
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 situatie de dead-lock apare atunci cand un set de mesaje se blocheaza reciproc,


astepand fiecare eliberarea unui buffer detinut de alt mesaj. Exista mai multe metode de
editare a acestor probleme:
preventia unui mesaj prin re-rutarea acestuia sau prin anularea lui;

virtuale pot face posibil ca mesajele independente sa utilizeze aceeasi legatura fizica. Modul
practic de realizare a acestora este destul de simplu. Fiecare nod nu va detine un singur buffer
pentru memorarea unui flit, ci va avea mai multe astfel de buffere impreuna cu un
multiplexor. Fiecare buffer poate fi ocupat de un pachet si va reprezenta de fapt un canal
vertical. Multiplexorul are rolul de a testa care dintre buffer-ele nodului pereche este liber
pentru a accepta un nou mesaj si apoi va alege in conformitate care dintre mesajele memorate
in propriile buffere va fi transmis mai departe.
Situatia de live – lock apare atunci cand mesajele se propaga la infinit fara a ajunge la
destinatie. In retelele care folosesc comutarea de pachete pot aparea mai usor situatii de live –
lock in timp ce utilizarea comutarii de circuite sau tehnicii ware – work duce la posibilitatea
de disparitie a unui live – lock.
Algoritmii de rutare au un rol important in retelele de rutare ale calculatoarelor cu
memorie distribuita. Algoritmii de rutare stabilesc calea care va fi urmata de un mesaj de la
sursa catre nodul destinatie si pot fi implementati atat la nivel hardware cat si software. Pot fi
clasificati astfel :

-minimali

Algoritmii minimali aleg intotdeauna calea cea mai scurta intre sursa si destinatie. La
fiecare pas mesajul se apropie de destinatie, dar nu se tine seama de faptul ca pot aparea
supraincarcari a unor secvente de retea.
Algoritmii non-minimali iau in considerare aspecte precum evitarea congestionarii
retelei atunci cand stabilesc calea pe care va trebui sa o urmeze un mesaj.

O alta clasificare a algoritmilor de rutare poate fi obtinuta daca este luat in considerare
modul cum acestia utilizeaza informatiile privind starea retelei. Putem avea astfel:

nodurilor sursa si destinatie, neluand in considerare si starea diferitelor segmente de retea.


In categoria alg. deterministi intra in principal 3 subclase de algoritmi:

mi ce folosesc tabele de rutare.

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

-NUMA (Cache Coerent Non Uniform Memory Access)


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

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.

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 dintr-un/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.
Cei mai utilizati algoritmi de arbitrare a magistralei sunt:
-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.
- impare timpul in cuante egale si ofera secvential, intr-o maniera
circulara aceste cuante fiecarui dispozitiv conectat la magistrala.
– cel mai putin utilzat – acorda prioritatea cea mai
mare dispozitivului care nu a mai accesat magistrala pentru intrevalul de timp cel mai lung.
– 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.
– 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.
AP – CURS 9
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.

Acordarea unei sanse egale de acces la magistrala tuturor procesoarelor reprezinta un


aspect cheie al proiectarii arbitrului de magistrala. Aceasta sansade a obtine acces la
magistrala se poate masura prin timpul de asteptare al unui procesor la momentul cand a cerut
acces si pana cand acest acces a fost acordat.
Din punct de vedere cantitativ aceasta caracteristica poate fi exprimata prin factorul de
echilibrare a magistralei. Factorul de echilibrare L=δ/W ;
W = (1/N) ∑
(1/N) * ∑ -
unde Wi = timpul mediu de asteptare a procesorului i.
Alt parametru important in caracterizarea magistralei este varidalitatea serviciului
V = s / w , unde w = media, s = abaterea standard a timpilor de asteptare indiferent de
componenta care l-a generat.
Ca o masura a performantelor unor magistrale se mai poate calcula si timpul maxim de
astepare m(i) = situatia cea mai nefavorabila.
Utilizarea magistralei este un alt parametru folosit la caracterizarea magistralei.
Aceasta masoara cat de mult este utilizata largimea de banda a magistrali si se defineste: nr de
transferuri realizate raportat la tipul de servicii al magistralei: U = r / (W+r +pm), unde
r=timpul de serviciu a magistralei (timpul cerut pentru operatii pe magistrala), w=media
timpilor de asteptare a tuturor procesoarelor, pm=media intervalului dintre 2 cereri succesive
de acces a magistralei.
Pentru toate cele N procesoare, utilizarea magistralei se calculeaza sumand dupa i de
la 1 la N expresia de mai sus si obtinandu-se: U = (r*N) / (W+r+pm).
Prin calcularea acestor parametrii cu ajutorul unor programe de simulare se pot deduce
cateva concluzii interesante.

Folosirea alg. Daisy-Chaining ,care e bazat pe proprietăți statice duce la timpi foarte
mari de așteptare pentru procesoarele cu o prioritate scăzută.De asemenea,nici factorul de
echilibrare nu are valori satisfăcătoare pentru un număr mare de procesoare conectate la
magistrală.Acesta crește foarte rapid odată cu creșterea nr. de procesoare.Timpul maxim de
așteptare crește și el rapid odată cu scăderea priorității.
Utilizarea acestui alg. furnizează rezultate bune când magistrala nu e foarte încărcată,
adică în cazul unui număr mic de procesoare.
Alg.Round-Robin duce la o încărcare echilibrată a magistralei deoarece toate
procesoarele vor primi acces la un anumit interval de timp. Experimental se observă că L
rămâne foarte mic indiferent de nr. de procesoare N. Timpul mediu de așteptare nu variază
semnificativ cu N.
Alg. Round-Robin duce la timpi medii de așteptare mai mari decât în cazul Daisy-
Chaining rezultând un factor de utilizare al magistralei mai mic.
Alg. Rotating , Daisy-Chaining și RLU duc la obținerea unei încărcări bune a
magistralei în condițiile unor timpi de așteptare mai reduși,decât în cazurile precedente.Acești
2 alg. duc la rezultate mai bune decât Round-Robin sau Daisy-Chaining, deci vor fi de
preferat în practică.
Alg.FCFS(first come first set)e un alg.simetric și deci va duce la o încărcare
echilibrată a magistralei.Dacă luăm în considerare toate elementele care caracterizează
performanța magistralei,putem trage concluzia că acest alg. e foarte bun,dar în schimb apar
dificultăți foarte mari la implementarea hardware a acestuia,deoarece arbitrul de magistrală
trebuie să mențină o listă cu toate cererile primite .Această listă înseamnă de fapt : spațiu de
memorie și procedure pt. gestionarea ei.
Un alt factor care contribuie la obținerea unor performanțe bune e modul de lucru al
magistralei. Primele magistrale pt calculatoare paralele funcționau pe baza unui principiu
denumit magistrală cu blocare. O operație de acces la memorie implicat de obicei 2 faze :
transformarea adresei și a datelor și respectiv operația propriu-zisă de citire sau scriere
executată de controlerul de memorie. La magistralele cu blocare,cele 2 faze se execută
secvențial.Magistrala e deci blocată până când operația de scriere/citire e terminată.
A 2-a generație de magistrale denumite pended-bus,permit suprapunerea celor 2
faze,astfel după încheierea fazei de transfer al adresei sau a datelor pe magistrală,alt procesor
poate starta imediat o nouă operație de citire/scriere în timp ce prima cerere e tratată de către
controlerul de memorie.Pentru a implementa o astfel de strategie,de utilizare a
magistralei,controlerul de memorie va trebui să fie dotat cu un buffer în care să memoreze
cererile transmise.
A 3-a generație de magistrale : merg mai departe cu optimizarea op.de citire.Se
observă că op.de citire necesită mai întâi transferarea adresei locației de memorie,utilizând
magistrala de adrese,apoi citirea propriu-zisă executată de controlerul de memorie și în final
transferarea datelor citite utilizând magistrala de date. Prima si a 3-a op. se pot executa
simultan pentru cereri care diferite, deoarece ele folosesc fie magistrală de date,fie cea de
adrese. Magistralele cele mai moderne permit separarea acestor 3 faze și execuția lor în mod
suprapus,astefel încât se permite unui procesor să execute o nouă cerere de citire înainte ca
cererea precedentă să se fi încheiat.Aceste magistrale au primit numele de split-transaction-
bus(magistrale ce tranzacții divizate).
Pe lângă cererile de acces concurent,un alt dezavantaj major al sistemelor bazate pe o
singură magistrală de comunicații e faptul că o defecțiune apărută la magistrală duce căderea
întregului sistem.
O modalitate de îmbunătățire a performanței sistemelor bazate pe o magistrală e
folosirea mai multor magistrale de comunicații. În acest caz fiecare dispozitiv va fi conectat la
toate aceste magistrale ca in fig. 5.11.

Folosirea mai multor magistrale de comunicații ridică probleme hardware


speciale,cum ar fii : problema arbitrului de magistrală,care în acest caz e mult mai complicat.
Mai întâi un arbitru 1-din N va rezolva confictele în care mai multe procesoare accesează
același modul de memorie. În etapa a 2-a n procesoare capătă 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 rețele Crossbar

Crescând nr. de magistrale din ex. precedent se poate ajunge la situația în care există o
cale de acces separată pentru fiecare modul(fig. 5.12). În această situație sistemul de
comunicații devine o rețea de tip crossbar.

Printre avantajele unor astfel de rețele se numără simplitatea inferfețelor dintre


unitățile funcționale și switch-uri (comutatoare), precum și faptul că se pot efectua transferuri
simultane pentru toate modulurile de memorie.Pentru a putea obține aceste avantaje se impun
câteva cerințe componentelor hardware dintr-un comutator. Fiecare comutator trebuie să fie
capabil să rezolve problema accesului concurent la același modul de memorie. Aceste
conflicte sunt rezolvate de o componentă de arbitrare a accesului,care lucrează cu priorități
acordate fiecărui procesor.
Rețelele crossbar cu tot avantajul oferit de lărgimea de bandă dedicată,devin foarte
scumpe pe măsură ce nr. componentelor conectate crește,deoarece nr. de comutatoare din
rețele crește cu puterea a 2-a a nr.de procesoare (sau cu produsul dintre nr. de procesoare și
cel de module de memorie).

Sisteme cu rețele multinivel

Rețelele multinivel au mai fost prezentate în cazul calc. SIMD.


Practic,aceleași principii sunt folosite și la calc. MIMD cu memorie partajată. Elem. de
bază al unei rețele multinivel e comutatorul 2 x 2 (fig. 5.13).
Elementul de comutare poate conecta intrarea A la ieșirea O la o anumită valoare a
semnalului pe linia de control și la ieșirea 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ă intrările A și B trebuie legate la aceeași ieșire,atunci
comutatorul trebuie să ia o decizie în sensul acceptării unor cereri și respingerii celeilalte.

O facilitate suplimentară poate fi existența unor buffere atașate intrărilor pentru a


crește performanțele rețelei de comutare.

În plus față de rețelele multinivel prezentate anterior la calculatoarele SIMD se va


prezenta rețeaua omega. Aceasta e construită pe baza funcției de interconectare perfect –
shuffle (amestecare perfectă). Modul în care funcţia perfect- shuffle conectează 2 procesoare :
-dacă N = 2n e nr. total de procesoare, atunci adresa fiecărui procesor se poate exprima prin n
biți. Procesorul cu adresa s e legat cu procesorul a cărui adresă, se obține prin op. de rotire la
stânga cu o poziție a reprezentării 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.

Rețeaua omega e o rețea multinivel, în care nivelurile sunt interconectate folosind


conexiunea perfect-shuffle.Pentru un nr. N= 2n procesoare,rețeaua va avea n niveluri. Un
comutator de la nivelul i trimite mesajul fie utilizând conexiunea „înainte”,dacă bitul i din
adresa procesorului sursă e egal cu bitul i din adresa procesorului destinațe, fie utilizând
conexiunea „interschimb” în caz contrar (fig. 4.17).

Modalitatea de rotare a mesajelor din rețeaua omega se poate exemplifica uşor pentru
cazul a 8 procesoare în felul următor :
1. Fie adresa procesorului sursă : s1,s2,s3
2. După prima aplicare a funcţiei shuffle : s2,s3,s1
3. După primul comutator : s2,s3,d1 (înainte dacă s1,-d1 ; conexiunea adiacentă dacă
s1≠d1)
4. După a 2-a aplicație a funcţiei Shuffle : s3,d1,s2
5. După al 2-lea comutator : s3,d1,d2 (înainte dacă s2=d2,interschimb dacă s2=d2)
6. După a 3-a aplicare a funcţiei shuffle : d1,d2,s3
7. După al 3-lea comutator : d1,d2,d3(înainte : s3=d3, conexiune adiacentă : s3=d3)
8. Procesorul destinației : d1,d2,d3 .
Rețeaua omega și conexiunea perfect-shuffle : fig. 5.14: