Sunteți pe pagina 1din 47

1.

2 Arhitecturi paralele de calculatoare

Creșterea performanțelor calculatoarelor a fost frânată de stadiul tehnologiei. Cerințele 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 concurență 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
 Suprapunerea constă în execuţia simultană a două sau mai multe evenimente, de fapt a
diferite faze din acele evenimente.
Prelucrarea paralelă se desfășoară 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ă existența unor algoritmi care pot descompune un program în
module independente şi pe care apoi le pot 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 descrește de la nivelul inferior la cel superior,
în timp ce rolul software-ului descrește 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 în 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ă în 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 constituie 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 constituie procesorul 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. Aceasta 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
Inmultire
Inmultire

12 Impartire

canale Memoria 12 Adunare

de I/E regis-
 Incrementare
tre
Decrementare
Operatie
logica
Deplasare
tam-
pon Salt
pt.
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
maxima Unitati de banda magnetica acces maxim

Unitati de disc

Unitati de disc fix

Memoria operativa

Capacitate Perioada mica


UC
,minima a 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 dintre 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ă la punerea în
practică apar probleme specifice, a căror rezolvare ridică probleme complexe, deşi se elimină limitările
arhitecturilor Von Neumann.
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 față 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 ține 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 șiruri de instrucţiuni şi un șir 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 - șir de instrucţiuni;
SD - șir 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
performanțelor. 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.

UC
SI
Masina
SISD UE SI
SD
MM

Fig. 1.3 Maşina SISD


UC
SI
SI

UE1 UE2 UE3    UEn


SD 1 SD 2 SD 3 SD n
  
M M 1 M M 2 M M 3 M M n
M p

Fig.1.4. Maşina SIMD

  
UC1 UC2 UC3 UCn
S I1 S I2 S I3 S In
UE1 UE2 UE3    UEn

SD M M 1
S In
M M 2   

S I3
M M 3

S I2


S I1

M M n
M P
Fig.1.5. Masina MISD
  
UC1 UC2 UC3 UCn
S I1 S I2 S I3 S In
UE1 UE2 UE3    UEn

SD 1 SD 2 SD 3 SD n
  
M M 1 M M 2 M M 3 M M n
M P
S I1 S I2 S I3 S In
  

Fig.1.6. Maşina MIMD


Î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 șir 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.
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.

2.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 analogia 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 fiecare segment să poată prelucra date separate (Fig
2.1).
Ti - registre 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 benzii. 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:

1 2 n
IN T1 N1 T2 N1 ….. Tn Tn Tf OUT

CLK

Fig.2.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 (Fig.2.2).
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.2.3).

IN OUT
t t 2t t

CLK

TCLK = T
<=>
2t
IN OUT
t t t t t

CLK

Fig.2.2.
T
TCLK =
A 2
IN t t 2t t OUT

2t

B
Fig.2.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 trec 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 R1 pm R2
R2 Ck
Ck R1 Segment 1
n n
n

MULTIPLICATOR
OR
pm R2 Pm R4

Ck R3 R4 Ck Segment 2
n n

SUMATOR

Segment 3
Pm R5

R5 Ck
Fig.2.4.

Pm Ri =comandă de tip ”primeşte” în 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 într-un interval k  t 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 1 Segment 2 Segment 3

Tact R1 R2 R3 R4 R5
1 A1 B1 - - -
2 A2 B2 A1 * B1 C1 -
3 A3 B3 A2 * B2 C2 A1 * B1 +C1
4 A4 B4 A3 * B3 C3 A2 * B2 + C2
5 A5 B5 A4 * B4 C4 A3 *B3 + C3
6 A6 B6 A5 * B5 C5 A4 * B4 + C4
7 A7 B7 A6 * B6 C6 A5 * B5 + C5
8 - - A7 * B7 C7 A6 * B6 + C6
9 - - - - A7 * B7 + C7
Tab.2.1.
În acest caz m 3 , n  7, rezultă rata de lucru R  7/9 procese per tact.

2.1 Clasificarea benzilor de asamblare


În literatura de specialitate clasificarea BA s-a făcut după mai multe criterii
 Din punct de vedere funcţional:
1. BA pentru operaţii aritmetice – Majoritatea calculatoarelor realizează operaţiile aritmetice, în
special pe cele în virgulă flotantă, în BA
2. BA la nivelul procesoarelor – fiecare procesor realizează un tip de operaţii asupra operanzilor
care constituie ieşiri ale procesorului anterior din bandă
 După tipul de operanzi cu care pot lucra:
1. BA scalare
2. BA vectoriale
În general calculatoarele cu puteri mari de calcul au implementate ambele tipuri de benzi
 După flexibilitate:
1. BA unifuncţionale – ele sunt dedicate, adică pot realiza o singură funcţie; un calculator poate
conţine mai multe asemenea benzi
2. BA multifuncţionale – pot realiza mai multe funcţii: fie simultan, fie la momente diferite de
timp
 Din punct de vedere al reconfigurabilităţii:
1. BA statice – nu au capacitate de reconfigurare, fiind capabile să execute numai un tip de
operaţii; pot fi unifuncţionale sau multifuncţionale
2. BA dinamice – au posibilităţi de reconfigurare, fiind capabile să execute simultan mai multe
tipuri de operaţii. Prin urmare, ele nu pot fi decât multifuncţionale
 După structură:
1. BA liniare
2. BA neliniare; există situaţii când intrările unei BA depind de intrările anterioare, adică trebuie
ţinut cont de istoria execuţiei instrucţiei (procesului); în alte situaţii, ieşirile unui post afectează
simultan intrările mai multor posturi. Asemenea situaţii nu se pot rezolva decât cu structuri
neliniare care au atât reacţii cât şi conexiuni pentru trecerea peste mai multe niveluri. În asemenea
situaţii, la intrările posturilor sunt necesare şi multiplexoare ce să permită selecţia intrării (Fig.2.5).
Intrãri
M M Ieşiri
T1 N1 U T2 N2 T3 N3 U T4 N4 Tf
X X

Tact

Fig.2.5.Structura unei benzi de asamblare neliniare

2.2. Organizarea memoriei în structurile cu BA


În structurile cu viteză mare în care operaţiile se execută prin descompunerea lor în părţi distincte şi are loc
realizarea simultană a acestor părţi – de către unităţi independente – memoria poate deveni un factor de
strangulare a fluxului de informaţii. Prin urmare, pentru a răspunde unităţilor din BA ce cer acces la
memorie, aceasta trebuie proiectată astfel încât să asigure o rată mare de transfer – într-un caz optim: o
cerere la fiecare impuls de tact.
O altă problemă o constituie cererile de acces simultane din partea a două sau mai multe unităţi. Aceasta
este dificil de rezolvat; în general o unitate primeşte accesul la memorie, celelalte vor fi nevoite să aştepte.
n -p lin ii d e a d re s ã m a i s e m n ific a tiv e

p
m odul 0 m odul 1    m o d u l 2 -1

C om andă
şi    T am pon
T am pon T am pon
s e le c ţie
  

p lin ii d e a d re s ă
m a i p u ţin    M UX
s e m n ific a tiv e

Fig.2.6 Organizarea memoriei cu adresare şi selecţie simultană a modulelor


Există mai multe soluţii de organizare a memoriei în vederea creşterii ratei de transfer.
1. o primă soluţie este organizarea memoriei cu adresare şi selecţie simultană a modulelor
(Fig.2.6). Memoria are capacitatea de 2 n cuvinte şi este organizată în 2 p module, fiecare având
2 n p cuvinte. Organizarea este de tip întreţesut, fiecare modul fiind adresat de liniile mai
semnificative de adresă (în număr de n  p ), iar cele p linii mai puţin semnificative vor permite
trecerea cuvintelor din module diferite. Pentru aceasta se foloseşte o logică combinaţională de tip
multiplexor. La ieşirea fiecărui modul se află un tampon. Modificarea rapidă a rangurilor de adresă
mai puţin semnificative va determina trecerea la fel de rapidă a cuvintelor prin multiplexor
(întrucât ele se află în tampoane, fiind citite simultan din toate modulele de memorie). Această
organizare oferă o rata de transfer ridicată întrucât rangurile de adresă mai semnificative se
modifică mult mai rar decât cele mai puţin semnificative.
2. Organizarea memoriei cu selecţie succesivă a modulelor se constituie ca a doua soluţie
(Fig.2.7) Rangurile mai puţin semnificative constituie intrări într-un decodificator ale cărui ieşiri
sunt linii de selecţie pentru modulele de memorie iar selecţia unei locaţii din interiorul modulului
se face de liniile mai semnificative rămase ale magistralei de adrese.

n -p lin ii d e a d re s ã m a i s e m n ific a tiv e

        
C om andă
m odul 0 m odul 1    m o d u l 2 p-1

T am pon T am pon    T am pon

p lin ii d e
a d re să
m a i p u ţin    D eco-
  
s e m n ific a tiv e d ific a to r

Fig.2.7. Organizarea memoriei cu selecţie succesivă a modulelor

2.3 Unităţi centrale cu BA


Majoritatea calculatoarelor performante actuale au implementat conceptul de BA. Pentru a-i evidenţia
avantajele presupunem că ciclul unei instrucţiuni este împărţit în mai multe subcicluri; un subciclu
corespunzând timpului de întârziere pe un post din BA. Fig.2.8 prezintă defalcarea doar în două subcicluri
– adică se presupune că în BA există doar două posturi.
Considerând o diagramă în care pe axa x este reprezentat timpul, măsurat în perioade ale BA, o asemenea
perioadă fiind egală cu întârzierea pe un post şi presupunând că toate aceste întârzieri sunt egale (iar în caz
contrar perioada este egală cu întârzierea maximă pe un post) iar pe axa y este reprezentat numărul de
niveluri din BA, se poate observa câştigul în timp care rezultă din acest tip de structură. Fig.2.9.a reprezintă
cazul unei structuri fără BA, iar Fig.2.9.b, cazul unei structuri cu BA.

Instrucţiune Aducere
cod de Execuţie
instrucţiune
Fig.2.8. Unitate centrală cu BA cu două nivele
Nivele

Execuţie I1 I2 I3 I4
Aducere I1 I2 I3 I4
1 2 3 4 5 6 7 8 Timp
Fig.2.9.a Diagrama timp-execuţie într-o unitate centrală fără BA

Nivele

Execuţie I1 I2 I3 I4 I5 I6 I7
Aducere I1I2 I3 I4 I5 I6 I7
1 2 3 4 5 6 7 8 Timp
Fig.2.9.b. Diagrama timp-execuţie într-o unitate centrală cu BA
Din Fig.2.9.a se observă că numărul de subcicluri necesare execuţiei a m instrucţiuni este 2m în timp ce din
Fig.2.9.b rezultă că o unitate centrală cu BA cu 2 niveluri execută aceleaşi m instrucţiuni în m  1  
subcicluri.
I1 înseamnă prima instrucţiune, I2 înseamnă a doua instrucţiune, s.a.m.d.
Concluziile desprinse se referă la situaţia ideală. În realitate performanţele sunt mai scăzute datorită
următoarelor cauze:
 Timpii de întârziere pe cele două subcicluri nu sunt egali; subciclul de execuţie este în majoritatea
cazurilor mai lung decât cel de aducere întrucât el presupune accese frecvente la memorie pentru
depunerea 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
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 niveluri – 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 5 subcicluri:
1. Aducerea codului de instrucţie - ACI
2. Decodificarea codului de instrucţie - DCI
3. Calcul adresă operand - CAO
4. Citirea operanzilor - CO
5. Execuţia - E
Fig.2.10.a reprezintă cazul unei structuri fără BA, iar Fig.2.10.b, cazul unei structuri cu BA. Se observă o
creştere a performanţei faţă de cazul anterior. Numărul de subcicluri necesare execuţiei a m instrucţiuni
este 5m pentru cazul unei unităţi centrale fără BA, iar pentru cazul unei unităţi centrale cu BA numărul

subcilurilor este m  4 . 
Structura unei UC cu BA cu 5 niveluri este dată în Fig.2.11.

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
Fig.2.10.a Diagrama timp-execuţie într-o unitate centrală fără BA

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.2.10.b Diagrama timp-execuţie într-o unitate centrală cu BA cu 5 nivele
Aducere Decodi-
cod de ficare Calcul
Citire
instruc- cod de adresă Execuţie
operanzi
ţiune instruc- operanzi
(ACI) ţiune
Fig.2.11. Unitate centrală cu bandă de asamblare cu 5 nivele

2.4. Unităţi aritmetice cu BA


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.2.11 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.
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 p0= p = ZxY
Fig.2.12. Î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  z  2 şi Y  y  2 se va obţine rezultatul U  u  x . Operaţiile
a b c

elementare ce trebuiesc executate sunt: scăderea exponenţilor, aliniere, adunare şi normalizare.


În continuare se va prezenta un exemplu de unitate aritmetică cu bandă de asamblare. 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.2.13. Poate efectua operaţii
aritmetice cu operanzi în virgulă fixă sau flotantă, cu lungimea de 16, 32 sau 64 biţi.

Ope- Tampon Generare Scanare


ranzi Înmulţire
intrare produs exponent

Rezultate
Aliniere Adunare Normalizare Tampon
ieşire

Fig.2.13 Unitate aritmetică din calculatorul ASC


Unitatea este multifuncţională, având posibilitatea de a se configura în funcţie de operaţia cerută. Fig.2.14
prezintă configuraţiile unităţii aritmetice pentru operaţiile în virgulă fixă: adunare (a) şi înmulţire (b), iar
Fig.2.15 prezintă configuraţiile unităţii aritmetice pentru operaţiile în virgulă flotantă: adunare (a) şi
înmulţire (b).
Unităţile aritmetice cu bandă de asamblare sunt foarte eficiente în cazul operaţiilor de înmulţire a două
matrici.
Tampon Tampon
Operanzi Adunare Rezultate
intrare ieşire
a)
Tampon Tampon Rezultate
Operanzi Inmulţire Adunare
intrare ieşire
b)
Fig.2.14 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

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

2.5 Aplicarea conceptului în cazul microprocesoarelor


Sarcina microprocesoarelor este 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 trebuiesc procesate (care sunt registrele care conţin acele date), extrage datele din
registre, efectuează operaţia asupra datelor, pune rezultatul la loc unde trebuie, şi o ia de la capăt cu
instrucţiunea următoare. În Fig.2.16 avem structura unui procesor pe care indicăm cinci stagii prin care o
instrucţiune trece în prelucrare.
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 (lucrurile nu stau chiar aşa).
Cartea recomandată pentru studiul arhitecturii calculatoarelor moderne este Hennessy and Patterson
„Computer Architecture -- a Quantitative Approach”.

Fig.2.16: 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ă.

2.6 Registre 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 registre, numiţi pipeline registers. Fiecare din aceste registre 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. Fig.2.17 arată segmentarea procesorului de mai
sus.
Fig.2.17: 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ă registrele de separaţie au un rol important pentru blocajul benzii de asamblare în anumite
circumstanţe.

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

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

De notat că durează o vreme de când prima instrucţiune intră în BA până când termină execuţia: atâtea
cicluri 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 transmisie 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
asamblare. 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.

2.8. Probleme de proiectare a BA


Performanţele structurilor cu BA sunt afectate de o serie de factori. O proiectare corespunzătoare poate
minimiza, sau chiar uneori elimina efectul acestora. În continuare se face o prezentare a acestor factori şi a
soluţiilor utilizate.

2.8.1. Întârzieri pe niveluri


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 (Fig.2.2 şi Fig.2.3)
2.8.2 Utilizarea tampoanelor
Pentru a păstra un flux continuu de informaţii într-o bandă de asamblare, nivelele de prelucrare pot fi
prevăzute cu tampoane. Acestea au rolul să contracareze diferenţele de viteză între memorie şi nivelele de
prelucrare, furnizând acestora operanzii la frecvenţa cerută. Utilizarea tampoanelor poate evita stările de
aşteptare, nepotrivite, ale nivelelor de prelucrare.
Problema care trebuie rezolvată o constituie stabilirea capacităţii tampoanelor. În principiu este de dorit ca
această capacitate să fie cât mai mare având în schimb dezavantajul preţului de cost mărit şi a logicii de
comandă care devine mai complexă. Nu există soluţii generale, ci s-a încercat acoperirea aplicaţiilor pentru
care a fost construit calculatorul, cu performanţe optime.
Astfel:
1. În calculatorul STAR-100 unitatea aritmetică are un tampon de 64 cuvinte, cu lungime de 128 biţi,
iar unitatea centrală are un tampon pentru instrucţiuni de 32 cuvinte, cu lungimea de 64 biţi. La un
acces la memorie sunt aduse opt instrucţiuni rezultând o furnizare continuă de instrucţiuni pentru
decodificare şi execuţie.
2. În calculatorul ASC unitatea centrală dispune de două tampoane, pe câte opt cuvinte, pentru
instrucţiuni, iar fiecare unitate aritmetică, din cele patru existente, are două duble tampoane pentru
operanzi şi un dublu tampon pentru rezultate.
3. În calculatorul CRAY-1 tampoanele au fost prevăzute cu o capacitate relativ mare. Astfel unitatea
aritmetică scalară dispune de 64 tampoane, fiecare de câte 64 biţi, pentru date. Unitatea aritmetică
vectorială dispune de opt blocuri de registre, fiecare având 64 registre, fiecare registru având 64
ranguri. De asemenea există patru tampoane pentru instrucţiuni, de capacitate 64 cuvinte de câte
16 ranguri pentru fiecare, ceea ce permite aducerea în avans a unei secvenţe de instrucţiuni destul
de lungi.
Pentru îmbunătăţirea fluenţei transferului de informaţii trebuie proiectată cu atenţie şi reţeaua de magistrale
a structurii, pentru a se evita congestia liniilor. În principiu este de dorit asigurarea unei independenţe de
comunicare cât mai mari între resursele sistemului.

2.8.3 Micşorarea numărului de accese la memorie


Analizarea atentă a unui program poate evidenţia situaţii în care se pot înlocui accese la memorii cu accese
la registre ceea ce duce la o creştere a vitezei de lucru. Pentru asta este necesară o analizare în avans a
instrucţiunilor şi o grupare a acceselor obţinându-se astfel înlocuirea unor cereri la memorie, care nu sunt
absolut necesare, cu cereri la registre. Exemplele de mai jos ilustrează cele afirmate. Prin A şi B s-au notat
două registre, iar prin M o locaţie de memorie.
Ex1: Considerăm secvenţa:
(A)  M
(M)  B
Prima instrucţiune depune conţinutul registrului A în memorie, iar a doua instrucţiune încarcă registrul B
cu informaţia din aceeaşi locaţie de memorie în care s-a făcut depunerea. Secvenţa se poate înlocui cu:
(A)  M
(A)  B
adică conţinutul primului registru se încarcă atât în memorie cât şi în cel de-al doilea registru, eliminându-
se astfel un acces la memorie (Fig.2.22)
Ex.2: Considerăm secvenţa:
(M)  A
(M)  B
Prima instrucţiune încarcă registrul A cu informaţia dintr-o locaţie de memorie, iar a doua instrucţiune
încarcă aceeaşi informaţie în registrul B. Secvenţa se poate înlocui cu:
(M)  A
(A)  B
eliminând un acces la memorie (Fig.2.22)
Ex.3: Considerăm secvenţa:
(A)  M
(B)  M
Prima instrucţiune depune conţinutul registrului A într-o locaţie de memorie, iar a doua instrucţiune depune
conţinutul registrului B în aceeaşi locaţie, pierzându-se astfel conţinutul registrului A.
Secvenţa se poate înlocui cu:
(B)  M
eliminând un acces la memorie (Fig.2.22)

M M

A B A B

M M

A B A B

M M

A B B
Fig.2.22 Eliminarea acceselor la memorie

2.8.4 Dependenţe (Hazarduri)

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.

2.8.4.1 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 multe cicluri de ceas. Un exemplu de ultima speţă sunt de
pildă operaţiile în virgulă flotantă care durează uneori zeci de cicluri de ceas, iar procesorul de
obicei are o singură unitate de calcul în virgulă flotantă.
Soluţii de evitare a hazardurilor structurale:
 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
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 L1 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.

2.8.4.2 Conflicte
Datorită caracteristicilor structurilor cu BA (în care fiecare nivel lucrează independent unul faţă de celălalt
şi în care la un moment dat pot exista mai multe instrucţiuni în diferite faze ale ciclului lor) apare riscul
conflictelor.
Se pot delimita 3 tipuri de conflicte:
 Conflicte la memorii
 Conflicte la nivelurile de prelucrare
 Conflicte datorită indisponibilitătii unui operand la momentul solicitării acestuia

2.8.4.2.1 Conflicte la memorii


Acest tip de conflict poate să apară când:
1. două accese se referă simultan la acelaşi modul de memorie sau când
2. un acces adresează un modul care este ocupat cu deservirea unui acces anterior.
În ambele situaţii fluxul de date este încetinit sau întrerupt iar viteza de lucru scade.
Numărul mare de nivele dintr-o bandă de asamblare este un factor favorizant pentru conflictul la memorii,
întrucât fiecare nivel are posibilitatea de a efectua un acces la memorie independent de celelalte. Afirmaţia
este valabilă în cazul general, existând desigur şi aplicaţii în care unele nivele nu execută accese la
memorie. O proiectare corespunzătoare a memoriei poate minimiza efectul acestui conflict.
Posibilitatea apariţiei conflictelor nu poate fi eliminată dar un algoritm de descompunere a proceselor în
subprocese, care să fie alocate nivelelor, poate micşora numărul lor.
Pentru rezolvarea conflictelor doar unul dintre solicitanţi va putea fi deservit, ceilalţi fiind obligaţi să
aştepte.
În strânsă legătură cu problema de mai sus este şi cea a interfeţei între memorie şi banda de asamblare.
Viteza mare de lucru a benzii, teoretic un rezultat la un impuls de tact, presupune şi rezolvarea problemei
alimentării ei cu operanzi precum şi cea a preluării de la ea a rezultatelor. Memoria trebuie să fie astfel
proiectată încât să poată furniza un set de operanzi la fiecare tact şi să poată prelua un rezultat la fiecare
tact. Există şi situaţii în care operanzii şi rezultatele se preiau, respectiv se depun, din/în registre, care sunt
mai rapide decât memoria şi problema interfaţării cu banda de asamblare dispare. Însă în majoritatea
cazurilor partenerul de lucru este memoria.
Pentru rezolvarea tuturor problemelor prezentate există mai multe soluţii.
1. Una dintre ele presupune proiectarea memoriei în blocuri întreţesute . Cererile la memorie vor
fi distribuite în mod uniform la blocuri. Soluţia nu ridică necunoscute întrucât proiectarea
memoriilor întreţesute este stăpânită dar cere introducerea de circuite suplimentare datorită
creşterii în complexitate atât a părţii de comandă cât şi a celei de adresare.
2. Altă soluţie constă în creşterea numărului de ranguri care pot fi transferate în paralel cu
memoria adică creşterea lungimii cuvântului de memorie. Aceasta poate fi astfel organizată încât
la un acces să se transfere mai mulţi octeţi. Pentru aceasta va fi necesară existenţa unui dublu
tampon care să mai aibă şi posibilităţi de deplasare. Figura 4.16 prezintă ideea acestei soluţii. Ea
nu este optimă pentru rezolvarea problemei conflictelor întrucât logica de comandă şi selecţie a
octeţilor doriţi devine foarte complexă. Există posibilitatea ca la un moment dat un nivel al benzii
să ceară un octet dintr-un capăt al cuvântului şi alt nivel să ceară un octet din celălalt capăt al
cuvântului. La un alt moment cei doi octeţi pot să aibă poziţii diferite în cadrul cuvântului deci
logica de selecţie a octeţilor trebuie să fie foarte flexibilă. De asemenea, cu cât cuvântul este mai
lung cu atât creşte posibilitatea de cereri simultane.
3. În fine, o altă soluţie presupune existenţa unei memorii foarte rapide, care poate fi realizată cu o
memorie de tip “cache”, dar soluţia ridică probleme specifice memoriilor “cache”, dimensionarea
capacităţii, lipsa operandului solicitat la un moment dat, coerenţa etc. Şi această soluţie este mai
puţin potrivită pentru problema conflictelor, oferind totuşi o îmbunătăţire a performanţelor datorită
scurtării semnificative a timpului de acces şi implicit a timpului de aşteptare al nivelelor ce au
generat conflictul.
511 0
Memoria

511 0
Tampon Tampon
511 0
Tampon Tampon

Banda de Banda de
asamblare asamblare

Fig.2.20 Soluţie pentru interfaţarea memoriei cu banda de asamblare

2.8.4.2.2Conflicte la nivelele de prelucrare


Acest tip de conflict poate să apară atunci când
1. două instrucţiuni din bandă I şi I+K cer activarea unui aceluiaşi nivel sau când
2. o instrucţiune I cere activarea unui nivel care este ocupat de o instrucţiune anterioară. Problema
este asemănătoare cu cea a conflictului la memorii şi duce la încetinirea vitezei de lucru prin
introducerea de stări de aşteptare.
Pentru reducerea efectului acestui conflict se pot folosi două soluţii.
1. Una presupune existenţa în bandă a nivelelor însoţite de copii ale celor care se consideră că vor fi
mai solicitate. Soluţia dă rezultate bune dar duce la complicarea logicii de comandă şi control a
benzii.
2. Cealaltă soluţie constă în implementarea conceptului de bandă de asamblare chiar în cadrul
nivelelor de prelucrare, dar aceasta presupune ca sarcinile alocate acestora să poată fi descompuse.
2.8.4.2.3 Conflicte datorită indisponibilităţii operanzilor
Problema apare în situaţia în care execuţia unei instrucţiuni nu poate începe datorită faptului că operandul
constituie rezultatul unei instrucţiuni anterioare a cărei execuţie încă nu s-a încheiat. De exemplu, în
secvenţa de mai jos:
ADD U,V U+V U
MUL U,V UV U
Instrucţiunea de înmulţire nu poate primi operandul U decât după ce execuţia instrucţiunii de adunare s-a
încheiat.
Pentru detectarea conflictului se pot utiliza următoarele soluţii:
1. fiecărui registru, sau eventual fiecărei locaţii de memorie, îi este ataşat un rang care indică
disponibilitatea conţinutului.
2. reordonarea instrucţiunilor astfel încât între două instrucţiuni legate între ele după cum s-a
prezentat să fie inserate alte instrucţiuni care nu necesită respectivii operanzi. Soluţia este simplă,
la nivel de principiu, dar presupune existenţa unui sistem de control şi planificare sofisticat şi nu
este aplicabilă întotdeauna întrucât în unele cazuri reordonarea nu este posibilă.
Un alt tip de conflict datorită indisponibilităţii operanzilor apare în situaţia ce se va descrie mai jos. Într-o
bandă de asamblare informaţia trece succesiv de la un nivel la altul, fiecare efectuând un set de prelucrări
asupra acesteia. Există însă situaţii în care un nivel are nevoie de aceeaşi informaţie care a fost la un nivel
anterior la un moment de timp anterior. Aceasta însemnă că trebuie prevăzută posibilitatea de a transfera
date prin nivel fără ca acestea să fie prelucrate. O soluţie o constituie posibilitatea de a deplasa date prin
nivele, ca într-un registru de deplasare. Soluţia este prezentată în Fig.2.21, în care prin D s-a notat data ce
trebuie transmisă nemodificată şi care se transferă de la nivelul i la nivelul k.

D D    D

R i N iv . i R N iv . i - 1    R N iv . k
i-1 k

Fig.2.21. Transferul de date de la un nivel la altul fără modificarea lor

2.8.4.2 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 Tabel 2.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

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

2.8.4.2.1 Hazardul în operaţii cu memoria


Hazardul apare într-o bandă de asamblare datorită independenţelor între instrucţiuni şi duce fie la o situaţie
de blocare fie la obţinerea unor operanzi şi rezultate incorecte. Întrucât, la un moment dat, într-o bandă de
asamblare pot exista mai multe instrucţiuni aflate în diferite faze ale ciclului lor, există posibilitatea ca mai
multe nivele să execute accese simultane la aceeaşi resursă, pentru depunerea de rezultate la aceeaşi locaţie
de memorie, de exemplu, ceea ce poate duce la o scriere greşită în memorie. De asemenea există situaţii în
care o instrucţiune nu poate trece printr-un nivel de prelucrare datorită faptului că depinde de rezultatele
unei instrucţiuni anterioare şi care însă nu a fost executată. Cazurile prezentate constituie exemple de
hazard datorită dependenţelor de date şi ele trebuiesc detectate şi rezolvate.
Se pot delimita trei tipuri de hazard generat de dependenţele de date:
- hazard de tip scriere după citire,
- hazard de tip citire după scriere,
- hazard de tip scriere după scriere,
O operaţie de citire după o altă citire nu poate genera hazard întrucât nu există nici o schimbare.
Pentru a obţine condiţia de detectare a hazardului se va aborda instrucţiunea ca o funcţie care are ca
domeniu de definiţie mulţimea formată din conţinuturile resurselor sistemului iar ca domeniu de aplicare
aceeaşi mulţime. Prin resurse se înţeleg registrele, locaţiile de memorie şi indicatorii de condiţii şi control.
Considerând o instrucţiune I prin A (I) notăm domeniul de definiţie al funcţiei I iar prin B (I) notăm
domeniul de aplicare al aceleaşi funcţii. Considerăm execuţia de către banda de asamblare a două
instrucţiuni: prima este I şi a doua este K. Operanzii folosiţi de o instrucţiune sunt elemente ale domeniului
de definiţie ale funcţiei ataşate instrucţiunii iar rezultatele vor fi depuse în domeniul de aplicare al ei, adică
funcţia foloseşte conţinuturile unor resurse pentru a crea noi conţinuturi pentru resurse.
Hazardul de tip scriere după citire poate apare atunci când instrucţiunea K execută o scriere după ce
instrucţiunea I a executat o citire. La nivelul celor două funcţii condiţia de hazard este ca intersecţia între
mulţimile A(I) şi B(K) să nu fie mulţimea nulă. Figura 2.23 arată condiţia de existenţă a hazardului.
Hazardul de tip citire după scriere poare apare atunci când instrucţiunea K execută o citire după ce
instrucţiunea I a executat o scriere. La nivelul celor două funcţii condiţia este ca intersecţia mulţimilor B(I)
şi A(K) să nu fie mulţimea nulă. Figura 2.23 arată condiţia de existenţă a hazardului.
Hazardul de tip scriere după scriere apare atunci când instrucţiunea K execută o scriere după ce
instrucţiunea I a executat o scriere. La nivelul celor două funcţii condiţia de hazard este ca intersecţia
mulţimilor B(I) şi B(K) să nu fie mulţimea nulă. Figura 2.23 arată condiţia de existenţă a hazardului.
Pentru detectarea hazardului se pot utiliza relaţiile obţinute.
1. Se compară domeniile de definiţie şi aplicare ale funcţiilor ataşate instrucţiunilor ce intră în bandă
cu cele ale funcţiilor ataşate instrucţiunilor existente în bandă şi se poate genera un semnal de
detecţie.
2. O altă soluţie constă în distribuirea logicii de detectare la fiecare nivel de prelucrare, deci controlul
nu va mai fi centralizat ci distribuit. Soluţia oferă mai multă flexibilitate dar necesită o logică de
control şi detecţie mai complexă.
După detectarea apariţiei hazardului se pune problema rezolvării situaţiei apărute. Considerând o secvenţă
de instrucţiuni în care instrucţiunea I apare înaintea instrucţiunii K şi execută hazard:
1. soluţie o constituie oprirea execuţiei instrucţiunii K şi a celor ce urmează după ea până când
instrucţiunea I obţine resursa dorită şi execută operaţia.
2. soluţie mai evoluată, dar şi mai greu de realizat, o constituie oprirea execuţiei doar a instrucţiunii
K şi permiterea execuţiei instrucţiunilor următoare în condiţiile în care execuţia acestor
instrucţiuni nu generează alt hazard.

K I
A(K) B(K) A(I) B(I)
Citire Scriere
I B(I) K
A(I) A(K) B(K)
Scriere Citire

Hazard de tip scriere dupa citire Hazard de tip citire dupa scriere

I
A(I) B(I)

A(K) K B(K)

Hazard de tip scriere dupa scriere


Fig.2.23

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

Impactul salturilor este extrem de important din două motive:

 Din raţiuni de performanţă, procesoarele moderne au BA 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
cicluri va umple din nou BA golită de un salt. Asta înseamnă 7*6 + 4*6 = 66 cicluri 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.

2.8.5 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 în asemenea cazuri nu este 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.

2.8.6 Alegerea instrucţiunilor (proceselor, operaţiilor) ce pot fi executate într-o bandă de asamblare
Între structura unei benzi de asamblare şi tipurile de instrucţiuni (procese, operaţii) pe care le va executa
trebuie să existe o legătură, în caz contrar performanţelor benzii sunt minime. Proiectantul trebuie să
stabilească setul de instrucţiuni care vor fi executate de banda de asamblare. Pentru aceasta instrucţiunile
trebuie să îndeplinească anumite condiţii ca:
1. posibilitate de descompunere şi
2. independenţă de valorile datelor.
Datorită sincronismului unei benzi de asamblare, cel mai lent nivel de prelucrare va impune viteza de lucru
a întregului sistem. Pentru a obţine o viteză mare este de dorit ca fiecare instrucţiune să poată fi
descompusă în seturi de microoperaţii a căror execuţie durează aproximativ acelaşi timp şi care sunt
independente unele de altele.
O condiţie a eficienţei BA este independenţa instrucţiunilor de date. Pentru a obţine o viteză constantă este
necesar ca operaţiile efectuate de fiecare nivel să nu depindă de valorile pe care le pot lua datele.
O altă sarcină a proiectantului o constituie stabilirea gradului de flexibilitate a unei benzi de asamblare.
Întrucât este necesară execuţia a mai multor tipuri de instrucţiuni, proiectantul poate alege între stabilirea
câte unei benzi de asamblare separate pentru fiecare tip de instrucţiuni sau utilizarea unei benzi de
asamblare separate pentru fiecare tip de instrucţiuni sau utilizarea unei benzi de asamblare mai flexibilă, şi
mai complexă, care să poată executa mai multe tipuri de instrucţiuni. Între nivele pot fi prevăzute
comutatoare care să asigure “scurtcircuitarea” unui nivel realizând astfel o configurare a benzii în funcţie
de operaţia pe care o va executa.

2.8.7 Planificarea
Este o operaţie foarte importantă şi complexă strâns legată de tipurile de instrucţiuni care se pot executa
prin bandă şi de posibilitatea de descompunere a lor.
Scopul acestei operaţii este de a asigura fluenţă în funcţionare prin alocarea de părţi din ciclul instrucţiunii
la nivele de prelucrare astfel încât să nu apară riscul unui conflict.
În literatura de specialitate se prezintă tehnici prin care se poate realiza o planificare a operaţiilor pe care le
va executa fiecare nivel de prelucrare din banda de asamblare. Tehnica este aplicabilă atât pe benzile
unifuncţionale cât şi pe cele multifuncţionale.

2.8.8 Modificarea secvenţei normale de execuţie a unui program


Structura unei benzi de asamblare permite prelucrarea simultană a mai multor instrucţiuni. Considerând
împărţirea din Fig.2.11 se poate asigura ca în timp ce o instrucţiune este executată, alta primeşte operanzii,
alta este decodificată şi alta este adusă din memorie. În condiţiile arătate în paragrafele anterioare:
întârziere egală pe nivele, fără interdependenţe între date etc. performanţele benzii vor fi maxime, adică va
putea oferi un rezultat la un impuls de tact.
Toate consideraţiile de mai sus rămân valabile în condiţiile în care instrucţiunile intră în bandă succesiv. În
cazul modificării acestei secvenţe normale performanţele vor fi puternic afectate. Modificarea poate fi
determinată de apariţia unei instrucţiuni de salt, de apel de subrutină sau a unei întreruperi. Întrucât apelul
de subrutină se execută tot prin intermediul unui salt, precedat de scrieri în memorie, vom asimila
instrucţiunea de apel de subrutină cu cea de salt.
Întreruperile pot fi de două tipuri: interne şi externe. Din punct de vedere al efectului asupra performanţelor
unei benzi de asamblare vom asimila o întrerupere internă cu o instrucţiune de salt. O întrerupere externă
poate apare oricând în raport cu ciclul instrucţiunilor din bandă. La sesizarea unei asemenea întreruperi va
trebui oprită intrarea de noi instrucţiuni în bandă şi vor trebui preluate cele care tratează întreruperea
respectivă. Partea din banda de asamblare între nivelul unde se găseşte instrucţiunea ce a fost întreruptă şi
începutul ei va trebui să fie golită ceea ce va duce la pierderea unui timp suplimentar. Apoi operaţiile
efectuate vor fi echivalente cu cele din cazul unei instrucţiuni de salt.
Din cele arătate rezultă că tratarea situaţiei generate de o instrucţiune de salt acoperă în bună măsură pe cea
generată de o instrucţiune de apel de subrutină şi de o întrerupere.
Instrucţiunile de salt pot fi de două feluri: necondiţionate şi condiţionate. Situaţia cea mai complicată apare
în cazul celor de salt condiţionat.
Fig.2.23 arată desfăşurarea ciclului instrucţiunilor într-o bandă de asamblare. Cazul a se referă la o secvenţă
fără instrucţiune de salt iar cazul b se referă la o secvenţă cu instrucţiune de salt. Se consideră o bandă de
asamblare cu structura prezentată în fig.2.23 şi cu aceleaşi notaţii. Instrucţiunea 13 a fost o instrucţiune de
salt. Se observă efectul asupra performanţelor. Este de dorit ca prin banda de asamblare să circule programe
cu cât mai puţine instrucţiuni de salt.
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

Nivele

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

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


- secvenţă fără instrucţiuni de salt
- secvenţă cu instrucţiuni de salt

În literatura de specialitate, se arată că instrucţiunile unui program se împart în:


 instrucţiuni aritmetice şi de încărcare: aproximativ 60 % din total;
 instrucţiuni de depunere (scriere în memorie): aproximativ 15 % din total;
 instrucţiuni de salt necondiţionat: aproximativ 5 % din total;
 instrucţiuni de salt condiţionat: aproximativ 20 % din total, din care 12 % execută ramura de
condiţie îndeplinită iar 8 % pe cea de condiţie neîndeplinită.
Rezultă un total de 25 % de instrucţiuni de salt.
Efectul instrucţiunilor de salt necondiţionat asupra performanţelor unei benzi de asamblare nu poate fi
micşorat decât prin minimizarea numărului de apariţii ale acestor instrucţiuni.
În cazul instrucţiunilor de salt condiţionat existenţa celor două ramuri de continuare a programului
complică lucrurile şi mai mult. Este imposibil să se cunoască în avans ce ramură va fi executată. Mai jos se
prezintă câteva soluţii utilizate la stabilirea succesiunii instrucţiunilor:
1. ataşarea de circuite suplimentare, sub forma creării a încă unei benzi de amplasare, astfel încât să
fie urmate ambele ramuri create de o instrucţiune de salt condiţionat. Sunt aduse în avans
instrucţiuni din ambele ramuri, până în momentul când condiţia este stabilită şi se va continua
execuţia instrucţiunilor doar dintr-o singură ramură. Soluţia nu necesită introducerea de circuite
suplimentare dar poate afecta viteza de lucru.
2. întârzierea aducerii instrucţiunii următoare celei de salt condiţionat până la stabilirea condiţiei,
deci impune aşteptarea până la determinarea ramurii corecte. Apare un timp nefolosit în care tot ce
se mai poate face este execuţia instrucţiunilor intrate în bandă după cea de salt condiţionat dacă
acestea nu sunt afectate de luarea ulterioară a deciziei.
3. soluţie bazată pe o complicare a sistemului de control şi planificare. Se face o analiză a succesiunii
instrucţinilor şi a independenţelor dintre ele şi se reordonează instrucţiunile astfel încât cea de salt
condiţionat să apară mai înainte de momentul când se ia decizia. Soluţia are o aplicabilitate
limitată.

2.8.9. înlănţuirea
Este o facilitate pe care o au mai multe calculatoare cu benzi de asamblare, utilă mai ales în cazul
operaţiilor cu vectori.
În principiu constă în conectarea succesivă a mai multor benzi de asamblare, sincronizate, ieşirile unei
benzi constituind intrări pentru următoarea. Dacă operanzii care se transferă sunt vectori nu este necesar, în
principiu, ca a doua bandă să aştepte efectuarea operaţiilor de către prima bandă asupra tuturor elementelor
care alcătuiesc operanzii.
Figura 2.24 prezintă o înlănţuire de două benzi de asamblare. Cazul a se referă la varianta fără înlănţuire iar
cazul b la cea cu înlănţuirea (aceasta oferă un câştig prin economisirea timpului necesar citirii registrului).
Figura 2.25 prezintă o diagramă din care rezultă câştigul în timp datorită înlănţuirii în cazul unei succesiuni
de două benzi de asamblare. În figura 2.25a se prezintă varianta fără înlănţuire iar în figura 2.25.b se
prezintă varianta cu înlănţuire. Instrucţiunile 11,12,13,14 intră în prima bandă după care trec în a doua. În
cazul a apare un timp necesar preluării informaţiei de la prima bandă.

R
BA 1 BA 2

A<I>

BA 1 BA 2

B<K>
R

Fig.2.24 Succesiunea de BA
a - Fără înlănţuire
b - Cu înlănţuire
Nivele

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

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.2.25 Câştigul de timp la conectarea a 2 BA


a – fără înlănţuire
b - cu înlănţuire

2.9 Structurile de tip tunel


Aceste structuri, deşi diferite de cele cu bandă de asamblare, vor fi tratate în acest capitol datorită
asemănării cu acestea.
O structură cu bandă de asamblare se caracterizează prin procesare rapidă a informaţiilor dar şi prin
existenţa unui hardware evoluat şi complex. O structură de tip tunel cuprinde un minim de hardware, în
principiu este suficientă o singură unitate de prelucrare, un singur procesor, dar viteza de lucru este mică.
Ea poate realiza execuţia simultană a mai multor procese, cu caracteristici asemănătoare, dar care nu
necesită viteze mari.
Figura 2.26 prezintă structura de bază a unui sistem de tip tunel.

RS Unitate de RS RS
n prelucrare n n
(procesare)

Tact

Fig.2.26 Structura de tip tunel


În varianta sa minimă conţine o singură unitate de prelucrare. Un procesor şi m registre de stare RS i, fiecare
conţinând starea unui proces.
Procesele pot fi independente unul de celălalt dar cu cerinţe de calcul şi de viteză asemănătoare. La fiecare
pas, care poate fi un impuls de tact sau mai multe, unitatea de prelucrare execută o operaţie a procesului a
cărui stare se găseşte în registrul de la intrarea în unitatea de prelucrare, în timp ce starea procesului ce a
fost executată anterior se încarcă în primul registru de la ieşirea unităţii, conţinutul anterior al acestuia este
deplasat în registrul imediat următor ş.a.m.d.
Structura poate fi privită ca un registru de deplasare în care un rang este activ, execută operaţii, iar celelalte
îl alimentează cu informaţiile necesare. Privită din afară structura are acelaşi efect ca şi m unităţi de
prelucrare, procesare, lucrând în paralel asupra a m procese la viteza 1/m în raport cu cea a structurii de tip
tunel. Structura simulează paralelismul în detrimentul vitezei, dar cu minim de hardware.
O cerinţă importantă se referă la capacitatea registrelor, care trebuie astfel aleasă încât să poată memora
toate informaţiile care definesc starea unui proces.

Unitate de
Memorie TD prelucrare
(procesare)

+1
RA

Fig.2.27 Structură de tip tunel cu deţinerea stării proceselor într-o memorie

O variantă a structurilor de tip tunel este prezentată în fig.2.27. În locul registrelor este folosită o memorie
cu scriere şi citire. Conţinutul registrului de adrese, RA, va indica locaţia care va conţine informaţia de
stare a procesului ce se va executa la acel moment. Există şi un tampon de date, TD, cu rol de legătură între
memorie şi unitatea de prelucrare. Un pas va consta din execuţia următoarelor operaţii:
 citirea conţinutului memoriei de la locaţie cu adresa conţinută în RA şi încărcarea sa în TD,
 execuţia de către unitatea de prelucrare a operaţiilor cerute de procesul a cărui stare se găseşte în
TD.
 înscrierea rezultatului în TD și depunerea sa în memorie la aceeaşi locaţie a cărei adresă se găseşte
în RA.
 incrementarea conţinutului lui RA şi reluarea întregii secvenţe.
Structura de tip tunel prezintă asemănări cu cea cu bandă de asamblare, alcătuită din m procesoare, dar şi
cu una formată dintr-un singur procesor, rapid, multiplexat în timp.
Raportat la cele cu bandă de asamblare, structurile tunel sunt mai lente dar complexitatea hardware-ului
este mult redusă; într-o perioadă de timp ele pot prelucra procese diferite, independente, ceea ce este valabil
la structurile cu bandă de asamblare doar dacă perioada este mare.
O comparaţie între o structură de tip tunel şi una alcătuită din mai multe procesoare - numărul egal cu cel
al registrelor din structura tunel, evidenţiază simplitatea constructivă a celei dintâi. În plus în sistemele cu
mai multe procesoare apar probleme legate de planificarea operaţiilor, sincronizarea lor şi altele. Un
avantaj al acestora îl constituie toleranţa la defecţiuni: în structurile tunel, existând o singură unitate de
prelucrare, o defectare a ei va determina căderea întregului sistem.
Între structurile de tip tunel şi cele alcătuite dintr-un procesor multiplexat în timp există diferenţe minime.
Diferenţa apare între sistemele de control şi planificarea care sunt mai simple la structurile de tip tunel.
O structură de tip tunel mai evoluată poate cuprinde mai multe unităţi de prelucrare. Există variante în care
fiecare unitate de prelucrare are propriul său registru de deplasare sau în care există un singur registru de
deplasare care înglobează toate unităţile de prelucrare. Pentru cazurile în care informaţia de stare este
conţinută în memorii, o creştere a performanţelor se obţine prin întreţeserea blocurilor de memorie.
Din descrierea structurilor de tip tunel se poate concluziona că o unitate de prelucrare cu m registre de stare
implementează de fapt m procesoare virtuale. În cazul variantelor cu mai multe unităţi de prelucrare
numărul de procesoare virtuale creşte liniar cu cel al unităţilor de prelucrare doar dacă acestea sunt cuprinse
în registre de deplasare separate.
Structurile de tip tunel au fost implementate frecvent existând multe realizări în care conceptul a fost
aplicat mai ales pentru construcţia canalelor de intrare/ieşire.

2.10 Calculatoare cu BA

Puterile de calcul mari au impus construcţia de calculatoare din ce în ce mai evoluate, în care au fost
implementate metode diverse de creştere a vitezei de lucru. În structura unui supercalculator găsim atât
benzi de asamblare cât şi operarea cu vectori iar în unele cazuri şi arii de procesoare. Din acest motiv este
dificil să se prezinte implementări ale conceptului de bandă de asamblare întrucât ele trebuiesc legate de
contextul general al structurii. Totuşi se va încerca o delimitare a blocurilor construite pe principiul
respectiv.
Ideea benzii de asamblare a fost utilizată începând cu sfârşitul deceniului şase. În deceniul şapte au apărut
mai multe calculatoare ce utilizau acest concept. Se pot remarca CDC 6600 şi mai ales IBM 360/91. În
deceniul şapte apare CRAY-1 şi apoi în deceniul următor CYBER-205, supercalculatoare cu o structură
complexă care implementează conceptul de bandă de asamblare la diferite nivele. Un calculator foarte
rapid, dar deosebit de complex, este MPP (”Massively Parallel Procesor”) care conţine atât benzi de
asamblare cât şi o arie cu 16384 procesoare.
Schema bloc a unităţii centrale a calculatorului IBM 360/91 este prezentată în fig.2.28. Constă din patru
unităţi:
 unitatea de control,
 unitatea pentru instrucţiuni,
 unitatea de execuţie a operaţiilor în virgulă fixă,
 unitatea de execuţie a operaţiilor în virgulă flotantă.

U n it a t e
d e c o n tro l
D a te D a te
A d re se D a te
U n it a t e p e n t r u
in s t r u c ţ iu n i
C om enzi C om enzi

U n it a t e d e e x e c u ţ ie U n it a t e d e e x e c u ţ ie
în v ir g u lă f ix ă în v ir g u lă f lo t a n t ă

Fig.2.28 Unitatea centrală a calculatorului IBM 360/91

Unitatea pentru instrucţiuni este construită sub forma unei benzi de asamblare fiind capabilă să furnizeze
instrucţiuni cu rata de transfer maximă, adică o instrucţiune la un impuls de tact. Perioada impulsurilor de
tact este de 60ns. Cele două unităţi de execuţie sunt specializate, una pentru operaţii în virgulă fixă, iar
cealaltă pentru operaţii în virgulă flotantă. În cadrul fiecărei unităţi există câte două blocuri specializate:
una pentru operaţii de adunare iar cealaltă pentru operaţii de înmulţire. Alegerea unei unităţi, precum şi în
cadrul unităţii a unui bloc specializat, se face de unitatea pentru instrucţiuni după decodificarea codului
instrucţiunii primite. Ambele unităţi sunt astfel construite încât să suporte rata cu care primesc operanzi.
Unitatea de control are rolul să gestioneze toate transferurile din unitatea centrală precum şi cele între
aceasta şi memorie.
Un alt exemplu este calculatorul ASC al firmei Texas Instruments, care utilizează benzi de asamblare atât
la nivelul instrucţiunilor (aducere, decodificare, aducere operanzi, execuţie) cât şi la nivelul operaţiilor
aritmetice. Figura .2.29 prezintă schema bloc a unităţii centrale.

U n it a t e 1 U n it a t e d e
e x e c u ţ ie


U n ita te d e
 c o n tro l C a n a le d e

m e m o rie in t r a r e / ie ş ir e P e rife rie

E x t e n s ie
U n it a t e 8
m e m o r ie

Fig.2.29 Schema bloc a calculatorului ASC

Unitatea de control memorie asigură accesul la opt blocuri de memorie, pe 32 biţi, organizare în mod
întreţesut, astfel că la un ciclu de memorie se transferă opt cuvinte. Canalele de intrare/ieşire asigură
conectarea unui mare număr de periferice: imprimante, cititoare de cartele, perforatoare de bandă, unităţi de
disc, unităţi de bandă şi concentratoare de date.
Unitatea centrală are o structură de bandă de asamblare conţinând o unitate pentru instrucţiuni şi patru
unităţi de execuţie. Unitatea de execuţie dispune de un tampon dublu, T, care are căi separate pentru doi
operanzi, X şi Y şi rezultat Z şi de o unitate aritmetică sub formă de bandă de asamblare, notată cu UA în
fig.2.30
x x’
y y’
O p e ra n zi z z’
T UA
x x’
y y’
z z’
In stru c ţiu n i T
U n ita te UA
p e n tru x x’
in stru c ţiu n i y y’
z z’
T UA
x x’
y y’
z z’
T UA
Fig.2.30 Unitate centrală a calculatorului ASC

Structura unei unităţi aritmetice este prezentată în fig.2.13. Dispune de opt blocuri specializate iar
conexiunile pot fi configurate în funcţie de operaţia ce se va executa. Operanzii au lungimea unui octet.
Viteza de lucru a unei unităţi aritmetice este de 0,5-1,5 MFLOPS dacă operanzii sunt scalari şi 3-10
MFLOPS dacă operanzii sunt vectori.
Unitatea pentru instrucţiuni are rolul să furnizeze comenzi către unităţile de execuţie, în urma decodificării
codurilor instrucţiunilor aduse din memorie.
Calculatorul CYBER-205 reprezintă o realizare deosebită a firmei Control Data. Poate lucra cu operanzi
scalari sau vectoriali, dispunând de unităţi aritmetice separate pentru fiecare dintre aceste operaţii. Ne vom
rezuma doar la descrierea benzilor de asamblare implementate.
Unitatea aritmetică scalară dispune de cinci benzi de asamblare independente, specializate pentru operaţiile:
adunare/scădere, înmulţire, logice, de deplasare şi împărţire şi extragerea rădăcinii pătrate. Operanzii pot
avea 32 sau 64 biţi iar viteza maximă este 50 MFLOPS.
Unitatea aritmetică vectorială are una, două sau patru benzi de asamblare, fiecare fiind capabilă să execute
una din următoarele operaţii:adunare/scădere, înmulţire, împărţire, extragerea rădăcinii pătrate, logice şi de
deplasare . În fig.2.31 este prezentată schema bloc a unei asemenea benzi.

O p e ra n zi B lo c tra n s fe r d a te
R e z u lta te

a b c d e

a - bloc pentru adunare/scădere


b - bloc pentru înmulţire/împărţire
c- bloc pentru deplasări
d - bloc pentru operaţii logice
e - bloc pentru generare întârzieri

Fig.2.31 Schema bloc a unităţii aritmetice a calculatorului CYBER-205


Fiecare bloc din cadrul unităţilor aritmetice vectoriale este la rîndul său o bandă de asamblare. Fig.2.32
prezintă structura blocului pentru adunare/scădere.

Control Com-
Operanzi pentru parare Ali- Adu-
sistem exponenţi niere nare

Nor- Nor- Detec-


mali- mali- tare Rezultate
zare zare sfârşit

Fig.2.32 Blocul pentru adunare/scădere din unitatea vectorială din calculatorul CIBER-205

Câteva caracteristici, strîns legate de benzile de asamblare, sunt:


 viteza maximă: pentru operaţii vectoriale 100 MFLOPS dacă există o bandă şi până la 400
MFLOPS dacă există patru benzi, pentru operanzi pe 32 biţi, respectiv 50-200 MFLOPS pentru
operanzi pe 64 biţi: pentru operaţii vectoriale înlănţuite viteza se dublează;
 întârzieri minime pe bandă; cinci impulsuri de tact pentru operaţii de adunare, scădere şi înmulţire,
trei impulsuri de tact pentru operaţii logice şi 54 impulsuri de tact pentru operaţia de împărţire;
perioada impulsului de tact este de 20 ns.
Reconfigurarea BA

3
2 P3
M P0 M P1 M P2 M
1
0

Intrare în BA
S00
S01
M Ieşire
S10
S11
Se0
S20
Se0
S21
S30
S31

0  2  3 1
Din figură se observă că fiecare element de procesare dispune de un multiplexor. Aceste multiplexoare
coordonează execuția instrucțiunilor în felul următor: intrările de selecție (ex. S00 și S01) determină de pe
care linie (dintre cele 4 posibile) vine instrucțiunea ce urmează să fie procesată de elementul de procesare
asociat multiplexorului respectiv. Aplicând la intrările de selecție ale celor 4 multiplexoare semnale
corecte, se poate determina o ordine de parcurgere a elementelor de procesare. De exemplu, pentru a urma
ordinea 0-2-3-1, intrările de selecție ale multiplexorului 0 vor fi S00=0 și S01=0 pentru ca instrucțiunea să fie
preluată de la intrarea în banda de asamblare (observați că fiecare multiplexor are o linie ce se trage direct
de la intrarea în banda de asamblare, aceasta fiind linia corespunzătoare poziției multiplexorului în bandă);
intrările de selecție ale multiplexorului 1 vor fi S10=1 și S11=1 pentru a se selecta linia 3 la intrare; intrările
multiplexorului 2 vor fi S20=0 și S21=0 pentru a se selecta linia 0 la intrare (în acest caz este vorba de linia
care provine de la elementul de procesare 0, deci nu linia legată direct la intrarea în banda de asamblare);
iar intrările de selecție ale multiplexorului 3 vor fi S30=1 și S31=0 pentru a se selecta linia 2 de intrare.

2.11. 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ţă între marile companii nu permite compromisuri (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 trebuiesc găsite soluţii.

2.11.1 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 ce). 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şină; mai mult decât atât, programele de pe una n-ar mai merge pe alta,
din cauză că altele ar fi dependenţele care trebuiesc 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.

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

Tabel 23 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

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

2.11.3 Î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 cicluri 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 pipeline-uri 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.

3. Paralelismul în spaţiu - Arii de procesoare


Spre deosebire de structurile cu BA (la care paralelismul se obţine prin execuţia succesivă a părţilor din
instrucţiuni de către blocuri specializate, conectate între ele sub formă de lanţ, la un moment dat într-o BA
existând mai multe instrucţiuni în diferite faze ale ciclului lor), ariile de procesoare permit prelucrarea
simultană a unui set de date, executându-se la un moment dat aceeaşi operaţie de către mai multe unităţi de
lucru; sunt foarte potrivite pentru aplicaţii în care trebuiesc executate operaţii identice asupra unor blocuri
mari de date.
O arie de procesoare este o structură regulată, alcătuită din mai multe elemente procesoare, cu sau fără
memorie locală, cu posibilităţi de transfer a informaţiei între ele, toate lucrând în paralel sub comanda unei
unităţi de control unice - UC (în sens funcţional şi nu neapărat fizic).
O arie de procesoare poate executa operaţii scalare şi vectoriale. Elementele procesoare sunt sincronizate,
asigurând de fapt paralelismul structurii.
Funcţiile UC sunt următoarele:
 asigură comunicarea ariei cu exteriorul; în general o arie de procesoare – AP – nu este un
calculator de sine stătător, ci este conectată la un sistem gazdă care se ocupă de problemele de
intrare/ieşire şi de gestionare a transferurilor
 primește instrucţiunile direcţionate către arie, le decodifică şi hotărăşte cine să le execute: cele
scalare sunt executate de UC, iar cele vectoriale vor fi executate de elementele procesoare
 dispune de o memorie în care se încarcă programe de sistem sau ale utilizatorului; prin execuţia
acestor programe rezultă toate comenzile ce se dau elementelor procesoare
 transferă elementelor procesoare toate informaţiile de care au acestea nevoie, dar nu pentru
prelucrare (de exemplu constantele)
Funcţiile elementelor procesoare sunt următoarele:
 asigură execuţia comenzilor primite de la UC
 comunică între ele dar numai sub comanda UC
 au posibilitatea de a nu participa la execuţia unei prelucrări, dar fără a putea executa altceva între
timp
 AP sunt maşini de tip SIMD

3.1 Tipuri de organizări


AP pot avea una din organizările din Fig.3.1, respectiv Fig.3.2
Pentru organizarea din Fig.3.1, o UC comandă m elemente procesoare, fiecare cu propria memorie locală şi
care pot comunica între ele prin intermediul unei reţele de interconectare, aflată la rândul ei sub comanda
UC. Semnificaţia notaţiilor din figură este următoarea:
 UC – unitate de control
 MUC – memoria a UC
 EP – element procesor
 ML – memorie locală
 RIN – reţea de interconectare
Toate elementele procesoare execută aceleaşi operaţii, sub comanda unităţii de control, dar asupra unor
operanzi diferiţi obţinuţi din memoriile locale. Operanzii sunt încărcaţi în memoriile locale înaintea lansării
în execuţie a instrucţiunii care îi prelucrează. Încărcarea memoriilor locale se poate face fie sub controlul
unităţii de control a ariei, fie direct din exterior. Există posibilitatea mascării unor elemente procesoare,
adică se poate comanda starea de activat sau dezactivat a fiecăruia. Doar elementele procesoare activate vor
efectua operaţiile cerute, în timp ce restul vor fi în stări de inactivitate.
Pentru accesul procesoarelor la date unitatea de control transmite fiecăruia o adresă de baza şi modul de
adresare. Local, în funcţie de modul de adresare ales, procesoarele vor combina adresa de bază cu
conţinutul unui registru intern rezultând adresa pentru memoria locală. Utilizând, de exemplu, valori
diferite în registrul intern folosit pentru adresarea locală, se pot obţine date aflate la locaţii diferite în
diferite memorii locale. De exemplu, utilizând adresarea locală indexată, se pot obţine datele aflate intr-o
diagonală a memoriilor locale. Un element procesor nu poate obţine direct o dată din memoria locală a altui
element procesor ci numai prin intermediul acestuia şi a reţelei de interconectare.
O deosebită importanță o are reţeaua de interconectare şi metodele de direcţionare a informaţiei de la un
procesor la altul. Performanțele sistemului sunt decisiv afectate de caracteristicile reţelei de interconectare.
Problema reţelelor de interconectare va fi tratată într-un paragraf separat datorită complexităţii şi
importanței ei.
Un exemplu de calculator cu tipul de organizare prezentat este ILLIAC IV, care va fi descris ulterior.
Dispune de o reţea de interconectare distribuită în care fiecare element procesor este conectat la patru
vecini.

D
EP0
A
M L0
T
E
EP1
UC M L1
In s tru c ţiu n i,
d a te    R IN
  
M UC

E P n -2
M L n -2

E P n -1
M L n -1

Fig.3.1. Arie de procesoare cu memorii locale

D
EP0
A
MP0
T
E
EP1
UC MP1
Instrucţiuni,
 RIN
date

MUC 

EPn-2
MPn-2

EPn-1
MPn-1

Fig.3.2. Arie de procesoare cu memorii partajate


Un alt tip de organizare a unei arii de procesoare este prezentat în Fig.3.2. Elementele procesoare nu mai
dispun de memorii locale, în schimb există un număr de module de memorii care pot fi adresate de oricare
dintre procesoare. Deci soluţia utilizează memorii partajate. Numărul modulelor de memorie nu trebuie să
fie egal cu cel al celulelor procesoare. Există şi în această variantă o reţea de interconectare dar aceasta este
plasată între elementele procesoare şi modulele de memorii. Aceasta trebuie sa aibă următoarele
caracteristici:
 să ofere maxim de flexibilitate; să permită un număr cât mai mare de combinaţii procesor-memorie,
deci cât mai multe procesoare să poată comunica cu cât mai multe memorii
 să fie rapidă
 riscul de blocare să fie minim
 riscul de conflict să fie minim; conflictul poate apare ca urmare fie a două sau mai multe accese
simultane la acelaşi modul de memorie, fie a încercării de a utiliza aceeaşi cale de comunicare.
Ca exemplu de calculator cu acest tip de organizare, des prezentată în documentaţia de
specialitate, se poate aminti BSP (“Buroughs Scientific Processor”).
Pentru caracterizarea performanţelor unei arii de procesoare se folosesc patru parametri.
Semnificaţiile lor sunt următoarele:
 numărul de elemente procesoare: ca exemplu se poate aminti ILLIAC IV cu 64, BSP cu 16 şi MPP
(“Massively Parallel Processor”) cu 16384 procesoare
 setul de funcţii pentru direcţionarea informaţiilor prin reţeaua de interconectare
 setul de instrucţiuni pentru: operaţii scalare şi vectoriale, de direcţionare a datelor, acţionare
asupra reţelei de interconectare
 posibilităţile de mascare a elementelor procesoare.

5.3 Arii de procesoare asociative

Dacă într-o arie de procesoare, în locul memoriilor cu acces aleator se folosesc memorii asociative, se
obţine o arie de procesoare asociative. O memorie asociativă este caracterizată de faptul că este adresabilă
prin conţinut, de unde rezultă un grad inerent de paralelism. O asemenea memorie va permite adresarea
paralelă a mai multor cuvinte spre deosebire de una cu acces aleator din care cuvintele se obţin în mod
succesiv.
Fig.3.3 prezintă structura unei memorii asociative. Considerăm un modul de memorie cu p cuvinte fiecare
pe câte două ranguri. În structura memoriei intră şi un număr de registre al căror rol este următorul:
 registrul de comparare sau căutare, CC: va memora cuvântul care determină selecţia; în
funcţie de algoritmul ales se vor căuta locaţiile al căror conţinut sunt într-o anume relaţie
cu informaţia conţinută în CC (are q ranguri)
 registrul de mascare, M: maschează sau nu ranguri ale memoriei; prin rangul memoriei
înţelegem un cuvânt cu lungimea de p ranguri, alcătuit din rangurile cu aceeaşi pondere
din toate cuvintele memoriei - utilizând acest registru există posibilitatea eliminării unor
ranguri din operaţia de căutare sau comparare (are q ranguri)
 registrul rezultat, R: conţine rezultatul curent al operaţiei de căutare sau comparare (are p
ranguri)
 registrul tampon, T: conţine rezultatul anterior al operaţiei specificate (are p ranguri).
Fig.3.3 Structura unei memorii asociative

Oricare dintre aceste registre poate fi acţionat din exterior. În plus mai există numărătoarele care au rolul să
baleieze cuvintele, respectiv rangurile, utilizate în operaţia de căutare.
Funcţionarea memoriei este următoarea: registrul CC este încărcat cu o configuraţie în vederea selectării
tuturor cuvintelor care au acea configuraţie sau anumite câmpuri ale ei. Aceasta se stabileşte de
configuraţia încărcată în registrul de mascare care va permite neluarea în considerare a unor ranguri sau
câmpuri. Apoi se generează semnale de interogare către toate rangurile care nu au fost mascate. În funcţie
de tipul de organizare a memoriei, interogarea se va face paralel sau secvenţial. Rezultatul se va depune în
registrul de rezultat, fiecare rang al său indicând un cuvânt care a îndeplinit condiţia. În cazul când trebuie
îndeplinite mai multe condiţii va fi folosit şi registrul temporar.

În funcţie de modul cum se face interogarea (în paralel pe toate rangurile sau secvenţial) există două tipuri
de organizare a unei memorii asociative. Figura 5.4 prezintă căutarea paralelă. Semnalele de căutare sunt
activate simultan pentru toate rangurile tuturor cuvintelor. Căutarea este paralelă la nivel de cuvânt şi de
bit. Exista q registre indicatoare, RI 0-(q-1), corespunzătoare numărului de ranguri. Fiecare registru
indicator va memora care cuvânt a îndeplinit condiţia corespunzătoare rangului respectiv. Rezultatul
căutării se obţine prin intersecţia tuturor conţinuturilor registrelor indicatoare.
Figura 5.5 prezintă organizarea bazată pe căutare secvenţială. La un moment dat este implicat în căutare un
rang al tuturor cuvintelor. Există o logică exterioară care va selecta pe rând rangurile memoriei. Căutarea
este paralelă la nivel de cuvânt, dar secvenţială la nivel de bit. Şi aici există q registre indicatoare, fiecare
memorând care cuvinte au îndeplinit condiţia corespunzătoare a rangului respectiv, dar intersecţia
conţinuturilor lor se va face succesiv.
Pentru mai multă claritate se consideră un exemplu. Se presupune că se doreşte căutarea printre angajaţii
unei firme a acelora care sunt ingineri şi nu au mai mult de 30 ani. Deci trebuiesc făcute două căutări.
Figura 5.6 prezintă organizarea memoriei şi starea registrelor. În figura 5.6.a se observa rezultatul primei
căutări.

În registrul CC a fost încărcată condiţia, din care interesează doar codul pentru profesie. Ca urmare toate
celelalte ranguri vor fi mascate, ceea ce se observă din configuraţia aflată în registrul de mascare, M. În
urma căutării rezultă configuraţia depusă în registrul R. Figura 5.6.b arată starea registrelor după a doua
căutare şi rezultatul final. Registrul CC conţine condiţia, din care interesează doar câmpul pentru vârstă. Ca
urmare, registrul de mascare va masca toate celelalte ranguri. Rezultatul celei de-a doua căutări este depus
în registrul R şi apoi se execută o operaţie ŞI logic între conţinuturile registrelor R şi T. În registrul T a fost
transferat rezultatul primei căutări. În registrul R rămâne rezultatul final.
În exemplul considerat, ţinând seama de faptul că cele doua căutări s-au executat ca urmare a unor condiţii
diferite, cărora le corespund câmpuri diferite în registrul CC, întreaga operaţie s-ar fi putut efectua într-o
singură trecere, dacă algoritmul de calcul ar fi fost acelaşi. Dar la prima trecere s-au căutat cuvinte care
aveau valoarea unui câmp egală cu o anumită valoare iar la a doua trecere s-au căutat cuvinte care aveau
valoarea unui câmp mai mică decât o anumită valoare. Chiar şi în aceste condiţii căutarea într-o singură
trecere este posibilă principial, dar cu costul unei logici interne complexe. Dacă două sau mai multe cerinţe
se referă la aceeaşi condiţie, la acelaşi câmp din registrul de căutare şi comparare, CC, atunci căutarea prin
mai multe treceri devine obligatorie. Rezultatul final se va obţine întotdeauna în R.
Ariile de procesoare asociative pot implementa în mod optim un set de algoritmi a căror funcţie este
căutarea unor informaţii în conformitate cu o anumită regulă. Ca exemple se pot aminti:
 căutarea valorii maxime;
 căutarea valorii minime;
 căutarea valorii medii;
 căutarea configuraţiilor cu valoarea egală cu cea a unei configuraţii date;
 căutarea configuraţiilor cu valoarea diferită de cea a unei configuraţii date;
 căutarea configuraţiilor a căror valoare se află în vecinătatea uneia date;
 căutarea configuraţiilor a căror valoare se află într-un domeniu închis;
 căutarea configuraţiilor a căror valoare se află într-un domeniu deschis.
Tot datorită caracteristicilor memoriilor asociative este uşurată operaţia de ordonare a informaţiilor în
conformitate cu o anumită regulă. Ca exemplu se pot aminti:
 ordonarea informaţiilor în sens crescător al valorii lor;
 ordonarea informaţiilor în sens descrescător al valorii lor.
În concluzie se poate afirma că ariile de procesoare asociative au două trăsături importante:
 au toate caracteristicile unei arii de procesoare; sunt maşini SIMD, au structură regulată,
conţin mai multe procesoare care lucrează sincron sub conducerea unei unităţi de control,
efectuând aceeaşi operaţie asupra unor date diferite,
 memoriile cu scriere/citire sunt de tip asociativ.

6.1 DEFINIREA CONCEPUTULUI DE CARACTERISTIC

Procesarea 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 prezentate. Astfel suportul hardware pentru procesarea
vectorială presupune existenţa a mai multor unităţi de prelucrare care trebuie să lucreze în paralel. O arie de
procesoare poate răspunde la cerinţele procesării vectoriale. De asemenea procesarea vectorială poate fi
implementată pe o structură de bandă de asamblare: Operanzii sunt sub forme de vectori - elementele
vectorilor sosesc pe rând la intrările benzii, iar 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
operand 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şinii în sensul că eficienţă
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 unul sau mai mulţi octeţi în
funcţie de tipul aplicaţiei.
În literatura de specialitate se prezintă o clasificare a instrucţiunilor vectoriale în patru tipuri de
bază, descrise de următoarele funcţii:
1. f1: V-->V
2. f2: V-->S
3. f3: VxV-->V
4. 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 tipul 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 exemplu 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 ȘI 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 al treilea 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: de 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 creează 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 vectorului 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ă ȘI î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, un element 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 rezultat î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 necesară câte o adresă de bază pentru fiecare vector
operand ş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 informaţ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ării 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. Registrele scalare ş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 operanzilor şi va controla şi comanda întreaga desfăşurare a
execuţiei instrucţiunii. Operanzii sunt aduşi din memorie iar rezultatele sunt depuse în memorie de către
unitatea pentru vectori. Execuţia instrucţiunilor vectoriale este realizată de procesorul vectorial împreună cu
registrele vectoriale. Procesorul vectorial poate conţine mai multe benzi de asamblare, împărţirea unei
operaţii vectoriale în sub-operaţii şi alocarea lor la benzile de asamblare realizându-se de către unitatea
pentru instrucţiuni vectoriale.

Întrucât în cadrul aceluiaşi sistem există atât procesor scalar cât şi vectorial apare 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 rolul 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. Performanțele structurilor de benzi de asamblare sunt puternic afectate de lungimea operanzilor.
Considerându-i că nişte vectori se poate afirma că rezultatele bune se obţin dacă lungimea operanzilor
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