Sunteți pe pagina 1din 73

1.

2 Arhitecturi paralele de calculatoare

Cresterea performantelor calculatoarelor a fost frânată de stadiul tehnologiei. Cerintele de viteză,


de capacitate de memorie sunt mereu crescânde, iar îmbunătăţirile în domeniul arhitecturii
calculatoarelor au cunoscut un salt doar în momentul dezvoltării procesării paralele.
Procesarea paralelă constă în prelucrarea informaţiei într-o formă care cuprinde exploatarea
evenimentelor concurente din procesul de calcul.

Prin concurentă se întelege paralelism, simultaneitate şi suprapunere.


• Evenimentele paralele sunt acelea care apar în acelaşi interval de timp la mai multe resurse,
• evenimentele simultane sunt acelea care apar la acelaşi moment de timp iar
• suprapunerea constă în execuţia simultană a două sau mai multe evenimente, de fapt a
diferite faze din acele evenimente.
Prelucrarea paralelă se desfăsoară la diferite nivele:
• Cel mai înalt este cel al paralelismului la nivelul programelor, care necesită
implementarea de algoritmi paraleli.
• Nivelul următor este cel al modulelor şi procedurilor din cadrul unui acelaşi program.
Acest tip de paralelism necesită existenta unor algoritmi care pot descompune un program
în module independente şi pe care apoi le poate aloca la diferite unităţi de calcul în vederea
execuţiei.
• Nivel al paralelismului între instrucţiuni. Pentru aceasta sunt necesari algoritmi care să
detecteze dependenţele între instrucţiuni.
• Ultimul nivel este cel al paralelismului la execuţia instrucţiunilor care presupune anumite
caracteristici structurale ale unităţii centrale.
Din prezentarea acestor nivele rezultă că rolul hardware-ului descreste de la nivelul inferior la cel
superior, în timp ce rolul software-ului descreste de la nivelul superior spre cel inferior.
Procesarea paralelă este un domeniu complex în care trebuiesc luate în considerare atât elementele de
hardware cât şi cele de software, ele completându-se şi determinându-se reciproc.
Din punctul de vedere al arhitecturii şi organizării sistemelor se poate face o clasificare a soluţiilor,
grupându-le în:
- paralelism în sisteme cu o unitate centrală;
- paralelism în sisteme cu mai multe unităţi centrale.

1.2.1 Paralelismul in sisteme cu o unitate centrală

Sistemele cu o unitate centrală sunt sisteme uniprocesor în care au fost încercate mai multe metode şi
tehnici pentru a obţine o prelucrare paralelă a informaţiei.
1. O primă metodă o constituie multiplicarea unităţilor funcţionale.
Existenţa unei singure unităţi aritmetice şi logice va impune execuţia secvenţială a operaţiilor
aritmetice şi logice. O creştere semnificativă a vitezei se obţine dacă un sistem dispune de mai
multe unităţi aritmetice şi logice şi, mai mult, dacă acestea sunt specializate.
Un exemplu îl constituie calculatorul CDC 6600, proiectat în 1964, care conţine 10 unităti
funcţionale în cadrul unitătii centrale, independente una faţă de cealaltă. Apare o complicare a
structurii, întrucât va fi necesar un bloc pentru alocarea operaţiilor la cele 10 unităţi ,astfel încât
să se menţină o încărcare cât mai uniformă. Această tehnică este folosită şi în unitatea de
intrare/ieşire unde există 12 canale independente.
Schema bloc a calculatorului CDC 6600 este prezentată in figura 1.1, unde prin DCP s-a notat un
dispozitiv de comandă şi planificare a celor 10 unităţi funcţionale.
O altă metodă o constitue suprapunerea operaţiilor efectuate de unitatea centrală cu cele de
intrare/ieşire. Pentru aceasta este necesară existenţa unor procesoare orientate pe operaţii de
intrare/ieşire. Un exemplu în acest sens îl constitue procesorul 8089 din familia
microprocesorului 8089.
2. O altă metodă o constituie implementarea paralelismului şi a conceptului de bandă de asamblare în
cadrul unităţii centrale. O tehnică des utilizată permite creşterea vitezei de execuţie a operaţiilor
de adunare prin obţinerea anticipată a transportului. De asemenea, este uzuală azi aplicarea
conceptului de bandă de asamblare şi suprapunere la execuţia instrucţiunilor. Ciclul unei
instrucţiuni este împărţit în cât mai multe faze de exemplu: aducere, decodificare, citirea
operanzilor, execuţia şi depunerea rezultatului, şi, la un moment dat, în unitatea centrală se află
mai multe instrucţiuni în diferite faze ale ciclului lor.
3. O cauză care duce la scăderea vitezei de lucru o constituie indisponibilitatea operanzilor atunci când
unitatea centrală are nevoie de ei. Acesta apare datorită decalajului existent între viteza de prelucrare,
a unităţii centrale şi viteza memoriilor. Există o ierarhizare a memoriilor determinată de capacitatea
şi viteza lor. Aceasta este prezentată în figura 1.2.
Memoria de masă se caracterizează prin capacitate mare şi foarte mare, de ordinul megaocteţilor şi
zecilor de megaocteţi, dar timp de acces de asemenea mare, de ordinul milisecundelor şi zecilor de
milisecunde.

Adunare

Înmultire

Înmultire

12 Împărtire
canale
de Memoria 24 Adunare
I\E registre
Incrementare

Incrementare

Operatie
logică
Deplasare
Tampon
Salt
pentru

instruc-
tiuni D.C.P

Fig. 1.1 Schema bloc a alculatorului CDC 6600


Memoria de masă face parte, de fapt, din periferia sistemului.
Memoria operativă aparţine sistemului şi este intens utilizată de unitatea centrală. Iniţial capacitatea
ei era mică, dar odată cu dezvoltarea tehnologiei aceasta a crescut. Timpul de acces este mult mai mic
decât în cazul memoriilor de masă, valorile uzuale fiind de ordinul zecilor de ns. Pentru echilibrarea
acestui decalaj, toate unităţile centrale folosesc o memorie tampon, conţinută chiar în interiorul lor,
caracterizată prin timp de acces minim la nivelul ciclului procesorului, sau mai mic decât acesta dar
şi prin capacitatea minimă. Există două posibilităţi de realizare a memoriei tampon:
• utilizarea de registre: toate procesoarele dispun de registre care pot fi privite ca o memorie
RAM de mică capacitate, dar de mare viteză; registrele sunt fie generale, caz în care
sunt folosite pentru memorarea temporară a operanzilor şi a rezultatelor pentru orice
instrucţie, fie specializate, caz în care sunt utilizate pentru anumite operaţii, de
exemplu: numărător de instrucţiuni, indicator pentru vârful stivei, etc; găsirea unui
raport optim între registrele generale şi cele specializate este o problemă deschisă încă,
un număr mare de registre generale ducând la o creştere a flexibilităţii, iar un număr
mare de registre specializate ducând la o compactare mărită a codului. Numărul de
registre este în general mic, de exemplu microprocesorul Z80 fiind de 18 registre pe 8
biţi şi 4 registre pe 16 biţi, iar la microprocesorul 68000 fiind de 18 registre pe 32 biţi şi
1 registru pe 16 biţi;
• utilizarea unei memorii RAM de mică capacitate, dar de mare viteză, numită memorie
„cache”; viteza maximă se obţine dacă procesorul comunică doar cu această memorie,
sistemul de operare asigurând încărcarea acestei memorii cu părţi din memoria
operativă a căror probabilitate de utilizare este maximă, de aici rezultând că este de dorit
o capacitate cât mai mare a acestei memorii; dar capacitatea mare duce atât la creşterea
costului, cât şi a timpului de acces; apar şi alte probleme care trebuiesc considerate de
proiectant, un exemplu constituind coerenţa care constă în faptul că o înscriere în
memoria „cache” trebuie să se reflecte şi în memoria operativă.

Capacitate Timp de acces


maximă Unităti de bandă magnetică maxim

Unităti de disc
cu deplasarea capului de scriere/citire

Unităti de disc .....

Memoria operativă

Capacitate Perioada mică a


minimă UC ciclului

Fig. 1.2 Ierarhizarea memoriilor

1. Alte tehnici de creştere a paralelismului în sisteme cu o unitate centrală se referă la partea de


programare. Multiprogramarea este una dintre acestea şi constă în execuţia aparent simultană a
mai multor programe în acelaşi interval de timp. Dacă, de exemplu, la un moment dat un
program necesită o comunicare cu periferia, de mai lungă durată, execuţia sa poate fi trecută sub
controlul unui procesor de intrare/ieşire şi în acest timp unitatea centrală se poate ocupa de
execuţia unui alt program.
2. O creştere a eficienţei se poate obţine utilizând sisteme de operare cu divizare a timpului. Acestea
permit execuţia aparent simultană a mai multor programe în acelaşi interval de timp, fiecărui
program fiindu-i alocată o „felie” din timpul unităţii centrale. După trecerea intervalului alocat,
unitatea centrală întrerupe execuţia respectivului program şi continuă cu execuţia altui program.
Divizarea timpului se poate aplica şi la sisteme cu mai multe unităţi centrale, dar acolo problemele de
alocare şi planificare sunt mai complexe.

1.2.2 Paralelismul în sisteme cu mai multe unităţi centrale

Sistemele cu mai multe unităţi centrale constituie suportul care a asigurat dezvoltarea cu eficienţă maximă
a procesării paralele. În urma cercetărilor s-au delimitat mai multe concepte dar, în general, o structură
eficientă s-a obţinut implementând într-un acelaşi sistem mai multe din aceste concepte, predominând
totuşi unul. Astfel există:
• sisteme care implementează conceptul de bandă de asamblare,
• sisteme multiprocesor,
• arii de procesoare,
• procesoare vectoriale,
• sisteme care implementează conceptul de flux de date,
• sisteme care implementează conceptul de sistolicitate.
Implementarea conceptului de bandă de asamblare duce la crearea unei structuri alcătuită din mai multe
unităţi funcţionale, sau elemente procesoare, fiecare orientată pe o anumită parte din execuţia unei
instrucţiuni. Ciclul unei instrucţiuni este împărţit în faze, fiecare unitate fiind specializată pentru execuţia
uneia din aceste faze. Unităţile funcţionale sunt legate între ele astfel încât asupra unei instrucţiuni care
intră în bandă se efectuează operaţiile specifice primei unităţi după care este transferată la a doua unitate
s.a.m.d. Comparaţia clasică care apare în literatura de specialitate face o analogie între aceste structuri şi
o bandă de asamblare a unei întreprinderi în care intră materia primă şi iese produsul finit. În cazul nostru
materia primă este constituită de operanzi, uneori şi de codul instrucţiunii, iar produsul finit este
rezultatul.
Răspândirea masivă a sistemelor multiprocesoare, precum şi diversitatea realizărilor le impun ca un
domeniu aparte care trebuie abordat separat şi în detaliu. În esenţă un asemenea sistem constă din două
sau mai multe procesoare (există realizări cu mii de procesoare) care pot sau nu să fie microprocesoare şi
care utilizează în comun mai multe resurse, care pot fi memorii sau porturi de intrare/ieşire.
Performanţele unui sistem multiprocesor sunt decisiv determinate de modul de interconectare atât a
procesoarelor între ele cât şi a procesoarelor cu resursele comune. La o extremă a acestor posibilităţi de
interconectare se află magistrala comună, o soluţie simplă, din punct de vedere constructiv şi logic, dar
puţin performantă datorită faptului că oferă posibilităţi de comunicare limitate. La cealaltă extremă se află
interconectarea de tip „crossbar” care oferă performanţe ridicate, permiţând comunicări multiple şi directe
între oricare doi parteneri dar cerinţele constructive şi preţul sunt atât de mari încât reţeaua nu poate fi
construită pentru mai mult de 16 procesoare decât acceptând un preţ uriaş. Între cele două extreme se află
reţelele de interconectare pe mai multe nivele, cu multe variante, care constituie soluţia adoptată de cele
mai multe realizări.
O arie de procesoare constituie o structură regulată, sincronă, alcătuită din mai multe elemente
procesoare, cu sau fără memorie locală, având posibilitatea de a comunica între ele, toate lucrând în
paralel sub comanda unei unităţi de control unice. Unicitatea unităţii de control nu trebuie înţeleasă în
sens fizic (pot exista mai multe astfel de unităţi), ci în sens funcţional (adică există un număr, foarte mic -
în raport cu cel al elementelor procesoare - de unităţi care îndeplinesc rol de control, comandă şi
planificare. Dacă structurile unei banzi de asamblare asigură paralelismul în timp, ariile de procesoare
asigură paralelismul în spaţiu.
Procesoarele vectoriale sunt acele unităţi de calcul care efectuează operaţii asupra unor operanzi
reprezentaţi sub formă de vectori. Prin operand vector se înţelege un set de mărimi scalare de acelaşi tip.
Următoarele două tipuri de arhitecturi, deşi paralele, pot forma o clasă specială şi anume cea a
arhitecturilor neconvenţionale. Conceptele noi descrise mai sus deşi au determinat modificări structurale
importante nu au scos sistemele din clasa Von Neumann. Pornind de la modificările funcţionale ale unei
arhitecturi Von Neumann au apărut şi alte soluţii care au dat naştere unor arhitecturi neclasice, adică non
Von Neumann, şi din această cauză denumite neconvenţionale. Deşi conceptele sunt deosebit de atractive,
la nivel de principiu, realizările nu au fost pe măsura aşteptărilor iniţiale. Explicaţia rezidă în faptul că
deşi performanţele ce pot fi obţinute sunt într-adevăr deosebite, deşi se elimină limitările arhitecturilor
Von Neumann, la punerea în practică apar probleme specifice, a căror rezolvare ridică probleme
complexe.
Structurile care implementează conceptul de flux de date au fost construite în conformitate cu regula de
bază a acestui concept: un procesor va executa o instrucţiune atunci când toţi operanzii, toate datele,
necesari execuţiei instrucţiunii îi sunt disponibili. Regula este simplă dar aplicarea ei în practică a dus la
apariţia unei structuri neconvenţionale, non Von Neumann, în care nu mai există numărător de
instrucţiuni nu mai există memorie operativă întrucât operanzii şi rezultatele parţiale „curg” de la un
procesor la altul, fiecare lucrând independent unul fată de celălalt, unica dependenţă fiind constituită doar
de transmiterea operanzilor.
Reprezentarea programelor utilizează un aparat matematic deosebit, teoria grafurilor, care delimitează şi
mai mult aceste tipuri de structuri de celelalte structuri paralele.
Arhitecturile sistolice alcătuiesc un alt tip de structuri neconvenţionale, cunoscute şi sub denumirea de
reţele sistolice. O reţea sistolică este alcătuită dintr-un ansamblu de celule procesoare, denumite şi celule
sistolice, foarte asemănătoare între ele, ca structură şi posibilităţi, interconetate într-o formă regulată şi
care prelucrează ritmic datele. Fiecare celulă este conectată doar cu un număr limitat de alte celule,
vecinii ei, numărul acesta depinzând de forma reţelei sistolice. Forma poate fi de mai multe feluri: liniară,
triunghiulară, hexagonală etc. Într-o reţea sistolică există un tact unic, global, care sincronizează toate
operaţiile, asigurând prezenţa datelor la intrările tuturor celulelor la momente de timp bine determinate.
Pentru mai multă claritate ne putem imagina că într-o astfel de structură datele trec sau „curg’’ de la o
celulă la alta, ritmic, pe mai multe direcţii, în funcţie de forma implementată.

1. 3 Clasificarea arhitecturilor

Literatura de specialitate prezintă mai multe criterii pentru clasificarea arhitecturilor, (1), (2).
Unul dintre acestea tine seama de modul de prelucrare a instrucţiunilor şi datelor. În conformitate cu acest
criteriu, Flynn a împărţit calculatoarele în următoarele categorii :
• cu un şir de instrucţiuni şi un şir de date - SISD (“Single Instruction stream - Single Data
stream”) - figura 1.3;
• cu un şir de instrucţiuni şi mai multe şiruri de date – SIMD (“Single Instruction stream -
Multiple Data stream”) - figura 1.4;
• cu mai multe siruri de instructini şi un sir de date – MISD (“Multiple Instruction stream -
Single Data stream”) - figura 1.5;
• cu mai multe şiruri de instrucţiuni şi mai multe şiruri de date – MIMD (“Multiple
Instruction stream - Multiple Data stream”) - figura 1.6;
Prin şir se înţelege o secvenţă de instrucţiuni sau date prelucrate de o singură unitate de execuţie care
este de fapt un procesor.
Notatiile din figurile 1.3 - 1.6 au următoarele semnificaţii:
UC - unitate de control;
UE - unitate de execuţie;
MM - modul de memorie;
MP - memorie partajată;
SI - sir de instrucţiuni;
SD - sir de date;
Arhitectura de tip SISD corespunde calculatoarelor seriale, cele mai răspândite. Unitatea de execuţie
prelucrează instrucţiunile secvenţial, una după cealaltă, luând operanzii din memorie.
În multe cazuri s-a implementat conceptul de bandă de asamblare rezultând o creştere semnificativă a
performantelor. Există şi o variantă a acestei organizări, şi anume cea cunoscută sub denumirea de
MSISD (“Multiple Single Instruction stream - Single Data stream”) caracterizată prin funcţionarea
independentă a mai multor calculatoare SISD.
Arhitectura de tip SIMD se caracterizează prin execuţia la un moment dat a unei singure secvenţe de
instrucţiuni, dar asupra mai multor şiruri de date.

Fig. 1.3 UC
Masina SISD SI
UE SI
SD
MM

UC

UE 1 U E2 U E3 UEn
1
U E1 SD 1 SD2 SD3 SD n

MM1 MM2 MM3 M Mn

Fig.1.4 Masina SIMD


UC1 UC2 UC3 ...... UCn

SI1 SI2 SI3 SIn

UE1 UE2 UE3 ...... UEn

SD MM1
SIn
.
MM2 .
SI3

MM3 SI2
.
.
. SI1

MMn

MP
Fig.1.5 Masina MISD

În principiu există o singură unitate de control, unică nu în sens fizic, ci în sensul operaţiilor pe care le
execută, de aducere şi decodificare a instrucţiunilor, precum şi de comandă şi control a unităţilor de
execuţie. Prelucrările se fac în paralel asupra mai multor seturi de date, la un moment dat, de către mai
multe unităţi de execuţie. Ariile de procesoare constituie exemple tipice de maşini SIMD.
Arhitecturile de tip MISD pot fi privite ca opuse celor de tip SIMD în sensul execuţiei simultane a mai
multor secvenţe de instrucţiuni, dar asupra aceluiaşi set de date care trec de la o unitate de execuţie la alta.
Asemănarea cu noţiunea de bandă de asamblare se opreşte aici, întrucât există o diferenţă principală:
banda da asamblare execută un sir de instrucţiuni, pe când maşina MISD execută mai multe şiruri de
instrucţiuni.
Nu există realizări practice de succes care să implementeze această arhitectură.
Arhitecturile de tip MIMD reprezintă maşinile paralele cele mai performante. Există mai multe unităţi de
control care comandă mai multe unităţi de execuţie, asigurând execuţia mai multor secvenţe de
instrucţiuni cu operanzi din mai multe şiruri de date.

UC1 UC2 UC3 ...... UCn


SI1 SI2 SI3
SIn

UE1 UE2 UE3 ...... UEn

SD1 SD2 SD3 SDn


MM1 MM2 MM3 ....... MMn

SIn
SI2 SI3
SI1

Fig.1.6 Masina MIMD

Diferenţa principală între maşinile MIMD şi cele MSISD este aceea că la cele MSISD nu există
comunicare între unităţile de control sau între cele de execuţie, pe când la cele MIMD, toate unităţile de
control concură la rezolvarea unei unice probleme complexe. Ca urmare, există comunicare între ele,
planificare a operaţiilor şi utilizare de resurse comune (de exemplu memoria). Exemple tipice de maşini
MIMD sunt sistemele multiprocesor.

3.1 DEFINIREA CONCEPTULUI DE ARHITECTURĂ PIPELINE

Averea considerabilă a lui Henry Ford se datora, cel puţin în parte, metodei sale inovatoare de a organiza
munca la fabricile sale de automobile: lucrătorii stau aşezaţi de-a lungul unei benzi, iar maşinile
neterminate merg de la unul la altul. Fiecare execută asupra maşinii o singură operaţiune, după care o
pasează mai departe. Asta e banda de asamblare.
Ei bine, exact aceeaşi idee poate fi aplicată în cazul construcţiei microprocesoarelor! În acest caz banda de
asamblare se numeşte pipeline, sau conductă.
Tehnica de procesare pipeline reprezintă o tehnică de procesare paralelă a informaţiei prin care un
proces secvenţial este divizat în subprocese, fiecare subproces fiind executat într-un segment special
dedicat care operează în paralel cu celelalte segmente. Fiecare segment execută o procesare parţială a
informaţiei. Rezultatul obţinut în segmentul i este transmis în tactul următor spre procesare segmentului
i+1. rezultatul final este obţinut numai după ce informaţia a parcurs toate segmentele, la ieşirea ultimului
segment. Denumirea de pipeline provine de la anologia cu o bandă industrială de asamblare. Este
caracteristic acestor tehnici faptul că diversele procese se pot afla în diferite faze de prelucrare în cadrul
diverselor segmente, simultan. Suprapunerea proceselor e posibilă prin asocierea unui registru fiecărui
segment din pipeline. Registrele produc o separare între segmente astfel încât fiecărui segment să poată
prelucra date separate (fig3.1).
Ti - regiştri tampon
Ni – nivele de prelucrare (combinaţionale sau secvenţiale)
Este evident că nivelul cel mai lent de prelucrare va stabili viteza de lucru a benzi. Aşadar, se impune în
acest caz partiţionarea unui eventual proces mai lent în subprocese cu timpi de procesare cvasiegali şi
interdependenţe minime. Există 2 soluţii principale de a compensa întârzierile diferite pe diversele nivele
de prelucrare [36]:

1 2 n

IN T1 N1 T2 N1 … .. Tn Tn Tf OU T

CL K

Fig.3.1.
Soluţia anterioară de balansare a benzii necesită circuite suplimentare şi poate fi realizată doar cu condiţia
ca sarcinile alocate respectivului nivel să poată fi descompuse.
O altă soluţie de balansare se bazează pe conectarea în paralel a unui alt nivel cu aceeaşi întârziere ca cel
mai lent. Şi aici trebuiesc circuite suplimentare. În plus, apare problema sincronizării şi controlului
nivelelor care lucrează în paralel. Soluţia e utilizată când sarcinile alocate nivelului mai lent nu pot fi
descompuse (fig.3.3).

IN OU T
t t 2t t

CL K

T C LK = T
<=>

2t
IN OU T
t t t t t

CL K

Fig.3.2. TCLK =

A
IN t t 2t t OUT

2t

Fig.3.3.
În Tact (i) informaţia se trimite spre procesare nivelului următor pe calea A. În tact (i +1) informaţia se
trimite analog pe calea B.
Se defineşte rata de lucru R a unei benzi de asamblare ca fiind numărul de procese executate în unitatea
de timp T (ciclu maşină sau tact). Considerând m posturi de lucru prin care trec n procese, rezultă că
banda le va executa într-un interval de timp ∆ t = ( m + n − 1) ⋅ T . Normal, pentru că m ⋅ T este
timpul de “setup” al benzii, adică timpul necesar terminării primului proces. Aşadar, rata de execuţie a
unei benzi prin care trece n procese este:
n
Rn =
(m + n − 1) * T
Rata ideală este de un proces per ciclu, întrucât:
1
R∞ = lim Rn =
n→ ∞
T
După cum vom vedea această rată teoretică nu se va putea atinge în practică, nu numai datorită faptului că
se prelucrează un număr infinit de procese şi datorită timpului de setup, ci mai ales datorită unor blocaje
în funcţionarea normală a benzii numite hazarduri .
Să dăm un exemplu simplu şi intuitiv de procesare pipeline a datelor. Presupunem că avem de calculat:
Ai ⋅ Bi + Ci , pentru i = 1, 2, …,7 unde Ai, Bi, Ci reprezintă registre (tablouri) binare pe “n” ranguri .
n Ai n Bi Ci
pm R 1 pm R2
R2 Ck
Ck R1 Seg m ent 1
n n
n

M UL TIP LICA T O R
OR
p m R2 Pm R 4

Ck R 3 R4 Ck Seg m ent 2
n n

S UM A T OR

Seg m ent 3
Pm R 5

R5 Ck
Fig.3.4.

Pm Ri =comandă de tip ”primeşte” îm registrul Ri


Fiecare operaţie e implementată într-unul din segmentele acestei structuri pipeline. Multiplicatorul şi
sumatorul se consideră a fi circuite combinaţionale. Operaţiile executate în fiecare segment al structurii
sunt următoarele:
R1 <------ Ai, R2 <-------Bi; memorează Ai şi Bi
R3 <------ R1 * R2, R4 <------- Ci; multiplicare (R1, R2) şi memorare Ci
R5 <------ R3 + R4; memorare rezultat i
Cele 5 registre se încarcă cu date noi în fiecare impuls de ceas. Efectul fiecărui impuls de ceas este arătat
în tabelul următor. Sunt necesare 3 impulsuri de tact, din momentul iniţial, pentru a avea memorat în R5
primul rezultat. Din acest moment , fiecare tact încarcă un nou rezultat în R5 şi simultan se translatează
informaţia prin structură. Când fluxul de date primare (Ai, Bi, Ci) s-a încheiat, mai trebuie generate totuşi
încă 2 impulsuri de tact pentru obţinerea rezultatelor în R5. Dacă timpul necesar execuţiei unui proces
într-un segment este t şi avem k segmente, atunci fiecare prelucrare completă se obţine în k ⋅ t intervale
de timp. Constanta k ⋅ t reprezintă timpul de setup al structurii, adică timpul după care se obţine primul
rezultat. Pipeline-ul de date se aplică cu precădere pentru operaţiile în virgulă mobilă, zecimale,
transcendente, etc.

Segment Segment 2 Segment 3


1
T R1 R2 R3 R4 R5
act
1 A1 B1 - - -
2 A2 B2 A1 * C -
B1 1
3 A3 B3 A2 * C A1 * B1 +C1
B2 2
4 A4 B4 A3 * C A2 * B2 + C2
B3 3
5 A5 B5 A4 * C A3 *B3 + C3
B4 4
6 A6 B6 A5 * C A4 * B4 + C4
B5 5
7 A7 B7 A6 * C A5 * B5 + C5
B6 6
8 - - A7 * C A6 * B6 + C6
B7 7
9 - - - - A7 * B7 + C7
Tab.3.1.
În acest caz m =3 , n = 7, rezultă rata de lucru R = 7/9 procese per tact.
Cum se aplică deci conceptul în cazul microprocesoarelor? Care e treaba unui microprocesor? Să execute,
una câte una, instrucţiunile programelor scrise de utilizatori. Dar execuţia unei instrucţiuni se poate
descrie ca o serie de paşi succesivi; ceva de genul: adu instrucţiunea din memorie, uită-te ce fel de
instrucţiune este (o operaţie aritmetică/logică, un apel de procedură, un salt, etc.), decide care date trebuie
procesate (care sunt regiştrii 1 care conţin acele date), extrage datele din regiştri, efectuează operaţia
asupra datelor, pune rezultatul la loc unde trebuie, şi o ia de la capăt cu instrucţiunea următoare. În figura
1 avem structura unui procesor ipotetic pe care indicăm cinci stagii prin care o instrucţiune trece în
prelucrare.

Figure 1: Arhitectura internă a unui microprocesor ipotetic. PC este Program Counter, adresa instrucţiunii în curs de
execuţie din program. IR este Instruction Register, registrul în care instrucţiunea curentă este decodificată pentru a
extrage comenzile asupra celorlalte unităţi ale microprocesorului. Cache-urile, în număr de două, sunt memoriile în
care procesorul ţine datele, respectiv instrucţiunile. MUX sunt multiplexoare: circuite care au mai multe intrări şi o
singură ieşire; ele aleg una dintre intrări şi o trimit la ieşire. Informaţia despre care dintre intrări este selectată
depinde de instrucţiunea curentă, şi este indicată prin linia punctată. De exemplu, ultimul multiplexor din dreapta, va
alege linia de sus pentru instrucţiuni care citesc din memorie şi pun rezultatul într-un registru, şi va alege linia de jos
pentru instrucţiuni care scriu o valoare calculată. ALU este unitatea aritmetică-logică (Arithmetic-Logical Unit). Am
etichetat unele dintre conexiuni cu informaţii despre valoarea pe care o poartă. Pentru fiecare instrucţiune, unele
dintre aceste sârme vor purta informaţii utile iar altele nu. Încercaţi să identificaţi pentru fiecare tip de instrucţiune de
fapt ce se întâmplă.
Ei bine, instrucţiunile joacă exact rolul rufelor: dacă avem în procesor câte un circuit independent pentru
fiecare din aceste numeroase sarcini, atunci putem pune aceste circuite să lucreze simultan pe instrucţiuni
succesive. Astfel, în timp ce instrucţiunea 1 pune rezultatul la loc (stagiul de acces la memorie),
instrucţiunea 2 operează asupra propriilor date (stagiul de execuţie), instrucţiunea 3 tocmai extrage datele
(stagiul de decodificare), iar instrucţiunea 4 tocmai este adusă din memorie (stagiul de citire).
Observaţi că -- aparent -- cîştigul pe care l-am obţine transformând procesorul într-un pipeline, este pe
gratis: şi un procesor obişnuit are nevoie de toate aceste circuite, însă atunci când folosea unul dintre ele,
celelalte erau inutile. Că lucrurile nu stau chiar aşa vom vedea în secţiunile următoare.

Cartea „canonică” pentru studiul arhitecturii calculatoarelor moderne este Hennessy and Patterson
„Computer Architecture -- a Quantitative Approach”. Această carte este de fapt versiunea pentru cursuri
doctorale a unei alte cărţi de aceiaşi autori. Cartea este excelent scrisă, iar capitolele 3 şi 4 sunt dedicate în
întregime tehnicii de pipelining, în total 250 de pagini.

Regiştrii de separaţie
Dacă un procesor este implementat ca un pipeline, atunci între diferitele stagii ale benzii de asamblare se
află nişte „tampoane”, care izolează stagiile unul de altul. Arhitectural vorbind, tampoanele sunt de fapt
tot nişte regiştri, numiţi pipeline registers. Fiecare din aceşti regiştri este comandat de ceasul
microprocesorului, şi încarcă în interior toate rezultatele procesării obţinute din stagiul anterior:
instrucţiunea, rezultatele parţiale, informaţii de stare, etc. Figura 2 arată segmentarea procesorului de mai
sus.

Figure 2: Procesorul de mai sus împărţit în stagii. Barele haşurate sunt regiştrii de separaţie. Observaţi că am mutat
un multiplexor din stagiul de acces la memorie în stagiul de citire, pentru că altfel în cazul unui salt am fi avut două
stagii care încearcă simultan să scrie în registrul PC. Cu toate acestea, linia care controlează multiplexorul vine în
continuare din stagiul de acces la memorie, unde instrucţiunile de salt îşi termină de calculat destinaţia.
Vom vedea că regiştrii de separaţie au un rol important pentru blocajul benzii de asamblare în anumite
circumstanţe.

Influenţa asupra ceasului


Câştigul cu ajutorul pipeline-ului este că fiecare stagiu este mai scurt decât întregul, deci se poate executa
mai repede decât dacă am executa toate stagiile unul după altul. Putem deci mări frecvenţa ceasului.

În al doilea rând, aşa cum am văzut, acum toate stagiile sunt folosite simultan, fiecare pentru altă
instrucţiune. Aceasta este o sursă de paralelism, care implică o altă creştere a performanţei.

Observaţi că succesul acestei metode se bazează pe faptul că avem de procesat un şir de instrucţiuni
extrem de lung, continuu.

Observaţi că durează o vreme de când prima instrucţiune intră în BA până când termină execuţia: atâţia
cicli de ceas câte stagii avem. Latenţa (latency), sau durata propagării unei instrucţiuni prin pipeline, este
mai mare decât în cazul unui procesor fără pipeline, pentru că am adăugat durata stocării datelor în
regiştrii de separaţie. Pe de altă parte, observaţi că după ce prima instrucţiune iese din BA, a doua se
termină în ciclul imediat următor. Deci rata de execuţie (throughput) este de o instrucţiune pe ciclu de
ceas! Distincţia între latency şi throughput este extrem de importantă.

Acest fenomen apare într-o formă exacerbată în cazul reţelelor de calculatoare, în care există doi
parametri independenţi: durata propagării datelor între două calculatoare, şi viteza de transmisiune a
datelor. Putem avea linii cu durată de propagare mică (de exemplu cu latenţa de 2ms), dar cu viteză mică,
cum ar fi un modem de 14.4Kbps. Putem avea însă o linie cu durată de propagare extrem de mare
(500ms), dar cu o viteza foarte mare, cum ar fi un canal de transmisiune prin satelit, de 2Mbps. Interesant
este că în cazul reţelelor de calculatoare produsul acestor cantităţi (latenţa * rata de transmisie) este cel
mai important; cu cât produsul este mai mare, cu atât susţinerea performanţei reţelei este mai greu de
obţinut.

Să observăm că viteza la care putem pune ceasul este limitată de cel mai lent stagiu din banda de
aamblare. Asta pentru că toţi lucrătorii trebuie să lucreze cu ritmul celui mai încet dintre ei. Din această
cauză, o împărţire a sarcinilor la 5 circuite nu garantează o creştere a vitezei de 5 ori. Să presupunem că
cele 5 stagii durează 3, 3, 3, 5, respectiv 3 nanosecunde, şi că întârzierea unui registru de separaţie este de
2 nanosecunde. Atunci circuitul fără BA execută o instrucţiune la fiecare 3+3+3+5+3=17 nanosecunde, şi
asta dă şi viteza ceasului. Pe de altă parte, circuitul din „felii” execută o instrucţiune la 5+2 nanosecunde
(5 pentru stagiul cel mai lent, plus două ns pentru propagarea prin registru). Iată deci cum, deşi am
împărţit sarcina la 5, din cauza neechilibrării stagiilor creşterea de viteză obţinută este de numai 17/7 =
2.42 ori.

Dependenţe
Problema este că, foarte adesea, nu putem executa mai multe instrucţiuni consecutive chiar una după alta,
pentru că anumite constrângeri fac acest lucru imposibil. Acest gen de interferenţă între instrucţiuni
consecutive se numeşte în engleză hazard. Voi folosi în româna termenul „dependenţe”, deşi acesta nu
este tocmai exact2.

Dependenţe structurale
Un exemplu pentru o astfel de dependenţă: un procesor trebuie după fiecare instrucţiune să incrementeze
adresa de unde se ia următoarea instrucţiune (adresa este aflată în registrul numit „Program Counter”).
Pentru că incrementarea este o operaţiune aritmetică, procesorul ar putea folosi pentru acest scop unitatea
aritmetică-logică (în figura noastră am fi avut în loc de ALU şi circuitul de incrementare un singur
circuit). Aici avem deci un conflict: o altă instrucţiune, aflată în stagiul de calcul ar putea dori să
folosească acea unitate în acelaşi timp pentru că trebuie să adune două numere.
Astfel de „hazards” sunt numite „structurale”, pentru că structura procesorului nu permite executarea
anumitor tipuri de instrucţiuni simultan în stagii diferite.

În exemplul nostru, instrucţiunile care nu folosesc unitatea aritmetică (de pildă o instrucţiune de salt
absolut) nu cauzează nici un fel de conflicte.

Putem da şi alte exemple de dependenţe structurale: mai multe instrucţiuni vor să acceseze simultan
acelaşi registru, mai multe instrucţiuni vor să acceseze memoria (de pildă o instrucţiune care vrea să-şi
adune operanzii şi tocmai îi citeşte şi una care a terminat şi vrea să scrie rezultatul), sau instrucţiuni a
căror execuţie durează mai mulţi cicli de ceas.

Un exemplu de ultima speţă sunt de pildă operaţiile în virgulă flotantă care durează uneori zeci de cicli
de ceas, iar procesorul de obicei are o singură unitate de calcul în virgulă flotantă.

Teoretic un hazard structural se poate oricând evita duplicând unităţile funcţionale care sunt în
conflict;
această soluţie nu este însă întotdeauna fezabilă. De pildă, dacă o împărţire 3 durează 10 cicli, atunci ar
trebui să avem 10 împărţitoare pentru a permite execuţia a 10 împărţiri succesive.

Tot pentru a evita dependenţele structurale procesoarele moderne au, aşa cum arătam în figură, două
cache-uri L14 separate: unul pentru instrucţiuni (I-cache) şi unul pentru date (D-cache): în acest fel se
poate citi o instrucţiune simultan cu scrierea rezultatelor alteia.

Dependenţe ale datelor


O dependenţă mult mai subtilă este cea a datelor. Să presupunem că avem un program cu două
instrucţiuni consecutive: una care scrie numărul 2 în registrul 3, iar următoarea care adaugă valoarea 5
acelui registru.
În tabelul 2 vedem cum progresează aceste instrucţiuni într-o BA ipotetică care seamănă cu cea descrisă
mai sus. Am mai pus nişte instrucţiuni noop, care nu fac nimic, în jur, pentru a ilustra mai bine
Ceasul
Instrucţiunea 0 1 2 3 4 5 6 7 8
noop C D E M S
scrie 2 în R3 C D E M S+
aduna 5 la R3 C D+ E M S
noop C D E M S
noop C D E M S
Table 2: Avansul instrucţiunilor într-un pipeline ideal. Am prescurtat stagiile cu C: citire, D: decodificare, E:
execuţie, M: memorie, S: scriere. Această execuţie nu este posibilă (fără ajutor suplimentar), pentru că la momentul
de timp 3 instrucţiunea de adunare vrea valoarea din R3, care va fi scrisă în R3 de instrucţiunea de scriere abia la
momentul 5. Dependenţa este marcată cu două semne + în tabel.
Diagrama din tabelul 2 este tipică pentru a descrie evoluţia datelor într-un pipeline. Programul este scris
pe verticală, ceasul este marcat pe orizontală. Starea BA poate fi citită pe verticală, de sus în jos. Căsuţa
de la instrucţiunea 1 şi ceasul 3 arată în care dintre fazele BA se află acea instrucţiune la momentul 3, în
cazul nostru în stagiul de acces la memorie (M).
Problema este că instrucţiunea de scriere pune datele în registrul 3 abia când atinge ultimul stagiu din BA.
Pe de altă parte, instrucţiunea de acumulare citeşte valoarea registrului 3 atunci când este în faza de
decodificare. Dar datorită suprapunerilor, decodificarea instrucţiunii de acumulare se face la momentul 3,
iar scrierea la momentul 5! Din cauza suprapunerii, în execuţie am inversat ordinea în timp în care se
petrec două operaţiuni. Dacă nu facem nimic, rezultatul final va fi desigur greşit, pentru că acumularea nu
vede efectul scrierii.

Înainte de a vedea ce e de făcut să inspectăm o altă dificultate care poate apărea.

Dependenţe ale controlului


Un tip special de dependenţe este cauzat de instrucţiunile de salt. O instrucţiune de salt indică o
întrerupere în fluxul normal al programului. Neplăcerea apare din faptul că execuţia instrucţiunii de salt
se termină destul de târziu, abia când instrucţiunea a calculat adresa finală de destinaţie. Dar între timp în
BA au intrat o grămadă de instrucţiuni, toate cele care urmau imediat. Evident, acestea nu trebuie
executate (sau vor fi executate dacă saltul este condiţionat de o condiţie care este falsă).
Astfel de dependenţe se numesc „dependenţe de control”, din cauză că sunt produse de modificări în
„controlul” (ordinea de execuţie) a programului.

Voi consacra un articol întreg acestui tip de dependenţe, pentru că efectul lor este catastrofal asupra
performanţei, şi pentru că sunt extrem de greu de reparat fără a pierde toate avantajele unui pipeline.
Impactul salturilor este extrem de important din două motive:
• Din raţiuni de performanţă, procesoarele moderne au BA foarte foarte lungi (peste zece stagii);
astfel de procesoare se numesc superpipelined. Ori, cu cât BA este mai lungă, cu atât o golire
şi reîncărcare a ei costă mai mult. BA nu mai este capabilă în acest caz să producă un
rezultat la fiecare ciclu de ceas, pentru că, după o golire, timpul până la următorul rezultat
este din nou egal cu latenţa, care este tot una cu numărul de stagii.

• Mai grav este faptul că, statistic s-a observat că, în medie, una din 7 instrucţiuni executate este
un salt. Această densitate enormă de salturi în codul maşină este cu adevărat îngrijorătoare: dacă
la fiecare 7 instrucţiuni trebuie să golim BA, atunci performanţa se duce cu totul de râpă.
Să estimăm costul unei astfel de situaţii pentru procesorul nostru de mai sus, cu întârzieri de 3, 3, 3, 5, 3
nanosecunde. Atunci procesorul va executa 7 instrucţiuni fiecare la câte un ciclu, după care timp de 4 cicli
va umple din nou BA golită de un salt. Asta înseamnă 7*6 + 4*6 = 66 cicli pentru 7 instrucţiuni, adică
66/7 = 9.42ns/instrucţiune în medie. Creşterea de performanţă a procesorului faţă de modelul fără BA este
acum de 17/9.42 = 1.8 ori. Şi, în plus, am presupus că celelalte feluri de dependenţe nu cauzează nici o
întârziere.

Excepţii
Când anumite condiţii excepţionale se ivesc, procesorul trebuie să întrerupă complet fluxul execuţiei, să
execute o rutină specială, iar apoi uneori să reia programul întrerupt din exact acelaşi punct.
Evenimentele care cauzează această întrerupere intempestivă se numesc excepţii. Există multe feluri de
excepţii, iar tratamentul lor depinde de tip. Exemple de excepţii: împărţirea prin zero, accesul la o pagină
de memorie virtuală care nu se află în memoria fizică, indicaţia terminării unui transfer de către un
dispozitiv periferic (ex. discul), întâlnirea unui punct de oprire (breakpoint) pus de un program de
depanare, etc.

Problema cea mai mare nu este în asemenea cazuri oprirea programului şi saltul (care seamănă teribil cu o
instrucţiune obişnuită de salt), ci repornirea. În momentul apariţiei unei excepţii, în BA se pot afla o
sumedenie de instrucţiuni, cine ştie de unde de prin memorie (poate la una dintre ele s-a ajuns printr-un
salt sau chiar o altă excepţie), etc.

Dacă procesorul vrea să poată relua execuţia după o excepţie, atunci trebuie să posede o grămadă de
circuite care menţin foarte multă informaţie despre întreaga stare a BA, pentru a permite repornirea. Un
astfel de pipeline se numeşte restartable, şi este extrem de complicat.

Soluţii
Concluzia care se desprinde este că e mai uşor de zis decât de făcut un pipeline. Dar lupta pentru
supremaţie în performanţa se dă pe viaţă şi pe moarte între marile companii (nu e o metaforă: cei mai
mari concurenţi ai lui Intel, Cyrix şi AMD au trebuit să fie cumpăraţi de alte mari companii, IBM,
respectiv National Semiconductors, pentru a supravieţui).
Ca atare trebuie găsite soluţii.

Compilatoare grijulii
O posibilă soluţie (care însă nu este folosită decât parţial) este ca în software să garantăm că astfel de
lucruri nu se pot întâmpla. Compilatorul care generează cod pentru un microprocesor ar trebui să ne
asigure că două instrucţiuni care se vor afla simultan în BA nu vor interfera una cu alta. Compilatorul
poate obţine acest efect umplând spaţiul dintre două astfel de instrucţiuni cu instrucţiuni care nu fac nimic
(no-op: no operation).
Din păcate soluţia aceasta nu este viabilă. Un motiv este că ar trebui ca compilatorul să aibă cunoştinţe
intime despre arhitectura internă a BA (ca să ştie ce depinde de cine). Dar Pentium, Pentium Pro şi
Pentium II au arhitecturi interne complet diferite, deşi implementează acelaşi set de instrucţiuni; ne-ar
trebui deci un compilator diferit pentru fiecare maşina; mai mult decât atât, programele de pe una n-ar
mai merge pe alta, din cauză ca altele ar fi dependenţele care trebuie evitate.

Pe de altă parte, compilatoarele moderne încearcă din răsputeri să ajute hardware-ul, fără a garanta
neapărat generarea unui cod lipsit complet de dependenţe. Operaţiunea numită code scheduling
(ordonarea codului) este extrem de importantă pentru a mări performanţa programelor. Practic
compilatoarele încearcă să aranjeze instrucţiunile codului în aşa fel încât instrucţiuni care depind una de
alta (cum sunt cele două de mai sus) sunt cât mai departe una de alta. De exemplu, dacă după cele două
instrucţiuni de mai sus vine o instrucţiune care incrementează registrul 2, atunci ultimele două
instrucţiuni pot fi schimbate între ele fără a modifica rezultatul programului, tocmai pentru că sunt
independente.

Blocajul (stall)
Dacă o instrucţiune nu poate progresa în BA din cauză că-i lipsesc anumite resurse (în exemplul de mai
sus, registrul 3 încă nu are valoarea necesară), atunci aceste instrucţiuni sunt pur şi simplu ţinute pe loc în
BA în aceleaşi stagii, în timp ce cele care le preced sunt lăsate să continue. Oprirea unei instrucţiuni se
numeşte blocaj, sau stall. În spatele instrucţiunii care continuă se formează un gol, numit „bulă” (bubble).
Bula este de fapt o instrucţiune noop: no operation, care nu are nici un efect.
Tabelul 3 prezintă evoluţia programului de mai sus atunci când apare o bulă.
Ceasul
Instrucţiunea 0 1 2 3 4 5 6 7 8
noop C D E M S
noop C D E M S
scrie 2 în R3 C D E M S+
aduna 5 la R3 C C* C* D+ E M
noop C D E
Table 3: Avansul instrucţiunilor într-un pipeline cu blocaj. Steluţa indică un blocaj: la momentul
respectiv instrucţiunea indicată rămâne în acelaşi stagiu. Pentru că starea BA se poate citi pe fiecare
coloană, observaţi că la momentul de timp 4 numai stagiile C, E, M şi S apar; asta înseamnă că stagiul
D conţine o bulă. La momentul următor bula se propagă în stagiul E, şi o nouă bulă apare în stagiul D.
De îndată ce instrucţiunea care scrie în R3 ajunge în stagiul S, instrucţiunea următoare poate continua,
pentru că a obţinut rezultatul. Observaţi că acum dependenţa este rezolvată, pentru că semnele + sunt în
aceeaşi coloană, deci rezultatul este deja disponibil când este cerut.
De îndată ce instrucţiunea care avea resursele cerute îşi termină execuţia, instrucţiunile de după ele, care
aveau nevoie de resurse, îşi pot continua execuţia în mod obişnuit. Blocarea unei instrucţiuni în BA este
relativ uşor de produs: registrul de separaţie de dinaintea acelui stagiu nu mai citeşte valorile produse de
stagiul anterior, ci păstrează vechiul său conţinut.
Soluţia prin care compilatorul inserează instrucţiuni inutile se numeşte statică, pentru că programul apoi
rămâne neschimbat. Prin contrast, atunci când bulele sunt create de microprocesorul însuşi atunci când
programul se execută, tehnica se numeşte dinamică. Observaţi că şi în acest caz programul din memorie
este neschimbat: bula apare doar în BA, şi apoi dispare.

Soluţia asta pare acceptabilă. Care este costul pe care trebuie să-l plătim?

În primul rând trebuie hardware special pentru a detecta dependenţele. Asta înseamnă practic o serie de
comparatoare: un comparator compară registrul în care scrie instrucţiunea care se află în stagiul 4 cu
regiştrii citiţi de instrucţiunile din stagiile 3, 2. Un alt comparator se uită să vadă dacă tipurile de
instrucţiuni din aceste stagii într-adevăr folosesc regiştri (de pildă o instrucţiune de salt imediat nu
foloseşte nici un registru. Dacă, de pildă, instrucţiunea din stagiul 4 va scrie în registrul consumat de
instrucţiunea din stagiul 2, atunci stagiul 2 este blocat, stagiile 3 şi 4 avansează, iar în stagiul 3 se
formează o bulă.
Un al doilea preţ pe care-l plătim pentru blocaj este scăderea performanţei. Din cauză că instrucţiunile
nu avansează şi BA procesează nimicuri, rata efectivă cu care instrucţiunile sunt executate scade sub una
pe ciclu. Cât de mult scade, depinde de o sumedenie de factori, începând cu calitatea compilatorului şi
terminând cu capacitatea BA de a evita blocajele prin următorul mijloc pe care-l analizăm, înaintarea.

Înaintarea (forwarding)
În exemplul de mai sus, o instrucţiune aflată în stagiul de decodificare avea nevoie de nişte date pe care
instrucţiunea aflată în stagiul de execuţie tocmai le calculase. Cea din stagiul de decodificare însă trebuia
să aştepte ca rezultatul calculelor să fie pus într-un registru, ceea ce se va întâmpla abia mai târziu. Ideea
este atunci simplă: din moment ce tot am deja rezultatul, de ce să mai aştept să fie scris în registru şi apoi
să-l iau din nou? Ce-ar fi dacă producătorul ar trimite rezultatul pe o scurtătură direct la consumator?
Această tehnică se numeşte “înaintare” (forwarding), deşi strict vorbind este o “înapoiere”, pentru că
datele sunt trimise înapoi în BA, de la producător la consumator. Asta permite instrucţiunii din stagiul de
decodificare să-şi continue execuţia netulburată, fără a mai fi nevoie de introducerea unei bule. Înaintarea
este ilustrată în figura 3

Figure 3: Stagiul de execuţie împreună cu cărarea de înaintare a datelor. Stagiul de execuţie poate prelua o valoare
fie de la stagiul de decodificare, fie de la propria sa ieşire. Noul multiplexor introdus, în partea de jos a figurii, face
această alegere. Multiplexorul este comandat de un comparator care se uită să vadă dacă una dintre instrucţiuni
produce valoarea unui registru de care cealaltă are nevoie.
Soluţia este clar preferabilă, pentru că viteza de execuţie rămâne aceeaşi, o instrucţiune pe ciclu. Costul
plătit este însă în hardware: pe lângă circuitele prezente în cazul blocării, înaintarea are nevoie de o
mulţime de trasee speciale şi circuite de selecţie (multiplexoare) pentru a trimite datele pe scurtături.
Procesoarele reale folosesc deci o mixtură a celor trei tehnici prezentate anterior; nu orice se poate rezolva
cu înaintare, aşa că blocajul este practic întotdeauna necesar. (Un exemplu ar fi o instrucţiune care
termină de calculat un rezultat abia în stagiul 4, dar care este consumat de instrucţiunea următoare în
stagiul 2. În momentul în care a doua instrucţiune vrea valoarea, ea nici nu există, deci înaintarea nu este
de nici un folos., deci trebuie folosit un blocaj.)
Variaţiuni şi concluzii
Pipelining-ul este până la urmă o metodă destul de simplă şi cu o eficacitate imediată. În procesoarele
moderne nu numai fazele de execuţie ale unei instrucţiuni sunt pipelined, ci şi operaţiile aritmetice; de
pildă unele unităţi aritmetice calculează o înmulţire pe 32 de biţi în 5-6 cicli de ceas, dar pentru că
înmulţitorul este pipelined, el poate accepta o nouă pereche de operanzi la fiecare ciclu, şi poate produce
rezultate cu aceeaşi frecvenţă.
Procesoarele moderne folosesc un întreg arsenal de alte tehnici, extrem de sofisticate,
dintre care enumerăm aici:
Superpipeline:
am definit acest termen deja: indică un pipeline extrem de adânc, câteodată de peste 10 stagii.
Superscalar:
procesoarele superscalare au la dispoziţie mai multe pipelines paralele, şi pot lansa în execuţie
mai multe instrucţiuni simultan. Pentium II are de pildă două BA, numite U şi V. Un astfel de
procesor poate termina mai multe instrucţiuni în fiecare ciclu de ceas!
VLIW:
este un acronim de la Very Long Instruction Word, adică “instrucţiuni foarte lungi”. Astfel de
procesoare au instrucţiuni formate din mai multe instrucţiuni elementare (ex. o adunare şi o
scădere simultan). Compilatorul are sarcina să grupeze instrucţiunile laolaltă în aşa fel încât să
poată fi executate simultan. Diferenţa faţă de un superscalar este că superscalarul decide dinamic
care instrucţiuni merg împreună, pe când la VLIW acest lucru se face la compilare.
Reordonare:
procesoarele moderne sunt în stare să execute instrucţiunile în altă ordine decât cea în care sunt
prezente în program; asta se numeşte out of order execution. Practic ele realizează echivalentul
operaţiei de scheduling pe care o fac compilatoarele, dar o fac în mod dinamic. Avantajul este că
dacă trebuie să blochezi o instrucţiune în BA dar cele de după ea au toate resursele disponibile,
poţi să le laşi s-o ia înainte, ţinând BA ocupată.
Execuţia speculativă:
este o tehnică folosită pentru a micşora impactul hazardurilor de control (adică dependenţele
produse de salturi). Procesorul presupune că saltul se face într-o anumită direcţie şi încarcă în
BA instrucţiunile de la “destinaţie” (asta se numeşte speculaţie - speculation). Dacă se dovedeşte
că a greşit în ghicirea adresei de destinaţie a saltului, atunci pur şi simplu şterge tot ce a încărcat
greşit în BA şi începe execuţia de la locul unde mergea în realitate saltul.
Prezicerea salturilor:
am văzut că dependenţele de control sunt foarte costisitoare, şi forwarding nu ajută în cazul lor
(pentru că adresa destinaţie este calculată relativ târziu, dar este necesară foarte devreme, în
chiar primul stagiu, care aduce instrucţiuni din memorie). Pentru asta procesoarele moderne
încearcă să ghicească în mod inteligent direcţia unui salt, bazându-se pe execuţiile trecute ale
acelui salt. O cantitate enormă de hardware este dedicată acestui scop.

CAP.2 ARHITECTURI BAZATE PE CONCEPTUL DE FLUX DE DATE

2.1 Definirea conceptului de flux de date

Cercetările care au dus la aparitia conceptului de flux de date şi la rezolvarea arhitecturilor care-i
utilizează, au început la sfârsitul deceniului sapte, principalii autori fiind J.Rodriguez, D.Adams şi, ceva
mai târziu (1974) J.B.Dennis, (4), (6).
Structurile de tip Von Neumman duc la o limitare în cresterea performantelor, mai ales a vitezei,
datorită a două caracteristici principale:
-existenta unei memorii globale care contine date şi instructiuni, la care unitatea centrală este
obligată să execute multiple accese; pentru aplicatii mai complexe memoria, chiar implementată sub
formă distribuită, devine un factor de strangulare a fluxului de date, datorită faptului că necesită un timp
pentru a răspunde la fiecare acces;
-existenta unui numărător de instructiuni, care va idndica adresa următoarei instructiuni ce se va
executa; nici o instructiune nu se va putea executa fără a fi aplelată prin intermediul numărătorului de
instructiuni, ceea ce duce la un control centralizat, unic, al aducerii şi executiei tuturor instructiunilor.
Cea de-a doua trăsătură va limita drastic cresterea gradului de paralelism în executia unui program,
chiar în conditiile în care programatorul specifică în mod explicit paralelismul în cadrul programului.
Pentru minimizarea efectului celor două limitări s-au încercat mai multe solutii: implementarea
conceptelor de suprapunere şi bandă de asamblare, structurile vectorizate, structurile multiprocesor,
fiecare însă avînd propriile dezavantaje.
O alternativă la structurile amintite o constituie structurile bazate pe conceptul de flux de date.
Regula de bază a acestui concept constă în executia de către un procesor a unei instructiuni atunci
când toate datele necesare executiei instructiunii îi sunt disponibile. Rezultă marele avantaj, al exploatării
paralelismului implicit al unei aplicatii. Executia instructiunilor într-o asemenea structură nu mai este
secventială, ci este conditionată doar de dependentele care există între date. Aceasta duce la posibilitatea
de a executa în paralel toate instructiunile ale căror date nu au dependente între ele, deci, paralelismul
este aplicat, la nivelul instructiunilor, fără a cere programatorului specificarea acestuia.
Pentru reprezentarea programelor care rulează pe structuri cu flux de date se folosesc grafuri, în care
nodurile se asignează operatiilor, iar legăturile dintre noduri, arcurile, reprezintă dependentele între
operatii. De-a lungul arcurilor vor fi transportate datele, reprezentate prin simboluri. Un nod va executa
operatia programată dacă la intrările sale au sosit toate simbolurile corespunzătoare operatiei respective.
Simbolurile de la intrare sunt preluate de nod, ele dispar de la intrările sale şi se va produce un simbol
rezultat, la iesirea nodului, care va fi transportat la intrările altor noduri. Întrucât singura conditionare în
executia unei operatii constă în dependentele între date, regurile de executie sunt locale şi ele permit
realizarea operatiilor cu viteze diferite pe diferite lanturi de noduri.
Figura 2.1 prezintă graful aferent executiei expresiei: E=(2+7)×(9+10) .Simbolurile care transportă
datele sunt reprezentate prin cercuri. Există două noduri care realizează operatia de adunare ce lucrează
în paralel şi un nod care obtine rezultatul, avînd ca intrări rezultatele partiale generate de nodurile din
primul nivel. Se observă că expresia este obtinută în doi pasi fată de situatia clasică, secventială, în care
executia ar necesita trei pasi.
În conformitate cu regurile descrise mai sus, rezultă câteva trăsături ale structurilor cu flux de date, în
primul rând nu se utilizează variabilele, întrucât o operatie este executată atunci şi numai atunci când în
sunt disponibile toate intrările. Rezultă că nu mai este necesară o memorie globală, deci se elimină unul
din dezavantajele principale ale structurii de tip Von Neumman. Apoi, caracterul local al regurilor de
lucru elimină şi necesitatea existentei unui control centralizat, unic, reprezentat de numărul de
instructiuni.

2 7 9 10 + +

+ + 9 19

X X

+ +

Fig.2.1 Executia unui program


X într-o structură cu flux
de date

171

În general, un nod realizează doar executia momentană a operatiei asupra intrărilor curente fără a
tine cont de istoria operatiilor realizate.Totusi în unele cazuri, procesoarelor li s-a atasat o memorie
realizându-se astfel posibilităti de memorare pentru noduri.
Pornind de la regula de bază care descrie functionarea unei structuri cu flux de date, în decursul
timpului au apărut completări şi variante de implementare. Astfel regula este completată cu cerinta ca un
nod, în momentul în care execută operatia şi consumă simbolurile de la intrare să nu aibă vreun simbol pe
iesire. În caz contrar există riscul ca un simbol anterior existent la iesirea unui nod care nu a fost
consumat să interactioneze cu noul simbol. Există totusi posibilitatea de a elimina acest risc prin
prevederea la intrările nodului a câte unui tampon de tip FIFO, dezavantajul fiind cresterea complexitătii
schemei.
În functie de modul de executie, se pot delimita două tipuri de structuri cu flux de date: comandate de
date şi comandate de cereri. În cazul primului tip functionarea unui nod este următoarea:
-executia operatiei este comandată, cerută, prin disponibilitatea tuturor intrărilor;
-în urma executiei nodul generează o nouă dată care va constitui intrare pentru alt nod.
În cazul celui de-al doilea tip au loc următoarele evenimente:
-unui nod i se cere executia unei operatii-cererea apare pe arcul de iesire al nodului;
-la rândul său nodul cere date, prin intermediul arcelor sale de intrare;
-alte noduri transmit datele cerute la intrarea nodului comandat ca urmare a aparitiei unei cereri ;
-nodul comandat execută operatia cerută şi generează rezultatul.
O caracteristică generală a tuturor structurilor cu flux de date constă în aceea că două arcuri nu este
permis să fie conectate simultan la intrarea unui nod. Aceasta ar duce la o executie aleatoare din partea
respectivului nod.
Conceptul de flux de date prezintă importante avantaje. Pe lângă modularitate, flexibilitate şi
posibilitate de extensie, principalul avantaj îl constituie detectarea paralelismului. Programatorul nu
trebuie să analizeze programul pentru a determina gradul de paralelism. Din modul de descriere a
programului printr-un graf, operatie executată de compilator, rezultă nivelul de paralelism. Operatiile ce
pot fi executate concurent vor putea fi reprezentate prin noduri alăturate în timp ce operatiile a căror
executie este secventială, există dependente între date, vor fi reprezentate prin noduri asezate unul sub
celălalt.
Pentru a creste doza de lucru există posibilitatea implementării conceptului de suprapunere. Nodul
poate fi astfel conceput încât după ce a consumat simbolurile de la intrare să poată prelua alte simboluri
chiar dacă nu a generat încă simbolul rezultat.

2.2 Reprezentarea grafică a programelor în sisteme orientate pe


conceptul de flux de date

După cum s-a arătat în paragraful precedent, un program ce va rula pe o structură cu flux de date se
reprezintă sub formă de graf. Nodurile, implementate prin procesoare, reprezintă operatorii iar arcurile,
implementate printr-o retea de interconectare, indică dependentele între operatori. Pe arcuri vor fi
transportate datele, prin intermediul unor simboluri.
Într-un graf notatia din cadrul semnului pentru un nod indică operatia ce o efectuează. Operatia se
va repeta de fiecare dată când la intrări vor sosi toate datele. Dacă notatia reprezintă o constantă nodul va
genera de fiecare dată constanta respectivă. Figura 2.2 prezintă graful pentru calcul expresiei yy+3y-7.
Rezultatele obtinute la iesirile nodurilor corespund intrărilor într-o relatie de tipul primul intrat-primul
iesit. În figura 2.2 se observă că între cele două noduri care realizează operatia de înmultire nu există arc,
deci nu există dependentă de date între cele două noduri. Rezultă că cele două operatii se pot realiza
simultan.
Lipsa dependentei între datele celor doi operatori se mai numeste şi concurentă spatială sau
orizontală. Există şi concurenta temporală, care apare între executiile corespunzătoare seturilor diferite de
intrări. Figura 2.3 prezintă paralelismul temporal în cazul grafului pentru calculul expresiei yy+3y-7
avînd ca date, succesiv valorile 2,3 şi 4. Se observă cum pătrunde primul set de date, figura 2.3b, în cazul
nostru valoarea 2.

y 3

X X

+ Fig.2.2 Graful pentru calculul


expresiei y ˛ +3y-7
7
-

Nodurile ce realizează operatia de înmultire preiau valorile de la intrare şi generează un rezultat


partial care va fi intrare pentru nodul următor. Figura 2.3c arată sosirea datelor la nodul care realizează
operatia de adunare simultan cu intrarea în graf a celui de-al doilea set de intrări, valoarea 3 în cazul
nostru. Din acest moment se poate evidentia implementarea naturală a conceptului de suprapunere. Cele
două nivele de noduri vor lucra în paralel consumînd intrările şi generînd rezultate partiale, simultan cu
intrarea în graf a celui de-al treilea set de date, valoarea 4 în cazul nostru, figura 2.3d. În continuare vor
apare, pe rând, rezultatele finale corespunzătoare celor trei seturi de intrări.

T F DEMUX

MUX T F

Fig.2.4 Noduri pentru operatiile de multiplexare (selectare)


şi demultiplexare (distribuire)

-4 -4 -4
-3 3 -3 3 3
3
-2
2 2 2 3 3 3 3 3 4 4 4
3
X X X X X X X
X
4 6 9 9

+ + + +
7 7 7
7
10 7
- - - -
a b c d

3 3 3

X X X X X X
16 12

+ + +
7 7 7
18 7 28 7
- - -
e f g 21
3 3

Fig.2.3 Reprezentarea paralelismului temporal

Reprezentarea conditionărilor, a ramificărilor, într-un graf se face prin intermediul a două tipuri de
noduri, reprezentate în fig. 2.4.
Functionarea nodului MUX, ce realizează functia de selectie este următoarea: la început este absorbit
simbolul de pe intrarea orizontală, care reprezintă o valoare binară. În functie de valoarea sa este selectat
fie simbolul de la intrarea T (TRUE) fie cel de la intrarea F (FALSE) şi trece nemodificat la iesire.
Nodul DEMUX, care realizează functia de distribuire va functiona în modul următor: întocmai ca în
cazul precedent se începe cu absorbirea valorii binare aflate la intrarea orizontală. Simbolul de la intrarea
verticală va fi dirijat fie spre iesirea T (TRUE), fie spre iesirea F (FALSE), în functie de valoarea logică
sosită la intrarea orizontală.
Pentru reprezentarea iteratiilor se folosesc grafuri ciclice. Activarea nodurilor care realizează
operatiile ce definesc iteratia se face prin sosirea simbolului ce aduce prima dată. Subgraful care desrie
corpul iteratiei va produce primul rezultat care va fi dus din nou la intrarea sa şi operatia se repetă până la
indeplinirea unei conditii.
Considerăm un exemplu: fie realizarea functiilor f1 şi f2, repetitiv, în functie de o valoare n în
conformitate cu următoarele relatii:
f1+f2 ..> f2; f1-f2 ..> f1; n-1 ..> n, până la n=5, cu valorile initiale:
1 ..> f1, 1 ..> f2, N ..> n.
Graful care realizează functiile cerute este cel din figura 2.5.
L L N
5
/ / /
f1 f2 n >

T F T F T F

+ - -

Fig.2.5 Graf pentru implementarea unui exemplu cu iterat ||


În exemplul considerat am utilizat noduri care realizează functiile de adunare, scădere, distributie
precum şi noduri cu functii speciale. Nodul din figura 2.6 va genera la iesire valoarea binară “1” dacă
valoarea de pe intrarea din stânga este mai mare decât valoarea de pe intrarea din dreapta sau valoarea
binară “0” în caz contrar. Figura 2.7 prezintă un nod care realizează următoarea functie: la prima sa
activare, iesirea va repeta valoarea aflată pe intrarea din dreapta, iar în continuare, la oricare altă activare
iesirea va repeta valoarea aflată pe intrarea din stânga.

> /

Fig.2.6 Nod care realizează Fig.2.7 Nod pentru selectia


functia “mai mare ca” intrărilor după o anumită regulă

2.3 Probleme ce trebuiesc solutionate la proiectarea sistemelor cu flux de date

Constructia unui sistem cu flux de date impune, în general, solutionarea următoarelor probleme:
a. stabilirea unei reguli unice pentru activarea nodurilor: se porneste de la regula generală conform
căreia un nod poate fi activat atunci când primeste toti operanzii; trebuiesc găsite posibilităti de verificare
şi detectare a sosirii operanzilor la intrările unui nod, precum şi a lipsei unui simbol la iesirea nodului;
b. alocarea nodurilor la procesoare; în general fiecare nod contine un procesor existînd şi posibilitatea
alocării mai multor procesoare la un nod:
c. stabilirea căilor de transmisie între noduri: este o problemă care afecteză decisiv performantele
unui sistem cu flux de date; orice întârziere în transmisia datelor va duce la degradarea performantelor;
un sistem cu flux de date nu trebuie văzut ca o structură rigidă, cu legături fizice fixate; conexiunile între
noduri se crează în timpul rulării programului care rezolvă aplicatia, conform cerintelor:
d. comunicarea cu exteriorul: este necesară implementarea unor tehnici de intrare/iesire pentru
încărcarea datelor şi a programelor şi pentru furnizarea rezultatelor;
e. cresterea gradului de paralelism prin atasarea de etichete simboluri care transportă date; primele
realizări în domeniul structurilor cu flux de date asigurau transportul de date pe arcuri prin intermediul
câte unui singur simbol pe fiecare arc; în acest fel au apărut probleme în două situatii: apelul de subrutină
şi ciclurile; în general apelurile succesive de subrutine se fac cu date de intrare diferite, ceea ce, într-o
primă rază, a dus la necesitatea repetării subgrafului ce implementează subrutina de atâtea ori câte apeluri
există; solutia a fost neeconomică: analog în cazul ciclurilor, sunt situatii în care nu există dependente
între date la diferite iteratii, deci nu are rost să se astepte executarea unei iteratii pentru lansarea
următoareia; pentru găsirea solutiei la cele două probleme de mai sus, s-a pornit de la ideea ca un arc să
poată transfera mai multe tipuri de simboluri; pentru distinctia dintre ele, simbolurilor li s-au atasat
etichete; în acest caz regula de activare a unui nod se modifică în sensul că fiecare nod va fi activat doar
dacă îi sosesc toate datele de intrare care mai trebuie să aibă şi aceleasi etichete; acestea va duce la
posibilitatea de creare, în timpul rulării programului, de copii ale nodurilor; în cazul ciclurilor de exemplu
, fiecare asemenea copie poate fi atasată câte unei iteratii, activarea lor având loc atunci cănd intrările care
sosesc au aceeasi etichetă; analog în cazul apelurilor de subrutine fiecare copie va corespunde unui apel;
crearea de copii se va putea face în măsura în care există resurse fizice disponibile ale sistemului;
f. lucrul cu masive de date: implementarea masivelor de date a ridicat probleme datorită lipsei unei
memorii globale: de exemplu, pentru modificarea unui element dintr-un masiv de date a fost necesară
recopierea întregului masiv cu schimbarea elementului respectiv, ceea ce a dus la scăderea vitezei de
lucru; şi în acest caz o solutie poate fi etichetarea, fiecărui element fiindu-i asociată o etichetă care indică
positia sa în cadrul masivului;
g. lucrul cu sirurile: permite cresterea performantelor prin implementarea conceptului de suprapunere:
considerînd, de exemplu, două subgrafuri, unul care produce un sir de date şi unul care îl consumă, nu
există nici un motiv ca cel ce primeste datele să nu poată începe prelucrarea primei valori înainte de a o
primi pe ultima; analog, în principiu, cel ce produce datele nu trebuie să astepte prelucrarea de către cel ce
le consumă;
h. tratarea exceptiilor locale şi globale: problema este deosebit de complexă, mai ales în cazul
exceptiilor globale, întrucât diferite noduri pot fi în diferite grade de activare;
i. detectarea încheierii executiei unui program: executia programului începe prin furnizarea de
simboluri la intrările grafului şi se va încheia atunci când nici un nod nu este activat; întrucât, la un
moment dat, pot fi activate simultan mai multe noduri este necesară păstrarea tuturor nodurilor la nivel
centralizat; programul se încheie atunci când din această listă rezultă că nici un nod nu este activ şi, în
plus, nu mai sosesc date la intrările grafului.

2.4. Structura generală a unui sistem cu flux de date

Se va prezenta structura generală, simplificată, a unui sistemcu flux de date în care circulă simboluri
cu etichete. Se consideră că nodurile sunt cu una sau două intrări. Se pot distinge două tipuri de simboluri:
-simboluri atasate valorilor care contin una sau două valori şi o etichetă;
-simboluri atasate functiilor care contin identificatorul functiei, valorile corespunzătoare şi o etichetă.
Prima problemă ce trebuie rezolvată constă în conceperea unei structuri hardware care, într-o
variantă simplificată, poate fi o structură în formă de inel. Următoarea problemă constă în initializarea
acestei structuri, operatie care se execută prin încărcarea unui program care corespunde stării initiale a
masinii şi a grafului ce trebuie executat. În cele mai multe cazuri aceasta se realizează prin intermediul
unui calculator sau a unei unităti de intrare/iesire specializate. Structura este prezentată în figura 2.8.
Se distinge prezenta a patru unităti functionale separate în care circulă simboluri în conformitate cu
graful ce trebuie executat. Întrucât modul de lucru este asincron există posibilitatea ca unul din blocuri să
furnizeze simboluri rezultat mai repede decât pot fi ele consumate de unitatea care le primeste. Aceasta
poate duce la o acumulare de simboluri pe legături şi pentru a evita pierderea lor se pot prevedea blocuri
de memorie rapidă şi de mică capacitate de tip FIFO, între unităti. În unele cazuri aceste blocuri sunt
incluse în unitătile functionale. Plasarea memoriilor FIFO nu rezolvă în totalitate problema. Apare o
scădere a performantelor datorită sufocării unor linii de comunicatie între unităti. Pentru evitarea acestei
situatii o atentie deosebită trebuie acordată fazei de generare a grafului.
Figura 2.8a prezintă structura generală a unei masini cu flux de date în care memoriile FIFO sunt
incluse în unitătile functionale iar figura 2.8b prezintă varianta în care memoriile FIFO sunt plasate între
unităti.
Unitatea selectie simboluri este conectată cu o memorie pentru simboluri. La fiecare ciclu unitatea
primeste un simbol valoare care contine un câmp de valoare, unul de etichetă şi unul de destinatie.
Unitatea cercetează dacă nodul destinatie este sau nu cu o singură intrare şi, în caz afirmativ,
simbolul este transmis mai departe. Dacă nodul necesită două intrări unitatea va căuta în memorie
simbolul cu aceeasi etichetă, aceeasi destinatie dar care corespunde celeilalte intrări. Dacă căutarea nu
reuseste simbolul intrat va fi depus în memoria pentru simboluri în asteptarea unui partener. Dacă
căutarea reuseste, se va genera un simbol functie care contine cele două valori, eticheta şi destinatia.
Unitatea aducere instructiuni împreună cu memoria pentru instructiuni furnizează instructiunile ce
implementează nodurile grafului.

Memorie Memorie
pentru pentru
simboluri instructiuni

Unitate Unitate Unitate Unitate


selectie aducere executie de
simboluri instructiuni instructiuni distributie

Memorie Memorie
pentru pentru
simboluri instructiuni

Unitate A Unitate B Unitate C Unitate


selectie FIFO aducere FIFO executie FIFO de
simboluri instructiuni instructiuni distributie

D
FIFO

Fig.2.8 Structura generală a unei masini cu flux de date

La sosirea unui simbol, câmpul destinatie al acestuia va specifica instructiunea ce se va alege rezultînd un
simbol alcătuit din cele două valori de intrare, eticheta, functia şi destinatia.
Unitatea executie instructiuni realizează operatiile ce corespund nodurilor grafului. Rezultă un simbol
care contine rezultatul, eticheta şi destinatia.
Unitatea pentru distributie are rolul să separe un simbol care contine mai multe rezultate, împreună
cu mai multe destinatii, în simboluri cu câte un rezultat şi o destinatie, păstrînd şi eticheta din simbolul
intrare.
Tabelul 2.1 prezintă care este structura simbolurilor în diferite puncte din masină. Se consideră cazul
unor operatii ce furnizează două rezultate.

Pozitie Structură simbol

A valoarea 1,2, etichetă, destinatie


B valoarea 1,2, etichetă, functie, destinatie
C rezultat 1,2, etichetă, destinatie 1,2
C rezultat, destinatie, etichetă
Pentru îmbunătătirea performantelor structurii prezentate se poate aplica solutia multiplicării
unitătilor critice sau întregii structuri. Dacă sunt multiplicate doar unele unităti este necesară inserarea de
module de memorie între o unitate singulară şi una multiplicată, în scopul de repartitie a simbolurilor
pentru fiecare copie a unei unităti multiplicate pentru a permite lucrul independent al acestora.

n-p linii de adrese mai semnificative


.
.
.

... ... ...


Tampon Tampon ... Tampon

Modul 0 Modul 1 ... Modul 2p-1

Linii de date

. .
. DECODIF .
ICATOR
. .
p linii de adrese
mai putin semnificative

Fig 4.4 Organizarea memoriei cu selecţie succesivă


a modulelor

aceste întârzieri sunt egale iar în caz contrar perioada fiind egală cu întârzierea maximă pe
un post, iar pe axa y este reprezentat numărul de nivele din banda de asamblare, se poate
observa câştigul în timp care rezultă datorită acestui tip de structură. Figura 4.6 a prezintă
cazul unei structuri fără bandă de asamblare iar figura 4.6 b pe cel al unei structuri cu
bandă de asamblare.
Din figura 4.6 a se observă că numărul de subcicli necesari execuţiei a m
instrucţiuni este 2m în tipm ce din figura 4.6 b rezultă că o unitate centrală cu bandă de
asamblare cu două nivele execută acelaşi m instrucţiuni în (m+1) subcicli. I1, înseamnă
prima instrucţiune, I2 înseamnă a doua instrucţiune ş. a. m. d.

Nivele
Execuţie I1 I2 I3 I4
Aducere I1 I2 I3 I4

1 2 3 4 5 6 7 8 Timp

a) - fără bandă de asamblare

Nivele
Execuţie I1 I2 I3 I4 I5 I6 I7
Aducere I1 I2 I3 I4 I5 I6 I7

1 2 3 4 5 6 7 8 Timp

b) - cu bandă de asamblare

Concluziile obţinute se referă la situaţia ideală. În realitate preformanţele sunt mai


scăzute datorită următoarelor cauze:
- timpii de întârziere pe cei doi subcicli nu sunt egali; subciclul de execuţie este în
majoritatea cazurilor, mai lung decât de aducere înreucât el presupune accese frecvente la
memorie pentru citirea operanzilor şi dupunerea rezultatelor;
- apariţia unei instrucţiuni de salt condiţionat va face ca următoarea instrucţiune al
cărei cod trebuie să fie adus să nu fie cunoscutădecât după trecerea ei prin subciclul de
execuţie.

Nivele

E
I1 I2 I3
CO
I1 I2 I3
CAO
I1 I2 I3
DCI
I1 I2 I3
ACI
I1 I2 I3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Timp

Nivele

E
I1 I2 I3 I4 I5 I6 I7 I8 I9 I10 I11
CO
I1 I2 I3 I4 I5 I6 I7 I8 I9 I10 I11
CAO
I1 I2 I3 I4 I5 I6 I7 I8 I9 I10 I11
DCI
I1 I2 I3 I4 I5 I6 I7 I8 I9 I10 I11
ACI
I1 I2 I3 I4 I5 I6 I7 I8 I9 I10 I11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Timp

Fig 4.7 Diagrama timp-execuţie într-o unitate centrală


- fără bandă de asamblare
- cu bandă de asamblare cu cinci nivele

Au fost căutate soluţii pentru minimizarea efectului acestor cauze. Astfel una
constă în egalizarea timpului de întârziere, cât mai mult posibil, pe nivele, ceea ce se poate
face prin creşterea numărului acestora şi alocarea corespunzătoare de sarcini. Se poate
împărţi ciclul unei instrucţiuni în cicci subcicli:
- aducerea codului de instrucţiune - ACI
- decodificarea codului de instrucţiune - DCI
- calculul adresei operanzilor - CAO
- citirea operanzilor - CO
- execuţia - E
Figura 4.7 prezintă diagrama timp-execuţie în cazul în care ciclul instrucţiune este
împărţit în cinci subcicli. Figura 4.7 a) arată cazul unei unităţi centrale fără bandă de
asamblare iar figura 4.7 b) arată cazul unei unităţi centrale cu bandă de asamblare. Se
observă o creştere a performanţei faţă de cazul anterior. Pentru execuţia a m instrucţiuni o
unitate centrală fără bandă de asamblare va avea nevoie de 5m subcicli iar una cu bandă de
asamblare va avea nevoie de (m+4) subcicli. Structura unei unităţi centrale cu bandă de
asamblare cu cinci nivele este prezentată în fig.4.8.

4.5 Unităţi aritmetice cu bandă de asamblare


Conceptul de bandă de asamblare este deosebit de eficient în cazul operaţiilor
aritmetice.
De exemplu, în cazul înmulţirii a doi operanzi Z = z3z2z1z0 şi Y = y3y2y1y0, fig.
4.9 prezintă operaţiile elementare ce trebuiesc executate şi care pot fi alocate unor nivele
dintr-o bandă de asamblare. Trebuiesc realizate înmulţirea rangurilor, deplasări şi adunări.
Aducere cod de instrucþiune

Decodificare cod de instrucþiune

Calculul adresa operanzi

Citire
operanzi

Execuþie

Fig. 4.8 Unitate centrală cu bandă de asamblare cu cinci nivele

z3 z2 z1 z0
y3 y2 y1 y0
z3y0 z2y0 z1y0 z0y0
z3y1 z2y1 z1y1 z0y1
z3y2 z2y2 z1y2 z0y2
z3y3 z2y3 z1y3 z0y3
p6 p5 p4 p3 p2 p1 p1= p = ZxY

Fig. 4.9 Înmulţirea a doi operanzi pe câte patru ranguri binare

În cazul operaţiilor în virgulă flotantă eficienţa benzii de asamblare


creşte.Considerând adunarea a doi operanzi în virgulă flotantă Z = zx2 la putrea a şi Y =
yx2 la puterea b se va obţine rezultatul U = ux2 la puterea c. Operaţiile elementare ce
trebuiesc executate sunt: scăderea exponenţilor, aliniere, adunare şi mormalizare.
În continuare se av prezenta un exemplu de unitate aritmetică cu bandă de
asamblare, (1), (5). Calculatorul ASC al firmei Texas Instruments cuprinde patru
asemenea unităţi independente, fiecare fiind alcătuită din opt nivele de prelucrare. Schema
bloc a unei asemenea unităţi este prezentată în fig. 4.10. Poate efectua operaţii aritmetice
cu operanzi în virgulă fixă sau flotantă, cu lungimea de 16, 32 sau 64 biţi.
Operanzi
Tampon Generare Scanare
intrare Înmulþire exponent
produs

Aliniere Adunare Normalizare Tampon


ieşire Rezultantă

Fig. 4.10 Unitate aritmetică din calculatorul ASC

Unitatea este multifuncţională, având posibilitatea de a se configura în funcţie de


operaţia cerută. Figura 4.11 prezintă configuraţiile unităţii aritmetice pentru operaţiile în
virgulă flotantă fixă: adunare, a şi înmulţire, b, iar figura 4.12 prezintă configuraţiile
unităţii aritmetice pentru operaţiile în virgulă flotantă: adunare, a şi înmulţire, b.
În figura 4.10 fiecare nivel a fost denumit conform funcţiei pe care o execută. Se
observă multitudinea de conexiuni ce pot posibile. Din figurile 4.11 şi 4.12 rezultă
posibilităţiile de reconfigurare pe care le are această unitate aritmetică.
Unităţile aritmetice cu bandă de asamblare sunt foarte eficiente în cazul operaţiilor
de înmulţire a două matrici. Problema a fost abordată şi în cadrul cap. 3 arătându-se
avantajele pentru acest tip de operaţie. Conceptul de bandă de asamblare este implementat
şi în cadrul arhitecturilor sistolice chiar începând cu principiul acestor arhitecturi.

Operanzi
Tampon Tampon
intrare Adunare
ieşire
Rezultat
a)

Operanzi
Tampon Tampon
Înmulţire Adunare
intrare ieşire

Rezultat
b)

fig. 4.11 Configuraţiile unei unităţi aritmetice din calculatorul ASC pentru
a) - adunare în virgulă fixă
b) - înmulţire în virgulă fixă
Operanzi Operanzi
Tampon intrare Tampon intrare

Înmulţire

Generare produs

Scădere exponenţi Scădere exponenţi

Aliniere Aliniere

Adunare Adunare

Tampon ieşire Tampon ieşire

Rezultat Rezultat
a b
Fig. 4. 12 Configuraţiile unei unităţi aritmetice din calculatorul ASC pentru
a - adunare în virgulă flotantă
b - înmulţire în virgulă flotantă

4.6 Probleme ce trebuiec considerate la proiectarea


structurilor cu bandă de asamblare

Performanţele strucutrilor cu bandă da saamblare sunt afectate de o serie de


factori. O proiectare corespunzătoare poate minimiza şi în unele cazuri chiar elimina
efectul acestora. Pe lângă prezentarea acestor factori se vor descrie şi câteva soluţii mai
des utilizate.

4.6.1 Întârzieri pe nivele

Problema a mai fost amintită, arătându-se că în cadrul unei benzi de asamblare


nivelulcel mai lent va impune viteza de lucru a întregii benzi. În exemplul din fig. 4.13 deşi
trei nivele au întârzierea t, datorită întârzie

Intrare t t 2t t
Ieşire
Tact

Fig. 4.13 Banda de asamblare cu întârzieri inegale pe nivel

Nivel iniţial

Intrare t t t t t
Ieşire
Tact

Fig. 4.14 Descompunerea nivelului mai lent

Intrare
t t 2t t
Ieşire

2t

Tact

Fig. 4.15 Multiplicarea nivelului mai lent

Memoria

Tampon Tampon

Tampon Tampon

Bandă Bandă
de asamblare de asamblare

D D ...

Nivel Nivel ...


R1 R1
l l
D
... Nivel
Rk k

... D D D

R1
...
K
R(l+1 Scriere Nivel
) 1
I Nivel
Citire l+1

I
D R(k-
Scriere
1)
Rk
K Nivel
Citire k-1

B<K> I Nivel
Scriere k

A<I> K
A<I> Scriere
B<K> B< A<I>
K>

A<I>

a)

B<K> B<I>

B<K>
A<
I>
b)
B Bandă de R A
an asablare <
dă 2 K
de >

as
ab
la
re

NIvele
E

CO

CAD

DCI

ACI

Timp

dana măduţă mihaela


LUCRARE DE PRACTICA

Toate elementele procesoare executa aceleasi operatii , sub comanda unitatii de control , dar
asupra unor operanzi diferiti obtinuti din memoriile locale. Operanzii sunt incarcati in memoriile locale
inaintea lansarii in executie a instructiunii care ii prelucreaza. Incarcarea memoriilor locale se poate face
fie sub controlul unitatii de control a ariei, fie direct din exterior. Exista posibilitatea mascarii unor
elemente procesoare, adica se poate comanda starea de activat sau dezactivat a fiecaruia. Doar elementele
procesoare activate vor efectua operatiile cerute, in timp ce restul vor fi in stari de inactivitate.
Pentru accesul procesoarelor la date unitatea de control transmite
fiecaruia o adresa de baza si modul de adresare. Local, in functie de modul de adresare ales, procesoarele,
vor combina adresa de baza cu continutul unui registru intern rezultind adresa pentru memoria locala.
Utilizind, de exemplu, valori diferite in registrul intern folosit pentru adresarea locala, se pot obtine date
aflate la locatii diferite in diferite memorii locale. De exemplu, utilizind adresarea locala indexata, se pot
obtine datele aflate intr-o diagonala a memoriilor locale. Un element procesor nu poate obtine direct o
data din memoria locala a altui elementprocesor ci numai prin intermrdiul acestuia si a retelei de
interconectare.
O deosebita importanta o are reteaua de interconectare si metodele de directionare a informatiei
de la un procesor la altul. Performantele sistemului sunt decisiv afectate de caracteristicile retelei de
interconectare. Problema retelelor de interconectare va fi tratata intr-un paragraf separat datorita
complexitatii si importantei ei.
Un exemplu de calculator cu tipul de organizare prezentat este ILLIAC IV, care va fi descris
ulterior. Dispune de o retea de interconectare distribuita in care fiecare element procesor este conectat la
patru vecini.
Un alt tip de organizare a unei arii de procesoare este prezentat in figura 5.2. Elementele
procesoare nu mai dispun de memorii locale, in schimb exista un numar de module de memorii, care pot
fi adresate de oricare din procesoare. Deci solutia utilizeaza memorii partajate. Numarul modulelor de
memorie nu trebuie sa fie egal cu cel al celulelor procesoare. Exista si in aceaste varianta o retea de
interconectare dar aceasta este plasata intre elementele procesoare si modulele de memorii. Aceasta
trebuie sa aiba urmatoarele caracteristici.
- sa ofere maxim de flexibilitate; sa permita un numar cit mai mare de combinatii procesor
memorie, adica cit mai multe procesoare sa poata comunica cu cit mai multe memorii,
- sa fie rapida,
- riscul de blocare sa fie minim,
- riscul de conflict sa fie minim; conflictul poate apare ca urmare fie a doua sau mai multe accese
simultane la acelasi modul de memorie, fie a incercarii de a utiliza aceeasi cale de comunicare.
Ca exemplu de calculator cu acest tip de organizare, des prezentata in documentatia de
specialitate, (1), se poate aminti BSP (“Buroughs Scientific Processor”).
Pentru caracterizarea performantelor unei arii de procesoare se folosesc patru parametri.
Semnificatiile lor sunt urmatoarele:
- numarul de elemente procesoare: ca exemplu se poate aminti ILLIAC IV cu 64, BSP cu 16 si
MPP (“Massively Parallel Processor”) cu 16384 procesoare.
- setul de functii pentru directionarea informatiilor prin reteaua de interconectare,
- setul de instructiuni pentru: operatii scalare si vectoriale, directionare a datelor, actionare
asupra retelei de interconectare,
- posibilitatile de mascare a elementelor procesoare.

5.3 Arii de procesoare asociative

Daca intr-o arie de procesoare, in locul memoriilor cu acces aleator se folosesc memorii
asociative, se obtine o arie de procesoare asociative. O memorie asociativa este caracterizata de faptul ca
este adresabila prin continut, de unde rezulta un grad inerent de paralelism. Oasemenea memorie va
permite adresarea paralela a mai multor cuvinte spre deosebire de una cu acces aleator din care cuvintele
se obtin in mod succesiv.
Figura 5.3 prezinta structura unei memorii asociarive. Consideram un modul de memorie cu p
cuvinte fiecare pe cite doua ranguri. In structura memoriei intra si un numar de registre al carui rol este
urmatorul:
- registrul de comparare sau cautare, CC: va memora cuvintul care determina selectia in functie
de algoritmul ales se vor cauta locatiile al caror continut sunt intr-o anume relatie cu informatia continuta
in CC,
- are q ranguri,
- registrul de mascare, M: mascheaza sau nu ranguri ale memoriei; prin rangul memoriei
intelegem un un cuvint cu lungimea de p ranguri, alcatuit din rangurile cu aceeasi pondere din toate
cuvintele memoriei - utilizind acest registru exista posibilitatea eliminarii unor ranguri din operatia de
cautare sau comparare - are q ranguri,
-registrul rezultat, R: contine rezultatul curent al operatiei de cautare sau comparare - are p
ranguri,
- regisrul tampon, T: contine rezultatul anterior al operatiei specificate - are p ranguri.
Oricare din aceste registre poate fi actionat din exterior. In plus mai exista numaratoarele care au
rolul sa baleize cuvintele, respectiv rangurile, utilizate in operatia de cautare.
Functionarea memoriei este urmatoarea: registrul CC este incarcat cu o configuratie in vederea
selectarii tuturor cuvintelor care au acea configuratie sau anumite cimpuri ale ei. Aceasta se stabileste de
configuratia incarcata in registrul de marcare care va permite neluarea in considerare a unor ranguri sau
cimpuri. Apoi se genereaza semnale de interogare catre toate rangurile care nu au fost mascate. In functie
de tipul de organizare a memoriei, interogarea se va face paralel sau secvential. Rezultatul se va depune in
registrul de rezultat, fiecare rang al sau indicind un cuvint care a indeplinit conditia. In cazul cind trebuie
indeplinite mai multe conditii va fi folosit si registrul temporar.

In functie de modul cum se face interogarea, in paralel pe toate rangurile sau secvential, exista
doua tipuri de organizare a unei memorii asociative. Figura 5.4 prezinta cautarea paralela. Semnalele de
cautare sunt activate simultan pentru toate rangurile tuturor cuvintelor. Cautarea este paralela la nivel de
cuvint si de bit. Exista q registre indicatoare, RIO-(q-1), corespunzator numarului de ranguri. Fiecare
registru indicator va memora care cuvint a indeplinit conditia corespunzatoare rangului respectiv.
Rezultatul cautarii se obtine prin intersectia tuturor continuturilor registrelor indicatoare.
Figura 5.5 prezinta organizarea bazata pe cautare secventiala. La un moment dat este implicata
in cautare un rang al tuturor cuvintelor. Exista o logica exterioara care va selecta pe rind rangurile
memoriei. Cautarea este paralela la nivel de cuvint, dar secventiala la nivel de bit. Si aici exista q registre
indicatoare, fiecare memorind care cuvinte au indeplinit conditia corespunzatoare a rangului respectiv,
dar intersectia continuturilor lor se va face succesiv.
Pentru mai multa claritate se considera un exemplu. Se presupune ca se doreste cautarea printre
angajatii unei firme a acelora care sunt ingineri si nu au mai mult de 30 ani. Deci trebuiesc facute doua
cautari.Figura 5.6 prezinta organizarea memoriei si starea registrelor. In figura 5.6.a se observa rezultatul
primei cautari.

In registrul CC a fost incarcata conditia, din care intereseaza doar codul pentru profesie. Ca
urmare toate celelalte ranguri vor fi mascate,ceea ce se observa din configuratia aflata in registrul de
mascare, M. In urma cautarii rezulta configuratia depusa in registrul R. Figura 5.6.b arata starea
registrelor dupa a doua cautare si rezultatul final. Registrul CC contine conditia, din care -intereseaza
doar cimpul pentru virsta. Ca urmare, registrul de mascare va masca toate celelalte ranguri. Rezultatul
celei de-a doua cautari este depus in registrul R si apoi se executa o operatie SI logic intre continuturile
registrelor R si T. In registrul T a fost transferat rezultatul primei cautari. In registrul R ramine rezultatul
final.
In exemplul considerat, tinind sema de faptul ca cele doua cautari s-au executat ca urmare a unor
conditii diferite, carora le corespund cimpur diferite in registrul CC, intreaga operatie s-ar fi putut efectua
intr-o singura trecere, daca algoritmul de calcul ar fi fost acelasi. Dar la prima trecere s-au cautat cuvinte
care aveau valoarea unui cimp egala cu o anumita valoare iar la a doua trecere sau cautat cuvinte care
aveau valoarea unui cimp mai mica decit o anumita valoare. Chiar si in aceste conditii cautarea intr-o
singura trecere este posibila principial, dar cu costul unei logici interne complexe. Daca doua sau mai
multe cerinte se refera la aceeasi conditie, la acelasi cimp din registrul de cautare si comparare, CC,
atunci cautarea prin mai multe treceri devine obligatorie. Rezultatul final se va obtine intotdeauna in R.
Ariile de procesoare asociative pot implementa in mod optim un set de algoritmi a caror functie
este cautarea unor informatii in conformitate cu o anumita regula. Ca exemple se pot aminti:
- cautarea valorii maxime;
- cautarea valorii minime;
- cautarea valorii medii;
- cautarea configuratiilor cu valorea egala cu cea a unei configuratii date;
- cautarea configuratiilor cu valoarea diferita de cea a unei configuratii date;
- cautarea configuratiilor a caror valoare se afla in vecinatatea uneia date;
- cautarea configuratiilor a a caror valoare se afla intr-un domeniu inchis;
- cautarea configuratiilor a caror valoare se afla intr-un domeniu deschis.
Tot datorita caracteristicilor memoriilor asociative este usurata operatia de ordonare a informatiilor in
conformitate cu o anumita regula. Ca exmplu se pot aminti:
- ordonarea informatiilor in sens crescator al valorii lor;
- ordonarea informatiilor in sens descrescator al valorii lor.
In concluzie se poate afirma ca ariile de procesoare asociative au doua trasaturi importante:
- au toate caracteristicile unei arii de procesoare; sunt masini SIMD, au structura
regulata, contin mai multe procesoare care lucreza sincron, sub conducerea unei unitati de control,
efectuind aceeasi operatie asupra unor date diferite,
- memoriile cu scriere/citire sunt de tip asociativ.

5.4 Retele de inerconectare

Porblema retelelor de interconectare este deosebit de importanta intrucit afecteza decisiv


performantele masinilor SIMD si MIMD. Documentatia de specialitate arata existenta multor tipuri de
retele, fiecare incercind sa imbine in mod optim performanta cu pretul de cost. La un capat s-ar putea
situa magistrala comuna, un caz particular de retea de comunicare, cu pret scazut dar si performante
scazute iar la celalalt capat s-ar putea situa reteaua de tip “crossbar” cu performante maxime dar pret si
complexitate de asemenea maxime, ceea ce o fac irealizabila pentru un numar mai mare de procesoare.
Reteaua de interconectare asigura comunicarea intre procesoarele unei masini SIMD sauMIMD.
In proiectarea ei trebuie sa se tina seama de patru considerente.
Primul considerent se refera la strategia transferului. Acesta poate fi:
- direct: comunicarea intre procesoare se face direct, fara circuite intermediare;
- indirect: comunicarea intre procesoare se face indirect prin intermediul unor circuite cu rol de
comutatoare.
Al doilea considerent se refera la strategia controlului, luindu-se o decizie in legatura cu metoda
de control a transferului utilizata. In cazul transferurilor directe acest control se exexcuta local deci nu se
pune problema la nivelul intregii retele. In cazul transferurilor indirecte, controlul poate fi:
- centralizat: toate transferurile se executa prin intermediul unui comutator centralizat sau toate
comutatoarele sunt comandate centralizat;
- descentralizat sau distribuit: controlul este executat de catre fiecare comutator.
Al treilea considerent se refera la modalitatea de stabilire a caii de comunicatie. Exista doua
posibilitati:
- prin comutare de circuite,
- prin comutare de pachete.
In cazul comutarii de circuite, inaintea efectuarii transferului, se stabileste o conexiune fizica
intre trnsmitator si receptor, care va ramine nemodificata pe toata durata transferului. Solutia este
eficienta doar in cazul transferurilor mesajelor lungi intrucit apare un timp necesar pentru stabilirea caii
de comunicatie si este de dorit ca aceasta intirziere sa apara de cit mai putine ori. Lungimea mesajelor
poate fi variabila.
In cazul comunicarii de pachete: calea se stabileste pe masura ce mesajul, numit si pachet,
strabate reteaua de interconectare in conformitate cu disponibilitaile momentane ale acesteia. Mesajul
soseste la intrarea unui comutator, este memorat intr-un tampon al ei pina cind poate continua drumul,
adica pina cind se poate stabili o conexiune intre acest comutator si altul sau intre el si destinatie. La
caculul intirzierii pe retea va trbui sa se ia in considerare timpul necesar pentru pozitionarea fiecarui
comutator ceea ce inseamna ca solutia este eficienta pentru mesaje scurte. Un avantaj al solutiei este acela
ca nu face nici o diferenta inter un mesaj generat local sau unul sosit de la un alt comutator.
Al patrulea considerent se refera la topologia retelei de interconectare care arata forma acesteia.
Ea poate fi reprezentata printr-un graf in care nodurile reprezinta comutatoarele, existind si cazul in care
comutatorul este atasat unui element procesor si atunci un nod reprezinta un element procesor plus un
comutator, iar arcurile reprezinta legaturile dintre ele,adica caile de comunicare. Topologia este
caracterizata de posibilitatile de directionare a informatilor de la un nod la altul. Daca alocam fiecarui nod
o adresa pe n ranguri, a(n-1) a(n-2)... a1 a0, atunci putem afirma ca, din punct de vedere formal, o
directionare corespunde unei functii bijective:
f:(a(n-1),a(n-2),...,a1,a0)-->(a(n-1),a(n-2),...,a1,a0)
care face ca fiecarui nod sa-i corespunda un alt nod si care actioneaza simultan la toate nodurile active.
Exista si posibilitatea ca un nod sa nu participe la trnsfer, sa fie inactiv, ceea ce inseamna ca el va putea
prelua informatia directionata catre el dar nu o va putea transmite mai departe.
In functie de flexibilitaea topologiei reteaua poate fi: statica si dinamica.
Intr-o retea statica legaturile intre cele doua noduri sunt fixe si nu exista nici o posibilitate de
reconfigurare. Ele se pot clasifica in retele: unidimensionale, bidimensionale si multidimensionale. Figura
5.7.a prezinta reteaua liniara, statica si unidimensionala. Figura 5.7.b prezinta exemple de retele
bidimensionale iar figura 5.7.c prezinta exemple de retele multidimensionale.

Un exemplu mai complex de retea statica multidimensionala este prezentat in figura 5.8. Spre
deosebire de cazul unei retele in forma de cub in care fiecare nod ocupa un virf al cubului, in aceasta
structura fiecare virf este inlocuit cu un plan alcatuit din trei noduri conectate intre ele sub forma de inel.
Forma obtinuta se numeste tricub.
Intr-o retea dinamica conexiunile pot fi modificate prin actionarea comutatoarelor. Spre
deosebire de cazul static cind comutatoarele sunt elemente pasive, aici sunt active. Ele se impart in retele
pe un nivel si pe mai multe nivele, in cadrul celei de-a doua grupe existind mai multe variante.

Figura 5.9 prezinta o retea dinamica pe un nivel. Ea cuprinde un sir de circuite distribuitoare,
conectate la intrare iar iesirea este furnizata de un sir de circuite selectoare. Aceasta realizeaza operatiile
de multiplexare la iesire, respectiv demultiplexare la intrare. Realizarea conexiunilor intre iesiri si intrari
se realizeaza prin comanda corespunzatoare a multiplexoarelor si demultiplexoarelor. Daca
multiplexoarele au p intrari iar demultiplexoarele au q iesiri este necesar ca q<=p. Reteaua de tip
“crossbar” este un asemenea exemplu in care q=p=n.

Dezavantajul major al unei retele dinamice pe un nivel consta in posibilitatile limitate de


conectare: un transmitator nu poate ajunge la oricare receptor la o singuratrecere a informatiei prin retea.
Gradul de conectare creste daca informatia poate fi recirculata, efectuind noi treceri prin retea, de fiecare
data comandind diferit comutatoarele. Cu cit posibilitatile de conectare a comutatoarelor sunt mai mari,
ceea ce inseamna complexitate crescuta a hardware-ului, cu atit numarul de treceri este mai mic. De
exemplu, in cazul retelei de tip “rossbar” este suficienta o singura trecere a informatiei pentru orice
conexiune dar complexitatea sa este maxima. In literatura de specialitate, (7), se arata ca pentru o
conectivitate totala sunt necesare log n treceri. O retea dinamica cu un singur nivel se mai numeste si reta
cu recirculare.
O retea dinamica pe mai multe nivele este alcatuita din un numar de nivele comutatoare. In
general se folosesc comutatoare cu doua intrari si doua iesiri care pot fi de doua tipuri: cu doua sau cu
patru stari. Figura 5.10 prezinta un astfel de comutator impreuna cu cele patru stari posibile ale sale: cu
transfer direct, in cruce, superior si inferior.

Comutatoarele cu doua stari nu pot executa decit transferurile direct sau in cruce.
Comanda unui asemenea comutator se face cu un rang binar pentru fiecare intrare. Din figura
5.11.a se observa efectul comandarii intrarii x1 cu valoarea “0” logic iar figura 5.11.b arata efectul
comandarii intrarii x1 cu valoarea “1” logic. Analog se realizeaza si comanda celelalte intrari.
Comutatorul trebuie sa aiba posibilitatea de arbitrare intrucit poate apare situatia in care ambele intrari
solicita aceeasi iesire.

In exmplul din figura 5.11 nu exista tampoane in interiorul comutatorului ceea ce va face ca in
cazul aparitiei unui conflict, ambele intrari cer aceeasi iesire, o noua icercare de transfer va necesita un
nou itmp de intirziere a comutatorului, cee ce in cazul unor incercari repetate poate duce le scaderea
vitezei de trnsfer. Solutia consta in inserarea de tampoane in comutator, pe fiecare cale. Aceasta este si o
cerinta in cazul cind transferul se face prin comutare de pachete. Figura 5.12 prezinta un astfel de
comutator.
In general, o retea pe mai multe nivele este alcatuita din m=log n nivele de comutare cu doua
intrari si doua iesiri, n fiind numarul intrarilor si al iesirilor in retea. Intirzierea pe retea este data de suma
intirzierilor pe fiecare nivel iar pretul de cost este proportional cu n x log n.Ea reprezinta un bun
compromis intre performanta si cost.
O retea de interconectare se caracterizeaza printr-un set de patru parametrii, fiecare corespunzind
cite unuia din cele patru considerente prezentate. Mai exista o caracteristica a lor dar care le orienteaza
spre utilizarea in masini SIMD, respectiv MIMD. Este vorba despre modul de comunicare care poate fi
sincron sau asincron.
Comunicarea sincrona este folosita in special de masinile SIMD, in timp ce cea asincrona este preferata in
cazul masinilor MIMD. Exista si posibilitatea utilizarii combinate a celor doua moduri.
Caracteristicile prezentate mai sus sunt strins legate de complexitatea retelelor.
Considerind cazul unei retele cu m transmitatori si m receptori, complexitatea ei poate fi:
- functie liniara de m,
- functie liniara de m x log m,
- functie liniara de m la patrat.
Exemple de topologii de retele de interconectare.

5.4.1 Retele de interconectare statice

Vom considera citeva exemple de complexitate diferita.


Primul este structura in forma de inel, caracterizata prin simplitate. Mesajele trec de la un nod la
altul pina ajung la destinatie. Are insa doua mari dezavantaje:
- timpul de transfer este variabil si, in general mare; difera mult in functie de pozitia relativa a
celor doi parteneri,
- o defectiune la un nod determina caderea intregului sistem.
In (10) se prezinta o realizare in care inelul se poate restringe si dupa aparitia unei defectiuni la
un nod. Acesta va fi izolat. Figura 5.13 prezinta structura sistemului in cazul lipsei defectiunii, a si in
cazul aparitiei defectiunii,b. Se observa ca exista doua bucle: principala si secundara. Cea principala
transfera mesajele iar cea secundara o combinatie predefinita. Daca un nod se defecteaza ambii vecini
sesizeaza aceasta situatie. Unul nu va primi mesajul util iar celalalt nu va primi combinatia de control.
Resursele nodurilor vor permite creerea unei bucle unice, izolind nodul defect si mentinind functionarea
sistemului.

Un alt exemplu este reteaua in forma de cub. In figura 5.14 seprezinta o astfel de retea pentru opt
noduri carora li s-au alocat adresele reprezentate in figura. Nodurile aflate pe o linie verticala difera prin
rangul cel mai semnificativ al adresei iar cele aflate pe diagonala difera prin rangul median al adresei.
Structura in forma de cub cuprinde si alte topologii, functie de dimensiunea cubului. Astfel
pornind de la simplu la complicat si generalizind se poate afirma ca:
- o structura cu un nod, un caz extrem, este o structura in forma de cub cu dimensiunea zero;
- o structura liniara, figura 5.7.a este o structura in forma de cub cu o singura dimensiune;
- o structura in forma de patrat este o structura in forma de cub cu doua dimensiuni;
- o structura ca cea din figura 5.14 este o structura in forma de cub cu trei dimensiuni.
Prin extensie se poate obtine cubul cu (M+1) dimensiuni translatind cubul cu M dimensiuni.
Numarul de noduri se dubleaza la fiecare trecere de la o dimensiune la alta, deci cubul cu M dimensiuni
va avea 2 la puterea M noduri. Numarul de arcuri intre noduri esteM x (2 la puterea(M-1)), pentru ca
exista M conexiuni ale fiecarui nod.

5.4.2 Retele de interconectare dinamice.

Sunt foarte raspindite si constituie inca un domeniu de cercetare. In literatura de specialitate s-au
delimitat citeva tipuri pe care le vom trece in revista, fara a insista asupra formalizarii matematice.

5.4.2.1 Retele de interconectare dinamice pe un nivel.

Exemplul clasic este reteaua obtinuta prin “amestecare perfecta” cu varianta de “amestecare
perfecta inversa”(“perfect shuffle” si “inverse perfect shuffle”). Poarta aceasta denumire intrucit functia de
directionare corespunde operatiei de amestecare a unui pachet de m carti de joc, m fiind numarul de
procesoare din retea.(1). Figura 5.15 prezinta topologia acestei retele in cazul a opt procesoare, notate cu
P0-P7. Circuitul de conectare realizeaza operatia de amestecare perfecta.
Functia de directionare este data de relatia de mai jos:
f(a(n-1)...a1a0)=a1a0a(n-1)
unde a(n-1)a(n-2)...a1a0 este adresa unui procesor. Relatia se refera la amestecarea perfecta. In cazul
anestecarii perfecte inverse functia de directionare este data de relatia de mai jos:

f(a(n-1)...a1a0)=a(n-1)...a1a0

Legatura intre m si n este m = 2 la puterea n.


In figura 5.16.a se observa conexiunile stabilite in cazul amestecarii perfecte iar in figura 5.16.b
se observa conexiunile stabilite in cazul amestecarii perfecte inverse.
In figura 5.17.a se prezinta graful atasat conexiunii prin amestecare perfecta iar in figura 5.17.b
se prezinta graful atasat conexiunii prin amestecare perfecta inversa.
Complexitatea si costul retelelor din aceasta categorie sunt dependente liniar de numarul
preocesoarelor (nodurilor).
In exemplele ce vor urma, complexitatea si costul vor fi dependente de m x log m unde m este
numarul de noduri din retea.
a b
Fig 5.16 Conexiuni obtinute prin amestecare perfecta:
a - directa
b - inversa

5.4.2.2 Retele de interconectare dinamice pe mai multe nivele


Cele mai multe realizari in domeniul retelelor de interconectare apartin acestei categorii.
Se vor prezenta succint citeva tipuri clasice de astfel de retele. Pentru simplitate se va considera
numarul de noduri egal cu opt.
a. Reteaua de tip BANYAN
Este prezentata in figura 5.18.
Exista opt functii de directionare date de relatiile din figura 5.19, unde sunt prezentate si
grafurile atasate conexiunilor pentru fiecare din functile de directionare.
b. Reteaua de tip BASELINE
Este prezentata in figura 5.20 iar figura 5.21 prezinta grafurile atasate conexiunilor determinate
de cele opt functii de directionare.
c. Reteaua de tip DELTA
Este prezentata in figura 5.22 iar in figura 5.23 se prezinta grafurile atasate conexiunilor
determinate de cele opt functii de directionare.

d. Reteaua de tip FLIP


Este prezentata in figura 5.24 iar in figura 5.25 sunt prezentate grafurile posibile.

e. Reteaua de tip OMEGA


Este prezentata in figura 5.26 iar in figura 5.27 sunt prezentate grafurile posibile.
Intr-o retea dinamica pe mai multe nivele un comutator va fi destul de complex. Exista o
problema care terbuie considerata atunci cind se alege intre o retea pe mai multe nivele care are o
complexitate mai mica, dar la care comutatorul este complex si o retea de tip “crossbar” care are o
complexitate mare dar comutatorul este foarte simplu.
Schema bloc a unui exemplu de comutator dintr-o retea pe mai multe nivele este prezentata in
figura 5.28.
Exista doua cai pentru transferul datelor:
- blocul superior pentru transmisie si receptie - BSRT,
- blocul inferior pentru receptie si transmisie - BIRT.
Unitatea de control a comutatorului, UCC, are rolul sa comande cele doua blocuri pentru transfer
precum si sa asigure comunicarea acestuia cu vecinii sai. Pentru fiecare cale exista un semnal de cerere si
unul de raspuns. USD este o unitate pentru selectie si distributie.
Un dezavantaj important al retelelor de interconectare pe mai multe nivele este probabilitatea
relativ mare de aparitie a blocarii, adica o cale stabilita blocheaza un numar de alte posibile cai, asa cum
se arata in figura 5.29.
Calea de la nodul 0 la nodul 7 va bloca urmatoarele posibile conexiuni: 1 cu 4, 1 cu 6, 1 cu 7, 2
cu 6, 2 cu 7, 3 cu 6, 3 cu 7, 4 cu 7, 5 cu 7, 6 cu7, 7 cu 7. Din aceasta cauza o asemenea retea este mai
putin potrivita pentru transferul prin comutare de circuite. In cazul transferului prin comutare de pachete,
blocarea corespunde situatiei in care un mesaj soseste intr-un nod si ramine in asteptare pina cind se
stabileste o cale spre urmatorul nivel de noduri.
Trebuie remarcat ca se poate realiza o retea de interconectare pe mai multe nivele si utilizind
comutatoarele cu mai multe intrari si iesiri. Figura 5.30 prezinta un asemenea exemplu.
Revenind la retelele care utilizeaza comutatoare cu doua intrari si doua iesiri, daca creste
numarul intrarilor si iesirilor din retea va creste si numarul comutatoarelor. In literatura de specialitate,
(1), (4), se arata ca numarul nivelelor este egal cu log m si fiecare nivel este alcatuit din m/2 comutatoare,
m fiind numarul de procesoare (noduri) din retea.
In figura 5.31 se prezinta o retea de tip BANYAN cu 16 intrari si 16 iesiri iar in figura 5.32 se
prezinta o retea de tip DELTA cu 32 de intrari si 32 iesiri.

5.4.2.3 Reteaua de tip “crossbar”

Aceasta este tratata intr-un paragraf distinct datorita particularitatilor sale. Preformantele sale
sunt maxime oferind conectivitate totala intre toate nodurile. Necesita insa m x m comutatoare, care desi
pot fi foarte simple, influenteaza decisiv complexitatea si pretul de cost al retelei. Deci complexitatea unei
retele de tip “crossbar” cu m intrari si m iesiri este functie de m patrat.
Figura 5.33 prezinta o retea de tip “crossbar” cu patru intrari si patru iesiri.
Desi posibilitatile totale de conectivitate si simplitatea principiala o fac atractiva, reteaua de tip
“crossbar” se dovedeste nerealizabila pentru un numar mare de noduri. De exemplu pentru 16 noduri de
intrare si 16 noduri de iesire vor fi necesare 256 comutatoare.

După cum s-a mai afirmat, în paleta reţelelor de interconectare, cea de tip "crosbar" se găseşte la
un capăt caracterizându-se prin performanţe ridicate, dar şi preţ ridicat, la celălalt capăt găsindu-se
conectarea prin magistrala comună, simplă şi ieftină, dar şi cu performaţe reduse. Preluând principiile de
la amândouă a rezultat conectarea prin magistrală multiplă, în care magistrala unică este ânlocuită prin
mai multe magistale, fiecare procesor având posibilitatea de conectare la fiecare din magistrale printr-un
comutator. Nu se vor detalia conexiunile prin magistrala comună, întrucât ele sunt caracteristice
sistemelor multimicroprocesor, care nu consatituie subiectul acestei lucrări, arătându-se doar că la
conexiune cu magistrală multiplă creşte viteza de transfer, întrucât ocuparea unei magistrale nu
blochează întreaga reţea.
Figura 5.34 prezintă o conectare cu magistrală multiple care permite conectarea a două grupe de
câte şase procesoare. Se observă că numărul de comutatoare este egal cu 24, câte 12 pentru ficare
magistrală, întrucât este necesară conectarea fiecărui procesor la la oricare magistrală, în comparaţie cu
36 comutatoare câte ar fi fost necesare dacă s-ar fi utilizat o reţea pe tip "crossbar". generalizând, se poate
afirma că pentru o reţea cu magistrală multiplă care conectează m procesoare cu alte m module prin
intermediul a p magistrale vor fi necesare 2 mp comutatoare în cazul reţelei de tip "crossbar".

5.5 Probleme ce trbuiesc luate în considerare la proiectarea ariilor de procesoare

Ariile de procesoare sunt eficiente în cazul în care trebuiesc executate acelaşi operaţii asupra
unor date diferite. Pentru aceasta ele trbuiesc să aibă unele proprietăţi. Aceste sunt :
- posibilităţi de permutare a datelor
- posibilităţi de partiţionare
- disponibilitate
- lăţime de bandă
- posibilităţi de testare de condiţii
- lungimea minimă a conexiunilor
Permutarea datelor este necesară în situaţii în care datele ce se vor prelucra se citesc din memorii
şi apoi trebuiesc reordonate, reaşezate, după o anumită regulă. Flexibilitatea reţelei de interconectare va
determina numărul de permutări care pot fi executate. Acesta va fi cu atât mai mare cu cât posibilităţile de
reconfigurare ale reţelei vor fi mai marişi cu cât posibilităţile de blocare vor fi mai mici.
Partţionarea este o caracteristicăcare permite divizarea ariei în mai multe subarii şi alocarea câte
unui proces fiecărei subarii. Gradul de paralelism al maşinii creşte dar este necesar ca pe lângă gruparea
procesoarelor în arii să fie posibilă si divizarea reţelei de interconectare în subreţele, fără însă a-i modifica
performanţele. În literatura de specialitate s-a demonstrat că oreţea de interconectare statică nu poate fi
divizată în subreţele independente în schimb una dinamică poate fi divizată. Practic această caracteristică
transformă o maşină SIMD într-o maşină MSIMD.
Disponibilitatea presupune două aspecte :
- detectarea şi diagnosticarea defecţiunilor,
- toleranţa la defecţiuni
Detectarea şi diagnosticarea defecţiunilor se obţine efectuând teste periodice, sau la nevoie,
asupra reţelei. Foarte importantă este însă toleranţa la defecţiuni. O cale pentru obţinerea ei este facilitatea
de reconfigurare prin restângere a unei reţele. Aceasta va izola modul sau arcul defect, permitând
funcţionarea în continuare a reţelei. O altă cale este dublarea nodurilor sau a arcelor, dar datorită
cerinţelor mari de circuite această soluţie nu poate fi aplicată decăt ăn situaţii rare. O soluţie de
compromis ar fi dublarea doar a unor noduri sau căi care sunt mai utilizate în aplicaţia respectivă.
lăţimea de bandă este de fapt o caracteristică a reţelei de interconectare. se defineşte cs Fiind
numărul de cereri de transfer ale procesoarelor satisfăcute în unitatea de timp. Este de dorit ca lăţimea de
bandă să fie maximă la un preţ rezonabil. Revenind la tipurile de reţele existente se poate afirma că
lăţimea de bandă a unei conexiuni prin magistrală comună este minimă în timp ce în cazul unei reţele de
tip "crossbar" lăţimea de bandă este maximă. În literatura de specialitate, se pot găsi metode analitice
pentru estimarea lăţimii de bandă a unei reţele de interconectare.
Testarea de condiţii este o proprietate care trebuie să existe atât la nivel global cât şi la nivel
local. Unitatea de control trebuie să aibăposibilitatea de a lua decizii referitoare la operaţiile comune ce se
vor executa de procesoare.A cestea la rîndul lor trebuie să aibă facilităţi de testare de condiţii ca, de
exemplu participarea sau nu la o operaţie.
Cerinţa referitoare la minimizarea lungimii totale a conexiunilor este importantă din două puncte
de vedere:
- siguranţa în funcţionare: conexiunile lungi sunt mai sensibile la perturbaţii, pot apare fenomene
caracteristice liniilor lungi,
- viteza de transfer.
Din aceste motive este de dorit facilitatea de reaşezare a elementelor procesoare în conformitate
cu acest criteriu.

5.6 Arii multiple de procesoare

Modificând schema bloc a unei arii de procesoare clasice, figura 5.35, prin utilizarea mai multor
unităţi de control care pot adresa elemente de procesoare prin intermediul unei reţele de interconectare se
obţine o arie multiplă de procesoare , figura 5.36. Ea constituie o variantţ a unei maşini SIMD, intrând în
clasa maşinilor MSIMD. Principiul de funcţionare constă în alocarea câte unui grup de procesoare pentru
fiecare unitate de control şi execuţia aceleiaşi operaţii de către fiecare grup sub controlul respectivei
unităţi. Rezultă o creştetreagradului de paralelism datorită faptului că este posibilă execuţia simultanăa
unor operaţii diferite. De asemanea, o altă rezultantă este creşterea vitezei de lucru pentru operaţii unice
efectuate asupra unor seturi lungi de date.
O arie multiplă de procesoare, deşi simplă principal, ridică unele probleme. În primul rând
trebuie rezolvată planificarea unităţilor de control pentru op anumită aplicaţie şi, în continuare, alocarea
elementelor procesoare la fiecare unitate de control. fiecare unitate de control este capabilă să execute
procese separate în cadrul fiecărui proces operaşiile scalare şi cele de control vor fi executate de unitatea
de control iar cele vectoriale de elementele procesoare. Numărul elementelor procesoare alocate unei
unităţi de control trebuie să fie variabil, funcţie de cerinţele aplicaţiei. Alegerea optimă a acestui număr
influenţează decisiv performanţele maşinii.
Pe de altă parte alocarea variabilăa elementelor procesoare la unităţile de control necesită o reţea
de interconectare reconfigurabilă şi partiţionabilă. Dacă numărul de elemente procesoare este mare,
reţeaua de intercoonectare poate deveni foarte complexă, chiar irealizabilă. Partiţionarea ei rezolvă si
această problemă. O maximă MSIMD nu poate funcţiona eficient şi flexibil dacă reţeaua de interconectare
nu estepartiţionabilă. Trebuie însă remarrcat că partiţionarea acesteia depinde de tip. Deasemenea trebuie
avut grijă ca subreţelele obţinute după partiţionare să nu introducă întârzieri suplimentare iar gradul de
blocare să nu crească.
O altă problemă care trbuie considerată la proiectarea ariilor multiple de procesoare este structura
software. O asemenea maşină impune, pentru a fi folosită eficient, existenţa unor algoritmi şi programe de
descompunere şi partiţionare a unei aplicaţii complexe în funcţie şi de resursele hardware disponibile.

Datorită comlexităţii lor, realizările în domeniul ariilor multiple de procesoare sunt mai puţine.
Principal, calculatorul ILLIAC IV a fost gândit ca făcând parte din această clasă. Figura 5.37 reprezintă
schema bloc a sa.
Au fost prevăzute patru arii de câte 64 elemente procesoare fiecare sub o comandă unei unităţi de
control şi cu posibilităţi de interconectare între ele. În conformitate cu această structură sunt posibile trei
configuraţiiale calculatorului, prezentat în figura 5.38.

În funcţie de complexitatea problemei calculatorul poate funcţiona ca arie multiplă sau simplă de
procesoare. Pentru configuraţiile de arie multiplă, fiecare unitate de control lucrează independent
existândşi posibilitatea sincronizării între ele.
Ca realizare fizică calculatorul ILLIAC IV există numai sub forma unei arii de 64 elemente
procesoare întrucât costul şi complexitatea realizării au depăşit cu mult prevederile.

5.7 Toleranţa la defecţiuni într-o arie de procesoare

Întrucât domeniile în care sunt necesare arii de procesoare reclamă atât putere mare de calcul cât
şi siguranţă în funcţionare deosebităse cere şi conferirea unui grad cât mai mare de toleranţă la defecţiuni.
În acest paragraf ne vom referi doar la defecţiunile permanente. Tehnica cea mai des utulizată este
reconfigurarea ariei fie prin activarea unei elemente procesoare sau căi de rezervă, fie prin restrângerea
dimensiunilor. Din acest punct de vedere putem echivala elemente procesoare cu circuitele de comutare.
Posibilitatea de reconfigurare impune existenţa redondanţei. Se pot distinge două tipuri de
redondanţă: structurală şi temporală.
Redondanţa structurală este cea mai utilizată. Ea constă în introducerea de elemente procesoare
de rezervă, împreună cu toate căile de comunicare necesare, deci trebuie conferit şi reţelei de
interconectare gradul de toleranţă la defecţiuni corespunzător. În ariile de procesoare elementele de
rezervă rămân în aştaptare, fără a funcţiona, până în momentul în care se detectează un procesor defect
când sunt activate şi înlocuiesc atât procesorul defect cât şi căile de comunicare ale acestuia.
Metoda oferă, teoretic, performanţe mari darnecesită parte de circuite komlexă, evoluată şi ca
urmare scumpă şi existenţa unori algoritmi de detectare şi înlocire rapizi.
Redondanţa temporală nu necesită circuite suplimentare dar impune o complicare a părţii de
comandă şi de algoritmi. Deasemanea aria de aplicabilitate este mai restrânsă şi viteza întregului sistem
scade. La nivel de principiu constă în următoarele: fiecare operaţie executată în arie este descompusă într-
o succesiune de faze, sarcinile unui element procesor care s-a defectatfiind preluate, fază cu fază de
celelalte procesoare.
Revenind la redondanţa structurală se pun două probleme. În primul rând este cea a căilor de
direcţionare a informaţiilor. Trebuie să existe posibilitatea creerii, în momentul creerii, de noi căi cea ce
impune prevederea de resurse hardware în acest scop: multiplexoare, comutatoare. Flexibilitatea reţelei de
interconectare va determina gradul de reconfigurabilitate a întregii arii.
A doua problemă se referă la utilizarea unor algoritmi de reconfigurare simpli şi rapizi.

În figura 5.39 se reprezintă reconfigurarea unei arii de procesoare în cazul defectării a trei
elemente cele haşurate. Reconfigurarea se face prin restrângerea dimensiunilor. Va fi necesară crearea
unor căi noişi abandonarea altora. Se observă că reconfigurarea are efect nu doar asupra elementeleor
defecte ci şi asupra unora funcţionale care vor rămâne fără posibilităţi de conectare. Pentru a evita acest
dezavantaj se poate prevedea un rând ss o coloană de elemente procesoare de rezervă.

În figura 5.40 se reprezintă o asemenea stuctură. ea este potrivită în cazul în care reconfigurarea
se poate executa într-o singură direcţie şi anume spre dreapta din punctul de vedere al intrării.
Se observă că intrările şi ieşirile din elementul procesor se fac prin intermediul unor
multiplexoare comandate prin semnale de control care au linii diferite faţă de cele de date. Un dezavantaj
evident este creşterea timpului de întârziere pe element datorită multiplexoarelor.Pentru creşterea gradului
de flexibilitate, adică creşterea numărului de posibileconexiuni ale unui element, se pot utiliza tot
multiplexoare dar creşte şi numărul de conexiuni fizice ceea ce poate construi un dezavantaj datorită
costului.

5.8 Calculatoare cu arii de procesoare

Printre primele realizări în domeniu se numără calculatorul proiectat de Unger şi realizat în anul
1958. Constă dintr-o arie planară de elmente procesoare comandată de o unitate de control. Figura
5.41prezintă struktura acestui calculator.
O realizare de referinţă o constituie calculatorul ILLIAC IV. Proiectarea sa a început la
Universitatea din Illinois, în 1960, iar primul sistem a fost realizat de firma Burroughs, în 1972. Scopul
principal a fost construirea unui calculator orientat pe operaţii vectoriale şi matriciale cu o viteză de10la
puterea nouă operaţii pe secundă. Iniţial s-a prevăzuto structură alcătuită din patru arii de procesoare,
fiecare cu câte 64 elemente procesoare figura 5.37 şi s-a estimat, costul la 10 milioane dolari. Dar după
construcţia primei arii costul a ajuns la 30 milioane dolari şi nu s-a mai continuat.
Interconectarea elementelor procesoare este prvăzută în figura 5.42. Întreaga arie este sub
comanda unei unităţi de control, nereprezentată în figură. datele sunt reprezentate în virgulăflotantă pe 64
sau 32 biţi sau în virgulă fixă pe 64, 48, 24 sau 8 biţi. Aria poate efectua operaţii asupra vektorilor,
eficientă maximă obţinînduse dacă lungimea vectorilor este multiplu întreg de 64.

Între unitatea de control şi cele 64 elemente procesoare există trei tipuri de linii. Unul constituie
o magistralăde date. Al doilea tip de linii foloseşte la transferul intrucţiunilor , în special al acelea care se
referă la direcţionarea informaţiei. Al treilea tip constă dintr-un grup de linii, fiecare legândun element
procesor cu câte un rang al unui registru al unităţii de control. Prin intermediul acestor linii se comunică
elementului procesor starea activă sau pasivă referitoare la o operaţie.
resursele unui element procesor sunt prezentate în figura 5.43. Este alcătuit din două părţi:
procesorul propriuzis şi o memorie rapidă, MEP, cu timp de acces de 120ns. Capacitatea unei memorii
este de 2048 cuvinte şi poate fi adresată atât de propriul procesor cât şi unitatea de control.
Procesorul conţine patru registre pecâte 64 biţi cu următoarele funcţii:
- A este registru acumulator
- B este registru pentru ooperanzi
- R este registrul pentru direcţionarea informaţiei - conexiunile între elemente procesoare se fac
prin intermediul registrelor R,
- S este registru general.
Registrul X este registrul index, pe 16 biţi şi este folosit pe o unitate aritmetică, nereprezentată în
figură, pentru calculul şi modificarea adreselor. Registrul D este pe 16 biţi şi este folosit ca registru de
adrese. Mai există o unitate aritmetică şi logică nereprezentată în figură, care execută operaţii de adunare,
înmulţire logice, de deplasare şi rotire.
ST este un indicator de stare folosit la activarea/dezactivarea procesorului.
Fiecare element procesor este conectat cu patru vecini, prin intermediul registrelor R, prin legătui
bidirecţionale. Există două tipuri de conexiuni: cele care conectează o celulă cu vecinii ei din dreapta şi
stânga, şi cele care conectează o celulă cu vecinii ei de sus şi jos. Întreaga arie are o formă de toroid
datorită conexiunilor între procesoare dela margini şi datorită conexiunii între primul şi ultimul procesor.
Figura 5.44 przintă conexiunile unui element procesor.
Se mai utilizează şi o denumire geografică a poziţiei elementelor procesoare conform căreia ele
se mai numesc:
- elementul de sus: element nord
- elementul de jos: element sud
- elementul din stînga: element vest
- elementul din dreapta: element est
Unitatea de control este procesor care poate executa operaţii scalare şi conduce toate cele 64
elemente procesoare transmitându-le atât datele cât şi operaţiile pe care trbuie să le execute. Schema bloc
a ei este prezentată în figura 5.45.

Conţine un tampon pentru instrucţiuni şi unul pentru date. O unitate aritmetică şi logică, UAL,
execută operaţii aritmetice de adunare, scădere şi operaţii logice asupra operaţiilor scalari.
Instrucţiunile sunt pe 32 biţi şi sunt de două tipuri: pentru unitatea de control şi pentru
elementele procesoare. Unitatea de control decodifică instrucţiunile primite şi hotăreşte cine le execută.
Tamponul pentru instrucţiuni poate conţine 128 instrucţiuni, ceea ce înseamnă că poate memora inclusiv
bucle.
Tot unitatea de control conţine un registru de mascare, M, care are atâtea ranguri câte elemente
procesoare există. Memorează starea fiecărui element, fiind copia indicatorilor de stare din acestea. De
asemenea poate poziţiona indicatorii de stare. Există posibilitatea interschimbării conţinutului acestui
registru cu cel alcătuit din toţi indicatorii ST.
Deci operaţiile executate de unitate de control sunt următoarele:
- decodifică toate instrucţiunile şi hotăreşte pe care le execută şi pe care le transmite către
elementele procesoare
- transmite semnale de control pentru toate elementele procesoare
- transmite adrese de memorie, adrese de bază, comune tuturor elemente procesoare
- transferă constante sau date tuturor elementelor procesoare
- primeşte şi răspunde la cererile de întrerupere
calculatorul ILLIAC IV nu este un calculator de sine stătător. El este orientat pe anumite tipuri
de operaţii. Sistemul de operare care conduce funcţionarea sistemului, incluzând şi subrutinele de
intrare/ieşire se află rezident în calculatorul gazdă Burroughs 6500. Comunicarea lui ILLIAC IV cu
Burroughs 6500 se face prin intermediul unei unităţi de intrare/ieşire care îl mai conectează şi unitate de
memorie de masă, figura 5.46.
Sistemul de operare cuprinde:
- partea de operare a calculatorului Burroughs 6500
- comunicarea cu unitatea da control a calculatorului ILLIAC IV
- partea de comandă şi transfer de dată pentru memoria de masă
- programele aferente sistemului de intrare/ieşire

Figura 5.47 prezintă o reaşezare a elementelor procesoare după criteriul minimizării lungimii
conexiunilor
o altă realizare importantă prin performanţele sale o constituie calculatorul MPP. A fost construit
pentru prelucrarea imaginilor primite de la sateliţi şi în scopul obţineri unei viteze mari de lucru. A
devenit funcţional în anul 1983.
Figura 5.48 prezintă structura acestui calculator. Aria de procesoare este organizată sub forma
unei matrici de 128x128 elemente. Pentru creşterea siguranţei în funcţionare au mai fost prevăzute patru
coloană de rezervă. Apariţia unei defecţiuni întrun element al unei coloane va duce la înlocuirea coloanei
respective, astfel că în totdeauna vor foncţiona 128x128 procesoare.
Fiecare element procesor poate executa operaţii aritmetice: adunare, înmulţire, în virgulă fixă şi
flotantă. De asemenea poate efectua operaţii logice. Operaţii sunt transferaţi cu o menorie locală, de 1024
biţi, existentă pentru fiecare procesor.
Un element procesor este conectat cu patru vecini, ca în cazul lui ILLIAC IV. dar, în plus,
programul poate fixa modul de conectare a elementelor de la marginile ariei. Există patru posibilităţi:
- conexiune în formă de arie deschisă,
- conexiunile totală
- conexiune toroidală deschisă
- conexiune în formă de cilindru
Comunicarea între aria de procesoare şi exterior se face prin intermediul unitîţii pentru transferul
instrucţiunilor şi datelor. Acesta se conectează la un calculator extern şi are rolul de a încărca programele
şi datele, de a le direcţiona spre/ de la unitatea de control a arieişi elementele de procesoare şi de a executa
programede test şi de diagnoză.
Periferia calculatorului MPP constă din: o unitate de bandă magnetică, două unităţi de disc, un
terminal alfanumericşi o imprimantă.
MPP are trei moduri de lucru:off-line, on-line şi cu viteză mare.
În modul off-line toate programele sunt executate de MPP iar comunicarea cu programatorul se
face prin intermediul terminalului alfanumeric. Aria poate transfera data cu unităţile de disc şi de bandă
precum şi pe căile de 128 biţi.
În modul co viteză mare MPP trasferă date cu exteriorul prin intermediul celor două căi de 128
biţi laviteză de 320 MO/sec.
Schema bloc a unui element procesor este prezentată în figura 5.49.
Elementul este alcătuit din două părţi: procesorul propriuzis şi o memorie RAM. Prcesorul va
executa în mod serial operaţiile aritmetice. El dispune de şase registre pe câte un biţi care au următorul
rol:
A este registru de lucru pentru un operant, în cazul operaţiilor aritmetice
B este registru pentru rezultat
C este registru pentru trasport
G este registru pentru activarea/dezactivarea elementului procesor
P este registru cu dublu rol: memorează al doilea operant al unei operaţii aritmetice şi
direcţionează transferul cu elementele vecine: este conectat cu alţi patru registri P ai elementelor vecine
S este registru pentru trasferul datelor cu exteriorul.
Registrele sunt interconectate prin intermediul unei magistrale de date. Toate magistralele de
date ale celor 16384 procesoare constituie intrări într-un circuit, organizat sub formă de arbore, a cărui
ieşire este conectată la unitatea de control a ariei.
Pentru a realiza o operaţie de adunare, biţii unui operant sunt încărcaţi succesiv în registru A iar
biţii celuilalt operant sunt încărcaţi succesiv în registrul P. Suma este calculată şi încărcată succesiv în
registrul B, de unde poate intra în registrul de deplasare, în memoria RAM sau poate fi trimisă în
exteriorul elementului. Registrul C este folosit pentru transport la operaţii de adunare, respectiv împrumut
la cea de scădere.
Înmulţirea se execută prin adunnări repetate si deplasări ale rezultatelor parţiale prin intermediul
uni registru de deplasare a cărui lungime poate fi programată.
Memoria RAM are o capacitate de 1024 biţi. Se folosesk circuite standard de memorie de
capacitate 1024x4 biţi. Fizic există cîte ogrupare de opt procesoare la care se ataşează omemorie RAM de
capacitate 1024 octeţi. În plus există al noălea rang pentrucontrol prin paritate care comandă un bistabil
ce va fi activat în cazul apariţiei unei erori. Toţi bistabilii de eroare conectaţi sub forma unui arbore se
conectează la unitatea de control.
Schema bloc a unităţii de control este prezentată în figura 5.50.
Sarcinile sale sunt execuţia operaţiilor scalare de intrare/ieşire şi comanda elementelor procesoare.
cuprinde trei părţi care pot lucra în paralel:
- blocul Control intrări/ieşiri
- blocurile Control transfre şi procesare
- blocurile Control trasfer EP şi Control EP

Blocul numit "Sir" va primi din partea blocului procesare acele instrucţiuni şi date care sunt
direcţionate către elementele procespare.
Setul de instrucţiuni al calculatorului MPP conţine trei tipuride instrucţii: secvenţiale, paralele şi
de transfer. Cele secvenţiale execută operaţii de:încărcare depunere adunare săderecomparare cele de
logice de salt etc. Ele se folosesc pentru controlul execuţiei unui program şi pentru calcullul şi transferul
informaţiilor la/de la elemente procesoare. Instrucţiunile paralele execută operaţii de: încărcare depunere
adunare scădere comparare şi cele logice. Unitatea de control este cea care detectează apariţia unei
asemenea instrucţiuni şi o direcţionează către arie. Instrucţiunile de transfer asigură comunicarea între
partea secvenţială şi cea paralelă.
Datorită resurselor sale deosebite performanţele calculatorului MPP sunt ridicate. Viteza de
calcul măsurată în milioane de operaţii pe secundă diferă în funcţie de tipul operaţiilor fiind de ordinul
miilor. pentru operaţii întregi şi de ordinul sutelor pentru operaţii în virgulă flotantă.
În continuare vor fi prezentate două calculatoare cu arii de procesoare asociative. Reamintim că o
arie de procesoare asociative este oarie de procesoare în care memoriile de scriere/citire utilizate sunt
adresabile după conţinut. După modul de acces la locaţiile memoriei ariile se împart în două categorii:
paralele şi seriale. La rândul ei prima categorie cuprinde două tipuri de organizări:
- arri asociative paralele cu organizare la nivel de cuvânt
- arii asociative paralele cu logică comparare distribuită.
La primul tip există logică de comparare la nivelul fiecărui bit la unui cuvântiar decizia se ia la
nivelul fiecărui cuvănt. La cel de al doilea tip logica de comparare este asociată la nivel de cuvânt, luând
în considerare un număr de biţi sau la nivel de gru de cuvinte. Cel de al doilea tip de organizare
presupune logică de comparare mai puţină deci preţ de cost mai redus.
Figura 5.51 prezintă stuctura calculatorului PEPE. este un exemplu de arie asociativă paralelă cu
logică distribuită. Este o realizare a laboratoarelor Bell şi a devenit funcţional în anul 1973. A fost
construit pantru prelucrarea semnalelor radar
Nici acest calculator nu este de sine stătătorci trebuie cuplat la unul gazdă.
PEPE dispune pe 188 elemente procesoare organizată în opt grupuri a câte 36. fiecare element
procesor dispune o unitate aritmetică, o unitate de ieşire şi o memorie asociativă de capacitate 1024x32
biţi. Activarea/dezactivarea elementelor procesoare precum şi încărcarea procesului ce trebuie executat se
face de calculatorul de gazdă.
Fiecare element procesor urmăreşte evoluţiacât unui obiectdin imaginea radar. De asemenea memorează
evoluţia acestui obiect.
Restul figurii 5.51 cuprinde schema bloc a unităţii de control a ariei existente în PEPE.

Un exemplu de aria asociativă serială este calculatorul STARAN. Figira 5.52 prezintă structura
acestui calculator. Este o realizare a firmei Goodzear Aerospace şi a devenit funcţional în anul 1975, fiind
folosit la prelucrarea imaginilor.
Calculatorul conţine o arie asociativă împărţită în 32 module. Fiecare modul conţine 256
elemente procesoare, o memorie asociativă de capacitate 256x256 biţio reţea de interconectare şi un
selector.
Fiecare element procesor adresează memoria la nivel de bit în toate cuvintele simultan. Practic
accesul la memorie se face pe "felii" de câte un bit, simultan la toate cuvintele până la baleierea totală a
memoriei. În plus există posibilitatea de adresare doar a unui grup de cuvinte. Deci accesul la memorie se
poate face pe "felii"de un bit dar şi pe "felii" de cuvinte. În figura 5.53 este reprezentat modul de adresare
a memoriei.

În figura 5.54 se prezintă schema bloc a unui modul.


Accesul la memoria asociativă se face sub controlul reţelei de interconectare. Operaţiile de
deplasare a datelor sunt controlate de acestea.
Pentru căutarea unui informaţii se foloseşte logica pentru contolul transferului asociativ care va
conţine combinaţia de referinţă.
Unitatea de interfaţă permite cuplarea la STARAN a unităţilor de memorie de masă a
terminalelor alfanumericea altor calculatoare etc. este o unitate evoluată care permite transferul rapid.
Fiecare modul se poate conecta la unitatea de interfaţă prin 256 intrări şi 256ieşiri. Aceasta
permite atât o viteză mare de comunicare cu exteriorul cât şi accesul unui element procesor oarecare la un
echipament periferic.
STARAN dispune şi de posibilitatea de conectare la un alt calculator. acesta va executa operaţiile
secvenţiale iar cele paralele vor fi transmise ariei şi divizate pentru fiecare element procesor.
din exemplele prezentate rezultă că ariile de procesoare constituie sisteme orientate pe anumite
tipuri de aplicaţii. Performanţele lor sunt deosebite dar domeniul deaplicabilitate este restrâns.
Literaturade specialitate prezintă vitezele maxime de lucru dar acestea se referă la condiţii speciale de
programare şi la o alocare optimă a resurselor. Viteza de lucru depinde de dimensiunile ariei, crescând, în
principiu, liniar cu acestea. De asemenea depinde de lungimea vectorilorimplicaţi în prelucrare.
Costul de realizare a unui asemanea sistem este mare, de ordinul zecilor de milioane de dolari,
ceea ce face ca elesă nu fie folosite în scopuri comerciale.
Cu titlu informativ se reprezintă mai jos vitezele de lucru în condiţiile enunţate măsurate în
MFLOPS pentru principalele realizări:
ILLIAC IV - anul apariţiei 1972 - viteza 80-100
PEPE - 1973 - 100
STARAN - 1970 - 60
BSP - 1979 - 50
MPP - 1983 - 200 - 6000.
Printre tipurile de aplicaţii pentru care ariile de procesoare au dat rezultate foarte bune se pot
enumera:
- algebră matricială
- meteorologie
- convoluţie
- filtrare
- procesare de imagini
- analiză în timp real
- recunoaştere de contururi
- sortare

CAP 6 PROCESAREA VECTORIALĂ

6.1 DEFINIREA CONCEPUTULUI DE CARACTERISTIC

Procsarea vectorială este o altă metodă de realizare a prelucrării paralele a informaţiei. ea trebuie
privită în strânsă legătură cu celelalte metode przentate. Astfel suportu lardware pentru procesarea
vectoială presupune existenţa a mai multor unităţi de prelucrare care trebuie să lucreze în paralel. O ari pe
procesoare poate răspunde la cerinţele procesării vectoriale. De asemenea procesarea vectorială poate fi
implementată pe o structură pe bandă de asamblare. Operaţii sunt sub forme de vectori iar la intrările
benzii sosesc pe rând, elementele vectorilor. la ieşirea benzii se va obţine tot un vector.
Prin procesare vectorială se înţelege prelucrarea informaţiei reprezentată sub formă de vectori.
Un uperant vector constă dintr-un set de mărimi scalare de acelaşi tip. Exemplele de asemenea mărimi
scalare pot fi: caractere, numere, etc.
Câteva caracteristici ale unui vector sunt următoarele:
- lungimea vectorului este numărul de mărimi scalare care formează vectorul;există o strânsă
legătură între lungimea vectorului şi posibilităţile hardware ale maşini în sensul că eficientă maximă se
obţine dacă numărul de unităţi de prelucrare coincide cu lungimea .
- pasul vectorului: este diferenţa dintre valorile adreselor locaţiilor de memorie la care se găsesc
două componente succesive ale unui vector; această diferenţă poate fi constantă adică oricare două
elemente succesive ale unui vector se găsesc la aceeaşi distanţă unul faţă de celălalt, astfel spus elementele
unui vector se găsesc la locaţii de memorie ale căror adrese respectă o anumită regulă;
- lungimea unui element a vectorului: un element poate ocupa sau mai mulţi octeţi în funcţie de
tipul aplicaţiei.
În literatura de specialitate se prezină o clasificare a instrucţiunilor vectoriale în patru tipuri, de
bază, desrise de următoarele funcţii:
f1: V-->V
f2: V-->S
f3: VxV-->V
f4: VxS-->V
unde V este mulţimea operanţilor vectori iar S este mulţimea operanţilor scalari. Instrucţiunile de tipul f1
şi f2 sunt unare iar cele de tipu f3 şi f4 sunt binare.
Exemple de operaţii de tipul f1 sunt:
- funcţii trigonometrice: de exemplu o instrucţiune care obţine cosinusul unui vector rezultând un
alt vector, format din cosinusul fiecărui element al vectorului iniţial
- ridicarea la o putere: de exemlu o instrucţiune care obţine pătratul unui vector rezultând un alt
vector ale cărui elemente sunt pătratele elementelor vectorului iniţial
- complementarea: de exemplu o instrucţiune care neagă un vector rezultând un alt vector
Exemple de operaţii de tipul f2 sunt:
- adunarea elementelor unui vector: se va obţine o mărime scalară care reprezintă suma algebrică
a elementelor vectorului operant
- calculul de extremităţi: de exemplu o instrucţiune care furnizează acel element al unui vector
care are valoarea minimă;
- o operaţie logică: de exemplu o instrucţiune care obţine funcţia SI logic între toate elementele
unui vector.
Exemple de operaţii de tipul f3 sunt:
- operaţii aritmetice: de exemplu o instrucţiune care adună doi vectori, element cu element,
rezultând un altreilea vector ale cărui elementele reprezintă suma elementelor din cei doi vectori
iniţiali,care au aceeaşi poziţie în cadrul vectorilor, sau o instrucţiune de înmulţire a doi vectori, element
cu element, rezultând un al treilea vector
- operaţii logice: ed exemplu o instrucţiune care realizează funcţia SAU logic între doi vectori,
element cu element, rezultând al treilea vector;
- operaţii de comparare: de exemplu o instrucţiune care compară doi vectori şi crează un al
treilea vector, un element al vectorului rezultat fiind acel element din vectorii iniţiali, de pe aceeaşi
poziţie, care are valoare mai mare.
Exemple de operaţii de tipul f4 sunt:
- operaţii aritmetice: de exemplu o instrucţiune care adună un vector cu un scalar, rezultând un
alt vector ale cărui elemente se obţin prin adunarea la elementele vecorului iniţial a unui scalar, sau o
instrucţiune care înmulţeşte un vector cu un scalar rezultând un alt vector
- operaţii logice: de exemplu o instrucţiune care efectuează funcţia logică SI între elementele
unui vector şi un scalar rezultând un alt vector.
operaţii mai complexe se pot realiza prin combinarea mai multor instrucţiuni vectoriale de bază.
De exemplu pentru înmulţirea a două matrici se poate utiliza o instrucţiune de tipul f3, care înmulţeşte doi
vectori, unul fiind un rând al primei matrici iar celălalt fiind o coloană a celei de-a doua matrici, urmată
de o instrucţiune de tipul f2 care adună elementele unui vector rezultând un scalar.
Există câteva instrucţiuni speciale pentru prelucrarea vectorilor. Astfel prin compararea a doi
vectori se poate obţine un vector binar. Exemplu: fie doi vectori A = (1,4,6,7) şi B= (2,3,5,9) şi
presupunem o instrucţiune care compară relaţia A >B. Va rezulta vectorul binar Z= (0,1,1,0) în care un
element este 1 dacă elementul din aceaşi poziţie a vectorului A este mai mare decât cel corespunzător din
vectorul B şi 0 în caz contrar.
În general, vectorii binari se folosesc la compresia unui vector, printr-o instrucţiune specială
rezultând un vector de lungime mai mică, ale cărui elemente sunt acele elemente din vectorul iniţial
cărora le-a corespuns elementul 1în vectorul binar, pe aceeaşi poziţie. Exemplu: fie vectorul A=
(1,3,5,7,9) şi vectorul binar Z=( 0,1,0,1,0). După execuţia instrucţiunii de compresie va rezulta vectorul
B=( 3,7).
O altă utilizare a vectorilor binari este compunerea a doi vectori rezultând un alt vector cu
lungimea dublă faţă de cea a vectorilor iniţiali, unelement al vectorului rezultat fiind luat din primul
vector sau din al doilea după cum în poziţia respectivă a vectorului binar este 1 sau 0. Exemplu: fie
vectorii A=(1,3,5,7) şi B=(2,4,6,8) şi vectorul binar Z =(1,1,0,0,1,0,1,0). Vectorul rezltat în urma
compunerii este C=(1,3,2,4,5,6,7,8).
Pentru specificarea unei instrucţiuni vectoriale trebuiesc furnizate următoarele informaţii:
- codul operaţiei: indică operaţia ce se va executa şi are rolul să selecteze unităţile de prelucrare
ce vor fi utilizate:
- dacă vectorii sunt în memorie este necesaă câte o adresă de bază pentru fiecare vector operant şi
pentru vectorul rezultat
- dacă vectorii sunt în memorie este necesar pasul vectorului; în general dacă această informaţie
nu se specifică se considerţ ca fiind implicit 1; pasul poate fi constant dar există şi sisteme în care poate fi
variabil rezultând astfel o creştere a flexibilităţii;
- lungimea vectorului: este o infomaţie utilizată la stabilirea momentului când se încheie execuţia
instrucţiunii vectoriale.
În funcţia de locul unde se găsesc vectorii, structurile vectoriale se pot împărţi în două:
- structuri memorie-memorie, în care atât vectorii operanţi cât şi rezultatele se iau respectiv se
depun din/ în memorii: exemple de asemenea calculatoare sunt: CYBER-205, CDC STAR - 100, TI-ASC
etc.
- structuri registru-registru, în care unitatea de prelucrare ia operaţii vectori din registre şi
depune vectorul rezultat tot în registre; asemenea calculatoare au multe registre. Exemplu FUJITSU VP-
200.

6.2 Structura tipică a unui calculator vectorial

În figura 6.1 este prezentată structura tipică a unui calculator vectorial. Cu toată diversitatea
existentă în cadrul realizărilor în majoritatea cazurilor se poate observa existenţa unor blocuri cu funcţii
similare.
În primul rând toate calculatoarele vectoriale au posibilitatea prelucrări şi operanţilor scalari.
Aceasta se reflectă în structura prezentatăprin existenţa a două ramuri: una pentru prelucrări vectoriale şi
una pentru prelucrări scalare.
Unitatea pentru instrucţiuni aduce şi decodifică instrucţiunile. Separă instrucţiunile scalare de
cele vectoriale şi le direcţioneazăpe una din cele două căi. Registrelescalareşi procesorul scalar vor fi
utilizate la execuţia instrucţiunilor scalare. Procesorul scalar poate conţine una sau mai multe benzi de
asamblare.
O instrucţiune vectorială va fi direcţionată către unitatea pentru instrucţiuni vectoriale. Aceasta
va decodifica instrucţiunea va calcula adresele operanziilor şi va controla şi comanda întreaga desfăsurare
a execuţiei instrucţiunii. Operanţii sunt aduşi din memorie iar rezultatele sunt depuse în memorie de către
unitatea pentru vectori. Execuţia instrucţiunilor vectorială este realizată de procesorul vectorialîmpreună
cu registrele vectoriale. Procesul vectorial poate conţine mai multe benzi de asamblare împărţirea unei
operaţii vectoriale în suboperaţii şi alocarea lor la benzile de asamblare realizânduse de către unitatea
pentru instrucţiuni vectoriale.
Întrucât în cadrul aceluiaşi sistem există atât procesor scalar cât şi vectorial apapre problema
unei unităţi de măsură comune pentru evaluarea performanţelor. Pentru un procesor scalar unitatea de
măsură cea mai utilizată este MIPS: un milion de instrucţiuni pe secundă. Pentru un procesor vectorial
unitatea de măsură cea mai utilizată este MFLOPS: un mega operaţii în virgulă flotantă pe secundă. Nu
există un raport constant între MFLOPS şi MIPS ci acesta depinde de tilul maşinii. Se poate însă
considera că un procesor scalar execută o operaţie aritmetică în virgulă flotantă utilizând 2-5 instrucţiuni
iar în medie se obiţnuieşte săse considere că 1 MFLOPS = 3MIPS.

6.3 Conceptul de procesare vectorială şi cel de bandă be asamblare

În cadrul multor realizări din domeniul arhitecturilor paralele se găsesc implementate ambele
concepte. Performantele structurilor de benzi de asamblare sunt puternic afectate de lungimea
operanţiilor. Considerându-i că nişte vectori se poate afirma că rezultatele bune se obţin dacă lungimea
operanţilor vectori este egală cu numărul de nivele din bandă. Mai există şi alţi factori care influenţează
performanţele cum ar fi de exemplu rata cu care este alimentată respectiv descongestionată banda dar
acestea au fost comentate în Cap 4.

S-ar putea să vă placă și