Vous êtes sur la page 1sur 168

ARHITECTURA CALCULATOARELOR

(STRUCTURI SI ARHITECTURI MULTIPROCESOR)


Anul III seria 2009-10
Precedenţe: Urmarea acestui curs presupune promovarea cursului de
STRUCTURA SI ARHITECTURA CALCULATOARELOR.
Metoda de evaluare a cunoştinţelor: evaluarea continua la CURS si
LABORATOR
 Condiţii de promovare: Nota minima la laborator 5
Nota minima la examen 5

 Ponderea: 50% nota de la laborator şi toate


laboratoarele efectuate.
50% nota de la examen.
 Referatele prezentate la curs se notează. Ponderea acestei note este egala cu
media notelor obţinute la laborator.

Cap.8. UNITATEA DE MEMORIE

Memoria este partea sistemelor de calcul care se utilizează pentru păstrarea


şi regăsirea ulterioară a datelor şi instrucţiunilor. Operaţiile principale în care este
implicată memoria sunt următoarele:
• Preluarea datelor de intrare în memorie;
• Păstrarea datelor pentru a putea fi prelucrate de către UCP;
• Păstrarea datelor de ieşire pentru a putea fi preluate de echipamentele de
ieşire;
• Transmiterea datelor din memorie la ieşire.
Sistemele de memorie influenţează în mod critic performanţele
calculatoarelor. Deoarece în memorie sunt păstrate atât datele cât şi instrucţiunile,
sistemul de memorie trebuie să satisfacă cererile simultane pentru prelucrarea
datelor, execuţia instrucţiunilor şi transferul între memorie şi exterior.
Există o mare varietate de tipuri, tehnologii, organizări, performanţe şi costuri
ale memoriilor utilizate în sistemele de calcul. Nici una din acestea nu este optimă
pentru satisfacerea tuturor cerinţelor. Ca o consecinţă, sistemele de calcul sunt
echipate cu o ierarhie de subsisteme de memorie, unele interne sistemului
(accesibile direct de UCP), iar altele externe (accesibile de către UCP printr-un
modul de I/E).

8.1. Caracteristicile sistemelor de memorie


Cele mai importante caracteristici sunt următoarele:
- Amplasarea. Sistemele de calcul dispun de memorii interne şi externe. Me-
moria internă este considerată de cele mai multe ori ca memorie principală. Există
însă şi alte forme de memorie internă. UCP necesită o memorie locală proprie, sub
forma registrelor. Unitatea de comandă şi control din cadrul UCP poate necesita de
asemenea o memorie proprie, în cazul unităţilor de comandă microprogramate.
Memoria externă constă din dispozitivele periferice, ca discuri sau benzi magnetice,
care sunt accesibile de către UCP prin controlere (module) de I/E.
- Capacitatea. Se exprimă prin octeţi (bytes) care formează sistemul de
memorie (Kocteţi, Mocteţi, Gocteţi).
- Unitatea transferabilă. Pentru memoria internă, unitatea transferabilă este
egală cu numărul liniilor de date către şi de la modulul de memorie, deci cu
numărul de biţi transferaţi simultan. Unitatea transferabilă nu trebuie să fie egală
neapărat cu un cuvânt de memorie. Pentru memoria externă, datele sunt
transferate de multe ori în unităţi mai mari decât un cuvânt, numite blocuri.
- Metoda de acces. Există următoarele tipuri de acces la unităţile de date:
1. Acces secvenţial. Memoria este organizată în unităţi de date, numite
înregistrări. Accesul trebuie realizat într-o secvenţă liniară. Se utilizează informaţii
de adresare memorate pentru separarea înregistrărilor şi pentru a permite
regăsirea informaţiilor. Timpul de acces la o înregistrare oarecare este variabil şi
depinde de poziţia înregistrării în cadrul fişierului. Unităţile de bandă sunt
echipamente cu acces secvenţial.
2. Acces direct. Blocurile sau înregistrările individuale au o adresă unică pe
baza amplasării fizice a acestora. Timpul de acces este de asemenea variabil şi
depinde de poziţia înregistrării accesată anterior. Unităţile de discuri fixe sunt
echipamente cu acces direct.
3. Acces aleator. Fiecare locaţie adresabilă a memoriei are un mecanism de
adresare încorporat. Timpul de acces a fiecărei locaţii este independent de
secvenţele acceselor anterioare şi este constant. Fiecare locaţie poate fi, deci,
selectată aleator şi poate fi adresată şi accesată direct. Memoria principală este
cu acces aleatoriu (RAM).
4. Acces asociativ. Memoria asociativă este un tip de memorie cu acces
aleator, care permite compararea unor biţi dintr-un cuvânt cu o anumită valoare
specificată şi efectuarea acestei comparări în mod simultan pentru toate cuvintele.
Deci, un cuvânt este regăsit pe baza unei părţi a conţinutului acestuia şi nu pe
baza adresei (memorie adresabilă prin conţinut). Fiecare locaţie are propriul
mecanism de adresare, iar timpul de regăsire este constant, independent de
locaţie sau de secvenţele acceselor anterioare.
- Tipul memoriei. Cele mai utilizate tipuri de memorii sunt memoriile
semiconductoare şi memoriile magnetice.
- Metoda de scriere a informaţiilor într-o memorie poate fi reversibilă sau
permanentă. Memoriile la care citirea şi scrierea pot fi efectuate în timpul
funcţionării sunt numite memorii cu citire-scriere. Toate memoriile utilizate
pentru memorare temporară sunt de acest tip. Memoriile semiconductoare cu
citire-scriere sunt numite de obicei memorii cu acces aleator (RAM), ceea ce
reprezintă o folosire improprie a termenului, deoarece există şi alte tipuri de
memorii care sunt cu acces aleator.
Memoriile al căror conţinut nu poate fi modificat sunt numite memorii
numai cu citire (ROM - Read-Only Memory). O memorie ROM este astfel o
memorie care nu se poate şterge. Aceasta este citită utilizând metode de acces
aleator ca cele pentru o memorie RAM. Memoriile ROM sunt utilizate pe scară
largă pentru memorarea programelor de control cum sunt microprogramele. Alte
aplicaţii cuprind programe de sistem sau subrutine de bibliotecă pentru funcţii
utilizate frecvent. Discurile compacte, cum sunt discurile CD-ROM, reprezintă o
clasă de memorie secundară ROM care utilizează un mecanism de citire-scriere
optic.
O memorie semiconductoare ROM este fabricată ca şi orice altă capsulă
de circuit integrat, datele fiind înscrise în timpul procesului de fabricaţie. Aceasta
are dezavantajul că procesul de includere a datelor are un cost fix relativ ridicat,
ceea ce este acceptabil numai la fabricarea un număr mare de circuite de
acelaşi tip. Atunci când este necesar doar un număr redus de memorii ROM cu
un anumit conţinut, o alternativă mai puţin costisitoare este memoria PROM
(Programmable Read-Only Memory). In cazul memoriei PROM, procesul de
scriere este executat prin semnale electrice de către furnizor sau utilizator într-
un moment ulterior fabricaţiei circuitului. Procesul de scriere, numit
"programare", este executat off-line utilizând un echipament special. Memoria
PROM asigură flexibilitate la un cost moderat, dar are dezavantajul că nu poate
fi ştearsă.
O altă variantă a memoriei ROM este memoria EPROM (Erasable
Programmable Read-Only Memory). Aceasta este citită şi înscrisă electric, ca şi
memoria PROM, însă înaintea unei operaţii de scriere toate celulele de
memorare trebuie şterse pentru a avea aceeaşi stare iniţială prin expunerea
capsulei la o radiaţie ultravioletă. Acest proces de ştergere poate fi executat în
mod repetat.
O formă mai atractivă de memorie ROM este memoria EEPROM
(Electrically Erasable Programmable Read-Only Memory). Această memorie
poate fi înscrisă în orice moment fără a-i şterge conţinutul. Operaţia de scriere
trebuie efectuată pe blocuri şi necesită un timp considerabil mai lung decât
operaţia de citire. Memoria EEPROM are avantajul că poate fi actualizată on-
line, utilizând semnale obişnuite de control, adrese şi date. Acest tip de memorie
este potrivită pentru păstrarea programelor de control şi ca un înlocuitor al
memoriei secundare în anumite aplicaţii.
La anumite tehnologii de memorie, informaţiile memorate se pierd după o
perioadă de timp dacă acestea nu sunt refăcute. Pierderea informaţiilor
memorate poate avea loc în următoarele cazuri: citirea distructivă, memorarea
dinamică şi volatilitatea. La anumite memorii metoda de citire distruge
informaţiile memorate; acest fenomen este numit citire distructivă (DRO -
Destructive Readout). Memoriile la care citirea nu afectează informaţiile
memorate sunt caracterizate prin citire nedistructivă (NDRO -Non-Destructive
Readout). La memoriile DRO fiecare operaţie de citire trebuie urmată de o
operaţie de scriere care reface starea originală a memoriei. Această refacere
este efectuată automat utilizând un registru buffer. Operaţia de citire transferă
cuvântul din locaţia adresată într-un registrul buffer. Conţinutul bufferului este
rescris apoi în locaţia originală.
Anumite memorii au proprietatea că informaţia memorată are tendinţa să
se modifice după un anumit timp, datorită unui proces fizic. De exemplu, la
anumite memorii semiconductoare o sarcină electrică dintr-un condensator
reprezintă valoarea binară 1, iar absenţa sarcinii reprezintă valoarea binară 0. In
timp, condensatorul tinde să se descarce, determinând pierderea informaţiei.
Pentru a evita acest lucru sarcina este refăcută printr-un proces numit
reîmprospătare. Memoriile care necesită o reîmprospătare periodică sunt numite
memorii dinamice, spre deosebire de memoriile statice, care nu necesită
reîmprospătare. Majoritatea memoriilor care utilizează tehnici de memorare
magnetică sau optică sunt statice. O memorie dinamică este reîmprospătată în
acelaşi mod în care sunt refăcute informaţiile într-o memorie cu citire distructivă.
Conţinutul fiecărei locaţii este citit periodic în registre buffer, iar apoi este rescris
sub formă amplificată în locaţia originală.
Conţinutul unei memorii poate fi distrus de asemenea prin deconectarea
sau defectarea sursei sale de alimentare. O memorie este volatilă dacă lipsa
tensiunii de alimentare distruge informaţiile memorate. Memoriile RAM
semiconductoare dinamice şi statice sunt volatile, în timp ce memoriile ROM şi
variantele lor sunt nevolatile. Majoritatea memoriilor secundare magnetice şi
optice sunt nevolatile.

8.2. Indicatori de performanţă ai memoriilor


Din punctul de vedere al utilizatorului, cele mai importante caracteristici ale
unei memorii sunt capacitatea şi performanţa. Performanţa unei memorii este
determinată în principal de viteza cu care informaţiile pot fi citite din memorie
sau scrise în memorie. Cei mai importanţi indicatori de performanţă utilizaţi sunt
timpul de acces, durata ciclului, rata de transfer şi fiabilitatea
1. Timpul de acces al unei memorii cu acces aleator, notat cu t A , este
timpul necesar pentru a executa o operaţie de citire sau scriere pentru o
cantitate fixă de informaţie, de exemplu, un cuvânt. Acest timp este calculat din
momentul în care memoria primeşte o cerere de citire sau scriere până în
momentul în care datele sunt disponibile pentru utilizare sau sunt memorate.
Timpul de acces pentru citire nu este întotdeauna egal cu timpul de acces
pentru scriere. Pentru o memorie cu acces non-aleator, timpul de acces este
timpul necesar pentru a poziţiona mecanismul de citire-scriere la locaţia dorită.
2. Durata ciclului, notată cu t M , se referă în primul rând la memoriile cu
acces aleatoriu. Durata ciclului constă din timpul de acces la care se adaugă
timpul suplimentar necesar înainte de a putea începe un al doilea acces.
Anumite memorii cu citire distructivă nu pot iniţia un nou acces înainte de a fi
executată o operaţie de refacere sau reîmprospătare. De aceea, timpul minim
care trebuie să treacă între începerea a două operaţii de acces consecutive
poate fi mai mare decât timpul de acces t A .
3. Rata de transfer, notată cu rM , este cantitatea maximă de informaţii
care pot fi transferate în sau din memorie în unitatea de timp. Această rată este
măsurată în biţi pe secundă sau cuvinte pe secundă. Dacă w este numărul de
biţi care pot fi transferaţi simultan cu memoria, rata de transfer este rM = w / t M
biţi/s. Dacă t M = t A , atunci rM = w / t A .
4. Fiabilitatea este măsurată prin timpul mediu între defecte (MTBF -Mean
Time Between Failures). In general, memoriile fără părţi în mişcare au o
fiabilitate mult mai ridicată decât memoriile care implică o deplasare mecanică,
precum discurile magnetice. Chiar şi la memoriile fără părţi în mişcare, apar
probleme de fiabilitate, în particular atunci când se utilizează densităţi de
memorare sau rate de transfer foarte ridicate. Codurile detectoare de erori şi
codurile corectoare de erori pot creşte fiabilitatea oricărui tip de memorie.

8.3. Ierarhia de memorii


Principalele caracteristici de care trebuie să se ţină cont la realizarea unui
sistem de memorie sunt capacitatea şi performanţele memoriei, în special timpul
de acces. Pe lângă acestea, trebuie să se ia în considerare şi costul memoriei.
Aceste caracteristici sunt contradictorii. De exemplu, există în general următoarele
relaţii între capacitatea, timpul de acces şi costul pe bit al diferitelor tehnologii
utilizate pentru implementarea sistemelor de memorie:
- O capacitate mai mare implică un timp de acces mai mare;
- O capacitate mai mare implică un cost pe bit mai mic;
- Un timp de acces mai mic implică un cost pe bit mai mare.
Pe de o parte, trebuie utilizate tehnologii de memorie care asigură o
capacitate ridicată, pentru că o asemenea capacitate este necesară şi deoarece
costul pe bit al acestor tehnologii este mai redus. Pe de altă parte, pentru a
satisface cerinţele de performanţă, trebuie utilizate memorii cu un timp de acces
redus, care au un cost ridicat şi o capacitate relativ redusă. Aceste cerinţe
contradictorii se pot asigura dacă se utilizează în cadrul unui sistem de calcul mai
multe componente şi tehnologii de memorie, care formează o ierarhie de memorii.
La ierarhizarea memoriei s-a ţinut seama de modul în care operează
programele. Astfel, prin analize statistice ale unor programe tipice s-a constatat
că în orice interval de timp dat referinţele la memorie tind să se restrângă în
zone locale ale memoriei. Această proprietate este cunoscută sub numele de
localitate a referinţelor. Există trei concepte asociate cu localitatea referinţelor:
localitatea spaţială, temporală şi secvenţială. Aceste concepte sunt definite în
continuare.
- Localitatea spaţială. De multe ori, un program utilizează date şi
instrucţiuni ale căror adrese sunt apropiate unele de altele în spaţiul de adrese.
De exemplu, referinţele la elementele unui tablou apar întotdeauna în cadrul
unei anumite zone limitate din spaţiul de adrese. Similar, dacă UCP face referire
la o instrucţiune I de un cuvânt, memorată la o adresă dată A , instrucţiunea
cea mai probabilă de a fi referenţiată în continuare de către UCP este cea
imediat următoare după I , a cărei adresă este A + 1.
- Localitatea temporală. Datele sau instrucţiunile referite recent au o
probabilitate ridicată de a fi referite din nou în viitorul apropiat. De exemplu, un
grup de instrucţiuni dintr-o buclă iterativă sau o subrutină pot fi executate în mod
repetat, rezultând o frecvenţă ridicată a referinţelor la adresele acestora.
- Localitatea secvenţială. Majoritatea instrucţiunilor dintr-un program sunt
executate într-o ordine secvenţială. Instrucţiunile care pot determina execuţia
într-o ordine diferită de cea secvenţială sunt salturile sau apelurile de proceduri.
Acestea reprezintă însă doar între 20% şi 30% din totalul instrucţiunilor. Pentru
acest motiv între 70% şi 80% din instrucţiuni sunt executate în aceeaşi ordine în
care ele sunt păstrate în memorie.
O ierarhie tipică este ilustrată în figura 8.1.
In mod uzual, se poate considera că diferitele unităţi de memorie dintr-un
sistem tipic formează o ierarhie de memorii ( M 1, M 2 ,..., M n ) , după cum se arată
în figura 8.1. Nivelul cel mai înalt, M 1 este reprezentat de unitatea de memorie
cea mai rapidă, cu dimensiunea cea mai redusă şi cu costul cel mai ridicat, fiind
amplasat cel mai aproape de procesor.

Fig.8.1

Următorul nivel, M 2 , este mai lent, are dimensiuni mai mari şi un cost mai
redus decât nivelul M 1 , fiind amplasat mai departe de procesor. Acelaşi lucru
este valabil pentru nivelele M 3 până la M n . In general, pe măsură ce nivelul
creşte, viteza şi deci costul pe bit cresc în mod proporţional, ceea ce tinde să
micşoreze capacitatea memoriei de la acel nivel.
Componentele sistemului de memorie pot fi plasate în patru grupe,
prezentate în continuare.
Registrele UCP. Registrele de viteză ridicată ale UCP sunt utilizate ca
memorie de lucru pentru păstrarea temporară a instrucţiunilor şi datelor. Ele
formează de obicei un set de registre cu scop general pentru păstrarea datelor.
Fiecare registru poate fi accesat pentru citire sau scriere într-un singur ciclu de
ceas.
Memoria principală (primară). Această memorie externă rapidă păstrează
programe şi date care sunt în uz curent. Locaţiile memoriei principale sunt
adresate direct prin instrucţiunile de încărcare şi memorare ale UCP. Cu toate
că se utilizează o tehnologie similară cu cea a setului de registre al UCP,
accesul este mai lent din cauza faptului că memoria principală este separată
fizic de UCP. Capacitatea memoriei principale poate ajunge în prezent la unităţi
sau zeci de Gocteţi, iar timpii de acces tipici sunt de câteva cicluri de ceas.
Memoria secundară. Acest tip de memorie are o capacitate mult mai mare
dar, în acelaşi timp, este mult mai lentă decât memoria principală. Memoria
secundară păstrează programe şi date care nu sunt solicitate în mod constant
de UCP. Este utilizată de asemenea atunci când capacitatea memoriei
principale este depăşită. Informaţia din memoria secundară este accesată
indirect prin programe de intrare/ieşire care transferă informaţii între memoria
principală şi cea secundară. Tehnologiile reprezentative pentru memoria
secundară sunt discurile magnetice fixe şi discurile optice, ambele având
mecanisme de acces electromecanice relativ lente. Capacităţile de memorare
de zeci sau sute de Gocteţi sunt obişnuite, iar timpii de acces se măsoară în
milisecunde.
Memoria cache. Majoritatea calculatoarelor şi procesoarelor au un alt nivel
de memorie (uneori mai multe asemenea nivele) numită memorie cache. Logic
memoriile cache sunt poziţionate între registrele UCP şi memoria principală.
Capacitatea de memorare a memoriei cache este mai mică decât cea a
memoriei principale, dar poate fi accesată mai rapid decât aceasta. Deoarece o
parte a acesteia sau întreaga memorie cache se poate afla în aceeaşi capsulă
cu UCP, timp de acces de unul la trei cicluri de ceas. Memoriile cache sunt
componente esenţiale ale calculatoarelor cu performanţe ridicate.
Spre deosebire de celelalte trei tipuri de memorii, memoriile cache sunt de
obicei transparente programatorului.
Figura 8.2 prezintă unele exemple de ierarhii de memorie cu două, trei şi
patru nivele. Ierarhia cu două nivele din figura 8.2(a) este tipică pentru
calculatoarele din generaţiile anterioare. La ierarhia din figura 8.2(b) este
adăugată o memorie cache numită memorie cache divizată, deoarece aceasta
are zone separate pentru memorarea instrucţiunilor (Cache I) şi a datelor
(Cache D). Al treilea exemplu din figura 8.2(c) are două nivele de memorii
cache, ambele de tip nedivizat.
Fig.8.2

8.4 Memoria principală semiconductoare


Memoria principală semiconductoare este de obicei o memorie cu acces
aleator (RAM). Acest tip de memorie se distinge prin faptul că fiecare locaţie de
memorare poate fi accesată independent, cu un timp de acces fix care este
independent de poziţia locaţiei accesate.

8.4.1. Celula de memorie şi unitatea de memorie


O unitate de memorie este compusă dintr-un anumit număr de celule de
memorie. Deşi, pentru realizarea celulelor de memorie, se utilizează o
diversitate de tehnologii, toate celulele de memorie semiconductoare prezintă
următoarele proprietăţi:
• Au două stări stabile (sau semi-stabile), care pot fi utilizate pentru a
reprezenta valorile binare 0 şi 1.
• Pot fi înscrise (cel puţin o dată) prin setarea stării.
• Pot fi citite prin sesizarea stării.
O schemă bloc a unei celule care memorează un bit de informaţie este
prezentată în figura 8.3. Linia de selecţie realizează selectarea (validarea)
celulei. Linia R/W (Read/Write) stabileşte dacă trebuie efectuată o operaţie de
citire sau de scriere asupra celulei selectate. Atunci când linia R/W este 0, se
efectuează o operaţie de citire, care determină trecerea datei memorate printr-
un amplificator de detecţie (sense amplifier) şi transmiterea acesteia pe linia de
ieşire. Intr-un mod similar, atunci când linia R/W este 1, se efectuează o
operaţie de scriere, care determină ca data de pe linia de intrare să fie
memorată în celulă.

Fig.8.3
O celulă de memorie poate fi construită, în funcţie de tehnologia utilizată,
dintr-un număr de unul până la şase tranzistoare. Restricţia principală la
proiectarea unei celule este dimensiunea sa. Obiectivul este ca dimensiunea
celulei să fie cât mai redusă, astfel încât să poată fi împachetate mai multe
celule în spaţiul disponibil din cadrul unei capsule.
Există două tipuri de memorii cu acces aleator, statice (SRAM) şi dinamice
(DRAM). Atât memoriile statice cât şi cele dinamice sunt volatile, deci informaţia
memorată este pierdută atunci când alimentarea cu energie este întreruptă.
Memoriile statice constau din celule asemănătoare cu bistabilele utilizate în
proiectarea logică. Celulele memoriilor SRAM diferă de bistabile în principal prin
metodele utilizate pentru adresarea celulelor şi transferul datelor. Memoriile
statice reţin datele atunci când un cuvânt este citit din acestea. De aceea aceste
memorii au proprietatea că citirea este nedistructivă.
Intr-o celulă de memorie DRAM, stările 1 şi 0 corespund prezenţei sau
absenţei unei sarcini memorate într-un condensator controlat de un circuit de
comutare, de obicei un tranzistor. Condensatorul unei celule DRAM trebuie
reîncărcat periodic. Operaţia de reîncărcare a condensatoarelor este numită
reîmprospătare. Deci, o memorie DRAM trebuie să conţină un circuit de
reîmprospătare şi să alterneze operaţiile de reîmprospătare cu accesele
normale la memorie. Datele conţinute în memoriile dinamice trebuie să fie
rescrise în locaţia corespunzătoare de memorie după fiecare operaţie de citire.
De aceea, memoriile dinamice sunt caracterizate prin proprietatea că citirea
este distructivă.
Deoarece o celulă de memorie DRAM poate fi construită utilizând un
singur tranzistor, în timp ce o celulă de memorie SRAM necesită până la şase
tranzistoare, la memoriile dinamice se obţine o densitate de memorare mai
ridicată. In consecinţă, o memorie RAM dinamică este mai puţin costisitoare
decât o memorie RAM statică corespunzătoare. Pe de altă parte, o memorie
RAM dinamică necesită un circuit de reîmprospătare. Pentru memorii de
dimensiuni mari, costul circuitului de reîmprospătare este compensat de costul
mai redus al memoriilor DRAM. Un alt aspect este că memoriile RAM statice
sunt mai rapide decât memoriile RAM dinamice.
O unitate de memorie este o matrice de celule de memorie. Structura
internă a unei unităţi de memorie de m cuvinte cu n biţi pe cuvânt constă din
m ∗ n celule de memorie. Intr-o unitate de memorie, fiecare celulă poate fi
adresată individual sau un grup de celule pot fi adresate simultan. De obicei, un
sistem de calcul are o dimensiune fixă a cuvântului. Dacă un cuvânt are n biţi,
atunci trebuie adresate simultan n celule de memorie, ceea ce permite ca
celulele să aibă o linie de selecţie comună. O unitate de memorie având patru
cuvinte de 2 biţi este ilustrată în figura 8.4.
Oricare cuvânt poate fi selectat cu ajutorul liniilor de adresă A1 şi A0 .
Operaţia care trebuie executată asupra cuvântului selectat este determinată de
linia R / W . De exemplu, dacă liniile de adresă A1 şi A0 sunt setate la 1, şi
respectiv 0, este selectat cuvântul 2. Dacă linia R / W este setată la 1, atunci
datele de pe liniile de intrare X 1 şi X 0 sunt memorate în celulele C2,1 , respectiv
C2,0 . Similar, dacă linia R / W este setată la 0, datele din celulele C2,1 şi C2,0
sunt transmise pe liniile de ieşire Z1 , respectiv Z 0 .

Fig.8.4
8.4.2. Organizarea memoriilor
Fiecare circuit integrat de memorie conţine o matrice de celule de
memorie. Se utilizează mai multe organizări ale celulelor de memorie şi a logicii
funcţionale dintr-o capsulă de memorie semiconductoare. Vom prezenta în
continuare două metode de organizare: 1D şi 2D.
In figura 8.5 este prezentată o memorie cu organizare 1D. Matricea de
memorie este compusă dintr-un număr mare de locaţii adresabile, fiecare din
acestea memorând un cuvânt de w biţi. Cuvântul este cea mai mică unitate
adresabilă. Această memorie funcţionează după cum urmează. Mai întâi,
adresa locaţiei care trebuie accesată este transferată prin magistrala de adrese,
care are m linii, în bufferul de adrese al memoriei. Adresa este apoi decodificată
de către decodificatorul de adresă DCD, care selectează locaţia cerută din
matricea de memorie. O linie de control indică tipul accesului care trebuie
executat. Dacă este cerută o operaţie de citire, conţinutul locaţiei adresate este
transferat de la matricea de memorie în bufferul de date şi de aici pe magistrala
de date. Dacă este cerută o operaţie de scriere cuvântul, care trebuie memorat,
este transferat de pe magistrala de date în locaţia selectată din unitatea de
memorie. Deoarece, de obicei, nu este necesar sau de dorit să se permită
citirea şi scrierea simultană, magistralele de date (de intrare şi de ieşire) sunt
combinate adesea într-o singură magistrală bidirecţională de date.

Figura 8.5

Pe fiecare linie conectată la matricea de memorie, există de obicei un


driver cu rol de amplificator de semnal. In figura 8.5 putem observa mai multe
seturi de drivere pentru liniile de date şi de adrese. Driverele, decodificatoarele
şi circuitele de control formează circuitele de acces ale memoriei şi acestea pot
avea un impact semnificativ asupra dimensiunii şi costului memoriei.
Fig.8.6

Cea mai obişnuită organizare de memorie este organizarea bidimensională (2D)


sau linie-coloană prezentată în figura 8.6, unde, pentru simplitate, circuitele de
date şi de control sunt omise. Cuvântul de adresă de m biţi este divizat în două
părţi, X şi Y , constând din m x , respectiv m y biţi. Celulele sunt aranjate într-o
matrice rectangulară de N x , linii şi N y coloane, astfel că numărul total de
celule este N x N y . Organizarea 2D necesită un număr mult mai redus de circuite
de acces decât organizarea 1D pentru aceeaşi capacitate de memorare. De
asemenea, în locul unui singur decodificator de adresă foarte complex, sunt
suficiente, în cazul organizării 2D, două decodificatoare de adresă mult mai
simple. In plus, organizarea 2D favorizează structurile bidimensionale permise
de tehnologia VLSI.
Un circuit integrat de memorie RAM conţine în mod tipic toate circuitele de
acces, incluzând decodificatoare de adresă, drivere şi circuite de control.
8.5 Memoria stivă
Memoria stivă este o listă liniară de date elementare, în care inserarea, elimi-
narea şi accesul la elementele de date se efectuează la un singur capăt al
acesteia. Stiva poate fi considerată o listă de tip LIFO (Last-In, First-Out).
In funcŃie de modul de implementare, stiva poate fi de mai multe tipuri:
- Stivă software, organizată în memoria internă;
- Stivă cablată (hardware);
- Stivă parŃial cablată.
Indiferent de modul de implementare, o stivă trebuie să permită efectuarea
următoarelor operaŃii:
- Introducere (inserare): PUSH;
- Extragere (eliminare): POP;
- Acces la elementul din vârful stivei.

8.5.1. Tipuri de memorii stivă

8.5.1.1 Stiva implementată în memorie


Stiva poate fi simulată în memoria internă a calculatorului, utilizându-se
adresarea convenŃională. Gestionarea stivei se poate realiza prin software,
existând instrucŃiuni speciale şi registre dedicate pentru operaŃiile cu stiva (figura
8.7)

Fig.8.7

Stiva poate fi definită cu ajutorul a două registre ale procesorului. Registrul


BP indică baza stivei, iar registrul SP indică vârful stivei. Adresa de bază a stivei
rămâne fixă, în timp ce adresa care indică vârful stivei se modifică la fiecare
operaŃie de introducere şi eliminare din stivă. InstrucŃiunile speciale de lucru cu stiva
modifică automat conŃinutul registrului SP.
De obicei, stivele cresc spre adrese mici, elementul din vârful stivei având
adresa cea mai mică, dar există şi stive care cresc spre adrese mari.
Presupunând că stiva creşte spre adrese mici, iar SP indică elementul din
vârful stivei, instrucŃiunea de introducere a unui element în stivă decrementează
registrul SP şi copiază elementul respectiv în stivă. InstrucŃiunea de extragere a
unui element din vârful stivei copiază acest element într-un registru de memorie şi
incrementează registrul SP.
In cazul stivei simulate în memorie, pe lângă operaŃiile obişnuite cu stiva, se
pot citi sau modifica elemente oarecare din stivă, prin adresarea lor relativă faŃă de
registrul de bază al stivei (BP).

8.5.1.2. Stiva cablată


Spre deosebire de stiva simulată în memorie, la care vârful stivei se
deplasează în timp ce informaŃiile din stivă rămân fixe, în cazul stivei cablate există
un vârf fix şi informaŃiile din stivă sunt translatate la fiecare operaŃie de introducere
sau eliminare din stivă.
Stivele cablate pot avea un registru de stare asociat, care indică dacă stiva
este goală (EMPTY) sau plină (FULL). La încercarea de extragere a unui element
din stiva goală se poate activa un semnal de eroare UNDERFLOW, iar la
încercarea de introducere a unui element în stiva plină se poate activa un alt
semnal, OVERFLOW.
Stivele cablate au avantajul unei viteze ridicate de efectuare a operaŃiilor,dar
dimensiunea acestora este limitată.

8.5.1.3. Stiva parŃial cablată

Fig. 8.8
Dacă dimensiunea stivei cablate este redusă, pentru cazurile de depăşire de
capacitate a stivei cablate, este indicată completarea acesteia cu o stivă simulată
în memoria internă, (Figura 8.8).

8.6 Memoria cache

8.6.1 Principii
Deoarece accesul la memoria principală necesită un timp considerabil mai
mare comparativ cu viteza globală a unui procesor, este important să se
proiecteze un sistem de memorie cu un timp de acces cât mai redus. O
posibilitate de a creşte viteza globală a sistemului de memorie este de a se
reduce numărul de accesuri la memoria principală. Acest deziderat poate fi
realizat prin instalarea unei memorii rapide de mici dimensiuni care să conŃină,
în fiecare moment, o parte din program. In acest mod, datorită proprietăŃii de
localitate a referinŃelor, numărul referinŃelor la memoria principală va fi redus în
mod considerabil. O asemenea memorie rapidă, utilizată temporar pentru
păstrarea unei porŃiuni a datelor şi instrucŃiunilor în vederea utilizării imediate,
este cunoscută sub numele de memorie cache.
Deoarece memoria cache are un preŃ ridicat, un sistem de calcul poate
avea doar o memorie cache cu o dimensiune limitată. Pentru acest motiv, un
sistem de calcul conŃine o memorie principală mai lentă şi de dimensiuni relativ
mari, împreună cu o memorie cache mai rapidă şi de dimensiuni mai mici.
Memoria cache este amplasată între memoria principală şi UCP şi conŃine copii
ale anumitor blocuri ale memoriei principale. Astfel, atunci când UCP solicită un
cuvânt şi acest cuvânt se află în memoria cache rapidă, nu va mai fi necesar
accesul la memoria principală.
Deşi dimensiunea memoriei cache este doar o mică parte din dimensiunea
memoriei principale, datorită proprietăŃii de localitate a referinŃelor, o mare parte
din cererile de acces la memorie vor fi satisfăcute de memoria cache.
PerformanŃa unui sistem poate fi îmbunătăŃită în mod semnificativ dacă
memoria cache este amplasată în acelaşi circuit integrat cu procesorul. In acest
caz, ieşirile memoriei cache pot fi conectate la UAL şi la registre prin legături
scurte, reducând timpul de acces. Aceasta este soluŃia adoptată la majoritatea
procesoarelor actuale.

8.6.2. Organizarea memoriei cache


Figura 8.9 prezintă componentele principale ale unei memorii cache.
Cuvintele de memorie sunt păstrate într-o memorie de date şi sunt grupate în
pagini de dimensiuni reduse, numite blocuri sau linii. ConŃinutul memoriei de
date este copia unui set de blocuri ale memoriei principale. Fiecare bloc al
memoriei cache este marcat cu adresa sa de bloc, numită marcaj (tag). ColecŃia
adreselor de marcaj asignate momentan memoriei cache, adrese care pot fi
necontigue, este păstrată într-o memorie specială, numită memorie de marcaje
sau director.

Fig. 8.9

Pentru a îmbunătăŃi performanŃele unui calculator, timpul necesar pentru


testarea adreselor de marcaj şi accesarea memoriei cache de date trebuie să fie
mai redus decât timpul necesar pentru accesarea memoriei principale.
Figura 8.10 prezintă două moduri de plasare a unei memorii cache într-un
sistem de calcul. In organizarea din figura 8.10(a), numită organizare "look-
aside", memoria cache şi memoria principală sunt conectate direct la magistrala
sistem. UCP iniŃiază un acces la memorie prin plasarea unei adrese Ai pe
magistrala de adrese la începutul unui ciclu de citire sau de scriere. Memoria
cache M 1 compară adresa Ai , cu adresele de marcaj plasate momentan în
memoria sa de marcaje. Dacă se găseşte o potrivire în memoria cache, deci,
apare un succes, accesul este terminat printr-o operaŃie de citire sau de scriere

Fig. 8.10

executată cu memoria cache, care nu implică memoria principală M 2 . Dacă nu


se găseşte o potrivire cu adresa Ai în memoria cache, deci, apare un eşec,
atunci accesul dorit este terminat printr-o operaŃie de citire sau de scriere
executată cu memoria principală. Ca răspuns la un eşec, este transferat un bloc
de date B j care conŃine adresa destinaŃie Ai de la M 2 la M 1 . Acest transfer
este rapid, datorită dimensiunii reduse a blocului şi a metodelor de acces rapide
la memoria RAM, cum este modul pagină. Memoria cache implementează o
anumită strategie de înlocuire pentru a determina unde să se plaseze noul bloc.
Atunci când este necesar, blocul memoriei cache înlocuit de B j este salvat în
M 2 . De notat că, în cazul eşecurilor la accesul memoriei cache, chiar dacă
acestea sunt puŃin frecvente, transferurile de blocuri între M 1 şi M 2 ocupă
magistrala sistem, care nu va fi disponibilă pentru alte operaŃii, cum sunt
transferurile de I/E.
In figura 8.10(b) se prezintă o altă organizare, care este mai rapidă, dar
mai costisitoare; aceasta este numită organizare "look-through". UCP comunică
cu memoria cache printr-o magistrală separată (locală) care este izolată de
magistrala sistem. In acest mod magistrala sistem este disponibilă pentru
utilizarea de către alte unităŃi, cum sunt controlere de I/E, care pot comunica cu
memoria principală. Prin urmare, accesurile la memoria cache şi accesurile la
memoria principală care nu implică UCP se pot desfăşura concurent. UCP
transmite o cerere la memoria principală numai după un eşec la accesul în
memoria cache. Magistrala locală care conectează M 1 şi M 2 poate avea o
lăŃime mai mare decât magistrala sistem, crescând astfel viteza transferurilor
între memoria cache şi cea principală.
Dezavantajul principal al organizării "look-through", pe lângă costul său
mai ridicat, constă în faptul că este necesar un timp mai lung pentru ca memoria
principală să răspundă la cererea UCP atunci când apare un eşec la accesul
memoriei cache.

8.6.3 FuncŃionarea memoriei cache


Atunci când UCP generează o cerere de citire pentru un cuvânt din
memorie, cererea este trimisă mai întâi la memoria cache pentru a verifica dacă
acest cuvânt se află deja în această memorie. In cazul în care cuvântul nu este
găsit în memoria cache (deci, apare un eşec la citire), cuvântul solicitat este
furnizat de memoria principală. O copie a cuvântului este depusă în memoria
cache pentru referinŃele viitoare de către UCP. In cazul în care cuvântul este
găsit în memoria cache (deci, apare un succes la citire), cuvântul este furnizat
de memoria cache. Astfel, în această situaŃie, nu este necesar accesul la
memoria principală. Prin aceasta, viteza sistemului creşte considerabil.
Figura 8.11 ilustrează execuŃia unei operaŃii de citire pentru un sistem
simplu de memorie cache. In acest exemplu, se presupune o dimensiune a
blocului (liniei) memoriei cache de 4 octeŃi. Fiecare adresă de memorie are
dimensiunea de 12 biŃi, astfel încât cei 10 biŃi de ordin superior formează
marcajul sau adresa blocului, iar cei 2 biŃi de ordin inferior definesc un
deplasament în cadrul blocului. Atunci când un bloc este adus în memoria
cache de date, marcajul acestuia este plasat în memoria cache de marcaje.
Figura 8.11 prezintă conŃinutul a două blocuri aduse în memoria cache de date;
de observat locaŃiile aceloraşi blocuri din memoria principală. Pentru citirea
cuvântului indicat de săgeată, adresa acestuia Ai = 1100 0101 0110 este
transmisă la M 1 care compară partea de marcaj a adresei Ai cu marcajele sale
memorate şi găseşte o potrivire. Marcajul memorat adresează blocul
corespunzător din memoria de date, iar deplasamentul de 2 biŃi este utilizat
pentru identificarea cuvântului destinaŃie din cadrul blocului, care este apoi
transmis la UCP.
Atunci când UCP generează o cerere de scriere pentru un cuvânt în
memorie, cererea este trimisă mai întâi la memoria cache pentru a verifica dacă
locaŃia acestui cuvânt se află în memoria cache. In cazul în care locaŃia
cuvântului nu este găsită în memoria cache (deci, apare un eşec la scriere), se
încarcă o copie a cuvântului din memoria principală în memoria cache. Apoi, se
execută o operaŃie de scriere. De asemenea, în cazul în care cuvântul este găsit
în memoria cache (deci, apare un succes la scriere), se execută o operaŃie de
scriere direct în memoria cache.

Fig. 8.11

ExecuŃia unei operaŃii de scriere pentru memoria cache din exemplul


precedent este ilustrată în figura 8.12. Partea de marcaj a adresei destinaŃie Ai
este transmisă la M 1 împreună cu cuvântul de date care trebuie memorat.
Atunci când apare un succes, noua dată, în acest caz 55h, este memorată în
locaŃia de la adresa Ai în memoria de date din M 1 modificând astfel vechea
dată FFh.

Fig. 8.12
Apare acum o nouă problemă, deoarece data din M 1 cu adresa Ai diferă
de data din M 2 cu aceeaşi adresă. O inconsistenŃă temporară de acest tip este
acceptabilă cât timp nici un dispozitiv (un alt procesor sau un dispozitiv de I/E)
nu încearcă citirea datei vechi. Prevenirea utilizării improprii a datei vechi
reprezintă problema coerenŃei memoriilor cache sau a consistenŃei memoriilor
cache. Aceasta este o problemă de bază la sistemele multiprocesor unde mai
multe procesoare partajează accesul la aceeaşi memorie principală, dar fiecare
dispune de propria memorie cache. Această problemă apare de asemenea în
sistemele uniprocesor atunci când este prezent un controler sau procesor de I/E
care are un acces direct la memoria principală, independent de UCP.
InconsistenŃele din memoriile cache pot fi minimizate prin implementarea unei
strategii care actualizează în mod sistematic datele din M 2 ca răspuns la
modificările efectuate asupra datelor corespunzătoare din M 1 .
Pentru executarea unei operaŃii de scriere, există două strategii care pot fi
utilizate: "write-back" şi "write-through".
- In cazul strategiei "write-back", numită şi "copy-back", fiecărui cuvânt din
memoria cache i se asociază un bit, numit bit de modificare (dirty bit) sau bit de
inconsistenŃă, care arată dacă acest cuvânt a fost modificat în timpul în care se
afla în memoria cache. Toate modificările asupra unui cuvânt sunt efectuate în
memoria cache. Atunci când un cuvânt trebuie eliminat din memoria cache, se
testează bitul de modificare al cuvântului; dacă bitul este setat, cuvântul este
scris în memoria principală în forma sa actualizată. Avantajul strategiei "write-
back" este că, atât timp cât un cuvânt rămâne în memoria cache, acesta poate fi
modificat de mai multe ori, iar pentru UCP nu are importanŃă dacă cuvântul din
memoria principală nu a fost actualizat. Dezavantajul acestei strategii este că
memoria cache şi memoria principală pot fi temporar inconsistente. Aceasta
creează dificultăŃi dacă mai multe procesoare cu memorii cache independente
partajează aceeaşi memorie principală, deoarece datele lor pot deveni
inconsistente. Strategia "write-back" complică de asemenea recuperarea în
cazul defectelor de sistem şi, deşi trebuie asociat un singur bit suplimentar cu
fiecare cuvânt, aceasta complică într-o oarecare măsură proiectarea sistemului.
- In cazul strategiei "write-through", cuvântul este modificat atât în
memoria cache, cât şi în memoria principală la fiecare ciclu de scriere.
Avantajele acestei strategii constau în faptul că este uşor de implementat şi
memoria principală are întotdeauna date consistente cu memoria cache. Pe de
altă parte, această strategie are dezavantajul că încetineşte UCP, deoarece
toate operaŃiile de scriere necesită accesuri ulterioare la memoria principală.
Totuşi, numai o fracŃiune redusă, probabil 10%, din toate accesurile la memorie
sunt operaŃii de scriere. Anumite procesoare permit utilizarea ambelor strategii
de scriere, astfel încât utilizatorul poate selecta strategia cea mai avantajoasă
pentru un program particular.

8.6.4. Maparea adreselor


O caracteristică de bază a memoriei cache este funcŃia de mapare (de
translatare), care atribuie locaŃii din memoria cache blocurilor din memoria
principală.
Se utilizează trei tipuri de mapare a adreselor:
1. Mapare asociativă;
2. Mapare directă;
3. Mapare cu seturi asociative.
Pentru a ilustra aceste trei tipuri de mapare ale adreselor, presupunem că
memoria principală are o capacitate de 64 K cuvinte de câte 16 biŃi fiecare, fapt
care înseamnă că magistrala de adrese are 16 biŃi. De asemenea, presupunem
că memoria cache care poate păstra maxim 256 de cuvinte. Considerăm că
UCP generează o cerere de citire. Cererea de scriere este gestionată într-un
mod similar. Vom urmări acum strategiile celor trei tipuri de mapare.

8.6.4.1. Memorie cache cu maparea asociativă


In cazul unei memorii cache cu mapare asociativă (numită şi memorie
cache cu asociativitate totală), adresa şi conŃinutul sunt memorate ca şi cuvinte
separate în memoria cache. Ca rezultat, un cuvânt de memorie poate fi
memorat în orice locaŃie a memoriei cache, ceea ce face ca acest tip de
memorie cache să fie cel mai flexibil. Figura 8.13 prezintă organizarea unei
memorii cache cu mapare asociativă pentru sistemul considerat. De observat
că, indiferent de adresele lor absolute din memoria principală, cuvintele sunt
memorate în locaŃii arbitrare.

Fig. 8.13

Deoarece o celulă de memorie asociativă are un cost mult mai mare decât
o celulă de memorie RAM, doar adresele cuvintelor sunt memorate în partea
asociativă, în timp ce datele sunt memorate în partea de memorie RAM a
memoriei cache. Această soluŃie nu va creşte timpul de acces al memoriei
cache în mod semnificativ, dar va conduce la un cost semnificativ mai redus.
Astfel, atunci când UCP generează o adresă pentru referinŃa la memorie,
aceasta este transferată în registrul argument şi este comparată, în paralel, cu
câmpurile de adresă ale tuturor cuvintelor aflate în memoria cache. Dacă s-a
găsit locaŃia cu o adresă care se potriveşte, datele corespunzătoare pot fi
accesate din memoria RAM.
Dezavantajul principal al mapării asociative este că necesită o memorie
asociativă de dimensiuni mari, care este foarte costisitoare.

8.6.4.2. Memorie cache cu maparea directă


Pentru implementarea mapării directe sunt necesare numai memorii RAM.
Memoria cache M 1 este împărŃită într-un număr de regiuni numite seturi,
fiecare din acestea memorând un bloc de n cuvinte consecutive. Memoria
principală M 2 este divizată similar în blocuri. In cazul mapării directe, fiecare
bloc din M 2 este mapat într-un set specific din M 1 .
Figura 8.14 reprezintă arhitectura unei memorii cache cu mapare directă.
Considerăm, pentru simplificare, că un set al memoriei cache, ca şi un bloc al
memoriei principale, conŃine un singur cuvânt. Pentru implementarea mapării
directe, adresele de memorie de 16 biŃi sunt divizate în două părŃi: cei 8 biŃi de
ordin inferior ai adresei din memoria principală formează un câmp de index,
care identifică setul unic al memoriei cache, unde se poate memora blocul de
memorie. CeilalŃi 8 biŃi de ordin superior ai adresei din memoria principală
rămaşi, formează un câmp de marcaj (tag).
Această arhitectură constă din trei componente principale: o memorie de
date, o memorie de marcaje şi un circuit de comparare. Memoria de date
păstrează cuvintele de date ale memoriei cache. Memoria de marcaje păstrează
marcajele asociate cu cuvintele de date şi are câte o intrare pentru fiecare
cuvânt al memoriei de date. Comparatorul activează linia de potrivire, indicând
existenŃa cuvântului adresat în memoria cache.
La adresa specificată de index, este memorat un marcaj în memoria de
marcaje şi un bloc de memorie în memoria de date. Dacă marcajul adresei de
memorie cerute se potriveşte cu marcajul din memoria cache, cuvântul din

Fig. 8.14

memoria de date este transmis la UCP. In caz contrar, se accesează memoria


principală, iar cuvântul corespunzător este încărcat şi transmis la UCP. Cuvântul
adresat, împreună cu partea de marcaj a adresei acestuia, înlocuieşte de
asemenea cuvântul şi marcajul cu indexul corespunzător din memoria cache.
Un exemplu care ilustrează funcŃionarea unei memorii cache cu mapare
directă este prezentat în figura 8.15. Vom considera memoria principală
prezentată în figura 8.13.

Fig.8.15

In acest exemplu, o adresă de memorie constă din 16 biŃi, iar memoria


cache conŃine 256 de cuvinte. Cei 8 biŃi mai puŃin semnificativi ai adresei
constituie câmpul de index, iar cei 8 biŃi rămaşi constituie câmpul de marcaj. BiŃii
de index determină adresa unui cuvânt în memoriile de marcaje şi de date.
Fiecare cuvânt din memoria de marcaje are 8 biŃi, iar fiecare cuvânt din
memoria de date are 16 biŃi. Dacă UCP solicită citirea cuvântului de memorie de
la adresa 0900h este atunci indexul va fi 00 iar marcajul 09. Astfel la adresa 00
din memoria de marcaje se găseşte valoarea 09 care corespunde cu marcajul
cuvântului solicitat deci a fost înregistrat un succes la căutare şi conŃinutul
memoriei de date de la adresa 00 (care este 3800h) este preluat de UCP.
Dacă apoi, UCP solicită citirea conŃinutului adresei 0100h, indexul (00h) se
potriveşte, dar marcajul (01h) este diferit, deci a fost înregistrat un insucces la
căutare şi în consecinŃă este accesată memoria principală, iar cuvântul de date
1234h (vezi figura 8.13) este transferat la UCP. Cuvintele din memoria de
marcaje şi memoria de date de la indexul 00h sunt înlocuite apoi cu 01h,
respectiv 1234h.
In cazul real în care fiecare bloc conŃine mai multe cuvinte de memorie de,
pe lângă marcaj şi index, utilizează în plus un deplasament care precizează
poziŃia cuvântului solicitat în cadrul blocului.
Avantajul mapării directe faŃă de maparea asociativă constă în faptul că
necesită un număr mai redus de biŃi pentru fiecare cuvânt din memoria cache şi
nu necesită memorie asociativă. Dezavantajul principal este că performanŃele
pot fi reduse considerabil dacă două sau mai multe cuvinte având acelaşi index,
dar marcaje diferite, sunt accesate în mod frecvent. De exemplu, cuvintele de
memorie de la adresele 0100h şi 0200h trebuie plasate ambele în memoria
cache la indexul 00h, astfel încât se pierde un timp important pentru
interschimbarea lor. Aceasta încetineşte sistemul, anulând efectul memoriei
cache. Totuşi, considerând proprietatea de localitate a referinŃelor,
probabilitatea de a avea două cuvinte cu acelaşi index este redusă.

8.6.4.3. Maparea cu seturi asociative (k-way set associative)


O metodă mai generală de mapare a adreselor pentru memoriile cache
este numită mapare cu seturi asociative. In timp ce la maparea directă fiecare
set, identificat de un anumit index, memorează un singur bloc, la maparea cu
seturi asociative fiecare set memorează un număr de k blocuri. Fiecare set este
o mică memorie asociativă, astfel încât maparea adreselor din cadrul fiecărui
set este asociativă. In practică sunt utilizate doar valori mici ale parametrului k,
cum ar fi de exemplu k=2, sau k=4.
De exemplu, o memorie cache cu seturi asociative cu k blocuri de
memorie, numit set asociativ cu k căi, poate memora k blocuri de date având
acelaşi index, împreună cu marcajele lor. In figura 8.19 se prezintă o arhitectură
pentru o memorie cache cu seturi asociative cu k blocuri de memorie.

Fig. 8.16

Considerăm din nou că un set conŃine un singur cuvânt. Fiecare bloc de


memorie are aceeaşi structură ca şi o memorie cache cu mapare directă. Pentru
a determina dacă un cuvânt adresat se află în memoria cache, marcajul
acestuia este comparat în paralel (asociativ) cu marcajele datelor din toate
blocurile de memorie. O potrivire în oricare din blocurile de memorie validează
semnalul de potrivire pentru a indica existenŃa cuvântului în memoria cache.
Dacă apare o potrivire, cuvântul corespunzător de date este transferat la
UCP. In caz contrar, cuvântul de date este încărcat din memoria principală şi
este transmis la UCP. Cuvântul de date, împreună cu marcajul acestuia, este
depus apoi într-unul din blocurile de memorie.

Fig. 8.17

Un exemplu ilustrând funcŃionarea memoriei cache cu seturi asociative


este prezentat în figura 8.17. Această figură prezintă o memorie cache cu seturi
asociative cu două căi. ConŃinutul adresei 0900h (vezi figura 8.13) este depus în
memoria cache la indexul 00h şi marcajul 09h. Dacă UCP solicită accesarea
cuvântului de la adresa 0100h, indexul (00h) se potriveşte, dar marcajul este
acum diferit. De aceea, este accesat conŃinutul memoriei principale, iar valoarea
1234h este transferată la UCP. Acest cuvânt de date şi marcajul acestuia (01h)
sunt memorate în al doilea bloc al memoriei cache. Atunci când nu există spaŃiu
pentru un anumit index în memoria cache, unul din cele două cuvinte de date
stocate la acel index va fi înlocuit conform unei strategii de înlocuire predefinite.

8.6.5. Strategii de înlocuire


Atunci când nu mai există spaŃiu în memoria cache, trebuie să se utilizeze
o strategie pentru a înlocui un cuvânt cu data din memorie care este accesată în
acel moment. In general, există trei strategii principale pentru a determina
cuvântul care va fi eliminat din memoria cache. Acestea sunt strategiile de
înlocuire aleatoare, înlocuirea cuvântului cel mai puŃin frecvent utilizat şi
înlocuirea cuvântului cel mai puŃin recent utilizat.
Înlocuire aleatoare. Această metodă alege un cuvânt în mod aleator şi
înlocuieşte acel cuvânt cu data nou accesată. Această metodă este uşor de
implementat prin hardware şi este mai rapidă decât alte metode. Dezavantajul
este că acele cuvinte care sunt cel mai probabil de a fi utilizate din nou au
aceeaşi şansă de a fi eliminate ca şi cuvintele care probabil nu vor fi utilizate din
nou. Acest dezavantaj se micşorează pe măsură ce dimensiunea memoriei
cache creşte.
Cel mai puŃin frecvent utilizat (LFU - Least Frequently Used). Această
metodă înlocuieşte datele care sunt cel mai puŃin utilizate. Metoda presupune că
datele care nu sunt referite frecvent sunt mai puŃin necesare. Pentru fiecare
cuvânt, se păstrează un contor al numărului total de utilizări ale cuvântului de la
încărcarea acestuia în memoria cache. Cuvântul cu valoarea cea mai mică a
contorului este cuvântul care va fi eliminat. Avantajul acestei metode este că un
cuvânt utilizat frecvent are o probabilitate mai mare de a rămâne în memoria
cache decât un cuvânt care nu a fost utilizat frecvent. Un dezavantaj este că
acele cuvinte care au fost încărcate recent în memoria cache au o valoare mică
a contorului, în ciuda faptului că este probabil ca ele să fie utilizate din nou. Un
alt dezavantaj este că implementarea acestei metode prin hardware este mai
dificilă şi deci mai costisitoare.
Cel mai puŃin recent utilizat (LRU - Least Recently Used). Această metodă
are performanŃa cea mai bună raportată la cost comparativ cu celelalte tehnici,
fiind implementată adesea în sistemele reale. Ideea acestei metode de înlocuire
constă în faptul că un cuvânt, care nu a fost utilizat pentru o perioadă lungă de
timp, are o şansă mai redusă de a fi utilizat în viitorul apropiat, conform
proprietăŃii de localitate temporală. Astfel, această metodă reŃine cuvintele din
memoria cache care au probabilitatea cea mai mare de a fi utilizate din nou. In
acest scop, se utilizează un mecanism pentru a păstra evidenŃa acelor cuvinte
care au fost accesate cel mai recent. Cuvântul care va fi eliminat este cuvântul
care nu a fost utilizat pentru perioada cea mai lungă de timp. O posibilitate de a
implementa un asemenea mecanism este de a asigna un contor fiecărui cuvânt
din memoria cache. De fiecare dată când este accesată memoria cache,
contorul fiecărui cuvânt este incrementat, iar contorul cuvântului care a fost
accesat este resetat la zero. In acest fel, cuvântul cu contorul cel mai mare este
cel care a fost utilizat cel mai puŃin recent.
8.7. Memoria virtuală

8.7.1. Principii
Memoria virtuală permite sistemului de calcul utilizarea unei memorii cu o
dimensiune mult mai mare decât dimensiunea reală fizică a memoriei principale.
Intr-un sistem de memorie virtuală, memoria principală şi cea secundară se
prezintă pentru un program al utilizatorului ca o memorie unică, de dimensiuni
mari şi adresabilă direct.
Inaintea apariţiei memoriei virtuale, dacă spaţiul de adrese al unui program
depăşea dimensiunea memoriei principale disponibile, programatorul era
responsabil pentru împărţirea programului în fragmente mai mici, astfel încât
fiecare fragment să poată fi încărcat în memoria principală. Toate aceste
fragmente erau păstrate în memoria secundară, de exemplu, pe disc, fiind
încărcate în memoria principală pe măsură ce erau necesare. Acest proces
necesita cunoaşterea locului în care fragmentele trebuiau stocate pe disc,
cunoaşterea operaţiilor de intrare/ieşire necesare pentru accesul fragmentelor şi
păstrarea evidenţei întregului proces de fragmentare. Acesta reprezenta un
proces foarte complex, ceea ce complica şi mai mult programarea unui
calculator.
Conceptul memoriei virtuale a fost creat în principal pentru a elibera
programatorul de această sarcină. Memoria virtuală permite utilizatorului să
scrie programe care depăşesc limitele fizice ale memoriei principale. De
asemenea, memoria virtuală permite multiprogramarea, prin care memoria
principală este partajată între mai mulţi utilizatori într-un mod dinamic. In cazul
multiprogramării, porţiuni ale mai multor programe sunt plasate în memoria
principală în acelaşi timp, iar procesorul îşi împarte timpul de execuţie între
aceste programe. Procesorul execută un program pentru o perioadă scurtă de
timp (numită o cuantă sau diviziune de timp), iar apoi comută la un alt program;
acest proces continuă până când fiecare program este terminat.
Atunci când se utilizează memoria virtuală, sistemul de memorie este
adresat printr-un set V de adrese logice sau virtuale, fiind numite astfel
deoarece, la execuţia programului, ele sunt translatate, în adrese ale memoriei
fizice. La o altă execuţie a programului adresele fizice pot fi altele.
Un set de adrese fizice sau reale R identifică locaţiile de memorare fizică
din fiecare unitate de memorie. Adresele virtuale sunt generate de obicei în
timpul compilării şi sunt translatate de procesor în adrese fizice în timpul
execuţiei. Un mecanism eficient pentru implementarea translatării adreselor, de
forma f : V → R , este esenţial pentru un sistem de memorie virtuală. Cele două
metode principale pentru implementarea unei memorii virtuale sunt paginarea şi
segmentarea.

8.7.2. Translatarea adreselor


Setul de locaţii abstracte pe care le poate adresa un program reprezintă
spaţiul de adrese virtuale V al programului. Adresele virtuale pot fi specificate
explicit sau implicit de identificatorii pe care programatorul îi asignează
variabilelor şi etichetelor de instrucţiuni. Pentru execuţia unui program pe un
anumit calculator, adresele sale virtuale trebuie translatate în spaţiul de adrese
reale R , definit de memoria care este prezentă fizic în calculator. Acest proces
este numit translatare a adreselor sau mapare a adreselor. Spaţiul de adrese
reale R este o secvenţă liniară de numere 0, 1, 2, ...., n − 1, corespunzând
locaţiilor adresabile de memorie şi este distribuit pe toate nivele ierarhiei de
memorii. Spaţiul de adrese virtuale V este o colecţie de liste, tablouri
multidimensionale şi alte structuri neliniare, astfel încât este mult mai complex
decât R .
Asignarea şi translatarea adreselor poate fi efectuată în diferitele etape ale
unui program şi anume:
• De către programator în timpul scrierii programului;
• De către compilator în timpul compilării programului;
• De către programul încărcător la încărcarea programului;
• De către sistemul hardware şi/sau software de gestiune a memoriei.
Specificarea explicită a adreselor reale de către programator a fost
necesară la primele calculatoare, care nu aveau un sistem hardware sau
software de gestiune a memoriei. In cazul calculatoarelor moderne,
programatorii utilizează în mod normal doar adrese virtuale. Un sistem hardware
sau software specializat determină în mod automat adresele reale cerute de
execuţia programului.
Translatarea adreselor se numeşte statică dacă compilatorul transformă
identificatorii simbolici ai unui program în adrese fizice, sau translatarea
adreselor este efectuată atunci când programul este încărcat pentru prima dată
pentru execuţie.
Translatarea adreselor este dinamică dacă spaţiul adreselor virtuale este
modificat în timpul execuţiei programului şi în consecinţă convertirea acestora în
adrese fizice este, de asemenea, efectuată în timpul execuţiei. Pentru
translatarea adreselor în timpul execuţiei se utilizează unităţi de gestiune a
memoriei (MMU - Memory Management Unit) implementate prin hardware.
Un program executabil cuprinde un set de blocuri de instrucţiuni şi de
date, fiecare din acestea fiind o secvenţă de cuvinte sau octeţi care trebuie
memoraţi în locaţii consecutive de memorie în timpul execuţiei. Considerând că
se utilizează adrese de cuvinte, un cuvânt C dintr-un bloc are propria adresă
reală Ar , utilizată de UCP pentru accesul la acest cuvânt. Adresa virtuală a
cuvântului C este specificată prin adresa de bază B a blocului care conţine
cuvântul, împreună cu adresa relativă sau deplasamentul D (numit şi offset) al
cuvântului din cadrul blocului, după cum se arată în figura 8.18. Adresa efectivă,
reală este:
Ar = B + D
Adesea B furnizează biţii de ordin superior ai adresei efective, în timp ce
D furnizează biţii de ordin inferior. In acest caz, adresa reală este formată
simplu prin concatenarea adresei de bază B şi a deplasamentului D, un proces
care nu creşte în mod semnificativ timpul pentru generarea adresei.

Adresa reala Ar

B+1

.
.
B+i

B+m-1

Fig. 8.18

Un mod simplu de implementare a translatării adreselor este de a păstra


adresele de bază ale blocurilor într-o tabelă de adrese ale memoriei controlată
de sistemul de gestiune a memoriei. Tabela poate fi păstrată în memorie, în
registrele UCP, sau în ambele. Logica de generare a adreselor utilizată de UCP
constă în calcularea adresei reale Ar prin combinarea deplasamentului D cu
adresa de bază corespunzătoare Bi .
Blocurile pot fi relocate cu uşurinţă în memorie prin manipularea adreselor
de bază ale acestora. Figura 8.19 ilustrează relocarea blocurilor utilizând
modificarea adreselor de bază. Presupunem că două blocuri sunt alocate în
memoria principală după cum se arată în figura 8.19(a). Se doreşte încărcarea
unui al treilea bloc K 3 în memoria principală, dar nu este disponibil un spaţiu
liber contiguu cu o dimensiune suficientă. O soluţie la această problemă este de
a se muta blocul K 2 , după cum se arată în figura 8.19(b), prin asignarea
acestuia a unei noi adrese de bază B2 şi reîncărcarea blocului în memorie.
Astfel, se crează un spaţiu în care poate fi încărcat blocul K 3 , prin asignarea
acestuia a unei adrese de bază corespunzătoare.

Fig. 8.19

In cazul alocării dinamice a adreselor, unitatea de gestiune a memoriei


trebuie să evite depăşirea limitelor unui bloc în special la scriere. O metodă
obişnuită pentru realizarea acestui deziderat este specificarea adresei maxime
Li , numită adresă limită, pe care o poate accesa blocul. O altă posibilitate este
de a se specifica dimensiunea blocului. Adresa de bază Bi şi adresa limită Li ,
sunt memorate în tabela de adrese ale memoriei. Fiecare adresă reală Ar
generată de bloc este comparată cu Bi şi Li ; accesul la memorie este efectuat
dacă şi numai dacă este satisfăcută următoarea condiţie:
Bi ≤ Ar ≤ Li
Figura 8.20 indică modul în care unitatea de gestiune a memoriei
efectuează translatarea adreselor. Adresa de intrare Av este o adresă virtuală
constând dintr-o adresă de bază virtuală Bv, concatenată cu un deplasament
D . Adresa de bază reală Br = f ( Bv ) asignată adresei virtuale Bv este
memorată într-o tabelă de adrese a memoriei principale. Această tabelă poate
avea dimensiuni mari. Pentru creşterea vitezei procesului de translatare, o parte
a tabelei de adrese ale memoriei este plasată într-o memorie de viteză ridicată
din UCP, numită buffer de translatare (TLB - Translation Look-aside Buffer).
Intrarea în TLB este deci partea adresei de bază Bv a adresei virtuale Av , iar
ieşirea acestuia este adresa de bază reală corespunzătoare Br . Această adresă
este apoi concatenată cu partea de deplasament D din Av pentru a obţine
adresa reală completă Ar .

Fig. 8.20

Dacă adresa virtuală Bv nu este găsită în bufferul de translatare TLB,


atunci partea tabelei de adrese ale memoriei principale, care conţine Bv este
transferată mai întâi din memoria externă în TLB. Deci, bufferul de translatare
are rolul unei memorii cache pentru translatarea adreselor. Din acest motiv,
bufferul de translatare este numit uneori memorie cache de adrese.
8.7.3. Paginarea
Paginarea este tehnica de divizare a unui program (numit în continuare
proces) în blocuri mai mici cu dimensiuni identice şi stocarea acestor blocuri în
memoria secundară sub forma unor pagini. Prin utilizarea avantajului localităţii
referinţelor, aceste pagini pot fi încărcate apoi în memoria principală în blocuri,
de aceeaşi dimensiune cu paginile, numite cadre de pagină.

Adresa de baza
reala a paginii

Fig. 8.21

Pentru ca această metodă să funcţioneze corect, fiecare proces trebuie să


păstreze, în memoria principală, o tabelă de adrese ale memoriei, numită tabelă
de pagini. Fiecărei adrese virtuale de pagină îi corespunde o adresă reală a
unui cadru de pagină. Figura 8.21 ilustrează modul în care funcţionează metoda
paginării.
O adresă virtuală constă din două părţi: o adresă de bază şi un
deplasament. Fiecare proces are un registru de bază, care conţine adresa de
început a tabelei de pagini a procesului. Tabelele de pagini au câte o fişă (entry)
pentru fiecare pagină pe care o conţine procesul. Aceste fişe conţin de obicei un
câmp de prezenţă de un bit, un câmp de acces şi un câmp de adresă. Câmpul
de prezenţă P specifică dacă pagina a fost încărcată în memoria principală.
Câmpul de acces specifică tipul operaţiilor care pot fi executate asupra paginii.
Acest câmp determină dacă pagina poate fi doar citită (R/O - Read Only), citită
şi scrisă (R/W - ReadAVrite), sau doar executată. Câmpul de adresă specifică
numărul cadrului în care aste încărcată pagina. Adresa de început a paginii în
memoria principală este determinată înmulţind numărul cadrului cu dimensiunea
cadrului. Atunci când se întâlneşte un acces la o variabilă sau o instrucţiune
care nu este încărcată în memorie, apare o lipsă de pagină (page fault), iar
pagina care conţine variabila sau instrucţiunea necesară este încărcată în
memorie. Pagina este depusă într-un cadru liber, dacă un asemenea cadru
există. Dacă nu există un cadru liber, trebuie selectată una din paginile
procesului, iar noua pagină va fi memorată în locul acesteia. Criteriul pentru
selectarea paginii care se va înlocui constituie strategia de înlocuire sau
algoritmul de înlocuire.

Fig. 8.22

Ca un exemplu, figura 8.22 prezintă conţinutul tabelelor de pagini pentru


două procese, Proces 1 şi Proces 2. Procesul 1 conţine trei pagini, P0 , P1 şi P2 ,
iar procesul 2 are două pagini, P0 şi P1 . Presupunem că toate paginile
procesului 1 au acces numai pentru citire, iar paginile procesului 2 au acces
pentru citire şi scriere. Deoarece fiecare cadru are o dimensiune de 4 KB,
adresa fizică de început a fiecărui cadru se calculează prin produsul dintre
numărul cadrului şi 4096. Astfel, dat fiind faptul că paginile P0 şi P2 ale
procesului 1 sunt încărcate în cadrele 1 şi 3, adresele de început ale acestora în
memoria principală vor fi 1 * 4096=4096 (4K), respectiv 3 * 4096=12288 (12K).
Procesul de conversie a adreselor virtuale în adrese fizice poate fi efectuat
mai rapid prin utilizarea unui buffer de translatare TLB (Translation Look-aside
Buffer) care va memora o parte dintre fişele conţinute de tabela de pagini a
procesului respectiv.
Pentru micşorarea timpului de răspuns al TLB acesta poate fi implementat
printr-o memorie asociativă. Pentru o anumită adresă de pagină, se caută o fisă
(entry) a bufferului de translatare pentru care există o potrivire cu acest număr
de pagină; această fişă (entry) este utilizată pentru a furniza numărul
corespunzător al cadrului. Dacă nu se găseşte o potrivire în bufferul de
translatare, se va localiza tabela de pagini a procesului corespunzător în
memoria principală, care se va utiliza pentru a furniza numărul cadrului.
Eficienţa unui sistem de memorie virtuală depinde de minimizarea
numărului lipsurilor de pagină. Deoarece timpul de acces al memoriei secundare
este mult mai ridicat decât timpul de acces al memoriei principale, un număr
excesiv al lipsurilor de pagină poate încetini sistemul în mod semnificativ. Atunci
când apare o lipsă de pagină, trebuie identificată o pagină în memoria principală
care nu este necesară în momentul respectiv, astfel încât aceasta poate fi
transferată în memoria secundară. Apoi, pagina cerută poate fi încărcată în
acest cadru eliberat din memoria principală.
Paginarea creşte în mod substanţial timpul de prelucrare necesar unui
proces, deoarece vor fi necesare două accese la disc, pe lângă execuţia unui
algoritm de înlocuire. Există însă o alternativă care, în unele cazuri, poate
reduce numărul accesurilor la disc la unul singur. Această reducere este
obţinută prin adăugarea unui bit suplimentar la fiecare pagină (bit de modificare
sau bit de inconsistenţă). Dacă o anumită pagină a fost modificată, bitul
corespunzător de modificare este setat la 1. Dacă bitul de modificare al unei
pagini este 1 şi această pagină a fost selectată pentru a fi eliminată din
memorie, atunci vor fi necesare două accesuri la disc. Dacă bitul de modificare
este 0 (aceasta însemnând că nu au fost modificări ale acestei pagini din
momentul în care a fost încărcată ultima dată), nu este necesară scrierea paginii
pe disc. Deoarece starea originală a acestei pagini se află pe disc şi nu s-au
efectuat modificări ale paginii, acesta poate fi înlocuită de noua pagină solicitată.

8.7.4. Segmentarea
O altă metodă de implementare a memoriei virtuale este numită
segmentare. In acest caz, un program este împărţit în secţiuni de lungime
variabilă numite segmente. Un segment poate corespunde unei entităţi logice
cum ar fi un set de date sau o funcţie în cadrul unui program. Fiecare proces
păstrează o tabelă de segmente în memoria principală, tabelă care conţine în
principiu aceleaşi informaţii ca şi tabela de pagini, însă, spre deosebire de
pagini, segmentele au lungimi diferite şi ele pot începe în orice zonă din
memorie. Pentru acest motiv, eliminarea unui segment din memoria principală
nu asigură întotdeauna spaţiu suficient pentru un alt segment.
Un segment este un set de cuvinte contigue, asociate logic. Un cuvânt
dintr-un segment este referit specificând o adresă de bază, numită adresă de
segment şi un deplasament în cadrul segmentului. Un program şi datele sale
pot fi considerate ca o colecţie de segmente înlănţuite. Legăturile provin din
faptul că un segment de program utilizează, sau apelează, alte segmente.
Avantajul principal al segmentării constă în faptul că limitele segmentelor
corespund limitelor programului şi ale datelor. In consecinţă, informaţiile care
sunt partajate între diferiţi utilizatori sunt organizate adesea în segmente. Din
cauza independenţei logice între segmente, un segment de program poate fi
modificat şi recompilat în orice moment fără a afecta alte segmente. Anumite
proprietăţi ale programelor, ca domeniul de definiţie al unei variabile sau
drepturile de acces, pot fi specificate în mod natural de către segmente. Aceste
proprietăţi necesită ca accesurile la segmente să fie verificate pentru a preveni
utilizarea lor neautorizată.
Dezavantajul segmentării constă în utilizarea ineficientă a memoriei
principale. La sistemele care utilizează segmentarea, blocurile de dimensiuni
diferite tind să prolifereze în memoria principală, lăsând între ele spaţii
neutilizabile. Acestea pot fi eliminate prin procesul de compactare a memoriei.
Existenţa unui spaţiu inutilizabil între zonele ocupate este numită fragmentare
externă. In cazul paginării, deoarece cadrele de pagină sunt contigue,
fragmentarea externă nu apare.
Comparând paginarea şi segmentarea, paginarea necesită un sistem mai
simplu de alocare a memoriei decât segmentarea, deoarece paginile au aceeaşi
dimensiune. Pe de altă parte, paginile nu au semnificaţie logică, deoarece ele
nu reprezintă elemente de program.
Administrarea memoriei virtuale poate fi simplificată prin combinarea
segmentării cu paginarea. Utilizând această soluţie se obţine şi o mai bună
utilizare a memoriei principale. Totuşi, dacă un bloc de k cuvinte este împărţit în
p pagini de câte n cuvinte, iar k nu este un multiplu de n, ultimul cadru de
pagină căruia îi este asignat blocul nu va fi ocupat complet. Existenţa unui
spaţiu inutilizabil în interiorul unui cadru de pagină ocupat parţial este numită
fragmentare internă.

8.7.5. Paginarea şi segmentarea


Paginarea şi segmentarea pot fi combinate pentru a obţine avantajele
ambelor soluţii. In acest caz, fiecare segment este împărţit în pagini. Avantajul
principal al divizării unui segment în pagini este că se elimină necesitatea de a
plasa segmentul într-o zonă contiguă din memoria principală. In loc de aceasta,
este nevoie doar de un număr de cadre de pagină egal cu numărul paginilor în
care s-a împărţit segmentul. Deoarece aceste cadre de pagină nu trebuie să fie
contigue, este mai uşor de plasat un segment de dimensiuni mari în memoria
principală.
Atunci când paginarea este combinată cu segmentarea, o adresă virtuală
are trei componente: un index de segment SI , un index de pagină PI şi un
deplasament (offset) D . Tabela de adrese ale memoriei constă atunci din una
sau mai multe tabele de segmente şi tabele de pagini. Pentru translatarea
rapidă a adreselor, se pot utiliza două buffere de translatare TLB, unul pentru
tabelele de segmente şi unul pentru tabelele de pagini (figura 8.23).
Fiecare adresă virtuală Av generată de un program este translatată printr-
un proces în două etape. Mai întâi, se utilizează indexul de segment SI pentru a
citi tabela curentă de segmente cu scopul de a obţine adresa de bază PB a
tabelei de pagini necesare.
Fig. 8.23

Această adresă de bază este combinată cu indexul de pagină PI (care


este un deplasament în cadrul tabelei de pagini) pentru a genera o adresă de
pagină, care este utilizată apoi pentru accesul la o tabelă de pagini. Rezultatul
este o adresă reală de pagină, deci, un număr al cadrului de pagină, care poate
fi combinat cu partea de deplasament D a adresei virtuale Av pentru a obţine
adresa reală finală Ar .

8.7.6. Alocarea memoriei


Diferitele niveluri ierarhice ale unui sistem de memorie sunt împărţite în
seturi de pagini sau segmente, care păstrează blocuri de date. Blocurile sunt
transferate în mod automat între aceste niveluri în scopul minimizării timpului de
acces al ierarhiei de memorie. Plasarea blocurilor de informaţii într-un sistem de
memorie se numeşte alocarea memoriei. Metoda de selectare a părţii memoriei
principale M 1 în care trebuie plasat un nou bloc K constituie strategia de
înlocuire. Strategiile simple de înlocuire plasează blocul K în memoria M 1
numai atunci când este disponibilă o regiune neocupată cu o dimensiune
suficientă (alocare non-preemptivă). Alte strategii realizează realocarea
blocurilor existente în memorie pentru a face loc blocului K (alocare
preemptivă). In general, metodele de alocare ale memoriei care sunt eficiente
au ca efect o rată ridicată de succes şi un timp mediu de acces scăzut. O
alocare eficientă a memoriei minimizează de asemenea spaţiul neocupat din
memoria M 1 .
Atunci când un bloc este transferat din memoria M 2 în M 1 , sistemul de
gestiune a memoriei crează o intrare corespunzătoare în lista spaţiilor ocupate.
Atunci când un bloc nu mai este necesar în memoria M 1 , acesta este eliberat
(dealocat) şi regiunea pe care o ocupă este transferată din lista spaţiilor ocupate
în lista spaţiilor disponibile. Un bloc este dealocat atunci când un program care îl
utilizează îşi termină execuţia sau când blocul este înlocuit de către un alt bloc.

8.7.6.1. Alocarea non-preemptivă


Presupunem că un bloc K i , de ni cuvinte trebuie transferat din memoria
M 2 în M 1 . Dacă nici unul din blocurile care ocupă deja memoria M 1 nu poate fi
acaparat (înlocuit) de către blocul K i , atunci este necesar să se găsească sau
să se creeze o regiune disponibilă de ni , sau mai multe cuvinte care permite
plasarea blocului K i . Acest proces este cunoscut ca alocare non-preemptivă a
memoriei.
Alocarea non-preemptivă poate fi implementată mai simplu într-un sistem
cu paginare, unde toate blocurile (paginile) au o dimensiune fixe şi memoria M 1
este divizată în regiuni (cadre de pagină) de aceeaşi dimensiune. Harta
memoriei (tabela de pagini) este parcursă pentru a găsi un cadru de pagină
disponibil; dacă se găseşte unul, acesta este asignat blocului K i . Această
metodă simplă de alocare este motivul principal al utilizării pe scară largă a
paginării. Dacă spaţiul de memorie este divizat în regiuni de lungime variabilă,
devine însă mai dificil să se aloce în mod eficient noi blocuri.
Doi algoritmi utilizaţi pe scară largă pentru alocarea non-preemptivă a
blocurilor de dimensiune variabilă (segmente care nu sunt paginate, de
exemplu) sunt primul potrivit, cel mai potrivit si cel mai nepotrivit.
Primul potrivit. Această metodă plasează blocul dat în prima regiune liberă
cu dimensiunea potrivită. Se parcurge harta memoriei în mod secvenţial până
când se găseşte o regiune disponibilă R j de ni sau mai multe cuvinte, unde n ,
este dimensiunea blocului K i care trebuie plasat, iar apoi se alocă blocul K i
regiunii R j .
Principalul avantaj al acestei metode este că favorizează formarea unor
zone libere la adresele mari de memorie prin plasarea blocurilor la adresele
joase de memorie ori de câte ori este posibil. Totuşi, această metodă produce
zone libere care pot fi prea mici pentru a păstra un bloc. Această problemă este
cunoscută sub numele de fragmentare. Atunci când apare fragmentarea, până
la urmă trebuie rulat un anumit algoritm de compactare pentru a colecta toate
zonele libere de dimensiuni mici într-o zonă cu dimensiunea mai mare. Aceasta
poate reduce performanţele.
Cel mai potrivit. Această metodă alocă regiunea disponibilă cu
dimensiunea cea mai mică care este suficient de mare pentru a păstra blocul
dat. Se parcurge harta memoriei şi se asignează blocul K i unei regiuni de
n j ≥ ni , cuvinte astfel încât n j − ni , să fie minimizat. Pentru a nu fi necesară
căutarea în întreaga hartă a memoriei, lista spaţiului disponibil este sortată în
ordinea crescătoare a dimensiunii regiunilor. Ca şi strategia primului potrivit, şi
strategia celui mai potrivit produce fragmentarea memoriei. Această strategie
poate crea un număr mare de blocuri mici care sunt inutile în majoritatea
cazurilor.
Comparând algoritmii primului potrivit şi celui mai potrivit, algoritmul
primului potrivit are avantajul timpului de execuţie mai redus. Eficienţa relativă a
celor doi algoritmi a fost un subiect de controverse, deoarece ambii au fost
implementaţi cu rezultate satisfăcătoare. Performanţele obţinute într-un mediu
particular depinde de distribuţia dimensiunii blocurilor care trebuie alocate.
Studiile de simulare sugerează că, în practică, algoritmul primului potrivit tinde
să aibă performanţe mai bune decât algoritmul celui mai potrivit.
Cel mai nepotrivit. Această metodă alocă regiunea disponibilă cu
dimensiunea cea mai mare pentru blocul dat. Se caută în harta memoriei
regiunea cea mai mare. Lista spaţiului disponibil este sortată în ordinea
descrescătoare a dimensiunii regiunilor. Această metodă, ca şi celelalte două
metode, produce fragmentarea memoriei. Totuşi, spre deosebire de primele
două metode, metoda celui mai nepotrivit reduce numărul regiunilor mici,
alocând întotdeauna regiunea cea mai mare pentru blocul dat.

8.7.6.2. Alocarea preemptivă


Alocarea non-preemptivă nu poate utiliza eficient memoria în toate
situaţiile. Este posibil să apară refuzarea unei cereri de alocare a memoriei
datorită spaţiului insuficient atunci când memoria M 1 este doar parţial ocupată.
Este posibilă utilizarea mult mai eficientă a spaţiului de memorie disponibil dacă
spaţiul ocupat poate fi realocat pentru a face loc noilor blocuri. Realocarea
poate fi efectuată utilizând două abordări:
- Blocurile aflate deja în memoria M 1 pot fi realocate în cadrul M 1 pentru a
crea un spaţiu suficient de mare pentru noul bloc.
- Una sau mai multe regiuni pot deveni disponibile prin dealocarea blocurilor
pe care le conţin. Această metodă necesită o strategie de înlocuire pentru
selectarea blocurilor care trebuie dealocate şi înlocuite.
Dealocarea necesită stabilirea unei distincţii între blocurile care au fost
modificate de la încărcarea lor în memoria M 1 şi blocurile care nu au fost
modificate. Blocurile de instrucţiuni rămân nemodificate, în timp ce blocurile de
date pot fi modificate. Pentru înlocuirea unui bloc care nu a fost modificat,
sistemul de gestiune a memoriei poate înlocui în mod simplu blocul dealocat cu
noul bloc şi poate actualiza intrarea acestuia în harta memoriei. Inainte ca un
bloc modificat să fie înlocuit, acesta trebuie copiat în memoria M 2 .

8.7.6.3. Strategii de înlocuire


A doua abordare pentru alocarea preemptivă implică acapararea unei
regiuni R ocupate de blocul K şi alocarea acesteia unui nou bloc K ' . Criteriul
pentru selecţia blocului K ca şi bloc care va fi înlocuit constituie strategia de
înlocuire. Principalul scop în alegerea unei strategii de înlocuire este de a
maximiza rata de succes a memoriei mai rapide M 1 .
Majoritatea strategiilor de înlocuire iau în considerare principiul localităţii
atunci când selectează un bloc pentru înlocuire. Principiul localităţii afirmă că pe
o perioadă dată de timp adresele generate se vor încadra într-o porţiune redusă
a spaţiului adreselor virtuale şi aceste adrese generate se vor modifica lent în
timp.
Rata de succes tinde la un maxim dacă intervalele de timp dintre două
lipsuri succesive de memorie sunt maximizate. Doi algoritmi practici de înlocuire
sunt FIFO (First-In, First-Out) şi LRU (Least Recently Used).
FIFO este una din cele mai simple strategii de înlocuire. Blocul selectat
pentru înlocuire este blocul cel mai puţin recent încărcat în memoria M 1 .
Avantajul strategiei FIFO este faptul că este foarte simplu de implementat.
Fiecărui bloc i se asociază un contor în lista spaţiilor ocupate; contoarele
asociate cu blocurile indică secvenţa lor de încărcare. De fiecare dată când un
bloc este transferat în memoria M 1 , contoarele indicând secvenţa de încărcare
sunt actualizate. Prin inspectarea acestor contoare, unitatea de gestiune a
memoriei poate determina cu uşurinţă primul bloc care a fost încărcat.
Dezavantajul strategiei FIFO este că poate mări în mod semnificativ timpul
necesar pentru execuţia unui proces, deoarece nu ia în considerare principiul
localităţii referinţelor şi în consecinţă, poate înlocui cu aceeaşi probabilitate
blocuri utilizate intens şi blocuri utilizate rar. De exemplu, dacă un bloc încărcat
în memorie de mai mult timp conţine o variabilă globală care este utilizată în
mod constant, acest bloc va fi unul din primele care va fi înlocuit. La următorul
acces la variabila globală, va apare o nouă lipsă a blocului, iar blocul va trebui
reîncărcat, înlocuind un alt bloc.
Strategia LRU (Least Recently Used) selectează pentru înlocuire blocul
care nu a fost utilizat de cel mai mult timp. Această strategie se bazează pe
presupunerea rezonabilă că blocul cel mai puţin recent utilizat este cel mai puţin
probabil de a fi utilizat în viitor. Strategia LRU evită înlocuirea blocurilor
încărcate de mai mult timp, dar frecvent utilizate, ca în cazul strategiei FIFO.
Totuşi, strategia LRU este mai dificil de implementat decât FIFO, deoarece
sistemul de gestiune a memoriei trebuie să păstreze informaţii despre
momentele referinţelor la toate blocurile din memoria M 1 . Strategia LRU poate fi
implementată prin asocierea unui contor hardware sau software cu fiecare bloc
din M 1 . De fiecare dată când un bloc este referit, contorul acestuia este setat la
o valoare pozitivă predeterminată. La intervale fixe de timp, contoarele tuturor
blocurilor sunt decrementate. In orice moment, blocul cel mai puţin recent utilizat
este cel al cărui contor conţine valoarea cea mai mică.
8.8 Tipuri de memorii semiconductoare

8.8.1. Parametrii memoriilor DRAM


Pentru început considerăm un circuit de memorie DRAM real cu o
capacitate de 64 MbiŃi. Cea mai mica unitate adresabilă este octetul, astfel încât
circuitul considerat reprezintă o memorie DRAM de 8 M x 8 biŃi. Dimensiunea
adreselor de memorie este 23 de biŃi. Circuitul utilizează organizarea
bidimensională, adresa de 23 de biŃi fiind divizată în două părŃi: o adresă de linie
de 13 biŃi şi o adresă de coloană de 10 biŃi. Pentru reducerea numărului de pini
ai circuitului acesta utilizează numai 13 linii externe de adrese. Această soluŃie
de proiectare implică faptul că adresele de linie şi de coloană trebuiesc
multiplexate pe magistrala de adrese, soluŃie adoptată în mod curent pentru
circuitele RAM de dimensiuni mari. Procesul de multiplexare este controlat de
două linii: RAS (Row Address Stwbe) şi CAS (Column Address Strobe).
Mai întâi, adresa de linie este transferată circuitului DRAM de către
dispozitivul extern (master), care plasează adresa de linie pe magistrala de
adrese a circuitului DRAM şi activează semnalul RAS. Dispozitivul master
plasează apoi adresa de coloană pe magistrala de adrese şi activează semnalul
CAS. Semnalul CAS indică de asemenea faptul că un cuvânt de date este
pregătit pe magistrala de date (pentru operaŃie de scriere) sau faptul că
magistrala externă este pregătită pentru a recepŃiona un cuvânt de date (pentru
operaŃie de citire).
Pentru a descrie performanŃele memoriilor DRAM se utilizează mai mulŃi
parametri, care pot fi definiŃi luând în considerare modul de funcŃionare a unei
astfel de memorii. Considerând un acces pentru citirea unei memorii DRAM, vor
avea Ioc următoarele operaŃii:
- Procesorul transmite adresa datei care trebuie accesată pe magistrala de
adrese;
- Controlerul de memorie determină adresele de linie şi de coloană ale datei
solicitate;
- Controlerul de memorie transmite prima parte a adresei (adresa de linie)
la memorie şi activează semnalul RAS. Ca urmare, decodificatorul adresei de
linie selectează linia corespunzătoare în care este memorată data, sau citeşte
întreaga linie şi o depune într-un buffer. Timpul de acces la linie tRAS (Row
Access time), numit şi timp de acces aleator (random access time) sau timp de
acces (tA), este timpul dintre activarea semnalului RAS şi prezenŃa datei
solicitate în bufferul de ieşire.
- Controlerul de memorie transmite a doua parte a adresei (adresa de
coloană) la memorie şi activează semnalul CAS. Întârzierea între semnalele
RAS şi CAS tRCD (RAS-to-CAS delay) reprezintă perioada de timp dintre
activarea semnalului RAS şi activarea semnalului CAS.
Ca rezultat al activării semnalului CAS, decodificatorul adresei de coloană
selectează coloana corespunzătoare în care este stocată data solicitată.
Perioada de timp care se scurge între momentul activării semnalului CAS şi
momentul în care data solicitată este disponibilă în bufferul de ieşire se notează
cu tCAS. (Column Access time).
Timpul necesar pentru a încheia accesul la o linie deschisă şi a deschide
următoarea linie este notat cu tRP (RAS Precharge)
Un mod obişnuit de a prezenta performanŃa unui modul DRAM este sub
forma x-y-y-y, care indică timpul de acces la primul cuvânt şi la următoarele trei
cuvinte (pentru un total de 32 de octeŃi). Aceşti parametrii poată denumirea de
latenŃe. De exemplu, dacă un circuit de memorie are latenŃele 5-2-2-2
înseamnă că primul cuvânt de memorie va necesita 5 cicluri de ceas pentru
acces, în timp ce următoarele trei cuvinte, în cazul când aparŃin liniei deja
accesate, vor necesita câte 2 cicluri de ceas fiecare.
Pentru memoriile sincrone această notaŃie reprezintă valorile parametrilor
tCAS, tRCD, tRP şi tRAS exprimate în cicluri de ceas. Unii producători preferă să
indice numai latenŃa semnalului CAS sub forma CL2 sau CL3, însemnând că
aceasta are valoare 2, sau 3 exprimată în cicluri de ceas. De exemplu latenŃele
unui circuit de memorie exprimate sub forma 4-4-4-12 indică faptul că tCAS=4,
tRCD=4, tRP=4 şi tRAS=12.

8.8.2. Tehnologii pentru memoriile DRAM

8.8.2.1. Categorii de memorii DRAM


Aproape toate tipurile de memorii DRAM au aceeaşi întârziere iniŃială
pentru accesul la primul cuvânt de memorie, deoarece intern toate memoriile
DRAM funcŃionează într-un mod similar. Diferitele tipuri de memorii DRAM
utilizează tehnici diferite pentru executarea operaŃiilor secvenŃiale după citirea
primului cuvânt de memorie, cu rezultate diferite în privinŃa performanŃelor
obŃinute. Majoritatea câştigurilor de performanŃă se obŃin prin "ascunderea"
operaŃiilor interne în diferite moduri.
IniŃial, au fost utilizate memorii DRAM cu interfaŃă asincronă, deoarece
procesoarele erau relativ lente. Mai recent, au fost realizate interfeŃe sincrone cu
caracteristici avansate. Este posibil ca memoriile sincrone să fie înlocuite prin
memorii bazate pe protocoale, cum este Rambus DRAM.
O interfaŃă asincronă este cea la care este necesară o perioadă minimă de
timp pentru a asigura ca o operaŃie să fie terminată. Fiecăreia din operaŃiile
interne ale unei memorii DRAM asincrone i se asignează intervale minime de
timp, astfel încât dacă apare un impuls de ceas înainte de terminarea acestui
interval minim, trebuie să se aştepte un nou impuls de ceas înainte ca
următoarea operaŃie să poată începe. Din această cauză, memoriile asincrone
au performanŃe limitate.
Utilizarea unor porturi de I/E cu un număr mai mare de biŃi reprezintă
metoda cea mai simplă şi cea mai ieftină de creştere a performanŃelor unei
memorii. Un asemenea port necesită însă pini suplimentari de I/E, ceea ce
implică o dimensiune mai mare a capsulei. Similar, segmentarea adiŃională a
matricei de memorie şi utilizarea mai multor linii de I/E creşte dimensiunea
circuitului. Ambele metode conduc la creşterea preŃului memoriilor DRAM.
Aceste probleme au limitat de obicei numărul liniilor de I/E la 4 sau 8,
determinând ca proiectanŃii să caute alte metode de creştere a performanŃelor.
O altă categorie de memorii DRAM este cea care utilizează o interfaŃă
sincronă. Prin implementarea unei interfeŃe sincrone, s-au eliminat perioadele
de aşteptare de către procesor, obŃinându-se de asemenea unele avantaje
suplimentare. In cazul funcŃionării sincrone, se memorează anumite informaŃii
de la procesor în circuitele latch ale memoriei DRAM sub controlul ceasului
sistem. Aceste circuite păstrează adresele, datele şi semnalele de control, ceea
ce permite procesorului să execute alte operaŃii. După un număr specific de
cicluri de ceas, datele devin disponibile şi procesorul le poate citi de pe liniile de
ieşire.
Un alt avantaj al unei interfeŃe sincrone este că ceasul sistem este singurul
semnal de sincronizare care trebuie furnizat memoriei DRAM. Aceasta elimină
necesitatea propagării unor semnale multiple de sincronizare. Intrările sunt de
asemenea simplificate, deoarece semnalele de control, adresele şi datele pot fi
memorate fără temporizările de setare şi menŃinere monitorizate de procesor.
Avantaje similare se obŃin şi pentru operaŃiile de ieşire.
Toate memoriile DRAM care au o interfaŃă sincronă sunt cunoscute sub
numele generic SDRAM.
O altă categorie este reprezentată de memoriile DRAM bazate pe
protocoale. Categoriile precedente de memorii au linii separate de adrese, date
şi control, care limitează viteza la care poate funcŃiona circuitul cu tehnologia
curentă. Pentru eliminarea acestui dezavantaj, au fost proiectate memorii DRAM
bazate pe protocoale, care implementează toate aceste semnale pe aceeaşi
magistrală. Cele mai cunoscute memorii din această categorie sunt DRDRAM
(Direct Rambus DRAM) şi SLDRAM (SyncLink DRAM)

8.8.2.2. FPM DRAM (Fast page mode)


Prin implementarea unor moduri speciale de acces, se pot elimina anumite
operaŃii interne. Astfel, dacă o secvenŃă de accesuri la memorie are aceeaşi
adresă de linie, este suficient să se transfere adresa de linie la circuitul DRAM o
singură dată la începutul secvenŃei. O metodă de acces rapidă de acest tip este
numită mod pagină.
Prin această metodă, semnalul RAS este menŃinut activ, astfel încât
întreaga linie de date (sau o pagină) este menŃinută în bufferele interne de
coloană. Reamintim că semnalul RAS are ca efect identificarea liniei în care se
găseşte data solicitată şi încărcarea acestea în buffere. ConŃinutul acestor
buffere poate fi apoi accesat doar prin activarea semnalului CAS . Aceasta
asigură operaŃii de citire mult mai rapide, deoarece timpii de setare şi menŃinere
pentru adresa de linie sunt eliminaŃi. Memoria FPM este cu puŃin mai rapidă
decât memoria DRAM convenŃională. Avantajul acestei memorii este, de
asemenea, consumul de putere mai redus, în principal datorită faptului că în
timpul accesului în mod pagină refacerea conŃinutului celulelor nu este
necesară.. Temporizările tipice pentru o memorie FPM DRAM sunt 6-3-3-3 (o
întârziere iniŃială de 6 cicluri de ceas, cu un acces la pagină de 3 cicluri de
ceas).

8.8.2.3. EDO DRAM


Memoria EDO (Extended Data Out), numită uneori Hyper Page Mode,
reprezintă o altă îmbunătăŃire a memoriei DRAM asincrone. In cazul memoriei
EDO, o operaŃie de citire poate începe înainte de terminarea ultimului acces.
Aceasta permite ca durata minimă a ciclului pentru semnalul CAS să fie redusă,
obŃinându-se astfel o creştere a vitezei în comparaŃie cu FPM DRAM de 5%
până la 10%. Temporizarea tipică a memoriei EDO este 5-2-2-2.

8.8.2.4. BEDO DRAM


In cazul memoriei BEDO (Burst EDO), memoria EDO este combinată cu
tehnologia pipeline şi circuite latch speciale pentru a reduce timpul de acces.
Adăugarea unui mod de transfer exploziv ("burst") şi utilizarea unei arhitecturi cu
bancuri duale asigură o temporizare de 4-1-1-1. Modul de transfer exploziv este
o îmbunătăŃire a modului pagină, deoarece după furnizarea primei adrese
următoarele 3 adrese sunt generate intern, eliminându-se astfel timpul necesar
furnizării unei noi adrese de coloană.

8.8.2.5. SDRAM
Toate memoriile care au o interfaŃă sincronă sunt cunoscute sub numele
generic SDRAM (Synchronous DRAM).
In mod tradiŃional memoriile DRAM au interfaŃă asincronă, fapt care
înseamnă că acestea răspund cât pot de repede la modificarea semnalelor de
intrare. InterfaŃa sincronă a memoriilor SDRAM determină ca aceste memorii să
aştepte un semnal de ceas înainte de a răspunde la semnalele de comandă. In
acest mod memoriile SDRAM lucrează sincron cu magistrala procesorului.
Memoria DRAM sincronă este complet diferită de în ceea ce priveşte
arhitectura sa şi metodele de control faŃă de memoria DRAM asincronă.
Prima diferenŃă este configuraŃia memoriei SDRAM, care utilizează o
arhitectură cu unităŃi (bancuri) multiple. Modulele tipice SDRAM au 2 sau 4
bancuri pe modul, permiŃând ca un banc să fie preîncărcat în timp ce celelalte
sunt citite sau scrise. Memoriile SDRAM utilizează o tehnologie denumită
pipelining, care presupune faptul că circuitul de memorie poate accepta o nouă
instrucŃiune înainte de a termina procesarea celei anterioare. Astfel, nu numai
că timpii de preîncărcare sunt mascaŃi, dar pot fi accesate simultan linii multiple
în fiecare banc al memoriei. In acest mod viteza de răspuns a modului de
memorie creşte considerabil.
A doua diferenŃă constă în faptul că memoria SDRAM poate funcŃiona în
mod exploziv pentru 1 bit, 2 biŃi, 4 biŃi, 8 biŃi, sau o pagină completă. In mod
exploziv, la fiecare tranzacŃie cu memoria se transferă mai multe locaŃii cu
adrese consecutive. Modul exploziv este avantajos deoarece instrucŃiunile şi
datele sunt citite în ordine secvenŃială în majoritatea timpului.
Printre primele memorii SDRAM putem menŃiona modulele de memorie
PC66, care funcŃionau pe magistrale de 66 MHz, urmate de modulele PC100.
Ulterior Intel a elaborat specificaŃiile pentru memoriile PC133 şi PC150 care
lucrau pe magistrale de 133MHz şi respectiv 150 MHz. Pentru PC150 rata de
transfer teoretică era de 1200 MocteŃi/s.
Memoriile SDRAM utilizează module DIMM (dual in-line memory module),
care au înlocuit modulele SIMM (single in-line memory module). Principala
deosebire dintre cele două tipuri de module de memorie constă în faptul că,
modulele DIMM au contacte distincte pe ambele părŃi ale plăcii, în timp ce
contactele modulului SIMM sunt redundante.

Memoriile HSDRAM
Ulterior au fost elaborate memoriile HSDRAM (High Speed SDRAM) care
utilizau circuite de memorie de calitate ridicată în scopul creşterii frecvenŃei
peste cea a memoriei SDRAM convenŃionale. Memoriile HSDRAM puteau
funcŃiona stabil la frecvenŃe de 150MHz sau chiar de 166MHz. Memoria
HSDRAM era compatibilă cu memoria SDRAM convenŃională, îmbunătăŃind în
acelaşi timp performanŃa şi stabilitatea sistemelor.

Memoriile ESDRAM (Enhanced SDRAM)


Această memorie este alcătuită dintr-o memorie SDRAM şi o memorie
cache de linie. Această memorie cache cu mapare directă păstrează conŃinutul
liniei active, eliberând deci matricea de memorie DRAM, astfel că aceasta poate
accesa o altă linie în timp ce conŃinutul liniei precedente este transferat în
bufferele de ieşire. Principiul de funcŃionare al memoriei ESDRAM constă în
faptul că, în loc de a se încerca reducerea întârzierilor prin utilizarea unor
componente mai rapide, aceste întârzieri sunt "ascunse" prin suprapunerea
anumitor operaŃii. Intr-o memorie SDRAM convenŃională, datele trebuie refăcute
prin rescrierea conŃinutului unei linii înainte de a putea activa o altă linie.
Memoria ESDRAM suprapune transferul în mod exploziv al datelor din memoria
cache de linie în bufferele de ieşire cu operaŃia de reinprospătare.
De obicei, o memorie ESDRAM permite activarea simultană a mai multor
linii (pagini). Activarea unei noi linii, poate fi, de asemenea, suprapusă cu
transferul datelor din memoria cache de linie în bufferele de ieşire. Rezultatul
este că întârzierea între semnalele RAS şi CAS este eliminată sau redusă.
LatenŃa semnalului CAS este de asemenea redusă, deoarece citirea se
efectuează din memoria cache de linie, cu un timp de acces la coloană
substanŃial mai redus. Spre deosebire de memoria SDRAM convenŃională,
împrospătarea matricei de memorie DRAM poate fi executată în timpul unei
operaŃii de citire în mod exploziv. ConŃinutul memoriei cache de linie nu este
pierdut în timpul ciclurilor de reîmprospătare.
Dezavantajul memoriei ESDRAM constă în costul mai ridicat, deoarece
utilizează circuite de calitate ridicată şi o matrice de celule de memorie SRAM

Memoria cu canale virtuale


Memoria cu canale virtuale (VCM – Virtual Channel Memory) utilizează o
memorie cache SRAM pentru a îmbunătăŃi latenŃa de acces medie. Memoria
cache este implementată ca un set de registre statice rapide plasate între
matricea DRAM şi bufferele de I/E (figura 8.24). Aceste registre au porturi duale
şi formează mai multe "canale virtuale" care pot fi utilizate de diferite dispozitive
pentru accesul la memorie. Registrele comunică cu matricea DRAM printr-o
magistrală cu lăŃime foarte mare, ceea ce asigură o rată de transfer ridicată
pentru transferurile interne de date. Spre deosebire de memoria ESDRAM

Fig. 8.24

memoria VCM utilizează o memorie cache complet asociativă sau asociativă pe


seturi. In cazul unei memorii cache complet asociative, oricare linie DRAM dintr-
un banc poate fi încărcată în oricare canal virtual. Se utilizează un algoritm
"write-back", astfel încât datele sunt scrise într-un canal virtual înainte de
salvarea lor în matricea DRAM. Spre deosebire de cazul memoriei ESDRAM, nu
memoria însăşi, ci controlerul memoriei sistemului este cel care implementează
algoritmii de gestiune a memoriei cache şi funcŃiile acestei memorii, cum sunt
cele de activare, refacere şi preîncărcare. Controlerul memoriei sistemului poate
asigna canale virtuale multiple unor porŃiuni ale aceluiaşi banc de memorie.
Fiecare canal virtual poate conŃine date din mai multe bancuri ale matricei
DRAM. Prin păstrarea datelor în mai multe canale virtuale între matricea DRAM
şi terminalele de I/E, memoria poate pregăti alte cereri de date într-un canal
separat în timpul citirii sau scrierii datelor curente.
Memoria VCM poate îmbunătăŃi performanŃele în sistemele multitasking, la
care memoria este accesată de către diferite dispozitive: una sau mai multe
unităŃi centrale, un accelerator grafic, un adaptor de reŃea, o placă de sunet şi
alte dispozitive de I/E. Fiecare din aceste unităŃi are acces la memorie pe baza
adresei, a dimensiunii blocului şi a numărului de accesuri în zone contigue.
Memoria VCM poate asigura un canal independent cu propriile resurse pentru
accesul la matricea de memorie. Rezultă astfel întârzieri reduse, rate de transfer
ridicate şi o eficienŃă îmbunătăŃită a magistralei de memorie.

Memoria FCRAM
FCRAM (Fast Cycle RAM) este o tehnologie dezvoltată de firma Fujitsu
Microelectronics. Fiecare banc de memorie FCRAM este subdivizat în mini-
zone. Această subdiviziune îmbunătăŃeşte timpul de acces aleator şi reduce
puterea consumată comparativ cu memoria SDRAM convenŃională. Se
utilizează o arhitectură pipeline cu trei etaje, care permite ca următorul acces
aleator să înceapă în timp ce data precedentă este transmisă la ieşire. Un set
de operaŃii care specifică o adresă poate fi urmat imediat de operaŃia următoare
(de exemplu, operaŃia de preîncărcare) fără a fi necesar să se aştepte
transmiterea datelor la ieşire. Astfel, operaŃia de preîncărcare poate fi executată
automat de memorie pe măsură ce operaŃiile sunt terminate. In acest fel,
operaŃia de preîncărcare este ascunsă.
Tehnologia FCRAM a fost dezvoltată pentru a îmbunătăŃi în mod
semnificativ performanŃele accesurilor aleatoare chiar şi la frecvenŃe reduse,
prin reducerea ciclurilor inactive ori de câte ori este posibil. Ca rezultat, gradul
de utilizare efectivă a magistralei va creşte. Memoria FCRAM poate funcŃiona cu
o latenŃă a semnalului CAS egală cu 1, valoare care nu este permisă de obicei
de memoria SDRAM convenŃională.
Pe baza tehnologiei FCRAM, firma Fujitsu a dezvoltat de asemenea mai
multe circuite de memorie pentru aplicaŃii de telefonie celulară.

Memoria DDR SDRAM


Standardul care precizează caracteristicile memoriilor DDR SDRAM se
numeşte JEDEC.
Numele memoriei DDR (Double Data Rate) SDRAM provine de la tehnica
transferării datelor atât pe frontul crescător, cât şi pe cel descrescător al
semnalului de ceas. De exemplu, la o frecvenŃă a magistralei de 133 MHz,
memoria DDR SDRAM execută transferurile de date la o frecvenŃă de 266 MHz.
Această tehnică creşte semnificativ eficienŃa magistralei de memorie pentru
transferurile de date. Un modul de memorie DDR SDRAM cu un ceas de 133
MHz oferă o rată de transfer la vârf de 2100 MB/s, comparativ cu o rată de
transfer la vârf de 1066 MB/s pentru un modul de memorie SDRAM cu aceeaşi
frecvenŃă de ceas. Totuşi, acesta nu înseamnă că rata de transfer medie este
dublată şi ea.
DDR SDRAM este o arhitectură care utilizează preîncărcarea, având o
interfaŃă care transferă două cuvinte de date la pinii de I/E în fiecare ciclu de
ceas. Un acces de citire sau scriere constă dintr-un singur transfer de date de
2n biŃi, pe timpul unui ciclu de ceas, cu matricea internă DRAM şi două
transferuri de date de n biŃi cu pinii de I/E, fiecare pe timpul unei jumătăŃi a
ciclului de ceas. Pentru a realiza acest lucru magistrala internă de date are o
lăŃime dublă faŃă de cea a interfeŃei externe.
LatenŃa semnalului CAS poate fi setată la 2 sau 2,5 cicluri de ceas. O
latenŃă a semnalului CAS de 2,5 cicluri de ceas înseamnă 5 fronturi ale
semnalului de ceas (crescătoare şi descrescătoare).
Ca şi memoriile SDRAM convenŃionale, memoria DDR SDRAM utilizează
module DIMM (dual in-line memory module), dar acestea nu sunt compatibile cu
modulele DIMM utilizate de primele. Modulele DIMM DDR au însă aceleaşi
dimensiuni ca şi modulele DIMM SDRAM, însă au un număr mai mare de pini.
Caracteristicile memoriilor DDR SDRAM sunt precizate de standardul JEDEC.

Memoriile DDR II SDRAM


Memoriile DDR II reprezintă a doua generaŃie de memorii DDR, numite
acum DDR I.
Arhitectura DDR II conŃine, modificări semnificative, cum sunt: îmbunătăŃiri
ale ratei de transfer, o lungime fixă a transferurilor în mod exploziv de 4 cicluri
de date, reducerea costurilor şi reducerea puterii consumate.
Astfel, la memoriile DDR II, rata de transfer este îmbunătăŃită prin creşterea
frecvenŃei semnalului de ceas. Conform specificaŃiilor DDR II, lungimea
transferurilor în mod exploziv este fixată Ia 4 cuvinte. Deci, sunt necesare 4
cicluri de date (2 cicluri de ceas) pentru toate transferurile de citire şi scriere.
Aceasta diferă de alte memorii SDRAM, la care lungimea unui transfer poate fi
de 2, 4, 8 cuvinte, sau o pagină întreagă. Unul din motivele adoptării acestei
soluŃii este că astfel se reduc timpii de testare a stărilor. Un alt motiv îl
reprezintă faptul că interfaŃa DDR II nu permite întreruperea tranzacŃiilor odată
ce ele au fost iniŃiate. Pentru o memorie SDRAM convenŃională sau DDR I,
poate fi necesară terminarea în avans a unei tranzacŃii pentru a se permite
efectuarea unei alte tranzacŃii cu prioritate mai ridicată. Deoarece lungimea
tranzacŃiilor DDR II este mai redusă, nu este necesară întreruperea lor.
Pe de altă parte, lungimea mai redusă a transferurilor ar putea avea un
impact negativ asupra ratei de transfer. De exemplu, încărcarea magistralei de
adrese va creşte, deoarece trebuie transmise mai multe adrese. SpecificaŃiile
DDR II permit însă transmiterea comenzilor consecutive pe orice front crescător
al semnalului de ceas, cât timp acestea nu determină un conflict pe magistrala
de date şi nu întrerup o comandă precedentă. De exemplu, pot fi iniŃiate
comenzi consecutive de citire (care implică activarea semnalului CAS) către
acelaşi banc de memorie la fiecare două cicluri de ceas, deoarece astfel nu vor
fi conflicte pe magistrala de date.
InterfaŃa DDR II funcŃionează la 1,8 V, spre deosebire de interfaŃa DDR I,
care funcŃionează la 2,5 V. Astfel, puterea consumată este mai redusă. Aceasta
permite utilizarea modulelor DDR II la calculatoarele portabile, calculatoarele
PDA şi telefoanele celulare.

DiferenŃa de bază dintre DDR I şi DDR II constă în faptul că ceasul de


magistrală este de două ori mai rapid decât frecvenŃa de lucru a celulelor de
memorie, astfel încât DDR II are posibilitatea de a lucra efectiv de două ori mai
repede decât DDR I. Ca un compromis însă latenŃa memoriilor DDR II este
considerabil mai mare. In timp ce memoriile DDR I au latenŃe tipice de 2 sau 3
cicli de ceas, DDR II poate avea latenŃe de 4 sa 6 cicli de ceas. Astfel, pentru a
obŃine aceleaşi întârzieri ca şi DDR I, frecvenŃa magistralei (FSB) pe care
operează memoriile DDR II trebuie dublată. LatenŃele tipice pentru o memorie
DDR II sunt 5-5-5-15 sau 4-4-4-12.

Memoriile DDR III


Una dintre cele mai importante îmbunătăŃiri ale memoriilor DDR III este
abilitatea acestora de a transfera date de I/E la o viteză de opt ori mai mare
decât viteza de lucru a celulelor de memorie din care este alcătuit, făcând astfel
posibilă creşterea frecvenŃei magistralei. Ca o consecinŃă a acestei îmbunătăŃiri
este creşterea proporŃională a latenŃelor. LatenŃele tipice ale unei memorii DDR
III sunt 7-7-7-15. Trebuie însă înŃeles faptul că, deşi latenŃele sunt exprimate
prin cifre mai mari (care reprezintă întârzierea exprimată în cicli de ceas) totuşi
intervalul de timp real este egal sau chiar mai mic, deoarece perioada ciclurilor
este mai mică.
Tensiunea de alimentare a memoriilor DDR III este de 1.5 V, fapt care
asigură scăderea puterii disipate cu 30%.

Memoriile Rambus DRAM


La începutul anilor '90, Firma Rambus a dezvoltat o tehnologie de memorie
numită Rambus DRAM (RDRAM), care utilizează transmiterea unor pachete de
adrese şi date pe o magistrală specială cu tensiuni reduse. Intel a sprijinit firma
Rambus pentru dezvoltarea unei variante a tehnologiei RDRAM pentru
calculatoarele personale, această variantă fiind numită Direct Rambus DRAM
(DRDRAM).
In timp ce magistralele actuale de memorie sunt de 64 biŃi, memoriile
RDRAM şi DRDRAM utilizează o magistrală de 8, respectiv 16 biŃi. Această
magistrală, numită canal Rambus, este utilizată nu numai ca un set de conexiuni
ci şi ca un canal inteligent de comunicaŃie. Deşi acest canal şi portul de
memorie sunt de numai 8 sau 16 biŃi, rata de transfer este ridicată, de până la
500 MB/s pentru memoria RDRAM şi 1,6 GB/s pentru memoria DRDRAM. Prin
utilizarea mai multor canale Rambus, rata de transfer poate fi crescută. Spre
deosebire de circuitele de memorie SDRAM, care sunt conectate în paralel la
magistrala de 64 de biŃi, circuitele de memorie RDRAM sunt conectate serial pe
magistrala Rambus.
Elementele principale ale unui sistem de memorie Rambus sunt prezentate
în figura 8.25. Aceste elemente sunt canalul Rambus, controlerul de memorie,
interfaŃa Rambus şi circuitele RDRAM.
Fig. 8. 25

FuncŃionarea la o viteză ridicată a canalului Rambus se obŃine printr-o


combinaŃie de mai multe tehnici. Acestea cuprind: încapsularea densă, linii de
transmisie de calitate ridicată, protocol electric care utilizează tensiuni reduse,
topologia canalului, semnale de ceas diferenŃiale, sincronizarea precisă,
utilizarea unor conexiuni scurte. Magistrala Rambus funcŃionează sincron.
Utilizarea memoriilor RDRAM nu este prea extinsă din cauza costurilor mai
ridicate ale acestora în comparaŃie cu memoriile DDR DRAM şi a faptului că
tehnologia de fabricaŃie este proprietate a firmei Rambus.

Proiectul IRAM
IRAM (Intelligent RAM) este denumirea unui proiect realizat la Universitatea
Berkeley, constând dintr-un procesor şi o memorie DRAM. Procesorul este
realizat utilizând tehnologia de fabricaŃie al memoriilor şi nu cel convenŃional al
logicii digitale. Motivul pentru plasarea procesorului în cadrul memoriei DRAM
este că tehnologia DRAM, care utilizează structuri 3D pentru a reduce
dimensiunea celulei, permite în practică o densitate de aproximativ 20 de ori mai
ridicată decât a circuitelor digitale.
Dezvoltarea tehnologiei IRAM se bazează pe mai multe observaŃii asupra
arhitecturilor actuale ale calculatoarelor. Una dintre acestea este creşterea
decalajului dintre performanŃele procesoarelor şi ale memoriilor. In timp ce
performanŃele procesoarelor cresc cu o rată de 60% pe an, timpul de acces al
memoriei DRAM se îmbunătăŃeşte cu o rată de doar 7% pe an. Pentru a
compensa acest decalaj, se introduce de obicei o ierarhie de memorii cache.
Prin aceasta, în cazul cel mai defavorabil, latenŃa memoriei devine chiar mai
ridicată. Pentru a realiza această ierarhie de memorii, o porŃiune importantă a
spaŃiului din cadrul procesoarelor este dedicată memoriilor cache statice
(SRAM). De exemplu, aproape jumătate din spaŃiul procesorului Alpha 21164
este ocupat de memorii cache. Aceste memorii conŃin doar copii redundante ale
informaŃiilor, copii care nu ar fi necesare dacă viteza memoriei principale ar fi
suficientă. In afară de aceasta, anumite aplicaŃii prezintă o localitate redusă a
accesului, rezultând performanŃe reduse chiar cu memorii cache de dimensiuni
mari.
SoluŃia tehnologiei IRAM constă în utilizarea spaŃiului din cadrul capsulei
pentru o memorie DRAM în locul memoriilor cache SRAM. Această memorie
poate fi tratată ca memorie principală şi nu ca o memorie care conŃine o copie
redundantă. In multe cazuri, întreaga aplicaŃie poate fi încărcată în memoria din
cadrul capsulei.
Primul circuit realizar de echipa de cercetători de la Universitatea Berkeley
se numeşte V-IRAM1 şi utilizează o arhitectură multiprocesor vectorială, care
permite executarea unui număr mare de operaŃii în paralel.
Cap. 9. SISTEME PIPELINE

Tehnica pipeline reprezintă o metodă de îmbunătăţire a performanţelor


unui procesor sau a unei unităţi aritmetice. Această metodă permite execuţia
simultană a mai multor instrucţiuni sau operaţii. Tehnica pipeline este
transparentă pentru programator; ea utilizează paralelismul prin suprapunerea
fazelor de execuţie ale instrucţiunilor sau a etapelor de execuţie ale unei operaţii
aritmetice. Un sistem pipeline poate fi comparat cu o linie de asamblare a unui
produs, în care există posturi de lucru specializate pentru o anumită operaţie, iar
la capătul benzii este obţinut produsul final.

9.1. Structura unui sistem pipeline


Tehnica pipeline descompune un proces secvenţial în mai multe
subprocese, care sunt executate de unităţi sau etaje diferite. Un etaj execută un
subproces şi produce un rezultat intermediar, care reprezintă o intrare pentru
etajul următor. Rezultatul final este obţinut numai după ce toate subprocesele
au trecut prin întregul sistem pipeline. Figura 9.1 ilustrează structura de bază a
unui sistem pipeline cu m etaje.

Unitate de Control

Date de Date de
intrare ieşire

R1 C1 R2 C2 Rm Cm
m

Etaj E1 Etaj E2 Etaj Em

Fig. 9.1

Un etaj Ei constă dintr-un registru de intrare sau latch Ri şi un circuit de


prelucrare Ci , care poate fi secvenţial, combinaţional sau inteligent. Registrele
păstrează rezultatele parţiale pe măsură ce acestea se deplasează prin sistemul
pipeline. Un semnal comun de ceas determină ca registrele să îşi schimbe
starea în mod sincron. In fiecare ciclu de ceas, fiecare etaj transferă rezultatele
sale parţiale la următorul etaj şi calculează un nou set de rezultate. Perioada
semnalului de ceas trebuie să fie suficient de mare pentru ca etajul cel mai lent
să termine execuţia operaţiei sale. In plus, trebuie să existe un timp suficient
pentru ca un registru să memoreze datele sale de intrare. Deci, perioada
ceasului trebuie să fie mai mare decât întârzierea maximă a etajului cel mai lent,
plus timpul necesar pentru memorarea datelor într-un registru.
Avantajul acestei tehnici constă în faptul că un sistem pipeline cu m etaje
poate procesa simultan până la m seturi independente de subprocese. Aceste
subprocese se deplasează prin sistemul pipeline etaj cu etaj, astfel încât atunci
când sistemul pipeline este plin, sunt executate în mod concurent m operaţii
separate, fiecare într-un etaj diferit. Mai mult, un nou rezultat final este generat
la ieşirea sistemului pipeline în fiecare ciclu de ceas.

9.2. Indicatori de performanţă ai sistemelor pipeline


Prin suprapunerea fazelor de execuţie ale unui proces secvenţial pentru
diferite taskuri de intrare (instrucţiuni sau operaţii), se obţine un timp teoretic de
execuţie egal cu:
T pipe = m ∗ P + (n − 1) ∗ P (9.1)
unde m este numărul de etaje, n este numărul taskurilor de intrare, iar P este
perioada ceasului. Termenul m ∗ P , numit întârziere sau latenţă a sistemului
pipeline, este timpul necesar pentru ca primul task de intrare să parcurgă toate
etajele, iar termenul (n − 1) ∗ P este timpul necesar pentru următoarele taskuri.
După întârzierea necesară parcurgerii tuturor etajelor, se va genera o ieşire în
fiecare ciclu de ceas. Ieşirile vor fi generate la intervale de timp care depind de
întârzierea introdusă de etajul cel mai lent. Chiar şi cu această limitare, prin
tehnica pipeline se pot îmbunătăţi performanţele în mod semnificativ faţă de
execuţia obişnuită, în care este necesară terminarea unui task înainte de
începerea execuţiei unui alt task. Atunci când n are o valoare mare, un sistem
pipeline poate genera ieşirile de aproximativ m ori mai rapid faţă de un sistem
care nu utilizează această tehnică.
Pe de altă parte, fără suprapunerea fazelor de execuţie procesul
secvenţial anterior necesită un timp de execuţie egal cu:
m
Tsec = n ∗ ∑ τi (9.2)
i =1
unde τ i , este întârzierea introdusă de etajul i . Perioada ceasului P trebuie să
îndeplinească următoarea condiţie
P ≥ τi + t i
unde t i este timpul necesar pentru memorarea rezultatului în registrul i.
In cazul ideal în care toate etajele au întârzieri egale, τi = τ pentru
i = 1,..., m , Tsec poate fi scris ca:
Tsec = n ∗ m ∗ τ (9.3)
Dacă se ignoră timpul necesar memorării într-un registru ( ti = 0 ), atunci
P=τ
şi se obţine:
Tsec = n ∗ m ∗ P (9.4)
Creşterea vitezei de calcul ( S ) poate fi definită ca:
T n∗m∗P n∗m
S = sec = = (9.5)
T pipe m ∗ P + (n − 1) ∗ P m + (n − 1)
Valoarea S se apropie de m atunci când n → ∞ . Deci, creşterea maximă a
vitezei unui sistem pipeline cu m etaje faţă de un sistem care nu utilizează
tehnica pipeline este aproximativ m . Cu alte cuvinte, atunci când n (numărul
taskurilor de intrare) este foarte mare, un sistem pipeline poate genera ieşirile
de aproximativ m ori mai rapid faţă de un sistem obişnuit.
Pe lângă creşterea de viteză, se utilizează adesea alţi doi factori pentru
determinarea performanţelor unui sistem pipeline; acestea sunt eficienţa şi rata
de transfer.
Eficienţa E a unui sistem pipeline cu m etaje, care reprezintă creşterea
vitezei pe etaj, este definită ca:
S n∗m 1 n
E= = ∗ = (9.6)
m (m + n − 1) m m + n − 1
Eficienţa E , se apropie de valoarea sa maximă 1 atunci când n → ∞ .
Atunci când n = 1 , E va avea valoarea 1 , care este valoarea minimă care se
m
poate obţine.
Rata de transfer R a unui sistem pipeline este definită ca numărul
taskurilor de intrare pe care le poate prelucra în unitatea de timp. Pentru un
sistem pipeline cu m etaje, rata de transfer R este definită ca:
n n
R= =
T pipe m ∗ P + (n − 1) ∗ P
Împărţind atât numărătorul cât şi numitorul cu P se obţine
n 1 E S
R= ∗ = = (9.7)
m + n −1 P P m ∗ P
Atunci când n → ∞ , rata R se apropie de valoarea maximă care este un
task pe ciclu de ceas.

9.3. Tipuri de sisteme pipeline


Sistemele pipeline sunt împărţite, de obicei, în două categorii: de
instrucţiuni şi aritmetice. Un sistem pipeline de instrucţiuni este realizat pentru a
îmbunătăţi performanţele unui calculator prin suprapunerea eficientă a fazelor
de execuţie ale instrucţiunilor. Sistemele pipeline aritmetice implementează
anumite funcţii ale unităţii aritmetice şi logice cum ar fi adunarea, înmulţirea şi
împărţirea în virgulă mobilă.
Un sistem pipeline din oricare categorie poate fi proiectat în două moduri:
static sau dinamic.
Un sistem pipeline static poate executa un singur tip de operaţie la un
moment dat. Operaţia executată de un asemenea sistem poate fi modificată
numai după ce acesta este golit, deci ultimele date de intrare au trecut prin toate
etajele. De exemplu, considerăm un sistem pipeline static care poate executa
operaţiile de adunare şi înmulţire. De fiecare dată când sistemul pipeline comută
de la o operaţie de înmulţire la una de adunare, acesta trebuie golit şi trebuie
setat pentru noua operaţie. Performanţele sistemelor pipeline statice vor fi
reduse în mod semnificativ dacă tipul operaţiilor se modifică în mod frecvent.
Un sistem pipeline dinamic poate executa mai multe tipuri de operaţii la un
moment dat. Pentru a executa o anumită operaţie asupra unor date de intrare,
datele trebuie să parcurgă anumite etaje într-o anumită ordine. De exemplu,
figura 9.2 prezintă un sistem pipeline dinamic cu trei etaje, care poate executa
adunarea şi înmulţirea în acelaşi timp asupra unor date diferite.
Pentru execuţia operaţiei de înmulţire, datele de intrare trebuie să
parcurgă etajele 1, 2 şi 3; pentru execuţia operaţiei de adunare, datele trebuie
să parcurgă numai etajele 1 şi 3.
Intrare

Registru

Etaj 1
Circuit de
prelucrare

Registru

Etaj 2
Circuit de
prelucrare

Registru

Etaj 3
Circuit de
prelucrare

Ieşire

Fig. 9.2

Astfel, prima etapă a operaţiei de adunare poate fi executată asupra


datelor de intrare D1 în etajul 1 şi în acelaşi timp, ultima etapă a operaţiei de
înmulţire poate fi executată în etajul 3 asupra unor date de intrare diferite D2 .
Intervalul de timp dintre aplicarea datelor D1 şi D2 la intrările sistemului pipeline
trebuie să fie astfel ales încât aceste date să nu ajungă în etajul 3 în acelaşi
timp; în caz contrar, apare o coliziune. In general, în cazul sistemelor pipeline
dinamice mecanismul care controlează momentul în care datele trebuie aplicate
la intrare este mult mai complex decât în cazul sistemelor statice.

9.4. Sisteme pipeline de instrucţiuni

9.4.1. Principi
In cazul unei arhitecturi von Neumann, procesul de execuţie a
instrucţiunilor implică mai multe faze. Mai întâi, unitatea de control a
procesorului încarcă instrucţiunea din memoria cache (sau din memoria
principală). Apoi, unitatea de control decodifică instrucţiunea pentru a determina
tipul operaţiei care trebuie executată. Dacă operaţia necesită operanzi, unitatea
de control determină adresa fiecărui operand şi le încarcă pe acestea din
memoria cache (sau din memoria principală). Apoi, operaţia este executată şi,
în sfârşit, rezultatul este memorat în locaţia specificată.
Un sistem pipeline de instrucţiuni îmbunătăţeşte performanţele unui
procesor prin suprapunerea prelucrării mai multor instrucţiuni diferite. Aceasta
se realizează prin divizarea procesului de execuţie a instrucţiunilor în mai multe
faze. Un sistem pipeline de instrucţiuni este în mod normal transparent
programatorilor şi este gestionat automat de către unitatea de control a UCP şi
de către compilatoare.
In general execuţia unei instrucţiuni se poate descompune în următoarele
operaţii simple:
1. Extragerea instrucţiunii (IF - Instruction Fetch): Citirea instrucţiunii din
memoria cache (sau din memoria principală).
2. Decodificarea instrucţiunii (ID - Instruction Decoding): Identificarea
operaţiei care trebuie executată.
3. Încărcarea operanzilor (OF - Operand Fetch): Adresarea şi citirea
operanzilor necesari.
4. Execuţia instrucţiunii (EX - Execution): Execuţia operaţiei specificate
asupra operanzilor.
5. Scrierea rezultatelor (WB - Write-Back): Actualizarea operanzilor
destinaţie.
Figura 9.4 prezintă un sistem pipeline de instrucţiuni cu cinci etaje fiecare
etaj având ca obiectiv executarea uneia dintre aceste operaţii.
Un sistem pipeline de instrucţiuni suprapune operaţiile executate de aceste
etaje asupra unor instrucţiuni diferite pentru a obţine un timp total de execuţie
mult mai redus pentru o secvenţă de instrucţiuni.
Registru
Etaj 1
Extragere instrucţiune IF

Registru
Etaj 2
Decodificare instrucţiune ID

Registru
Etaj 3 Registre, memorii cache,
Încărcare operanzi OF memorie principala

Registru

Etaj 4
Execuţie EX

Registru
Etaj 5
Scriere rezultate WB

Fig. 9.4

Ca un exemplu, se consideră figura 9.5, care prezintă execuţia unei


secvenţe de patru instrucţiuni.

Cicluri → 1 2 3 4 5 6 7 8

i1 IF ID OF EX WB
i2 IF ID OF EX WB
i3 IF ID OF EX WB
i4 IF ID OF EX WB

Fig. 9.5

In timpul primului ciclu, sau perioadă de ceas, instrucţiunea i1 este


încărcată din memorie. In cel de-al doilea ciclu, instrucţiunea i1 este decodificată
în timp ce instrucţiunea i2 este încărcată din memorie. Acest proces continuă
până când toate instrucţiunile sunt executate. Ultima instrucţiune se termină
după opt cicluri de ceas. Presupunând că perioada ceasului este de P = 2,5 ns ,
sunt necesare 8 ∗ 2.5 = 20ns pentru a termina execuţia celor patru instrucţiuni.
Timpul total de execuţie poate fi determinat şi din ecuaţia (9.1). Deci
T pipe = m ∗ P + (n − 1) ∗ P = 5 ∗ 2.5 + (4 − 1) ∗ 2.5 = 20ns
In cazul în care nu se utilizează execuţia suprapusă, timpul de execuţie va
fi mult mai ridicat. Utilizând ecuaţia (9.2), rezultă:
T sec = n ∗ m ∗ P = 4 ∗ 5 ∗ 2.5 = 50ns
Deşi prin utilizarea tehnicii pipeline creşte viteza de execuţie a
instrucţiunilor, această tehnică poate pune anumite probleme. Unele din aceste
probleme şi soluţiile posibile sunt prezentate în secţiunile următoare.

9.4.2. Problema indisponibilităţii instrucţiunilor (The fetching problem)


In general, furnizarea rapidă a instrucţiunilor pentru un sistem pipeline este
costisitoare din punct de vedere al resurselor necesare. O metodă simplă pentru
îmbunătăţirea gradului de utilizare al unui sistem pipeline este utilizarea
bufferelor pentru memorarea instrucţiunilor şi a datelor care vor fi transmise la
intrarea sistemului. Gradul de utilizare al unui sistem pipeline este definit ca
raportul între timpul în care etajele sistemului sunt utilizate şi timpul total. Un
sistem pipeline este utilizat 100% din timp dacă fiecare etaj este utilizat în
fiecare ciclu de ceas.
In unele situaţii, sistemul pipeline trebuie golit şi reîncărcat, de exemplu,
atunci când apare o instrucţiune de salt sau o întrerupere. Timpul necesar
pentru reîncărcare poate fi minimizat prin încărcarea în avans a instrucţiunilor şi
a datelor în anumite buffere (prefetch unit), ca de exemplu, în memoria cache
din cadrul procesorului, fapt care va permite transferul imediat la intrarea
sistemului pipeline. Dacă instrucţiunile şi datele necesare execuţiei pot fi
încărcate şi memorate în buffere înainte ca acestea să fie necesare, sistemul
pipeline va avea o sursă continuă de informaţii. Se utilizează algoritmi de
preîncărcare care asigură ca instrucţiunile potenţial necesare să fie disponibile
în majoritatea timpului. Prin utilizarea acestor algoritmi, întârzierile datorită
conflictelor de acces la memorie pot fi reduse, deoarece timpul necesar pentru
transferul datelor din memorie este semnificativ mai ridicat decât timpul necesar
pentru transferul datelor dintr-un buffer.

9.4.3. Problema întârzierii introduse de etaje (bottleneck problem)


Această problemă se referă la complexitatea operaţiilor executate de un
etaj al sistemului pipeline. Dacă un etaj execută operaţii mai complexe faţă de
alte etaje, timpul necesar pentru terminarea acestor operaţii va creşte. Ca
urmare, perioada ceasului trebuie aleasă în funcţie de acest timp, ceea ce
reduce performanţele întregului sistem. O soluţie posibilă a acestei probleme
este divizarea etajului respectiv în mai multe etaje. O altă soluţie este de a se
realiza mai multe copii ale acestui etaj, care să execute în paralel respectiva
operaţie.
Problema emiterii instrucţiunilor (The issuing problem)
Această problemă apare atunci când o instrucţiune disponibilă nu poate fi
executată. Cauzele care pot genera o astfel de situaţie sunt următoarele:
- resursa necesară nu este disponibilă (hazard structural);
- există o dependenţă de o instrucţiune anterioară (hazard de date);
- intervenţia instrucţiunilor de salt care modifică succesiunea de execuţie a
instrucţiunilor (hazardul de control).

9.4.4. Problema hazardului structural


Hazardul structural se referă la situaţia în care o resursă necesară nu este
disponibilă pentru execuţia instrucţiunii. Un hazard structural apare ca rezultat al
conflictelor la resurse între instrucţiuni. Un tip de hazard structural care poate
apare se datorează modului de proiectare al unităţilor de execuţie. Dacă o
unitate de execuţie, care necesită mai multe cicluri de ceas, nu este de tip
pipeline şi nu există mai multe unităţi de acelaşi tip, atunci nu se pot lansa în
execuţie mai multe instrucţiuni care utilizează această unitate.
Un alt tip de hazard structural care poate apare se datorează proiectării
setului de registre. Dacă un set de registre nu are mai multe porturi de citire
(scriere), atunci operaţiile multiple de citire (scriere) nu pot fi executate simultan.
De exemplu, în anumite situaţii sunt necesare două operaţii de scriere în
registre în acelaşi ciclu de ceas. Aceste operaţii nu sunt posibile dacă setul de
registre are un singur port de scriere.
Efectul unui hazard structural poate fi eliminat în mod simplu prin
implementarea unităţilor de execuţie multiple şi prin utilizarea unui set de
registre cu porturi multiple de citire sau scriere.

9.4.5. Problema hazardului de date


9.4.5.1. Dependenţe de date
Hazardul de date apare atunci când există dependenţe de date între
instrucţiunea curentă şi o instrucţiune precedentă. In cazul unui procesor care
nu utilizează tehnica pipeline, instrucţiunile sunt executate secvenţial, iar
execuţia unei instrucţiuni este terminată înaintea începerii execuţiei următoarei
instrucţiuni. Astfel, instrucţiunile sunt executate în aceeaşi ordine în care apar în
program. Situaţia este diferită în cazul unui procesor care utilizează tehnica
pipeline, la care execuţia instrucţiunilor este suprapusă. O instrucţiune poate fi
lansată în execuţie şi poate fi terminată înaintea terminării instrucţiunii
precedente. Hazardul de date, cunoscut şi sub numele de problema
dependenţei datelor, apare ca rezultat al suprapunerii execuţiei (sau schimbării
ordinii de execuţie) a instrucţiunilor între care există dependenţe de date. Pentru
a înţelege această problemă să considerăm într-un program apare următoarea
secvenţă de instrucţiuni:
i1 : ADD R2, R3, R4 ; R2=R3+R4
i2 : ADD R5, R2, R1 ; R5=R2+R1
Instrucţiunea i2 depinde de i1 , deoarece utilizează rezultatul instrucţiunii i1
(conţinutul registrului R2) ca o dată de intrare. In figura 9.6 este prezentată
execuţia celor două instrucţiuni în sistemul pipeline considerat.

Cicluri → 1 2 3 4 5 6
i1 IF ID OF EX WB
i2 IF ID OF EX WB

Fig. 9.6
După cum se constată instrucţiunea i2 ajunge în faza OF înainte ca i1 să
treacă prin faza WB. Această situaţie conduce la utilizarea vechiului conţinut al
registrului R2 pentru calcularea unei noi valori pentru R5 şi deci, la un rezultat
invalid. Pentru a se obţine un rezultat valid, instrucţiunea i2 nu trebuie să ajungă
în faza OF până când i1 nu trece prin faza WB. In timpul execuţiei problema
semnalată poate fi rezolvată în două moduri (figura 9.7):
- execuţia fazei OF a instrucţiunii i2 este întârziată cu două cicluri cu ceas
sau
- lansarea în execuţie a instrucţiunii i2 este întârziată cu două cicluri de
ceas.
In ambele cazuri faza OF a instrucţiunii i2 este executată după ce
conţinutul registrului R2 a fost reactualizat de faza WB a instrucţiunii i1 .

Cicluri → 1 2 3 4 5 6 7 8
i1 IF ID OF EX WB
i2 IF ID - - OF EX WB

Cicluri → 1 2 3 4 5 6 7 8
i1 IF ID OF EX WB
i2 - - IF ID OF EX WB

Fig. 9.7

Pentru inserarea întârzierilor, se poate adăuga la sistemul pipeline un


circuit suplimentar, numit circuit de interblocare (pipeline interlock). Acest circuit
detectează dependenţele între date şi întârzie instrucţiunile dependente până la
rezolvarea conflictului.
O altă posibilitate constă în rezolvarea acestui tip de hazard în timpul
compilării. Compilatorul detectează dependenţa între date şi instrucţiuni,
rearanjând aceste instrucţiuni astfel încât dependenţa să nu creeze hazarduri
pentru sistem. De exemplu, considerăm cele patru instrucţiuni din figura 9.8.
Aceste instrucţiuni pot fi reordonate astfel încât instrucţiunile i3 şi i4 , care nu
sunt dependente de i1 şi i2 , sunt inserate între acestea din urmă.
i1 : ADD R2, R3, R4 ; R2=R3+R4
i2 : ADD R5, R2, R1 ; R5=R2+R1
i3 : ADD R6, R6, R7 ; R6=R6+R7
i4 : ADD R8, R8, R7 ; R8=R8+R7

Cicluri → 1 2 3 4 5 6 7 8
i1 IF ID OF EX WB
i3 IF ID OF EX WB
i4 IF ID OF EX WB
i2 IF ID OF EX WB

Fig. 9.8

Dacă nu este posibilă rearanjarea instrucţiunilor, pentru a se introduce


întârzieri, compilatorul inserează instrucţiuni NOP (No Operation).
Există trei tipuri principale de hazarduri de date: RAW (Read After Write),
WAR (Write After Read) şi WAW (Write After Write). Numele hazardului indică
ordinea de execuţie a operaţiilor pentru a se obţine un rezultat valid; dacă
această ordine nu este respectată, se poate obţine un rezultat invalid. Aceste
hazarduri sunt explicate în continuare. Se presupune că există două instrucţiuni
i1 şi i2 , iar i2 trebuie executată după i1 .
RAW. Acest de hazard indică faptul că i2 trebuie să citească sursa de
date după ce i1 a scris această dată. Dacă această ordine nu este respectată se
produce un rezultat invalid deoarece locaţia citită conţine o dată eronată.
De exemplu, în secvenţa următoare:
i1 : ADD R2, R3, R4 ; R2 = R3 + R4
i2 : ADD R5, R2, R1 ; R5 = R2 + R1
se poate obţine un rezultat invalid dacă i2 citeşte registrul R2 înainte ca i1 să
scrie în acest registru.
WAR. Acest hazard indică faptul că i2 trebuie să scrie într-o anumită
locaţie după ce i1 a citit data conţinută în acea locaţie. Dacă această ordine nu
este păstrată conţinutul acelei locaţii de memorie este alterat. De exemplu, în
secvenţa:
i1 : ADD R2, R3 , R4 ; R2 = R3 + R4
i2 : ADD R4, R5, R6 ; R4 = R5 + R6
se poate obţine un rezultat invalid dacă i2 scrie în registrul R4 înainte ca i1 să
citească acest registru; deci, instrucţiunea i1 poate utiliza conţinutul incorect al
registrului R4.
WAW. Acest hazard indică faptul că i2 trebuie să scrie într-o anumită
locaţie după ce i1 a scris în aceeaşi locaţie. De exemplu, în secvenţa:
i1 : ADD R2, R3, R4 ; R2 = R3 + R4
i2 : ADD R2, R5, R6 ; R2 = R5 + R6
valoarea din registrul R2 este recalculată de către i2 . Dacă ordinea de execuţie
este inversată, iar i2 scrie în registrul R2 înainte ca i1 să scrie în acest registru,
R2 va conţine o valoare incorectă.
Hazardurile de tip WAR şi WAW nu pot apare atunci când ordinea de
execuţie a instrucţiunilor din program este păstrată. O modalitate de a
îmbunătăţi arhitectura unui sistem pipeline de instrucţiuni este de a creşte
gradul de execuţie concurentă a instrucţiunilor prin execuţia mai multor
instrucţiuni independente de către unităţi funcţionale diferite, ca de exemplu,
sumatoare, circuite de înmulţire şi circuite de împărţire. In aceste condiţii
instrucţiunile pot fi executate şi terminate într-o ordine diferită de cea din
program. Pentru acest motiv, în astfel de arhitecturi sunt posibile toate tipurile
de hazarduri de date.
In arhitecturile actuale, dependenţele între instrucţiuni (Data Dependancy)
sunt verificate în mod static de compilator şi/sau în mod dinamic de circuite în
timpul execuţiei. Prin aceasta se păstrează ordinea de execuţie a instrucţiunilor
între care există dependenţe, ceea ce asigură obţinerea unor rezultate valide.
Au fost dezvoltate numeroase tehnici statice de verificare a dependenţelor
pentru a se utiliza avantajul paralelismului dintr-o buclă. Aceste tehnici pot
detecta majoritatea dependenţelor. Totuşi, anumite dependenţe nu pot fi
detectate la compilare. De exemplu, nu este posibil să se determine
întotdeauna adresele efective de memorie utilizate de instrucţiunile de încărcare
şi memorare pentru a rezolva posibilele dependenţe între acestea. In timpul
execuţiei, adresele efective de memorie vor fi cunoscute şi astfel dependenţele
între instrucţiuni pot fi determinate în mod dinamic. In general, verificarea
dinamică a dependenţelor are avantajul că poate detecta dependenţele care
sunt imposibil sau dificil de detectat la compilare. In practică, se utilizează
adesea o verificare combinată a dependenţelor (statică şi dinamică) pentru a se
folosi avantajele ambelor metode.
Două din cele mai des utilizate tehnici pentru verificarea dinamică a
dependenţelor sunt metoda Tomasulo şi metoda tabelei de rezultate
(scoreboard). Ideea de bază a acestor metode este utilizarea unui mecanism
pentru identificarea disponibilităţii operanzilor şi a unităţilor funcţionale în
calculele succesive.

9.4.5.2. Metoda Tomasulo


Metoda Tomasulo a fost elaborată de R. M. Tomasulo pentru a elimina
efectul timpilor mari de acces la memorie la calculatorul IBM Systems/360
Model 91.
Această metodă creşte gradul de execuţie concurentă a instrucţiunilor cu
un efort minim din partea compilatorului sau al programatorului. Metoda
Tomasulo este utilizată în mai multe variante pentru planificarea dinamică a
execuţiei instrucţiunilor la procesoarele superscalare recente. In cazul acestei
metode, se asociază fiecărui registru de date a unităţii aritmetice un bit busy şi
un câmp de marcaj (Tag). Bitul busy al unui anumit registru este setat atunci
când o instrucţiune lansată în execuţie desemnează acest registru ca o
destinaţie. Acest bit este resetat atunci când rezultatul execuţiei este scris în
registru. Câmpul de marcajul al unui registru identifică unitatea a cărei rezultat
urmează să fie înscris în registru.
Fiecare unitate funcţională din cadrul unităţii aritmetice poate avea mai
multe seturi de registre de intrare. In exemplul considerat în figura 9.9 acestea
au două seturi de registre (sursa_1 şi sursa_2). Fiecare set este numit staţie de
rezervare, fiind utilizat pentru păstrarea operanzilor unei instrucţiuni lansate în
execuţie. Un câmp de marcaj este, de asemenea, asociat cu fiecare registru al
unei staţii de rezervare. In plus, o magistrală comună de date (MCD)
conectează ieşirile unităţilor funcţionale cu intrările staţiilor de rezervare şi cu
registrele.
MCD face posibil ca rezultatul unei operaţii să devină disponibil pentru
Fig. 9.9

toate unităţile funcţionale, fără înscrierea prealabilă într-un registru.


Aceasta permite furnizarea directă a unei copii a rezultatului la toate
unităţile funcţionale care aşteaptă acest rezultat. Cu alte cuvinte, o instrucţiune
aflată în curs de execuţie poate avea acces la rezultatul unei instrucţiuni
precedente înainte ca rezultatul instrucţiunii precedente să fie înscris în registrul
destinaţie.
Figura 9.9 prezintă o arhitectură simplă pentru această metodă. In această
arhitectură, există nouă unităţi care comunică printr-o magistrală comună de
date. Aceste unităţi sunt cinci registre de date, două staţii de rezervare pentru
adunare A1 şi A2 şi două staţii de rezervare pentru înmulţire M 1 şi M 2 . Codurile
1 până la 5 sunt asociate cu registrele din setul de registre, 6 şi 7 sunt asociate
cu staţiile de rezervare pentru adunare, iar 8 şi 9 sunt asociate cu staţiile de
rezervare pentru înmulţire. Ca exemplu, considerăm execuţia următoarelor două
instrucţiuni:
i1 : ADD R2, R3, R4 ; R2 = R3 + R4
i2 : ADD R2, R2, R1 ; R2 = R2 + R1
Secvenţa începe cu execuţia instrucţiunii i1 . Conţinutul registrelor R3 şi R4
este încărcat în registrele sursa_1, respectiv sursa_2 ale staţiei de rezervare A1
iar câmpul de marcaje al registrului R2 este setat la 6, care este eticheta staţiei
A1 . După înscrierea operanzilor instrucţiunii i1 în staţia de rezervare pentru
adunare A1 bitul busy al registrului R2 este setat la 1. In continuare, unitatea de
adunare începe execuţia operaţiei specificate de i1 . Simultan, în timpul
procesului de încărcare a operanzilor pentru instrucţiunea i2 , devine cunoscut
faptul că registrul R2 nu poate fi utilizat deoarece instrucţiunea i2 depinde de
rezultatul instrucţiunii i1 . Pentru a permite începerea execuţiei instrucţiunii i2 cât
mai rapid posibil, conţinutul câmpului de marcaje al registrului R2 (care este în
acest moment 6) este înscris în câmpul de marcaje al registrului sursa_1 al
staţiei de rezervare A2 . In acelaşi moment, marcajul registrului R2 este
modificat la 7, ceea ce înseamnă că rezultatul staţiei A2 trebuie transferat în R2.
De asemenea, conţinutul registrului R1 este încărcat în registrul sursa_2 al
staţiei de rezervare A2 . La terminarea operaţiei specificate de i1 şi producerea
rezultatului, unitatea de adunare transmite un semnal de cerere către MCD
pentru preluarea rezultatului. Atunci când MCD achită cererea, unitatea de
adunare transmite rezultatul pe magistrală, de unde rezultatul este transmis
împreună cu eticheta staţiei A1 (cu valoarea 6) tuturor unităţilor. Fiecare staţie
de rezervare, în timp ce aşteaptă datele, compară conţinutul câmpului de
marcaje ale registrelor sale cu eticheta de pe magistrală. Dacă acestea sunt
identice, conţinutul registrului respectiv este actualizat şi bitul său busy este
resetat. In acest caz, datele sunt copiate în registrul sursa_1 al staţiei A2 .
Începe apoi execuţia operaţiei de adunare cu operanzii staţiei A2 .
După efectuarea adunării specificate de i2 pe magistrală este depus
rezultatul adunării dintre R2 şi R1, împreună cu eticheta staţiei de rezervare A2
(care este 7). Acest rezultat va fi preluat de registrul R2 care conţine în câmpul
de marcaj valoarea 7.
După cum rezultă din exemplul precedent, conceptele principale ale
metodei Tomasulo sunt staţiile de rezervare, magistrala comună de date şi
utilizarea marcajelor. Staţiile de rezervare au rolul de a aştepta operanzii şi
astfel, eliberează unităţile funcţionale de această sarcină. Magistrala comună de
date utilizează staţiile de rezervare furnizând acestora rezultatul unei operaţii
direct de la ieşirea unei unităţi funcţionale. Marcajele asigură păstrarea
dependenţelor între operaţiile succesive, favorizând în acelaşi timp concurenţa.
Deşi circuitele suplimentare necesare pentru implementarea metodei
Tomasulo favorizează execuţia concurentă a instrucţiunilor, programatorul
şi/sau compilatorul au o influenţă substanţială asupra gradului de concurenţă.
Aceasta se ilustrează prin următoarele două secvenţe care calculează expresia
(A * B) + (C + D).
O posibilă secvenţă de instrucţiuni care rezolvă această problemă este:
LOAD R1, A
LOAD R2, B
LOAD R3, C
LOAD R4, D
MUL R5, R1, R2 ; R5 = A * B
ADD R5, R5, R3 ; R5 = (A * B) +C
ADD R4, R5, R4 ; R4 = (A *B) + C + D
O alternativă la această secvenţă, care permite un grad mai mare de
concurenţă, este următoarea:
LOAD R1, A
LOAD R2, B
LOAD R3, C
LOAD R4, D
MUL R5, R1, R2 ; R5 = A * B
ADD R4, R3, R4 ; R4 = C + D
ADD R4, R5, R4 ; R4 = A * B + C + D
In cea de-a doua secvenţă, instrucţiunea de înmulţire şi prima instrucţiune
de adunare pot fi executate simultan, ceea ce nu este posibil în cazul primei
secvenţe. In practică, de multe ori se utilizează o combinaţie a tehnicilor
hardware şi software pentru creşterea gradului de concurenţă.
9.4.5.3. Metoda tabelei de rezultate (Scoreboard)
Metoda tabelei de rezultate a fost utilizată pentru prima dată la calculatorul
de înaltă performanŃă CDC 6600, la care unităŃi funcŃionale multiple permit
terminarea execuŃiei instrucŃiunilor într-o ordine diferită de cea în care apar în
program. Această metodă păstrează informaŃii despre starea fiecărei instrucŃiuni
lansate în execuŃie, fiecare registru şi fiecare unitate funcŃională, în anumite
buffere care reprezintă tabela de rezultate. Prin considerarea unui instantaneu
al tabelei de rezultate, se poate determina dacă trebuie să se aştepte pentru
noua instrucŃiune. Dacă aşteptarea nu este necesară, unitatea funcŃională
corespunzătoare începe imediat execuŃia instrucŃiunii. Dacă trebuie să se
aştepte (de exemplu, unul din operanzii de intrare nu este încă disponibil),
execuŃia noii instrucŃiuni este întârziată.
O tabelă de rezultate este fi formată din trei tabele: starea instrucŃiunilor,
starea unităŃilor funcŃionale şi starea registrelor destinaŃie.
Figura 9.10 reprezintă un instantaneu al conŃinutului acestor tabele pentru
următorul program care calculează expresia C+D+A*B:

LOAD R1, A
LOAD R2, B
LOAD R3, C
LOAD R4, D
MUL R5, R1, R2 ; R5 = A ∗ B
ADD R2, R3, R4 ; R2 = C + D
ADD R2, R2, R5 ; R3 = R2 + R5 = C + D + A * B

Starea instrucŃiunilor
InstrucŃiune Lansată Faza OF Faza EX Faza WB
terminată terminată terminată

LOAD R1, A Da Da Da Da
LOAD R2, B Da Da Da Da
LOAD R3, C Da Da Da Da
LOAD R4, D Da Da Da
MUL R5, R1, R2 Da Da
ADD R2, R3, R4 Da
ADD R2, R2, R5

Starea unităŃilor funcŃionale


ID Nume unitate Ocupată Registru Registre sursă
Unitate destinaŃie
RS1 Liber Rs2 Liber
1 LOAD/STORE Da R4
2 ÎnmulŃire Da R5 R1 Da R2 Da
3 Adunare_1 Da R2 R3 Da R4 Nu
4 Adunare_2 Nu
Starea registrelor destinaŃie
R1 R2 R3 R4 R5 R6
ID unitate 3 1 2

Fig. 9.10

Tabela de stare a instrucŃiunilor arată dacă o instrucŃiune este sau nu


lansată în execuŃie. Dacă o instrucŃiune este lansată în execuŃie, tabela arată în
care fază de execuŃie se află instrucŃiunea. După ce o instrucŃiune este
încărcată din memorie şi decodificată, se va încerca lansarea execuŃiei acesteia
utilizând unitatea funcŃională corespunzătoare. O instrucŃiune va fi lansată în
execuŃie dacă unitatea funcŃională este disponibilă şi nu există altă instrucŃiune
activă care utilizează acelaşi registru destinaŃie; în caz contrar, lansarea este
întârziată. Cu alte cuvinte, o instrucŃiune este lansată în execuŃie atunci când nu
există hazarduri structurale şi hazarduri WAW. Atunci când există asemenea
hazarduri, lansarea execuŃiei acestei instrucŃiuni şi a instrucŃiunilor următoare
este întârziată până când hazardurile sunt eliminate. In acest fel, instrucŃiunile
dependente sunt lansate în execuŃie în ordinea în care apar în program, în timp
ce instrucŃiunile independente pot fi executate într-o ordine diferită.
Tabela de stare a unităŃilor funcŃionale arată dacă o unitate funcŃională
este ocupată sau nu. O unitate funcŃională ocupată înseamnă că execuŃia unei
instrucŃiuni de către această unitate nu a fost încă terminată. Pentru o unitate
ocupată, tabela identifică de asemenea registrul destinaŃie şi disponibilitatea
registrelor sursă. Un registru sursă al unei unităŃi este disponibil dacă nu apare
ca destinaŃie pentru nici o altă unitate anterioară.
Tabela de stare a registrelor destinaŃie indică destinaŃia registrelor care nu
au fost încă înscrise. Pentru fiecare din aceste registre se identifică unitatea
funcŃională activă care va executa scrierea în registru.
In timpul fazei de extragere a operanzilor, tabelele sunt monitorizate
pentru a determina dacă registrele sursă sunt disponibile pentru a fi citite de
către o unitate funcŃională activă. Dacă nici unul din registrele sursă nu este
utilizat ca registru destinaŃie de către alte unităŃi funcŃionale active, unitatea
citeşte operanzii din aceste registre şi începe execuŃia operaŃiei. După
terminarea execuŃiei, tabela de rezultate testează dacă există hazarduri WAR
înainte de a permite scrierea rezultatului în registrul destinaŃie. Dacă nu există
hazarduri WAR, tabela de rezultate indică unităŃii funcŃionale să scrie rezultatul
în registrul destinaŃie.
In figura 9.10, tabelele indică faptul că execuŃia primelor trei instrucŃiuni
LOAD a fost terminată şi operanzii acestora au fost înscrişi în registrul
destinaŃie. Ultima instrucŃiune LOAD a fost lansată în execuŃie de către unitatea
LOAD/STORE (unitatea 1). La această instrucŃiune, s-a terminat extragerea
operandului, dar nu s-a înscris încă operandul în registrul R4. Unitatea de
înmulŃire execută instrucŃiunea MUL, iar prima instrucŃiune ADD este transmisă
unităŃii Adunare_1. Această unitate aşteaptă pentru ca registrul R4 să fie înscris
de către unitatea LOAD/STORE înainte de a începe execuŃia. Acest lucru este
necesar deoarece există un hazard RAW între ultima instrucŃiune LOAD şi
prima instrucŃiune ADD. In acest moment, a doua instrucŃiune ADD nu poate fi
lansată în execuŃie, deoarece utilizează registrul R2 ca registru sursă şi
destinaŃie. Registrul R2 este ocupat în acest moment cu prima instrucŃiune
ADD. Atunci când registrul R4 este înscris de unitatea LOAD/STORE, unitatea
Adunare_1 va începe execuŃia.
Ulterior conŃinutul tabelei de rezultate se modifică. După cum se ilustrează
în figura 9.11, dacă unitatea LOAD/STORE (unitatea 1) a terminat execuŃia (a
înscris în R4 valoarea variabilei D), unitatea Adunare_1 poate termina faza de
încărcare a operanzilor şi începe faza de execuŃie. După terminarea execuŃiei
rezultatul poate fi înscris în registrul R2 deoarece unitatea de înmulŃire a
terminat faza de citire a operanzilor şi este acum în faza de execuŃie. A doua
instrucŃiune ADD va fi transmisă acum unităŃii Adunare_2.

Starea instrucŃiunilor
InstrucŃiune Lansată Faza OF Faza EX Faza WB
terminată terminată terminată
LOAD R1, A Da Da Da Da
LOAD R2, B Da Da Da Da
LOAD R3, C Da Da Da Da
LOAD R4, D Da Da Da Da
MUL R5, R1, R2 Da Da Da
ADD R2, R3, R4 Da Da Da Da
ADD R2, R2, R5 Da

Starea unităŃilor funcŃionale


ID Nume Ocupată Registru Registre sursă
unitate unitate destinaŃie Rd Rs Liber Rs Liber
1 2

1 LOAD/STOR Nu
2 E
ÎnmulŃire Da R5 R1 Da R2 Da
3 Adunare_1 NU
4 Adunare_2 Da R2 R2 Da R5 Nu

Starea registrelor destinaŃie


R1 R2 R3 R4 R5 R6
ID 4 2
unitate

Fig. 9.11

Cât timp unitatea de înmulŃire nu a citit conŃinutul registrului R2 unităŃii


Adunare_1 nu i se va permite scrierea rezultatului în registrul R2; aceasta
deoarece există un hazard WAR între instrucŃiunea MUL şi prima instrucŃiune
ADD.
Componenta principală în cazul metodei tabelei de rezultate este tabela
de stare a registrelor destinaŃie. Această tabelă este utilizată pentru a soluŃiona
hazardurile de date între instrucŃiuni. De fiecare dată când o instrucŃiune este
lansată în execuŃie, registrul destinaŃie al instrucŃiunii este marcat ca fiind
ocupat. Registrul destinaŃie rămâne ocupat până când execuŃia instrucŃiunii este
terminată. Atunci când se pregăteşte lansarea unei noi instrucŃiuni, sunt testaŃi
operanzii acesteia pentru a nu exista conflicte între registre cu instrucŃiunile
precedente a căror execuŃie nu a fost terminată.

9.4.6. Problema hazardului de control


Hazardul de control se referă la situaŃia în care o anumită instrucŃiune,
cum ar fi o instrucŃiune de salt, modifică fluxul execuŃiei programului.

9.4.6.1. InstrucŃiuni de salt


In orice set de instrucŃiuni, salturile permit modificarea ordinii secvenŃiale
de execuŃie a instrucŃiunilor. In general, în jur de 20 - 30% din totalul
instrucŃiunilor dintr-un program sunt salturi. Pentru acest motiv, instrucŃiunile de
salt executate de un sistem pipeline pot reduce în mod semnificativ rata de
prelucrare. Ori de câte ori un salt este executat, trebuie să se încarce o nouă
adresă în contorul de program, ceea ce poate invalida toate instrucŃiunile a
căror execuŃie a început sau cele care au fost preîncărcate într-un buffer.
Această golire a etajelor pipeline la fiecare salt reduce performanŃele sistemului.
De notat că un salt condiŃionat, care nu este executat permite continuarea
execuŃiei secvenŃiale a instrucŃiunilor, deci această problemă apare numai în
cazul în care saltul este executat.
In general, instrucŃiunile de salt se pot clasifica în trei categorii:
1) Salturi necondiŃionate;
2) Salturi condiŃionale;
3) Bucle.
Un salt necondiŃionat modifică întotdeauna ordinea secvenŃială de
execuŃie şi, în loc de a incrementa contorul de program, încarcă adresa
destinaŃiei saltului în acesta.
Un salt condiŃionat încarcă adresa destinaŃiei în contorul de program
numai dacă o anumită condiŃie, bazată pe starea unor indicatori de condiŃii, este
îndeplinită. In caz contrar, contorul de program este incrementat ca de obicei.
Cu alte cuvinte, un salt condiŃionat selectează o cale a instrucŃiunilor pe baza
unei condiŃii. In cazul în care condiŃia este îndeplinită, această cale începe de la
adresa destinaŃiei saltului şi este numită cale destinaŃie. In caz contrar, această
cale începe de la următoarea instrucŃiune şi este numită cale secvenŃială. In
sfârşit, o instrucŃiune de buclare determină de obicei saltul la începutul buclei,
care este executată de un anumit număr de ori, fix sau variabil.
Dintre aceste tipuri de salturi, salturile condiŃionate sunt cel mai dificil de
gestionat. Ca un exemplu, considerăm următoarea secvenŃă de instrucŃiuni:
i1
i2 (salt condiŃionat la ik )
i3
:
ik (destinaŃie)
ik +1

Figura 9.12 prezintă execuŃia acestei secvenŃe de instrucŃiuni într-un


sistem pipeline atunci când se selectează calea destinaŃie. In această figură, c
indică penalizarea datorită saltului, reprezentând numărul de cicluri pierdute
atunci când este selectată calea destinaŃie.
C

Cicluri → 1 2 3 4 5 6 7 8 9 10 11
i1 IF ID OF EX WB
i2 IF ID OF EX WB
i3 IF ID OF EX
i4 IF ID OF
i5 IF ID
ik IF ID OF EX WB
ik+1 IF ID OF EX WB

Fig. 9.12

Pentru a arăta efectul penalizării datorită saltului asupra performanŃelor


globale ale sistemului pipeline, trebuie să se determine numărul mediu de cicluri
pe instrucŃiune. Fie t med numărul mediu de cicluri necesare pentru execuŃia unei
instrucŃiuni. Acest număr poate fi exprimat ca:
t med = p s ∗ t s + (1 − p s ) ∗ t n (9.8)
unde p s indică probabilitatea ca o anumită instrucŃiune să fie o instrucŃiune de
salt, t s reprezintă numărul mediu de cicluri pentru o instrucŃiune de salt, iar t n
reprezintă numărul mediu de cicluri pentru o instrucŃiune diferită de una de salt.
Numărul mediu de cicluri pentru o instrucŃiune de salt poate fi determinat
considerând două cazuri. Dacă se alege calea destinaŃie, sunt necesare 1 + c
cicluri pentru execuŃie; în caz contrar, nu există penalizare datorită saltului şi
este necesar un singur ciclu. Deci:
t s = pd (1 + c) + (1 − pd )(1) (9.9)
unde pd indică probabilitatea să fie aleasă calea destinaŃie d . Numărul mediu
de cicluri pentru o instrucŃiune diferită de una de salt este 1 ( t n = 1). După
întârzierea iniŃială, se termină execuŃia unei instrucŃiuni diferite de una de salt în
fiecare ciclu. Deci:
t med = p s [ pd (1 + c) + (1 − p d )(1)] + (1 − p s ) ∗ (1) = 1 + p s pd c (9.10)
După analizarea a numeroase cazuri practice, Lee şi Smith au arătat că
valoarea medie a probabilităŃii p s este cuprinsă între 0,1 şi 0,3, iar valoarea
medie a probabilităŃii pd este cuprinsă între 0,6 şi 0,7. Presupunând că p s = 0,2 ,
pd = 0,65 şi c = 3 , rezultă:
t med = 1 + 0,2 ∗ 0,65 ∗ 3 = 1,39 (9.11)
Cu alte cuvinte, sistemul pipeline operează la 100/1,39 = 72% din viteza
sa maximă atunci când există instrucŃiuni de salt.
Pentru a se reduce efectul salturilor asupra performanŃelor unui procesor,
au fost propuse diferite tehnici. Cele mai cunoscute tehnici sunt predicŃia
salturilor, întârzierea salturilor şi preîncărcarea multiplă. Aceste tehnici sunt
prezentate în continuare.

9.4.6.2. PredicŃia salturilor


In cazul acestei metode, se realizează o predicŃie a rezultatului unei decizii
legate de execuŃia saltului. Pe baza acestei predicŃii, se alege pentru execuŃie
calea secvenŃială sau calea destinaŃie. Deşi prin alegerea căii respective se
reduce adesea penalizarea datorită saltului, penalizarea poate creşte în cazul
unei predicŃii eronate.
Există două tipuri de predicŃii, statice şi dinamice. In cazul unei predicŃii
statice, se decide înaintea execuŃiei programului preîncărcarea instrucŃiunilor
dintr-una din cele două căi. De exemplu, o tehnică simplă este aceea de a
presupune întotdeauna că saltul trebuie executat. Prin această tehnică, la
întâlnirea unei instrucŃiuni de salt se încarcă în contorul de program adresa de
destinaŃie a saltului. O altă tehnică este de a alege o anumită cale (secvenŃială
sau destinaŃie) pentru anumite tipuri de salturi şi cealaltă cale pentru restul
tipurilor. In cazul în care alegerea este eronată, sistemul pipeline este golit şi se
încarcă instrucŃiunile corespunzătoare căii corecte.
In cazul predicŃiei dinamice, în timpul execuŃiei programului procesorul ia o
decizie bazată pe informaŃiile despre salturile executate anterior.
Metoda cea mai simplă este predicŃia dinamică utilizând un bit, metodă
implementată de exemplu, la unele procesoare RISC.
Această metodă presupune asignarea unui bit de control p fiecărei
instrucŃiuni de salt. Dacă la prima execuŃie se realizează saltul, p va avea
valoarea 1. In caz contrar p = 0 . La următoarea întâlnire a acestei instrucŃiuni
se urmează calea anterioară. Dacă predicŃia a fost eronată se schimbă valoarea
bitului de control p . Astfel la următoarea execuŃie se va urma cealaltă cale.
O metodă mai eficientă constă în a se asocia un contor de n biŃi fiecărei
instrucŃiuni de salt. Această metodă este numită metoda de predicŃie bazată pe
un contor (counter based branch prediction). In cazul acestei metode, după ce o
instrucŃiune de salt a fost executată pentru prima dată, contorul C al acesteia
este setat la o valoare de prag T (10 pentru exemplul din fig. 9.13) dacă a fost
selectată calea destinaŃie, sau la valoarea T − 1 (01 pentru exemplul din fig.
9.13) dacă a fost selectată calea secvenŃială. In continuare, de fiecare dată
când instrucŃiunea de salt trebuie executată, dacă C ≥ T , este selectată calea
destinaŃie; în caz contrar, este selectată calea secvenŃială. Valoarea contorului
C este actualizată după execuŃia saltului. In cazul în care calea corectă este
calea destinaŃie, contorul este incrementat cu 1; în caz contrar, contorul este
decrementat cu 1.
Dacă C ajunge !a valoarea maximă 2 n − 1 , contorul nu mai este
incrementat, chiar dacă a fost selectată calea destinaŃie şi predicŃia a fost
corectă. In mod similar, contorul nu este decrementat la o valoare mai mică de
0.
In practică, pentru n şi T se alege adesea valoarea 2. Studiile au arătat
că metodele de predicŃie cu 2 biŃi sunt aproape la fel de eficiente ca şi metodele
care utilizează un număr mai mare de biŃi. Figura 9.13 prezintă stările posibile în
cazul metodei de predicŃie cu 2 biŃi.
O altă variantă a metodei precedente este de a se modifica predicŃia
numai atunci când aceasta a fost eronată de două ori în mod consecutiv. Figura
9.14 prezintă stările posibile în cazul acestei variante.

Fig. 9.13

Fig. 9.14

Este convenabil să se memoreze statisticile salturilor într-o tabelă numită


tabelă de istorie a salturilor (branch history table), împreună cu adresa
instrucŃiunii de salt şi adresa destinaŃiei saltului. Pentru accesul rapid,
majoritatea procesoarelor plasează tabela de istorie a salturilor într-o memorie
cache de dimensiuni reduse, numită buffer al destinaŃiei salturilor (BTB - Branch
Target Buffer). De obicei, fiecare intrare a acestei memorii cache păstrează
adresa unei instrucŃiuni de salt, adresa destinaŃiei saltului şi statisticile de
predicŃie (figura 9.15).

Fig. 9.15

Atunci când o instrucŃiune de salt este executată pentru prima dată,


procesorul alocă o intrare în BTB pentru această instrucŃiune. Cererile pentru
încărcarea instrucŃiunilor sunt trimise simultan la memoria cache de instrucŃiuni
şi la BTB. Dacă se găseşte o potrivire în BTB, adresa anticipată a destinaŃiei
saltului este citită din tabel. ExecuŃia continuă pe calea de instrucŃiuni definită de
adresa destinaŃiei saltului, toate rezultatele fiind considerate speculative până
când rezultatul testării condiŃiei de salt devine disponibil. Atunci când execuŃia
instrucŃiunii de salt este terminată, adresa destinaŃiei acesteia este actualizată în
BTB. Statisticile de predicŃie ale instrucŃiunii de salt sunt de asemenea
actualizate.
Metodele de predicŃie statice necesită de obicei mai puŃine circuite, dar pot
determina creşterea complexităŃii compilatorului. Spre deosebire de acestea,
metodele de predicŃie dinamice determină creşterea complexităŃii circuitelor, dar
necesită operaŃii mai simple în timpul compilării. In general, prin utilizarea
predicŃiei dinamice se pot obŃine rezultate mai bune. PredicŃia dinamică asigură,
de asemenea, un grad mai ridicat de compatibilitate a codului obiect, deoarece
deciziile sunt luate după compilare.
Pentru a determina efectul predicŃiei salturilor asupra performanŃelor, este
necesară reevaluarea numărului mediu al ciclurilor de ceas pentru execuŃia unei
instrucŃiuni. Considerăm ecuaŃia (9.8). Există două cazuri posibile: calea
anticipată este corectă sau incorectă. In cazul în care calea este anticipată
corect, penalizarea este d atunci când calea este cea destinaŃie (figura 9.16(a))
sau 0 atunci când calea este cea secvenŃială. In cazul în care calea este
anticipată incorect, penalizarea este c atât pentru calea destinaŃie, cât şi pentru
cea secvenŃială (figura 9.12 şi figura 9.16(b)). De notat că în figura 9.16(a),
adresa căii destinaŃie este obŃinută după faza de decodificare. Atunci când se
utilizează un buffer al destinaŃiei saltului, adresa destinaŃiei poate fi obŃinută în
timpul sau după faza de extragere a instrucŃiunii.
d

Cicluri → 1 2 3 4 5 6 7 8 9 10 11
i1 IF ID OF EX WB
i2 IF ID OF EX WB
i3 IF
i4
i5
ik IF ID OF EX WB
ik+1 IF ID OF EX WB
a
c

Cicluri → 1 2 3 4 5 6 7 8 9 10 11
i1 IF ID OF EX WB
i2 IF ID OF EX WB
i3 IF ID OF EX
i4 IF ID OF
i5 IF ID
ik IF ID OF EX WB
ik+1 IF ID OF EX WB
b
Fig. 9.16

Pe baza acestor observaŃii, avem:


t s = pc [ pd (1 + d ) + (1 − pd )(1)] + (1 − pc )[ pd (1 + c) + (1 − pd )(1 + c)]
= pc (1 + pd d ) + (1 − pc )(1 + c) (9.13)
unde pc este probabilitatea unei predicŃii corecte. Înlocuind acest termen în
ecuaŃia (9.8), obŃinem:
t med = p s [ pc (1 + pd d ) + (1 − pc )(1 + c)] + 1 − p s )(1)
= 1 + p s c − p s pc c + p s pc p d d (9.14)
Presupunând că p s = 0,2 , p d = 0,65 , pc = 0,7 , c = 3 , şi d = 1 rezultă
t med = 1,27 (9.15)
Deci, sistemul pipeline funcŃionează la 100/1,27 = 78% din viteza sa
maximă atunci când se utilizează predicŃia salturilor.

9.4.6.3. Întârzierea salturilor


Întârzierea salturilor (delayed branching) elimină sau reduce în mod
semnificativ efectul penalizării datorită salturilor. In cazul acestei metode se
încarcă şi se execută un anumit număr de instrucŃiuni după instrucŃiunea de salt,
indiferent de calea care va fi selectată pentru salt. De exemplu, un procesor cu
o întârziere a salturilor egală cu k execută următoarele k instrucŃiuni
secvenŃiale, iar apoi fie continuă pe aceeaşi cale, fie începe execuŃia
instrucŃiunilor de la adresa destinaŃiei saltului. De câte ori este posibil,
compilatorul încearcă să plaseze după instrucŃiunea de salt k instrucŃiuni care
sunt independente de instrucŃiunea de salt. Dacă nu există suficiente instrucŃiuni
de acest tip, compilatorul va insera instrucŃiuni NOP. Ca un exemplu,
considerăm următoarea secvenŃă:
i1 : LOAD R1, A
i2 : LOAD R2, B
i3 : BRZ R2, i7 ; salt la i7 dacă R2 = 0
i4 : LOAD R3, C
i5 : ADD R4, R2, R3 ; R4 = B + C
i6 : MUL R5, R1, R2 ; R5 = A * B
i7 : ADD R4, R1, R2 ; R4 = A + B
Presupunând k = 2 , compilatorul modifică această secvenŃă prin mutarea
instrucŃiunii i1 şi inserarea unei instrucŃiuni NOP după instrucŃiunea de salt i3 .
SecvenŃa modificată este următoarea:
i2 : LOAD R2, B
i3 : BRZ R2, i7
i1 : LOAD R1, A
NOP
i4 : LOAD R3, C
i5 : ADD R4, R2, R3
i6 : MUL R5, R1, R2
i7 : ADD R4, R1, R2
După cum se observă din secvenŃa modificată, instrucŃiunea i1 este
executată indiferent de rezultatul evaluării saltului. Pentru a înŃelege efectul de
reducere a penalizării prin utilizarea întârzierii salturilor ne vom referi la figura
9.16(b). In cazul în care nu se utilizează metoda întârzierii salturilor, atunci când
predicŃia sugerează ca probabilă calea secvenŃială, se începe execuŃie
instrucŃiunilor care urmează după instrucŃiunea de salt. Dacă, după execuŃia
instrucŃiunii de salt de constată că predicŃia a fost eronată, sistemul pipeline se
goleşte pentru a începe execuŃia instrucŃiunilor de pe calea de destinaŃie. In
acest caz cele trei perioade de ceas în care se încerca execuŃia instrucŃiunilor
de pe calea secvenŃială au fost irosite. Dacă pe cale secvenŃială sunt introduse
instrucŃiuni care sunt independente de instrucŃiunea de salt, în cazul considerat,
se continuă cu execuŃia acestora şi abia după finalizarea acelor instrucŃiuni, se
trece la execuŃia instrucŃiunilor de pe calea destinaŃie. In acest mod nu a fost
pierdut nici un ciclu de ceas.
9.4.6.4. Preîncărcarea multiplă (multiple prefetching)
In acest caz, procesorul extrage instrucŃiuni din ambele căi posibile. După
ce s-a luat decizia despre execuŃia saltului, calea nedorită este abandonată.
Prin extragerea prealabilă a instrucŃiunilor din ambele căi posibile, se evită
penalizarea datorită extragerii instrucŃiunilor în cazul unei predicŃii incorecte.
Pentru extragerea instrucŃiunilor din ambele căi, se utilizează două buffere.
La execuŃia normală, primul buffer este încărcat cu instrucŃiuni aflate după
instrucŃiunea de salt. Dacă saltul este executat, conŃinutul primului buffer este
invalidat şi cel de-al doilea buffer se utilizează ca buffer primar, care a fost
încărcat cu instrucŃiuni aflate la adresa destinaŃiei instrucŃiunii de salt.
Această metodă de extragere dublă asigură un flux constant de instrucŃiuni
şi date pentru sistemul pipeline şi reduce întârzierile datorate golirii şi
reîncărcării sistemului pipeline.
In concluzie, fiecare din tehnicile prezentate anterior reduce înrăutăŃirea
ratei de transfer a sistemului pipeline. Alegerea uneia din aceste tehnici pentru
un sistem particular depinde de factori ca cerinŃele ratei de transfer şi restricŃiile
de cost. In practică, datorită acestor factori, într-un procesor se implementează
de obicei o combinaŃie a acestor tehnici.
9.4.7. ÎmbunătăŃirea ratei de transfer
O posibilitate de creştere a ratei de transfer a unui sistem pipeline de
instrucŃiuni este de a se utiliza paralelismul la nivelul instrucŃiunilor (instruction-
level parallelism - ILP). Acest paralelism rezultă dintr-un set de tehnici ale
procesorului şi compilatorului care îmbunătăŃesc performanŃa prin executarea
operaŃiilor independente în paralel. Sistemele bazate pe paralelismul la nivelul
instrucŃiunilor preiau un program convenŃional într-un limbaj de nivel înalt scris
pentru procesoare secvenŃiale şi utilizează tehnici statice (ale compilatorului) şi
dinamice (circuite) pentru a exploata în mod automat paralelismul implicit al
programului. Aceste tehnici sunt în mare măsură transparente pentru
programatorii de aplicaŃii, spre deosebire de paralelismul tradiŃional de tip
multiprocesor, care necesită ca programatorii să rescrie programele de aplicaŃii.
In prezent, prelucrarea paralelă la nivelul instrucŃiunilor rămâne singura metodă
viabilă pentru creşterea continuă a performanŃelor fără a rescrie în mod
fundamental programele de aplicaŃii.
Metodele obişnuite pentru a exploata paralelismul la nivelul instrucŃiunilor
sunt prelucrarea superscalară, prelucrarea superpipeline şi cuvintele foarte lungi
de instrucŃiuni (Very Long lnstruction Word — VLIW). O metodă mai nouă este
numită EPIC (Explicitly Parallel lnstruction Computing). Fiecare din aceste
metode încearcă iniŃierea mai multor instrucŃiuni în acelaşi ciclu de ceas.

9.4.7.1. Prelucrarea superscalară


Metoda superscalară se bazează pe paralelismul spaŃial, care constă în
execuŃia concurentă a mai multor operaŃii în unităŃi separate de prelucrare.
Această metodă realizează multiplicarea execuŃiei instrucŃiunilor într-un ciclu de
ceas prin lansarea mai multor instrucŃiuni către diferite unităŃi funcŃionale. Un
procesor superscalar conŃine unităŃi multiple de execuŃie, fiecare din acestea
fiind de obicei de tip pipeline, astfel încât acestea constituie un set de sisteme
pipeline de instrucŃiuni independente. Unitatea de control a unui procesor
superscalar este proiectată pentru a încărca şi a decodifica mai multe
instrucŃiuni în mod concurent. Aceasta poate lansa sau expedia până la k
instrucŃiuni simultan către diferitele unităŃi de execuŃie, unde k poate avea o
valoare egală cu şase sau, utilizând tehnologia actuală, mai mare. Necesitatea
de a prelucra mai multe instrucŃiuni simultan fără conflicte complică mult
proiectarea unităŃii de control. Figura 9.17 prezintă într-o formă ideală
diferenŃele din punct de vedere al posibilităŃilor de prelucrare ale instrucŃiunilor
între trei organizări UCP: un procesor secvenŃial (care nu este de tip pipeline),
un procesor de tip pipeline şi un procesor superscalar, fiecare dintre acestea
executând acelaşi şir de instrucŃiuni I1 , I 2 , I 3 ,... . Presupunând că fiecare
instrucŃiune necesită un număr total de cinci cicluri, putem observa că un singur
sistem pipeline (k = 1) cu cinci etaje oferă o creştere a vitezei de 5 ori, în timp ce
un sistem superscalar cu două instrucŃiuni lansate simultan (k = 2) oferă o
creştere potenŃială a vitezei de 10 ori. La începutul ciclului 15, procesorul
secvenŃial a terminat numai două instrucŃiuni, în timp ce procesorul de tip
pipeline şi cel superscalar au terminat 10, respectiv 20 de instrucŃiuni. Mai mult,
procesorul superscalar a început prelucrarea instrucŃiunilor I 21 la I 30 .

Fig. 9.17

După cum se ilustrează în figura 9.17, prezenŃa a k unităŃi de execuŃie de


tip pipeline cu m etaje permite unui UCP superscalar să atingă factori de
creştere a vitezei care se apropie de k × m , comparativ cu un UCP care nu
dispune de paralelism la nivelul instrucŃiunilor. Ocuparea a k sisteme pipeline
necesită ca UCP să încarce cel puŃin k instrucŃiuni în fiecare ciclu de ceas.
Volumul ridicat al traficului de instrucŃiuni de la memoria de program la UCP
necesită ca sistemul să dispună de o memorie cache rapidă şi de dimensiuni
mari, adesea sub forma unei memorii cache de instrucŃiuni (I-cache) pentru
păstrarea programului, completată cu o memorie cache de date (D-cache)
pentru păstrarea operanzilor. Pentru extragerea instrucŃiunilor, există de obicei
un buffer sau o coadă de instrucŃiuni în cadrul UCP, care păstrează
instrucŃiunile preîncărcate şi parŃial decodificate. Unitatea de control expediază
instrucŃiunile din bufferul de instrucŃiuni către diferitele unităŃi de execuŃie.
Unitatea de control a unui procesor superscalar este responsabilă pentru
determinarea momentului în care poate fi executată fiecare instrucŃiune şi
pentru asigurarea accesului la resursele pe care instrucŃiunea le necesită, cum
sunt operanzi din memorie, unităŃi de execuŃie şi registre UCP. Pentru aceasta,
unitatea de control trebuie să Ńină cont de următorii factori:
• Tipul instrucŃiunii: De exemplu, o instrucŃiune de adunare în virgulă
mobilă trebuie expediată la o unitate de execuŃie în virgulă mobilă şi nu la o
unitate în virgulă fixă.
• Disponibilitatea unităŃii de execuŃie: O instrucŃiune poate fi expediată la
o unitate de execuŃie de tip pipeline numai dacă nu vor rezulta coliziuni.
• DependenŃe de date: Pentru a evita conflictele la utilizarea registrelor,
trebuie satisfăcute restricŃii privind dependenŃele de date între operanzii
instrucŃiunilor active.
• DependenŃe de control: Pentru a menŃine performanŃe ridicate, sunt
necesare tehnici pentru a reduce impactul instrucŃiunilor de salt asupra eficienŃei
sistemelor pipeline.
• Ordinea instrucŃiunilor: InstrucŃiunile trebuie să genereze rezultatele în
ordinea specificată de programul care se execută. Rezultatele pot fi însă
calculate intern într-o ordine diferită pentru a îmbunătăŃi performanŃele UCP.
Pentru păstrarea ordinii de execuŃie a instrucŃiunilor între care există
dependenŃe şi pentru a asigura obŃinerea unor rezultate valide, un procesor
superscalar trebuie să utilizeze un mecanism de control, care poate fi bazat pe
metoda tabelei de rezultate sau metoda Tomasulo. In practică, majoritatea
procesoarelor se bazează pe tehnica superscalară şi utilizează metoda tabelei
de rezultate.
Pentru a rezolva problema salturilor întârziate se utilizează diferite metode
arhitecturale, cum sunt memorii cache (sau buffere) pentru destinaŃia saltului şi
execuŃia speculativă, ExecuŃia speculativă implică predicŃia direcŃiei unui salt
dependent de date şi execuŃia instrucŃiunilor corespunzătoare. Cu seturi multiple
de registre virtuale şi utilizând metoda tabelei de rezultate, un procesor poate
urmări ambele căi ale unui salt şi poate alege şirul corect de instrucŃiuni.

9.4.7.2. Prelucrarea superpipeline


Metoda superpipeline asigură performanŃe ridicate prin suprapunerea
execuŃiei unui număr mai mare de instrucŃiuni într-un singur sistem pipeline de
instrucŃiuni. Un procesor superpipeline conŃine de obicei un sistem pipeline de
instrucŃiuni cu un număr mai mare de etaje decât un sistem pipeline obişnuit. Cu
alte cuvinte, procesul de execuŃie al unei instrucŃiuni este divizat în etape cu
complexitate mai redusă. Prin creşterea numărului de etaje ale sistemului
pipeline de instrucŃiuni este posibilă creşterea frecvenŃei ceasului, deoarece
această frecvenŃă depinde de întârzierea introdusă de etajul cel mai lent.
Metoda superpipeline are anumite avantaje. O singură unitate funcŃională
necesită un spaŃiu mai redus şi circuite mai simple comparativ cu structurile
bazate pe prelucrarea superscalară. SpaŃiul suplimentar care rămâne disponibil
permite implementarea unor circuite speciale pentru obŃinerea unor viteze mai
ridicate, memorii cache de dimensiuni mai mari şi căi de date cu un număr mai
mare de linii.
Majoritatea procesoarelor actuale utilizează metoda superpipeline. De
exemplu, sistemul pipeline al familiei de procesoare cu arhitectura Intel actuală
constă din 20 etaje, faŃă de 5 la procesorul Intel Pentium şi 6 la procesorul Intel
Pentium cu extensiile MMX. Aceasta permite familiei de procesoare cu
arhitectura Intel actuală să ajungă la o frecvenŃă cu aproximativ 50% mai
ridicată faŃă de procesorul Pentium cu aceeaşi tehnologie de fabricaŃie.
Alte exemple de arhitecturi superpipeline sunt procesoarele MIPS R4000
şi R4400.
Să considerăm un procesor care divizează extragerea instrucŃiunilor şi
accesul la memoria cache de date pentru a crea un sistem pipeline cu opt etaje.
Cele opt etaje ale sistemului pipeline sunt ilustrate în figura 9.18.

Fig. 9.18.

Faze corespunzătoare celor opt etaje ale sistemului pipeline sunt descrise
mai jos.
1. IF (Instruction Fetch, First Half): Logica de salt selectează o adresă de
instrucŃiune şi începe extragerea acestei instrucŃiuni din memoria cache de
instrucŃiuni. In aceeaşi fază, bufferul de translatare (TLB) pentru instrucŃiuni
începe translatarea adresei virtuale într-o adresă fizică.
2. IS (Instruction Fetch, Second Half): Extragerea instrucŃiunii din memoria
cache de instrucŃiuni şi translatarea adresei virtuale într-o adresă fizică sunt
terminate.
3. RF (Register Fetch): InstrucŃiunea este decodificată şi marcajul
memoriei cache de instrucŃiuni este comparat cu numărul cadrului de pagină
obŃinut din bufferul de translatare pentru instrucŃiuni. Operanzii necesari sunt
încărcaŃi din setul de registre.
4. EX (Instruction Execution): UAL execută operaŃia aritmetică sau logică
pentru instrucŃiunile care operează cu registrele. Pentru instrucŃiunile de
încărcare şi memorare, UAL calculează adresa virtuală a datelor. Pentru
instrucŃiunile de salt, UAL determină dacă condiŃia de salt este adevărată şi
calculează adresa virtuală a destinaŃiei saltului.
5. DF (Data Fetch, First Half): Pentru instrucŃiunile de încărcare şi
memorare, începe extragerea datelor din memoria cache de date şi translatarea
adresei virtuale într-o adresă fizică. Pentru instrucŃiunile de salt, începe
translatarea adresei şi actualizarea TLB. Pentru instrucŃiunile care
operează cu registrele, nu se execută nici o operaŃie în timpul fazelor DF, DS şi
TC.
6. DS (Data Fetch, Second Half): Pentru instrucŃiunile de încărcare şi
memorare, extragerea datelor din memoria cache de date şi translatarea
adresei virtuale într-o adresă fizică sunt terminate. Pentru instrucŃiunile de salt,
translatarea adresei şi actualizarea TLB sunt terminate.
7. TC (Tag Check): Pentru instrucŃiunile de încărcare şi memorare,
memoria cache execută testarea marcajului. Adresa fizică din TLB este
comparată cu marcajul memoriei cache pentru a determina dacă există un
succes sau un eşec la accesul memoriei cache.
8. WB (Write Back): Pentru instrucŃiunile care operează cu registrele,
rezultatul instrucŃiunii este scris în setul de registre. Pentru instrucŃiunile de salt,
nu se execută nici o operaŃie în timpul acestei faze.

9.4.7.3. Cuvinte foarte lungi de instrucŃiuni


Metoda cuvintelor foarte lungi de instrucŃiuni (Very Long lnstruction Word -
VLIW) utilizează compilatorul în mod intens pentru ca acesta să includă mai
multe operaŃii independente într-un cuvânt lung de instrucŃiune. Lungimea
cuvântului de instrucŃiune este suficient de mare pentru a furniza, în paralel, biŃi
de control pentru mai multe unităŃi funcŃionale, în acelaşi mod în care o
microinstrucŃiune controlează resurse multiple care execută microoperaŃii.
InstrucŃiunile VLIW încearcă să maximizeze numărul operaŃiilor executate în
paralel şi necesită a logică de decodificare simplă.
Compilatorul unei arhitecturi VLIW determină paralelismul între operaŃiile
de bază pentru a menŃine unităŃile funcŃionale ocupate cât mai mult timp.
Compilatorul determină câmpurile de control ale instrucŃiunilor VLIW şi specifică
resursele care vor fi utilizate de procesor în fiecare ciclu de ceas. Deci, codul
VLIW furnizează un plan explicit al modului în care procesorul va executa
programul. Compilatorul creează acest plan de execuŃie în mod static în timpul
compilării, pe baza cunoaşterii complete a procesorului VLIW. In timpul
execuŃiei, unitatea de control lansează execuŃia unei instrucŃiuni lungi în fiecare
ciclu. Această instrucŃiune iniŃiază simultan mai multe operaŃii independente.
Pentru arhitecturile VLIW, programul furnizează informaŃii explicite în
privinŃa paralelismului. Compilatorul identifică paralelismul din program şi îl
comunică procesorului prin specificarea operaŃiilor care sunt independente
unele de altele. Utilizând aceste informaŃii, procesorul va cunoaşte, fără o
testare suplimentară, care operaŃii pot fi lansate în execuŃie în acelaşi ciclu.
Calculatoarele VLIW nu au avut un succes comercial. Totuşi, unele din
noile arhitecturi de procesoare utilizează metoda VLIW pentru a obŃine
performanŃe superscalare. Un exemplu recent de arhitectură VLIW este MAJC
(Microprocessor Architecture for Java Computing), introdusă de Sun
Microsystems.
Prima implementare a acestei arhitecturi este procesorul MAJC-5200,
introdus în anul 2000. Acesta este un procesor cu performanŃe ridicate pentru
aplicaŃii multimedia, integrând două unităŃi centrale de prelucrare într-o singură
capsulă.

9.4.7.4. EPIC
Arhitectura EPIC (Explicitly Parallel Instruction Computing) a fost
dezvoltată la Hewlett-Packard Laboratories, începând cu anul 1989, pentru a
permite un grad mai înalt de paralelism la nivelul instrucŃiunilor fără o
complexitate hardware inacceptabilă. Arhitectura EPIC este o evoluŃie a
arhitecturii VLIW, care a asimilat şi multe concepte ale tehnicii superscalare.
EPIC pune la dispoziŃie o filozofie pentru a construi procesoare ILP (instruction-
level parallelism), împreună cu un set de caracteristici arhitecturale care sprijină
această filozofie. Prima implementare comercială a unei arhitecturi EPIC este
arhitectura Intel IA-64.

Filozofia EPIC
Unul din scopurile EPIC a fost de a păstra conceptul VLIW de construire
statică a planului de execuŃie al programului de către compilator, dar de a-l
îmbunătăŃi cu caracteristici specifice prelucrării superscalare, care folosesc
avantajele factorilor dinamici. Pentru a realiza aceste scopuri, filozofia EPIC are
trei principii de bază:
- Compilatorul trebuie să aibă rolul cheie în construirea planului de
execuŃie al programului, iar arhitectura trebuie să asigure suportul necesar
pentru compilator.
- Arhitectura trebuie să asigure facilităŃi care asistă compilatorul în
folosirea avantajelor paralelismului la nivelul instrucŃiunilor.
- Arhitectura trebuie să asigure mecanisme pentru a comunica
procesorului planul de execuŃie al compilatorului.
Aceste principii sunt explicate în continuare. Filozofia EPIC atribuie
sarcina de a construi planul de execuŃie compilatorului. Procesoarele EPIC
pun la dispoziŃie facilităŃi care asistă compilatorul în construirea cu succes
a planului de execuŃie. O cerinŃă de bază este ca funcŃionarea procesoarelor
EPIC să fie predictibilă şi controlabilă din punct de vedere al compilatorului.
EsenŃa construirii planului de execuŃie în timpul compilării este de a reordona
codul secvenŃial original pentru a profita de paralelismul aplicaŃiei şi de a utiliza
într-un mod optim resursele hardware, minimizând astfel timpul de execuŃie.
Fără un suport arhitectural corespunzător, reordonarea poate afecta
corectitudinea programului. Din acest motiv, procesoarele EPIC pun la dispoziŃie
facilităŃi arhitecturale care permit o reordonare extensivă a codului în timpul
compilării.
Un compilator EPIC întâmpină o problemă majoră în construirea planului
de execuŃie la compilare, deoarece anumite tipuri de informaŃii pot fi cunoscute
numai la execuŃie. De exemplu, compilatorul nu poate cunoaşte destinaŃia
fiecărui salt condiŃionat. Adesea este imposibil de a construi o planificare statică
care optimizează toate căile din program. O ambiguitate rezultă de asemenea
atunci când compilatorul nu este capabil să determine dacă două referinŃe la
memorie vizează sau nu aceeaşi locaŃie. In caz afirmativ, ele trebuie executate
secvenŃial. In caz contrar, ele pot fi planificate în orice ordine. In asemenea
circumstanŃe, compilatorul construieşte şi optimizează planul de execuŃie pentru
cazul probabil. Totuşi, EPIC pune la dispoziŃie facilităŃi arhitecturale, ca de
exemplu speculaŃia controlului şi a datelor, pentru a asigura corectitudinea
programului chiar şi atunci când presupunerea este incorectă. Uneori, rezultă o
reducere a performanŃei, dar aceste situaŃii trebuie să fie puŃin frecvente.
După construirea unui plan de execuŃie, compilatorul trebuie să comunice
acest plan procesorului. Pentru aceasta, arhitectura setului de instrucŃiuni
trebuie să fie capabilă să exprime deciziile compilatorului despre momentul în
care să se lanseze fiecare operaŃie şi care resurse să fie utilizate. In particular,
trebuie să fie posibil să se specifice care operaŃii trebuie lansate simultan.
(SoluŃia utilizată de alte filozofii de proiectare este să se creeze un program
secvenŃial care este prezentat procesorului şi reorganizat de acesta în mod
dinamic.) Atunci când se comunică planul de execuŃie procesorului, este
important să se furnizeze informaŃii critice la momentul potrivit. Un exemplu este
operaŃia de salt, care, dacă va fi executată, necesită începerea încărcării
instrucŃiunilor de la destinaŃia saltului cu mult înaintea saltului care este lansat.
In loc de a pune la dispoziŃie un buffer al destinaŃiei saltului pentru a indica
adresa destinaŃie, filozofia EPIC constă în a furniza aceste informaŃii
procesorului, în mod explicit şi la momentul corect, prin intermediul codului.
Există alte probleme care trebuie rezolvate de microarhitectura
procesorului, care nu se referă direct la execuŃia codului, dar care afectează
timpul de execuŃie. Un exemplu este gestionarea ierarhiei memoriei cache şi
deciziile asociate despre datele care trebuie înlocuite. Strategiile de înlocuire
sunt încorporate de obicei în circuitele memoriei cache. EPIC permite
compilatorului să gestioneze şi aceste mecanisme ale microarhitecturii. In
concluzie, EPIC pune la dispoziŃie facilităŃi arhitecturale care permit un control
prin program al mecanismelor care sunt controlate în mod normal de
microarhitectură.
EPIC simplifică două responsabilităŃi de bază ale procesorului.
- Filozofia EPIC permite eliminarea verificării în timpul execuŃiei a
dependenŃelor pentru operaŃiile care au fost demonstrate de compilator ca fiind
independente.
- EPIC permite eliminarea logicii complexe pentru lansarea operaŃiilor într-
o ordine diferită de cea din program, bazându-se pe ordinea de lansare
specificată de compilator. EPIC îmbunătăŃeşte abilitatea compilatorului de a
genera în mod static un plan de execuŃie, permiŃând diferite forme de mutare a
codului în timpul compilării care ar fi ilegale într-o arhitectură convenŃională.
Unele din facilităŃile arhitecturale ale EPIC sunt descrise în continuare.

OperaŃii multiple pe instrucŃiune (MultiOp)


O instrucŃiune MultiOp specifică un set de operaŃii care se intenŃionează a
fi lansate în execuŃie simultan, fiecare operaŃie fiind echivalentul unei instrucŃiuni
într-un procesor secvenŃial convenŃional. Compilatorul identifică operaŃiile
planificate pentru a fi lansate în execuŃie simultan şi le împachetează într-o
instrucŃiune MultiOp. Atunci când se lansează în execuŃie o instrucŃiune MultiOp,
nu este necesar ca procesorul să efectueze verificarea dependenŃei între
operaŃiile sale constituente.
La construirea unui plan de execuŃie, compilatorul trebuie sa Ńină cont de
numărul resurselor de fiecare tip disponibile în cadrul procesorului şi trebuie să
efectueze alocarea resurselor. Filozofia EPIC constă în a comunica aceste
decizii procesorului prin intermediul codului, astfel încât procesorul nu necesită
executarea din nou a alocării resurselor în timpul execuŃiei. O posibilitate pentru
aceasta este utilizarea unui format poziŃional de instrucŃiune, deci, poziŃia unei
operaŃii în cadrul instrucŃiunii MultiOp specifică unitatea funcŃională în care
operaŃia va fi executată. In mod alternativ, această informaŃie poate fi specificată
ca parte a codului operaŃiei.
Ordinea de lansare în execuŃie a instrucŃiunilor este stabilită de compilator.
Astfel, dacă o operaŃie nu va încerca să utilizeze un rezultat înainte ca acesta să
fie generat, procesorul nu necesită interblocări sau abilitatea de a insera
suspendări ale execuŃiei.

Rezolvarea problemei salturilor


Multe aplicaŃii necesită un număr mare de salturi. OperaŃiile de salt au o
latenŃă hardware care se întinde din momentul în care începe execuŃia saltului
până în momentul în care începe execuŃia instrucŃiunii de la destinaŃia saltului.
In acest timp, au loc mai multe acŃiuni: se calculează o condiŃie de salt, se
formează o adresă destinaŃie, se încarcă instrucŃiunile din calea secvenŃială sau
calea destinaŃie, iar instrucŃiunea următoare este decodificată şi lansată în
execuŃie.
Problema fundamentală constă în faptul că, deşi seturile convenŃionale de
instrucŃiuni specifică un salt ca o singură operaŃie, acŃiunile sale trebuie
executate de fapt în momente diferite, ceea ce creşte latenŃa saltului. Atunci
când sunt suprapuse un număr insuficient de operaŃii cu execuŃia saltului,
rezultă performanŃe nesatisfăcătoare. Filozofia EPIC constă în a elimina ciclurile
de suspendare ale execuŃiei prin obŃinerea unei mai bune suprapuneri între
procesarea saltului şi alte calcule. In loc de a se baza numai pe circuite pentru a
soluŃiona problema, EPIC asigură caracteristici arhitecturale care facilitează
următoarele posibilităŃi:
EPIC nu tratează un salt ca o operaŃie unică. In loc de a considera un salt
ca o singură operaŃie cu latenŃă ridicată, EPIC separă salturile în trei operaŃii
distincte: o operaŃie de pregătire pentru salt determină adresa destinaŃie şi o
furnizează unităŃii de salt; o comparaŃie calculează condiŃia de salt; în final,
saltul efectiv marchează locaŃia din şirul de instrucŃiuni la care este transferat
condiŃionat fluxul de control.
Separarea salturilor permite compilatorului să mute operaŃiile de pregătire
pentru salt şi de comparaŃie în avans faŃă de saltul efectiv, astfel încât
procesorul poate termina calculul condiŃiei de salt şi preîncărcarea instrucŃiunilor
corespunzătoare până în momentul în care se ajunge la saltul efectiv. La
executarea operaŃiei de pregătire pentru salt, procesorul poate preîncărca în
mod speculativ - înaintea cunoaşterii condiŃiei de salt - instrucŃiuni de la
destinaŃia saltului. După execuŃia comparaŃiei, procesorul poate determina dacă
saltul va fi executat, poate elimina instrucŃiunile încărcate în mod speculativ care
nu sunt necesare şi poate iniŃia preîncărcarea nespeculativă a instrucŃiunilor.
Aceste tehnici permit procesarea suprapusă a componentelor saltului, cu
utilizarea doar a mutării statice a componentelor saltului.
EPIC reduce penalizarea datorită salturilor prin eliminarea salturilor
utilizând execuŃia predicativă. ExecuŃia predicativă se referă la execuŃia
condiŃională a operaŃiilor pe baza unei intrări cu valori booleene, numită
predicat, asociată cu blocul de bază conŃinând operaŃia.

Rezolvarea problemei accesului la memorie


Accesurile la memorie pot, de asemenea, reduce performanŃele. Deoarece
perioada de ceas a procesorului descreşte mai rapid decât timpul de acces la
memorie, timpul de acces la memorie (măsurat în cicluri ale procesorului)
creşte. Memoriile cache de date pot reduce degradarea performanŃelor datorată
latenŃei crescute a memoriei principale. Totuşi, memoriile cache gestionate prin
hardware reduc uneori performanŃele chiar sub cele ale unui sistem fără o
memorie cache. EPIC pune la dispoziŃie mecanisme arhitecturale care permit
compilatoarelor să controleze în mod explicit mutarea datelor în cadrul ierarhiei
memoriilor cache.
Arhitecturile EPIC atribuie operaŃiilor de încărcare şi de memorare un
specificator al memoriei cache destinaŃie pe care compilatorul îl utilizează
pentru a indica nivelul memoriei cache în care operaŃia de încărcare sau
memorare trebuie să promoveze sau să retrogradeze datele referenŃiate pentru
a fi utilizate de următoarele operaŃii cu memoria. Specificatorul memoriei cache
destinaŃie reduce lipsurile din memoriile cache prin controlul conŃinutului lor.
Compilatorul poate exclude datele cu o localitate temporală insuficientă din
memoria cache de un anumit nivel şi poate elimina datele din această memorie
cache după ultima utilizare.

9.4.7.5. ComparaŃie între metodele de îmbunătăŃire a ratei de transfer


O comparaŃie între metodele de îmbunătăŃire a ratei de transfer prezentate
anterior indică anumite diferenŃe interesante. De exemplu, metodele
superscalară şi VLIW sunt mai sensibile la conflictele între resurse decât
metoda superpipeline. Intr-un procesor superscalar sau VLIW, o resursă trebuie
duplicată pentru a reduce şansele conflictelor, în timp ce tehnica superpipeline
evită orice conflicte la resurse. O arhitectură EPIC încearcă să evite conflictele
la resurse prin utilizarea compilatorului.
Pentru a se evita ca un procesor superpipeline să fie mai lent decât un
procesor superscalar, tehnologia utilizată în procesorul superpipeline trebuie să
reducă întârzierea sistemului pipeline. De aceea, în general, procesoarele
superpipeline necesită o tehnologie mai rapidă de tranzistoare cum este GaAs
(arseniură de galiu), în timp ce procesoarele superscalare necesită un număr
mai mare de tranzistoare pentru a permite duplicarea resurselor hardware.
Metoda superscalară utilizează adesea tehnologia CMOS, deoarece această
tehnologie asigură o densitate ridicată a circuitelor. Tehnologia existentă
favorizează în general densitatea crescută a circuitelor faŃă de viteza crescută a
acestora. Din punct de vedere istoric, densitatea circuitelor a crescut cu o rată
mai rapidă decât viteza tranzistoarelor. Acest precedent sugerează concluzia că
metoda superscalară este mai eficientă din punct de vedere al costului pentru a
fi implementată de industrie.
Avansul tehnologic a permis tehnicilor superscalară şi superpipeline să fie
combinate, obŃinându-se soluŃii eficiente. Asemenea soluŃii, care încearcă să
profite de aspectele pozitive ale fiecărei tehnici, pot fi regăsite în procesoarele
existente.
Pentru procesoarele superscalare şi superpipeline, programul nu conŃine
informaŃii explicite despre paralelismul la nivelul instrucŃiunilor care este
disponibil şi de aceea acest paralelism trebuie descoperit de procesor. Pentru
procesoarele VLIW şi EPIC, planul de execuŃie al programului este construit de
compilator, astfel încât programul conŃine informaŃii explicite despre paralelismul
disponibil. Aceste informaŃii sunt comunicate procesorului, care execută planul
specificat.
Procesoarele superscalare şi superpipeline construiesc în mod dinamic
planul de execuŃie al programului, spre deosebire de procesoarele VLIW şi
EPIC, care utilizează compilatorul pentru a construi în mod static planul de
execuŃie. Ca rezultat, circuitele procesoarelor superscalare şi superpipeline sunt
mai complexe, dar construirea în mod dinamic a planului de execuŃie poate Ńine
cont de factori care pot fi determinaŃi numai la execuŃie. In ultima decadă, a
existat o controversă între complexitatea şi posibilităŃile dinamice ale
procesoarelor superscalare şi superpipeline, contra simplităŃii şi limitărilor
procesoarelor VLIW. Filozofia EPIC subscrie la ambele dintre aceste poziŃii.
DiferenŃa este că EPIC expune aceste mecanisme la nivelul arhitectural, astfel
încât compilatorul poate controla aceste mecanisme dinamice, utilizându-le în
mod selectiv după cum este adecvat. Acest control permite compilatorului să
utilizeze strategii mai eficiente pentru gestionarea acestor mecanisme decât ar
permite o strategie hardware. Filozofia EPIC, împreună cu caracteristicile
arhitecturale care o sprijină, asigură mijloacele pentru a defini arhitecturi cu un
grad mai ridicat de paralelism la nivelul instrucŃiunilor şi la un nivel de
complexitate mai redus pentru diferite domenii de aplicaŃii.
9.5. Sisteme pipeline aritmetice

9.5.1. Principii
Pentru îmbunătăŃirea performanŃelor, anumite funcŃii ale unităŃii aritmetice
şi logice pot fi implementate printr-un sistem pipeline. Pentru implementarea
funcŃiilor aritmetice complexe, ca adunarea, înmulŃirea şi împărŃirea în virgulă
mobilă se utilizează sisteme pipeline aritmetice. Aceste funcŃii pot fi
descompuse în mai multe operaŃii executate în mod succesiv.
Considerăm, de exemplu, adunarea a două numere normalizate în virgulă
mobilă, X şi Y . Această operaŃie poate fi executată în următoarele patru etape:
compararea exponenŃilor, alinierea mantiselor (egalizarea exponenŃilor),
adunarea mantiselor şi normalizarea rezultatului. Aceste operaŃii necesită un
sistem pipeline cu patru etaje, după cum se arată în figura 9.19. Presupunem
că X are reprezentarea normalizată în virgulă mobilă ( X M , X E ), unde X M este
mantisa şi X E este exponentul şi, în mod similar, Y = (YM , YE ) .
In prima etapă a adunării numerelor X = ( X M , X E ) şi Y = ( YM , YE ),se
compară X E şi YE . Această operaŃie este executată de etajul E1 al sistemului
pipeline, care are în componenŃa sa un sumator în virgulă fixă. Acest etaj
identifică exponentul cel mai mic, de exemplu X E si stabileşte exponentul
comun, care în acest caz, este YE . Mantisă corespunzătoare X M se modifică
'
prin deplasarea la dreapta pentru a forma o nouă mantisă X M , astfel încât
'
( XM , YE ) = ( X M , X E ). Această operaŃie este executată de etajul al doilea ( E2 )
'
al sistemului pipeline. In etajul al treilea E3 sunt adunate mantisele X M şi YM ,
care sunt acum aliniate corespunzător. Această adunare în virgulă fixă poate
produce un rezultat care nu este normalizat. Rezultatul este normalizat în etajul
al patrulea E4 . Pentru realizarea normalizării se contorizează mai întâi
numărului k al cifrelor de zero de la începutul mantisei (sau al cifrelor de unu în
cazul unui număr negativ). In continuare se deplasează mantisa cu k poziŃii la
stânga şi se ajustează în mod corespunzător exponentul

Fig. 9.19
9.5.2. Sisteme pipeline aritmetice cu reacŃie inversă

Utilitatea unui sistem pipeline aritmetic poate fi mărită prin includerea


căilor de reacŃie inversă de la ieşirile etajelor la intrările primare ale sistemului
pipeline. ReacŃia inversă permite ca rezultatele calculate de anumite etaje să fie
utilizate în calculele ulterioare de sistemul pipeline. Vom ilustra în continuare
acest concept prin adăugarea reacŃiei inverse la un sumator în virgulă mobilă
de tip pipeline cu patru etaje.

Fig. 9.20

Considerăm problema calculării sumei a N numere în virgulă mobilă


b1 , b2 ,…, bN . O soluŃie a acestei probleme ar putea consta în adunarea
perechilor consecutive de numere utilizând un sumator pipeline şi memorarea
sumelor parŃiale temporar în registre externe. Însumarea poate fi efectuată mult
mai eficient prin modificarea sumatorului după cum se arată în figura 9.20.
Astfel, a fost adăugată o cale de reacŃie inversă la ieşirea etajului final E4 ,
permiŃând rezultatelor sale să fie aplicate la intrarea primului etaj E1 . Operanzii
de intrare ai sumatorului modificat se obŃin din patru surse separate:
- o variabilă X care este obŃinută, de obicei, dintr-un registru UCP sau o
locaŃie de memorie,
- o sursă constantă K , care poate aplica operanzi cum sunt cuvintele
constând numai din biŃi de 0 (cifra 0),
- ieşirea etajului E4 , reprezentând rezultatul calculat de E4 în perioada de
ceas precedentă,
- un rezultat anterior calculat de sistemul pipeline şi memorat în registrul
de ieşire R .
Problema adunării a N numere este soluŃionată de sistemul pipeline
aritmetic din figura 9.20 în modul următor. Operanzii b1 , b2 ,…, bN sunt introduşi
în sistemul pipeline într-un şir continuu prin intrarea X . Acest proces necesită o
secvenŃă de operaŃii de încărcare din memorie, care sunt implementate simplu
dacă operanzii sunt memoraŃi în locaŃii contigue.
In figura 9.23, b8 = bN este ultimul element care trebuie însumat.
După ce ultimul operand bN a fost aplicat la intrarea sistemului pipeline,
structura reacŃiei inverse este modificată din nou pentru a permite ca cele patru
sume parŃiale b1 + b5 , b2 + b6 , b3 + b7 şi b4 + b8 să fie adunate. Modificarea
necesară a structurii reacŃiei inverse este indicată în figura 9.22 pentru cazul N
= 8. La momentul t = 9, intrările externe în sistemul pipeline sunt invalidate prin
setarea lor la zero, iar prima din cele patru sume parŃiale b1 + b5 de la ieşirea
etajului E4 este memorată în registrul R . Apoi, la momentul t = 10, noul rezultat
b2 + b6 de la etajul E4 este aplicat la intrarea sistemului pipeline, împreună cu
rezultatul precedent b1 + b5 obŃinut din R .
Astfel, în acest moment începe calculul b1 + b5 + b2 + b6 , care este suma
jumătăŃii operanzilor de intrare. După o nouă întârziere de o perioadă, începe
calculul sumei celeilalte jumătăŃi b3 + b7 + b4 + b8 .

Fig. 9.21

Atunci când b1 + b5 + b2 + b6 apare la ieşirea etajului E4 la momentul t =


14, aceasta este memorată în R , până când b3 + b7 + b4 + b8 apare la ieşirea
etajului E4 la momentul t = 16. In acest moment, ieşirile etajului E4 şi ale
registrului R sunt aplicate la intrările etajului E1 . Rezultatul final este produs
patru perioade mai târziu, la momentul t = 20 în cazul N = 8.

Fig. 9.22

Pentru cazul general al N operanzi, sistemul pipeline aritmetic din figura


9.21 şi 9.22 poate calcula suma a N > 4 numere în virgulă mobilă într-un timp
(N+11)T unde T este perioada de ceas a sistemului pipeline, deci întârzierea pe
etaj. Deoarece un sumator comparabil care nu este de tip pipeline necesită un
timp de 4NT pentru calcularea sumei, creşterea vitezei obŃinute este
4N/(N+11), care se apropie de 4 pe măsură ce N creşte.
OperaŃiile aritmetice mai complexe din seturile de instrucŃiuni ale UCP,
inclusiv majoritatea operaŃiilor în virgulă mobilă, pot fi implementate în mod
eficient prin sisteme pipeline. InmulŃirea în virgulă fixă şi mobilă este de
asemenea adecvată pentru implementarea printr-un sistem pipeline. In figura
9.23 este prezentat un sistem pipeline de înmulŃire.

Adunare Inmultire
Normalizare
exponenti mantise

Rotunjire Normalizare
mantisa finala
Fig. 9.23

9.6. Controlul sistemelor pipeline


După cum se ştie există două tipuri de sisteme pipeline: statice şi
dinamice. Un sistem pipeline static poate executa o singură operaŃie la un
moment dat, în timp ce un sistem pipeline dinamic poate executa mai multe
operaŃii. Controlul secvenŃierii operaŃiilor prezentate pentru execuŃie unui sistem
pipeline este foarte important pentru creşterea eficienŃei acestuia. Dacă se
iniŃiază două operaŃii care necesită acelaşi etaj pipeline în acelaşi timp, apare o
coliziune. In această secŃiune se prezintă o metodă de control pentru
planificarea unui sistem pipeline.

9.6.1. Planificarea
Există mai multe metode pentru controlul planificării sistemelor pipeline.
înaintea descrierii unor asemenea metode, sunt definite conceptele de tabelă
de rezervare şi latenŃă.
Tabele de rezervare. O tabelă de rezervare indică momentele în care
etajele unui sistem pipeline sunt utilizate pentru o anumită funcŃie. Fiecare etaj
este reprezentat printr-o linie în tabela de rezervare. Fiecare linie este împărŃită
în coloane, câte una pentru fiecare ciclu de ceas. Numărul de coloane indică
numărul total al unităŃilor de timp necesare pentru execuŃia unei anumite funcŃii.
Pentru a indica faptul că un anumit etaj E este utilizat la momentul de timp ti
este plasat un semn „x” la intersecŃia liniei şi coloanei corespunzătoare etajului
şi momentului de timp respectiv din tabelă.

Fig. 9.24

Figura 9.24 reprezintă o tabelă de rezervare pentru un sistem pipeline


static cu trei etaje. Momentele de timp t 0 , t1 , t 2 , t3 şi t 4 indică cinci cicluri de
ceas consecutive. In exemplul considerat poziŃia semnelor „x” indică faptul că,
pentru a produce rezultatul scontat datele de intrare trebuie să treacă succesiv
prin etajele 1, 2, 2, 3 şi 1. Tabela de rezervare poate fi utilizată pentru a
determina diferenŃele de timp între aplicarea datelor la intrare astfel încât să nu
apară coliziuni.
LatenŃa. Întârzierea, sau numărul unităŃilor de timp (ciclurilor de ceas)
care separă aplicarea datelor la intrare, este numită latenŃă. Va apare o
coliziune dacă două seturi de date de intrare sunt aplicate cu o latenŃă egală cu
distanŃa între două semne „x” într-o linie a tabelei de rezervare. De exemplu, în
tabela din figura 9.24 există două semne „x” cu o distanŃă 1 în a doua linie.
Astfel, dacă al doilea set de date este aplicat la intrare cu o latenŃă de o unitate
de timp după primul, va apare o coliziune în etajul 2.

9.6.2. Planificarea sistemelor pipeline statice


Planificarea sistemelor pipeline statice începe prin crearea unui set de
liste a latenŃelor interzise pe baza tabelelor de rezervare ale funcŃiilor. Se obŃin
apoi vectorii de coliziune şi se desenează diagrama stărilor.
Lista latenŃelor interzise. Fiecare tabelă de rezervare cu două sau mai
multe semne „x” într-o anumită linie are una sau mai multe latenŃe interzise,
care, în cazul în care nu sunt evitate, vor determina coliziunea datelor. Lista
latenŃelor interzise F este o listă de numere întregi care corespund acestor
latenŃe interzise. In cazul sistemelor pipeline statice, valoarea zero este
considerată întotdeauna ca o latenŃă interzisă, deoarece nu este posibilă
iniŃierea a două taskuri în acelaşi timp. Un element al acestei liste se poate
determina calculând distanŃa între două semne „x” dintr-o anumită linie. De
exemplu, lista latenŃelor interzise a tabelei de rezervare din figura 9.24 este (4,
1, 0).
Vectori de coliziune. Un vector de coliziune este un şir de cifre binare de
lungime N + 1 , unde N este latenŃa interzisă maximă din lista latenŃelor
interzise. Vectorul de coliziune iniŃial, C , este creat din lista latenŃelor interzise
în felul următor: fiecare element ci din C , pentru i = 1,..., N , este 1 dacă i este
un element al listei latenŃelor interzise; în caz contrar, ci este zero. Valorile zero
din vectorul de coliziune indică latenŃe permise, sau momente în care aplicarea
datelor este permisă.
Pentru lista precedentă a latenŃelor interzise (4, 1, 0), vectorul de coliziune
este:
C = c4 c 3 c 2 c1 c 0
= (1 0 0 1 1)
In acest vector de coliziune, latenŃele 2 şi 3 sunt permise, în timp ce
latenŃele 0, 1 şi 4 sunt interzise.
Diagrama stărilor. Diagramele de stări se utilizează pentru a indica
diferitele stări ale unui sistem pipeline pentru un interval de timp dat. După
crearea unei diagrame a stărilor, este mai simplă deducerea unei planificări a
datelor de intrare astfel încât să nu apară coliziuni.
Pentru a crea diagrama stărilor unui sistem pipeline, starea iniŃială este
întotdeauna vectorul de coliziune iniŃial. Dacă există valoarea 0 în poziŃia ci
atunci aplicarea datelor este permisă după i unităŃi de timp (cicluri de ceas).
Figura 9.25 reprezintă o diagramă de stări pentru sistemul pipeline din
figura 9.24. Vectorul de coliziune 10011 reprezintă starea iniŃială. Un nou set de
date poate fi aplicat la intrare după două sau trei cicluri de ceas ( i = 2 sau
i = 3 ).

Fig. 9.25

De fiecare dată când este permisă aplicarea unui set de date, vectorul de
coliziune este deplasat la dreapta cu i poziŃii, în poziŃiile din stânga fiind
introduse zerouri. Aceasta corespunde cu trecerea unui număr de i unităŃi de
timp. Se efectuează operaŃia SAU logic între acest nou vector şi vectorul de
coliziune iniŃial pentru a se genera un nou vector de coliziune şi o nouă stare.
Această operaŃie este necesară deoarece aplicarea noilor date forŃează o nouă
constrângere asupra stării curente a sistemului pipeline. De fiecare dată când
se generează un nou vector de coliziune de la un vector de coliziune existent în
diagrama stărilor, se trasează un arc între acestea. Arcul este etichetat cu
latenŃa i . Procesul de generare a noilor vectori de coliziune continuă până când
nu se mai pot genera noi vectori.
In cadrul unei diagrame a stărilor, aplicarea unui set de date cu o
întârziere de N + 1 cicluri de ceas sau mai mare va determina reîntoarcerea la
vectorul de coliziune iniŃial. Aceasta deoarece vectorul de coliziune curent este
deplasat la dreapta cu N + 1 poziŃii şi sunt introduse zerouri în stânga. Dacă se
efectuează operaŃia SAU logic între un vector de coliziune egal cu zero şi
vectorul de coliziune iniŃial, rezultatul este vectorul de coliziune iniŃial. In
exemplul considerat arcele a2 şi a3 au latenŃele i = 3 şi i ≥ 5 . LatenŃa i ≥ 5
corespunde situaŃiei în care noul set de date de intrare se aplică după 5 sau
mai multe cicluri de ceas. După o perioadă de timp mai mare sau egala cu 5
cicluri de ceas, sistemul pipeline s-a golit şi este evident că aplicarea unui nou
set de date găseşte sistemul în faza iniŃială.
LatenŃa medie. LatenŃa medie se determină pentru un anumit ciclu din
diagrama stărilor. Un ciclu într-o diagramă a stărilor este o secvenŃă alternantă
de vectori de coliziune şi arce, C0 , a1, C1,..., a n , C0 , în care fiecare arc ai
conectează vectorul de coliziune Ci −1 cu Ci şi toŃi vectorii de coliziune sunt
distincŃi cu excepŃia primului şi ultimului.
Pentru simplitate, un ciclu poate fi reprezentat printr-o secvenŃă de latenŃe
ale arcelor sale. De exemplu, în figura 9.25 ciclul C0 , a1 , C1 , a 2 , C0 , unde
C0 = (10011) , C1 = (10111) , a1 este un arc de la C0 la C1 , iar a2 este un arc de la
C1 , la C0 , poate fi reprezentat ca ciclul C = (2,3) , unde 2 şi 3 sunt latenŃele
arcelor a1 , respectiv a2 . Un arc poate avea mai multe latenŃe. De exemplu arcul
a2 are latenŃele 3 şi 5.
LatenŃa medie pentru un ciclu se determină prin adunarea latenŃelor
arcelor ciclului şi împărŃirea sumei cu numărul total de arce din ciclu. De
exemplu, în figura 9.25 ciclul C = (2,3) are latenŃa medie:
(2 + 3) / 2 = 2,5
Lungimea unui ciclu este dată de numărul arcelor din care este constituit.
Astfel C0 , a1 , C1 , a 2 , C0 are lungimea 2, iar ciclul C0 , a3 , C0 are lungimea 1.
LatenŃa medie minimă. Un sistem pipeline poate avea mai multe latenŃe
medii asociate cu diferite cicluri. LatenŃa medie minimă este latenŃa cu valoarea
cea mai mică din acestea. De exemplu, pentru diagrama din figura 9.25,
latenŃele medii sunt următoarele:
(2 + 3)/2 = 2,5 din ciclul C0 , a1 , C1 , a 2 , C0
(2 + 5)/2 = 3,5 din ciclul C0 , a1 , C1 , a 2 , C0
3/1 = 3 din ciclul C0 , a3 , C0
5/1=5 din ciclul C0 , a3 , C0
Astfel, latenŃa medie minimă (LMM) este 2,5. Deşi ciclul cu latenŃa medie
minimă maximizează rata de transfer a sistemului pipeline, uneori se poate
alege un ciclu mai puŃin eficient pentru a se reduce complexitatea implementării
circuitului de control. De exemplu, ciclul C = (2, 3), cu valoarea LMM egală cu
2,5, necesită un circuit care contorizează două unităŃi de timp, apoi trei unităŃi
de timp, din nou două unităŃi de timp şi aşa mai departe. Dacă însă este
acceptabil să se aplice un set de date de intrare la fiecare trei unităŃi de timp,
complexitatea circuitului va fi mai redusă. De aceea, uneori este necesară
determinarea latenŃei minime care poate fi utilizată pentru aplicarea datelor de
intrare în toate situaŃiile. Această latenŃă este numită latenŃa minimă.
Pentru determinarea latenŃei minime se caută în diagrama stărilor ciclul de
lungime 1, care are latenŃa cea mai mică. In exemplul considerat acesta este
ciclul C0 , a3 , C0 cu latenŃa 3. Astfel, latenŃa minimă pentru acest sistem pipeline
este 3.

9.6.3. Planificarea sistemelor pipeline dinamice


La planificarea unui sistem pipeline static, trebuie evitate doar coliziunile
între diferitele date de intrare pentru o anumită unitate funcŃională. In cazul unui
sistem pipeline dinamic, este posibil ca diferitele seturi de date de intrare
necesitând unităŃi funcŃionale diferite să fie prezente în sistemul pipeline în
acelaşi timp. Pentru acest motiv, trebuie să se ia în considerare şi coliziunile
între aceste date. Ca şi în cazul sistemelor pipeline statice, planificarea
sistemelor pipeline dinamice începe cu determinarea unui set de liste a
latenŃelor interzise pe baza tabelelor de rezervare ale funcŃiilor. In continuare se
obŃin vectorii de coliziune, iar în final se desenează diagrama stărilor.

Fig. 9.26

Listele latenŃelor interzise. In cazul unui sistem pipeline dinamic,


numărul de liste ale latenŃelor interzise este egal cu pătratul numărului de unităŃi
funcŃionale care partajează sistemul pipeline. In figura 9.26, numărul de unităŃi
funcŃionale este 2, notate cu A şi B ; astfel, numărul de liste ale latenŃelor
interzise este 4, acestea fiind notate cu AA , AB , BA şi BB . De exemplu, dacă
lista AB conŃine valoarea întreagă d , atunci un set de date care necesită
unitatea funcŃională B nu poate fi aplicat la intrarea sistemului pipeline la
momentul t + d , unde t reprezintă momentul de timp la care setul de date
necesitând unitatea funcŃională A a fost aplicat la intrare. Deci,
AA = (3,0) , AB = ( 4,2,1,0) , BA = (2,1,0) , BB = (3,2,0)
Vectori de coliziune şi matrice de coliziune. Vectorii de coliziune se
determină în acelaşi mod ca şi pentru un sistem pipeline static; 0 indică o
latenŃă permisă, iar 1 indică o latenŃă interzisă. Pentru exemplul precedent,
vectorii de coliziune sunt următorii:
C AA = (01001) C BA = (00111)
C AB = (10111) C BB = (01101)
Vectorii de coliziune pentru unitatea funcŃională A formează matricea de
coliziune M A :
C 
M A =  AA 
C AB 
Vectorii de coliziune pentru unitatea funcŃională B formează matricea de
coliziune M B :
C 
M B =  BA 
C BB 
Pentru vectorii de coliziune din exemplul precedent, matricele de
coliziune sunt următoarele:
01001 00111
MA =   MB =  
10111 01101
Diagrama stărilor. Diagrama stărilor pentru un sistem pipeline dinamic
este construită în acelaşi mod ca şi pentru un sistem pipeline static. Diagrama
rezultată este mult mai complexă decât diagrama stărilor unui sistem pipeline
static, datorită numărului mai mare de coliziuni potenŃiale.
Ca un exemplu, considerăm diagrama stărilor din figura 9.27. Pentru
început, ne referim la matricea de coliziune M A . Există două tipuri de coliziuni:
A cu A (vectorul de sus) sau A cu B (vectorul de jos). Dacă se alege prima
latenŃă permisă pentru vectorul C AA (în acest caz, 1), întreaga matrice este
deplasată la dreapta cu o poziŃie, în poziŃiile din stânga fiind introduse zerouri.
Apoi se execută o operaŃie SAU logic între noua matrice şi matricea de
coliziune iniŃială M A , deoarece latenŃele interzise originale pentru unitatea
funcŃională A trebuie luate în considerare şi în continuare.

Fig. 9.27

Dacă se alege prima latenŃă permisă pentru vectorul C AB din matricea


M A (în acest caz, 3), întreaga matrice este deplasată la dreapta cu trei poziŃii,
în poziŃiile din stânga fiind introduse zerouri. Apoi se execută o operaŃie SAU
logic între noua matrice şi matricea de coliziune iniŃială pentru unitatea
funcŃională B , deoarece coliziunile originale pentru unitatea funcŃională B sunt
încă posibile şi trebuie luate în considerare. OperaŃia de deplasare şi operaŃia
SAU logic continuă până când se iau în considerare toate latenŃele posibile şi
diagrama stărilor va fi completă.
Cap. 10. Arhitectura Intel (IA-32)

10.1. Procesoarele Intel


Firma Intel a fost cea care a proiectat primul procesor, în anul 1969. Acesta a
fost procesorul 4004, de 4 biŃi. Au urmat apoi procesoarele de 8 biŃi 8080 şi 8085.
Primul procesor al familiei 80x86, numită şi familia cu arhitectura Intel (IA - Intel
Architecture) a fost însă procesorul I8086, care a apărut în 1978, fiind urmat în
scurt timp de o versiune mai ieftină pentru sisteme mai simple, procesorul I8088.
Programele scrise pentru aceste procesoare puteau fi executate fără modificări şi
pe ultimele procesoare ale familiei 80x86.

10.2. Prezentare generală a procesoarelor Intel

I8086 şi I8088
Procesorul I8086 are registre de 16 biŃi, o magistrală externă de date de 16
biŃi şi o magistrală de adrese de 20 de biŃi, astfel că spaŃiul de adresare este de
maxim 1 Mocteti. Procesorul I8088 este identic, cu excepŃia faptului că magistrala
externă de date este de 8 biŃi. Aceste procesoare au introdus conceptul de
segmentare a memoriei: memoria este împărŃită în zone numite segmente de
maxim 64 KocteŃi, iar cele patru registre de segment pot păstra adresele de bază
ale segmentelor active. Aceste procesoare pot funcŃiona numai în modul real, care
este un mod uniproces, în care se execută un singur proces (program sau task) la
un moment dat. Din punct de vedere al programatorului, cele două procesoare
sunt identice, cu excepŃia faptului că I8086 va prelucra datele într-un mod mai
eficient dacă acestea sunt aliniate la adrese de cuvânt (adrese pare).

I80186 şi I80188
Procesoarele I80186 şi I80188 sunt versiuni îmbunătăŃite ale procesoarelor
I8086, respectiv I8088. Au fost adăugate noi instrucŃiuni şi anumite instrucŃiuni vechi
au fost optimizate pentru creşterea vitezei. Aceste procesoare conŃin în aceeaşi
capsulă şi circuite suplimentare: un generator de tact, un controler DMA cu două
canale, trei numărătoare/temporizatoare programabile şi un controler de
întreruperi, care poate gestiona patru surse externe de întrerupere.

10.3. Procesorul I80286


Procesorul I80286 are două moduri de lucru: modul real şi modul protejat.
Setul de instrucŃiuni al procesorului I8086 a fost lărgit cu instrucŃiuni specifice
modului de lucru protejat, ce oferă suportul necesar implementării unor sisteme
de operare multitasking, cum este OS/2. Intr-un asemenea sistem de operare,
unitatea centrală de prelucrare serveşte pe rând mai multe taskuri, (procese),
astfel încât utilizatorul are impresia că sunt rulează mai multe programe
simultan.
I80286 are magistrala de date de 16 biŃi la fel ca şi I8086, dar în schimb
are magistrala de adrese de 24 de biŃi, cu care poate adresa în mod direct un
spaŃiu de memorie de 16 MocteŃi. De asemenea, are în compunere o unitate de
gestiune a memoriei, prin intermediul căreia poate adresa o memorie virtuală de
1Gocteti. La fel ca şi I8086, poate adresa un spaŃiu de I/E de 64 Kporturi de 8
biŃi sau 32 Kporturi de 16 biŃi.
I80286 lucrează în conjuncŃie cu coprocesorul matematic I80287, care,
spre deosebire de I8087, poate asigura asistenŃă procesorului I80286, în ce
priveşte efectuarea calculelor matematice şi în modul protejat.
I80286 este procesorul în jurul căruia au fost realizate calculatoarele IBM
AT sau compatibile, folosind o magistrală de tip ISA - Industrial Standard
Architeclure.

10.3.1 Arhitectura internă a procesorului I80286


Procesorul I80286 este compus din 4 unităŃi independente care lucrează
în paralel:
- unitatea de interfaŃă cu magistrala - BU (Bus Unit);
- unitatea instrucŃiunilor - IU (Instruction Unit);
- unitatea de execuŃie - EU (Execution Unit);
- unitatea de adresare - AU (Adress Unit).

Fig. 10.1

Unitatea de interfaŃă cu magistrala (BU) controlează toate operaŃiile pe care


procesorul le efectuează pe magistrală, generând adresele datelor ce trebuie citite
sau memorate şi semnalele de control pentru memorie şi porturile de l/E. BU
transferă date între memorie sau porturi şi procesor, la cererea unităŃii de execuŃie.
Dacă BU nu are o astfel de cerere din partea unităŃii de execuŃie, va aduce din
memorie următoarea instrucŃiune în secvenŃă, pe care o plasează într-o coadă
de instrucŃiuni. Aceasta presupune că instrucŃiunile se execută în secvenŃă, una
după alta, în ordinea în care apar în memorie. Dacă survine o ruptură în secvenŃă
(de exemplu o instrucŃiune de salt), coada de instrucŃiuni este resetată şi se
reîncepe citirea instrucŃiunilor cu anticipaŃie de la noua adresă. Coada de
instrucŃiuni este o memorie internă de 6 octeŃi, care memorează codurile
instrucŃiunilor înainte de a fi utilizate de unitatea instrucŃiunilor. Acest mecanism de
citire cu anticipaŃie a instrucŃiunilor permite eliminarea timpilor morŃi de citire din
memorie a instrucŃiunii următoare.
Unitatea instrucŃiunilor (IU) primeşte instrucŃiuni din coada de instrucŃiuni, le
decodifică, şi le plasează într-o altă coadă, cu lungimea de 3 octeŃi, numită coada
instrucŃiunilor decodificate.
Unitatea de execuŃie (EU) execută instrucŃiunile preluate din coada de
instrucŃiuni decodificate şi face apel la unitatea de interfaŃă cu magistrala (BU),
pentru toate transferurile de date cu memoria sau cu porturile de I/E. Unitatea de
execuŃie conŃine o unitate aritmetico-logică -Arithmetical Logical Unit, destinată
efectuării calculelor aritmetice şi logice care intervin în execuŃia instrucŃiunilor. UAL
efectuează calculele manevrând regiştrii generali şi operanzi; instrucŃiunilor, şi
totodată gestionează indicatorii de condiŃie şi stare conŃinuŃi în registrul
indicatorilor de condiŃie şi stare.
Unitatea de adresare (AU) asigură gestiunea memoriei, mecanismele de
protecŃie a memoriei şi translatarea adreselor virtuale (logice) în adrese fizice, care
sunt apoi utilizate de unitatea de interfaŃă cu magistrala.
Procesorului I80286 are o arhitectură de tip pipeline cele 4 unităŃi lucrând în
paralel, astfel că, spre exemplu, în timp ce unitatea de execuŃie este ocupată cu
execuŃia instrucŃiunii curente, unitatea de interfaŃă cu magistrala încarcă
instrucŃiunea următoare, sau transferă în memorie rezultatul instrucŃiunii executate
anterior. In acelaşi timp, unitatea instrucŃiunilor decodifică următoarea
instrucŃiune de executat, pe care o pune în coada de instrucŃiuni decodificate,
pentru a fi preluată de unitatea de execuŃie.

10.3.2. Registrele procesorului I80286


Procesorul I80286 conŃine 15 regiştri interni de 16 biŃi. Aceşti regiştri pot fi
grupaŃi în 5 categorii astfel:
- regiştri generali;
- regiştri indicatori de adresă şi index;
- regiştri de segment;
- registrul pointerului de instrucŃiuni;
- regiştri de control şi stare;
Regiştri generali AX, BX, CX, DX sunt utilizaŃi în majoritatea instrucŃiunilor
aritmetice şi logice şi pot fi folosiŃi atât ca regiştri pe 16 biŃi, cât şi ca regiştri pe 8
biŃi. De exemplu, registrul AX, pe 16 biŃi, este compus din registrul AH ce conŃine
cei 8 biŃi mai semnificativi din AX şi din registrul AL, ce conŃine cei mai puŃin
semnificativi 8 biŃi din AX.
Figura 10.2. Regiştri procesorului I80286
.
Regiştri SP şi BP sunt denumiŃi regiştri indicatori de adresă (sau pointer) şi
sunt folosiŃi numai ca regiştri pe 16 biŃi. Registrul SP conŃine deplasamentul în
octeŃi al vârfului stivei, faŃă de începutul segmentului de stivă curent. De cele mai
multe ori şi registrul BP conŃine un deplasament în segmentul de stivă curent.
Registrele BX şi BP mai sunt denumite uneori şi registre bază, fiind desemnate să
conŃină adresa de bază a unei structuri de date din memorie, cum ar fi adresa de
bază a unui tablou. Registrele index SI şi DI sunt registre numai pe 16 biŃi şi conŃin
de regulă un index, care se incrementează sau se decrementează pe măsură ce se
examinează o structură de date. Sunt folosite în special de instrucŃiunile de
prelucrare a şirurilor de caractere.
SpaŃiul de memorie adresabil de I80286 este împărŃit în segmente logice cu
dimensiunea maximă de 64 Kocteti. In general, programele sunt constituite din mai
multe segmente (module) de cod, date, sau stivă, numai o parte din acestea fiind
utilizate la un moment dat. Procesorul I80286 permite unui program să aibă acces
la 4 segmente simultan. Registrele de segment sunt utilizate pentru a identifica cele
4 segmente curente, fiecare registru fiind specializat pentru un anumit tip de
segmente. Registrele de segment sunt:
- CS - registru de segment de cod
- DS - registru de segment de date
- SS - registru de segment de stivă
- ES - registru de segment de date suplimentare
Toate registrele de segment au 16 biŃi. Registrele de segment sunt
accesibile prin program. ConŃinutul registrelor de segment este interpretat diferit
în funcŃie de modul de lucru al procesorului: real sau virtual.
In modul de lucru real, care este modul de lucru compatibil I8086, registrele de
segment conŃin cei mai semnificativi 16 biŃi ai adresei de bază a segmentelor de
memorie. Pentru a face acces la o dată din memorie, procesorul trebuie să
cunoască adresa de bază a segmentului în care se află data ce se doreşte a fi
accesată (adresa primului octet din segment), precum şi adresa relativă în segment
a datei respective, sau un deplasament (offset), ce reprezintă distanŃa în octeŃi
faŃă de începutul segmentului.
Astfel, în modul real, CS conŃine cei mai semnificativi 16 biŃi ai adresei de
bază a segmentului de cod curent, DS conŃine cei mai semnificativi 16 biŃi ai
adresei de bază a segmentului de date curent ş.a.m.d.
Segmentele de cod ale unui program conŃin instrucŃiunile programului.
Segmentele de date (referite de DS şi ES) conŃin date sau variabile pentru
programul ce se execută.
Segmentele de stivă, referite prin intermediul registrului de segment SS,
conŃin zone de memorie organizate pe principiul stivei.
In modul de lucru protejat, registrele de segment conŃin un index într-o
tabelă de descriptori a segmentelor. Acest index indică către o intrare (fişă) a unui
segment. O intrare în această tabelă conŃine un descriptor de segment, care
cuprinde:
- adresa de bază a segmentului;
- dimensiunea segmentului;
- drepturile de acces la segmentul respectiv etc.
In concluzie, registrul de segment indică o intrare într-o tabelă de
descriptori a segmentelor, unde se găseşte adresa de bază a segmentului în
care se doreşte a se efectua accesul. Din această cauză, în modul de lucru
protejat, registrele de segment mai sunt denumite şi selectori de segment,
deoarece selectează un segment dintr-o tabelă ce descrie mai multe segmente.
Registrul pointer de instrucŃiuni - IP - este un registru de 16 biŃi, care
conŃine adresa relativă în raport cu începutul segmentului de cod curent, a
următoarei instrucŃiuni ce trebuie executată. Registrul IP este transparent la
nivelul programatorului, el fiind actualizat automat după citirea instrucŃiunii
curente, astfel încât să indice deplasamentul următoarei instrucŃiuni de executat.
Registrul indicatorilor de stare şi control - F - conŃine indicatorii de stare şi
control ai procesorului. Indicatorii de stare, în număr de 6, sunt poziŃionaŃi de
unitatea aritmetico-logică în urma execuŃiei unei instrucŃiuni şi reflectă anumite
stări ale rezultatului unei operaŃii aritmetice sau logice. Unele instrucŃiuni ale
procesorului testează aceşti indicatori şi, în funcŃie de cum sunt poziŃionaŃi (în 0
sau în 1), se execută anumite acŃiuni specifice.

10.3.3. Modurile de lucru ale procesorului I80286


Modul de lucru real este modul compatibil I8086, asigurând posibilitatea
rulării pe sisteme cu I80286 a programelor dezvoltate anterior pe procesoarele
8086/8088. Singurul avantaj este faptul că în modul real viteza de lucru este mai
mare.
In modul de lucru real memoria este adresată folosind un pointer de 32 de
biŃi, format din două componente.
- un selector de segment de 16 biŃi, care indică segmentul de memorie
dorit, aflat într-unul din registrele de segment, şi
- un deplasament (offset) de 16 biŃi, care indică octetul dorit în cadrul
segmentului.
Memoria fizic adresabilă în modul real este de 1Moctet, I80286 folosind
pentru adresarea memoriei numai liniile de adresă A0-A19 şi ignorând liniile A20-
A23, care sunt Ńinute în zero. Memoria de 1Moctet este împărŃită în mai multe
segmente logice, un segment logic fiind format din locaŃii adiacente de memorie,
şi având dimensiunea maximă de 64 Kocteti. Fiecărui segment îi corespunde o
adresă de bază, care este adresa locaŃiei de început a segmentului. Toate
segmentele încep la o adresă multiplu de 16. Segmentele pot fi adiacente,
disjuncte, parŃial sau total suprapuse. O locaŃie fizică poate să aparŃină unuia
sau mai multor segmente.
Adresa fizică pe 20 de biŃi a unei locaŃii de memorie se calculează
înmulŃind selectorul de segment, aflat într-unui din registrele de segment, cu 16
(ceea ce înseamnă de fapt deplasarea cu 4 poziŃii spre stânga), la care se
adună deplasamentul (figura 10.3). Deci, conŃinutul registrului de segment este
interpretat ca fiind cei mai semnificativi 16 biŃi ai adresei de bază a segmentului.

Fig. 10.3

InstrucŃiunile unui program se găsesc într-unul din segmentele de cod ale


programului. Adresa fizică a instrucŃiunii care urmează să se execute, se obŃine
folosind registrul CS, ce conŃine adresa de bază a segmentului de cod curent şi
registrul IP ca deplasament în segmentul de cod indicat de CS.
Modul de lucru protejat oferă mecanisme de management şi protecŃie a
memoriei şi un set de instrucŃiuni asociate, procesorul I80286 lucrând în acest
mod la întreaga sa capacitate. Pentru a intra în modul de lucru protejat, trebuie
setat un anumit bit din registrul denumit MSW (Machine Status Word)
Revenirea în modul real se face numai prin iniŃializarea procesorului.
In modul de lucru protejat se poate adresa un spaŃiu de memorie de
16MocteŃi, utilizând liniile de adresă A0-A23, utilizatorul având la dispoziŃie şi un
spaŃiu de memorie virtual de 1GocteŃi/task. Pentru adresarea memoriei, se
utilizează un pointer de 32 de biŃi, constituit dintr-un selector de 16 biŃi şi un
offset de 16 biŃi. Selectorul reprezintă un index (deplasament) într-o tabelă, de
unde se obŃine adresa de bază, pe 24 de biŃi, a segmentului. La această adresă
de bază se adună offset-ul, obŃinându-se adresa fizică pe 24 de biŃi.

10.3.4. Gestiunea şi protecŃia memoriei la procesorul I80286.


In modul de lucru protejat, programatorii folosesc acelaşi set de instrucŃiuni
(mai puŃin câteva instrucŃiuni specifice modului protejat), moduri de adresare şi
tipuri de date ca şi în modul real. Ceea ce deosebeşte fundamental modul protejat
de modul real sunt facilităŃile legate de managementul memoriei, protecŃie şi
multitasking, care constituie suportul dezvoltării şi implementării unor sisteme de
operare evoluate.
Mecanismul de memorie virtuală dă iluzia programatorului că memoria
principală (care poate fi adresată în mod direct de procesor) este foarte mare.
Practic, memoria calculatorului nu mai este "văzută" ca fiind organizată pe două
nivele: memorie principală şi memorie secundară. Întreaga memorie a calculatorului
este organizată astfel pe un singur nivel, numindu-se memorie virtuală.
Programatorul foloseşte pentru adresarea memoriei adrese virtuale, o adresă
virtuală specificând o locaŃie din memoria virtuală. Totalitatea adreselor virtuale
formează spaŃiul de adrese virtual. SpaŃiul de adrese virtual este împărŃit în
segmente de lungime variabilă. Pentru a adresa o locaŃie în spaŃiul de adresă
virtual, se folosesc două componente: o componentă care specifică segmentul
din memoria virtuală şi o componentă care specifică deplasamentul în segment
al locaŃiei respective.
Dacă segmentul referit nu se află în memoria principală, se generează o
întrerupere a activităŃii şi se va aduce segmentul respectiv din memoria
secundară în memoria principală, după care se revine din întrerupere, accesând
locaŃia respectivă. Deci, prin acest mecanism de adresare virtuală,
programatorul este degrevat de sarcina gestiunii memoriei. El nu trebuie să ştie
dacă un segment se află în memoria principală sau în memoria secundară, dacă
se află în memoria secundară să aducă segmentul în memoria principală etc,
aceste sarcini fiind preluate de sistemul de operare, programatorul având la
dispoziŃie un spaŃiu de adresă virtual mult mai mare decât spaŃiul adreselor
fizice (dimensiunea memoriei principale), dar cu care poate lucra la fel ca şi
când ar dispune de o memorie principală foarte mare. Pentru a Ńine evidenŃa
segmentelor, se construieşte o tabelă a segmentelor în memoria principală, în
care sunt trecute toate informaŃiile despre fiecare segment din memoria virtuală:
adresa de bază, dimensiunea segmentului, dacă este sau nu rezident în
memoria principală, drepturi de acces etc.
Încărcarea unui segment din memoria secundară în memoria principală se
face în locul unui alt segment sau al mai multor segmente, care vor fi scoase din
memoria principală şi transferate în memoria secundară, conform unui anumit
algoritm. De exemplu, va fi scos din memoria principală segmentul (sau
segmentele) cel mai puŃin recent utilizat, sau o altă strategie poate propune
scoaterea segmentului cel mai puŃin utilizat (cu numărul cel mai mic de accese
la segment).
NoŃiunea de protecŃie a memoriei desemnează totalitatea controalelor
efectuate de sistemul de operare în scopul asigurării utilizării corecte a
informaŃiei, împiedicând propagarea erorilor de programare, ce pot duce la
alterarea, distrugerea sau pierderea informaŃiei. Pentru implementarea
mecanismelor de protecŃie, fiecare task se execută cu un anumit nivel de
privilegiu. Procesorul I80286 recunoaşte 4 niveluri de privilegiu şi nu permite ca
un task cu un anumit nivel de privilegiu să acceseze date la un nivel mai
privilegiat. Aceasta permite detectarea anumitor erori, uşurând dezvoltarea şi
întreŃinerea programelor.
Conceptul de task este de asemenea important în gestiunea memoriei
Task-ul se defineşte la nivel de execuŃie, ca reprezentând execuŃia unui
program legată de contextul fiecărui utilizator. De exemplu, dacă mai mulŃi
utilizatori din sistem utilizează acelaşi program de editare, se va crea pentru
fiecare utilizator un task separat, fiecare task cu propriul său context. Fiecărui
task i se ataşează un spaŃiu de adresare, numit spaŃiu de adresare local. In
acelaşi timp, toate taskurile trebuie să poată avea acces la serviciile sistemului
de operare, la biblioteci etc. Se defineşte astfel un spaŃiu de adresare global,
care este partajabil de către toate taskurile. In modul de lucru protejat, taskurile
lucrează numai cu adrese virtuale, neavând acces la adresele fizice generate de
procesor.
O adresă care apare într-un program are două componente: un selector
de segment de 16 biŃi şi un deplasament de 16 biŃi. Această adresă (sau
pointer) de 32 de biŃi se transformă diferit în adresă fizică în funcŃie de modul de
lucru al procesorului, real sau protejat. In modul de lucru protejat selectorul de
segment are următoare structură :

Fig.10.4

Câmpul RPL - Requested Priviledge Level - specifică nivelul de prioritate


al selectorului. Bitul TI specifică spaŃiul de adresare local dacă Tl=1, sau spaŃiul
de adresare global dacă TI=0. BiŃii 3-15 ai selectorului specifică un index în
tabela locală de descriptori a segmentelor dacă Tl=1, sau un index în tabela
globală de descriptori dacă TI=0. Este permis astfel accesul la 8192 (213)
segmente locale şi 8192 segmente globale. łinând cont de faptul că un
segment are dimensiunea maximă de 64 Kocteti, rezultă o capacitate de
adresare virtuală de 1Goctet pe task (2x213x64 Kocteti). Indexul reprezintă,
astfel, un pointer într-o tabelă din memorie, unde se găseşte adresa de bază pe
24 de biŃi a segmentului în care se doreşte accesul.
Mecanismul de protecŃie, implementat hard, poate localiza, izola şi preveni
un număr mare de erori de program. Toate testele referitoare la protecŃie se
realizează în paralel cu execuŃia programului, ceea ce nu afectează
performanŃele sistemului. Se poate păstra astfel funcŃionarea corectă a
sistemului, atunci când anumite programe încearcă să efectueze unele operaŃii
interzise. Principalele tipuri de protecŃie implementate de I80286 sunt:
- izolarea software-ului de sistem de software-ul de aplicaŃie al
utilizatorului,
- izolarea utilizatorilor între ei,
- verificarea accesului la fiecare din obiectele definite în mod protejat
(segmente, nivele, taskuri, etc.).
Primul tip de protecŃie se realizează prin utilizarea a 4 niveluri de prioritate,
nucleul sistemului de operare şi programele de sistem executându-se pe cele
mai prioritare niveluri, în timp ce programele utilizatorilor se vor executa pe
nivelurile mai puŃin prioritare. O eroare de program a unui utilizator nu va afecta,
astfel, sistemul de operare.
Prin izolarea utilizatorilor între ei, se previne situaŃia când o eroare a unui
program utilizator poate afecta buna funcŃionare a altui program utilizator, erori
care sunt greu de depistat.
In ce priveşte al treilea tip de protecŃie, procesorul I80286 face o verificare
a folosirii corespunzătoare a obiectelor la fiecare acces la memorie. De
exemplu, segmentele de date nu pot fi executate, segmentele de cod nu pot fi
modificate etc.
InformaŃia utilizată de mecanismul de protecŃie se referă la:
- tipul segmentului;
- atributele segmentului (sau drepturile de acces);
- nivelul de prioritate;
- limita segmentului.
Mecanismul de protecŃie acŃionează de două ori:
- la încărcarea registrului de segment care va selecta un segment şi
- la fiecare acces în segmentul selectat.
La încărcarea registrelor de segment se testează dacă descriptorul este
valid (indexul din registrul de segment nu pointează în afara tabelei cu
descriptori), dacă descriptorul este accesibil de pe nivelul de prioritate de pe
care se execută programul, dacă segmentul indicat de descriptor este prezent în
memorie, dacă tipul segmentului corespunde cu registrul de segment.
In cazul unui acces în cadrul segmentului referit de un registru de
segment, se verifică dacă nu s-a depăşit limita segmentului şi dacă accesul
corespunde tipului de segment. De exemplu, într-un segment de date cu
atributul read only sau în segmentele de cod nu este permisă scrierea.
Orice violare a unei protecŃii va determina apariŃia unei excepŃii. ExcepŃiile,
ca şi întreruperile, sunt modalităŃi de transfer al controlului, dar care apar ca
rezultat direct al execuŃiei instrucŃiunilor programului, spre deosebire de
întreruperi care apar independent de execuŃia normală sau anormală a
programului curent. O excepŃie apare în condiŃiile în care execuŃia unei
instrucŃiuni nu se poate termina normal. Deşi cauzele lor diferă, întreruperile şi
excepŃiile utilizează acelaşi mod de transfer al controlului.
Tot o manifestare a mecanismului de protecŃie este şi separarea spaŃiilor
de adresă între utilizatori. Fiecare task utilizator are o tabelă locală cu
descriptori, conŃinutul tabelei locale curente fiind schimbat la fiecare comutare
de task.

10.5.5. Întreruperile procesorului I80286


Întreruperile sunt modalităŃi de transfer al controlului. La apariŃia unei
întreruperi, procesorul întrerupe execuŃia programului curent şi execută în
continuare rutina de tratare a întreruperii respective, până când întâlneşte
instrucŃiunea IRET, care este instrucŃiunea de revenire din întrerupere. După
execuŃia instrucŃiunii IRET, procesorul reia execuŃia programului întrerupt de la
instrucŃiunea imediat următoare instrucŃiunii ce se executa în momentul apariŃiei
întreruperii.
Fiecare rutină de întrerupere are asociată o adresă, care este adresa
primei instrucŃiuni din cadrul rutinei de tratare a întreruperii. Orice rutină de
întrerupere se termină cu instrucŃiunea IRET.
Adresele tuturor rutinelor de tratare a întreruperilor sunt trecute într-o
tabelă din memorie.
In modul real sunt rezervaŃi pentru această tabelă primii 1024 de octeŃi din
memorie (de la 00000H la 003FFH ), ce memorează o tabelă cu 256 de intrări,
numită tabela vectorilor de întrerupere. Deci, în modul real sunt disponibile 256 de
întreruperi, fiecare intrare în tabelă (de 4 octeŃi) conŃinând adresa rutinei de tratare
a întreruperii corespondente.
In modul de lucru protejat, sunt disponibile de asemenea 256 de întreruperi,
dar rutinele de tratare a întreruperilor sunt accesate prin intermediul porŃilor.
Adresele rutinelor de întrerupere sunt trecute într-o tabelă, numită tabela
descriptorilor de întrerupere - IDT (Interrupt Descriptor Table ), accesată prin
intermediul registrului IDTR - Interrupt Descriptor Table Regisler, ce conŃine
adresa de bază şi limita tabelei IDT. Fiecare intrare în tabela IDT va conŃine 8
octeŃi, câŃi sunt necesari pentru un descriptor de poartă, dimensiunea tabelei fiind
ajustată cu ajutorul câmpului Limită din IDTR.
In cazul apariŃiei unei întreruperi în modul real, procesorul întrerupe programul
curent, salvează registrele în stivă, serveşte întreruperea, după care restaurează
registrele din stivă, continuând programul întrerupt. In modul protejat, nu este
suficient să se salveze numai registrele, ci se salvează întreaga stare a taskului
(registrele plus alte informaŃii ) într-un segment de sistem, numit segment de stare
a taskului - TSS (Task State Segment).
Mai precis, la sosirea unei întreruperi (interne sau externe) în modul real,
procesorul efectuează următoarele:
- salvează în stivă registrul indicatorilor de condiŃie şi stare, CS-ul şi IP-
ul instrucŃiunii următoare, în această ordine;
- resetează indicatorul de stare IF. Dacă IF- Interrupt Flag este poziŃionat pe 1
procesorul recunoaşte cererile de întrerupere externă;
- se execută instrucŃiunile din rutina de întrerupere, până când se
întâlneşte instrucŃiunea IRET;
- la întâlnirea instrucŃiunii IRET se revine din întrerupere, restaurând din stivă
IP, CS şi registrul indicatorilor de condiŃie şi stare.
Stiva trebuie să se găsească în aceeaşi stare ca la apariŃia întreruperii. Este
indicat ca la începutul unei rutine de întrerupere să se salveze registrele
procesorului în stivă, urmând a fi restaurate înainte de execuŃia instrucŃiunii IRET.
Procesorul I80286 are trei tipuri de întreruperi:
- întreruperi hardware;
- întreruperi software;
- excepŃii.
Întreruperile hardware se mai numesc şi întreruperi externe, întreruperile
software şi excepŃiile fiind numite şi întreruperi interne.
Întreruperile hardware sunt generate de dispozitive hardware şi pot fi la
rândul lor de două tipuri:
- întreruperi mascabile şi
- întreruperi nemascabile.
Întreruperile hardware mascabile sunt generate prin aplicarea unui "1" logic
pe intrarea (pinul) INTR a procesorului. Procesorul va întrerupe programul curent
şi va executa o rutină de tratare a întreruperii, numai dacă indicatorul IF din registrul
indicatorilor de condiŃie şi stare este 1. Dacă IF=0, procesorul continuă nestingherit
execuŃia programului curent. Indicatorul IF poate fi poziŃionat în 0 sau 1 prin
program. Prin invalidarea întreruperilor externe mascabile, poziŃionând IF în zero, se
previne întreruperea unor secvenŃe critice de program, care nu pot, fi întrerupte.
Dacă întreruperile externe sunt validate, după execuŃia instrucŃiunii curente,
procesorul va efectua recunoaşterea întreruperii, pentru a afla adresa rutinei de
tratare a întreruperii. Majoritatea dispozitivelor periferice (imprimanta, hard disk,
tastatură etc.) folosesc mecanismul de întrerupere al procesorului. De exemplu,
tastatura va întrerupe procesorul atunci când este apăsată o tastă. Prin rutina de
întrerupere corespunzătoare tastaturii, procesorul va prelua codul tastei apăsate,
după care continuă programul întrerupt. Deoarece există mai multe dispozitive
hardware care pot genera întreruperi în acelaşi timp, este necesară existenŃa unui
dispozitiv, numit controler de întreruperi, care permite dispozitivelor hardware să
întrerupă procesorul conform unei ordine de prioritate. Dacă există mai multe cereri
de întrerupere din partea unor dispozitive hardware, controler de întreruperi va
pune 1 pe linia INTR, întrerupând procesorul, după care, atunci când procesorul
efectuează recunoaşterea întreruperii, va depune pe magistrala de date vectorul de
întrerupere al dispozitivului hardware cel mai prioritar. După citirea vectorului de
întrerupere de pe magistrala de date, procesorul va prelua din intrarea în tabela
vectorilor de întrerupere sau din IDT, adresa rutinei de tratare a întreruperii
corespunzătoare dispozitivului hardware ce a generat întreruperea.
Întreruperile externe nemascabile sunt generate prin aplicare unui 1 logic
pe intrarea NM (NeMascable Interrupt) a procesorului, aceste întreruperi fiind
asociate cu apariŃia unor evenimente deosebite, cum ar fi căderea tensiunii de
alimentare, când procesorul trebuie să execute anumite acŃiuni de urgenŃă.
Aceste întreruperi sunt tratate imediat ce apar, nefiind posibilă invalidarea
lor. Adresa rutinei de tratare a întreruperilor nemascabile se află în intrarea
numărul 2 din tabela vectorilor de întrerupere (sau IDT), procesorul transferând
automat controlul la această rutină, imediat ce recepŃionează un 1 logic pe
intrarea NM1.
Întreruperile software sunt generate prin execuŃia unei instrucŃiuni INT n ,
unde n este un număr întreg cuprins între 0 şi 255. După execuŃia acestei
instrucŃiuni, procesorul va transfera controlul la rutina de întrerupere a cărei
adresă se găseşte în intrarea cu numărul n , din tabela vectorilor de întrerupere
sau tabela descriptorilor de întrerupere. De exemplu, instrucŃiunea INT 2 va
executa aceeaşi rutină de întrerupere care se execută şi în cazul apariŃiei unei
întreruperi externe nemascabile.
ExcepŃiile sunt întreruperi generate de către procesor însuşi. In tratarea
excepŃiilor, procesorul nu face distincŃie între o excepŃie şi o întrerupere
software cu numărul egal cu cel al excepŃiei respective.
Exemple de excepŃii:
- division by zero - procesorul generează automat o întrerupere cu
numărul 0 (deci la fel ca şi instrucŃiunea INT 0), atunci când instrucŃiunile de
împărŃire DIV şi IDIV încearcă să efectueze o împărŃire la zero.
- overflow detection - dacă indicatorul OF este setat în urma unei
instrucŃiuni, procesorul execută o întrerupere cu numărul 4.
- single step - procesorul execută întreruperea numărul 1, după fiecare
instrucŃiune executată, dacă indicatorul TF este setat. TF este indicatorul de
urmărire (Trap Flag) care controlează modul de funcŃionare al procesorului.
Dacă TF este setat procesorului intră în modul de funcŃionare pas cu pas utilizat
pentru depanare. In acest mod, după execuŃia unei instrucŃiuni se generează o
întrerupere internă, ceea ce dă posibilitatea investigării rezultatului execuŃiei
instrucŃiuni.
- coprocessor non prezent - procesorul execută automat o întrerupere cu
numărul 7, dacă unitatea instrucŃiunilor detectează o instrucŃiune pentru
coprocesorul matematic şi acesta nu este prezent.

10.4. Procesorul I80386


Procesorul I80386 a introdus în cadrul arhitecturii Intel registre de 32 de biŃi,
utilizate atât pentru păstrarea datelor cât şi pentru adresare. Pentru compatibilitate
cu procesoarele anterioare, aceste registre s-au obŃinut prin extinderea registrelor
de 16 biŃi, fiind posibilă utilizarea în continuare a vechilor registre, acestea
constituind jumătatea de ordin inferior a registrelor de 32 de biŃi. Aceste facilităŃi au
contribuit la creşterea remarcabilă a vitezei de lucru pentru procesor I80386.
Extinderea magistralei de adrese la 32 de biŃi a dat posibilitatea procesorului
I80386 să adreseze în mod direct o memorie de 4 GocteŃi şi o memorie virtuală
de 64TocteŃi pe task.
SpaŃiul de intrare/ieşire este limitat totuşi la 64 Kporturi, la fel ca la
procesorul I80286, în schimb pe lâng ă porturi de 8 sau 16 biŃi, I80386 poate
accesa şi porturi de 32 biŃi.
Procesorul 180386 are 3 moduri de lucru: real, protejat şi virtual 8086. In
modul real, 80386 poate adresa o memorie de 1MocteŃi, lucrând ca un 8086 mult
mai rapid. Modul protejat I80386 este compatibil cu modul protejat I80286, dar
datorită spaŃiului de memorie mult mai mare (4GocteŃi în loc de 16MocteŃi),
descriptorii de segmente şi porŃi au fost puŃin modificaŃi, păstrându-se
compatibilitatea. SpaŃiul de adresă virtual, de 64TocteŃi, este împărŃit în segmente cu
dimensiunea maximă de 4GocteŃi. Deci, în modul de lucru protejat I80386,
dimensiunea maximă a unui segment nu mai este limitată la 64Kocteti. In modul de
lucru virtual 8086, I80386 lucrează ca un procesor 8086, beneficiindu-se în schimb
de toate facilităŃile de management şi protecŃie oferite de I80386.
Procesorul I80386 a introdus de asemenea mecanismul de paginare ca
metodă de gestiune a memoriei virtuale, cu dimensiunea fixă de 4 KocteŃi a
paginilor de memorie. Paginarea a asigurat o eficienŃă mai ridicată comparativ cu
utilizarea segmentelor, metoda fiind complet transparentă pentru programele de
aplicaŃii, fără o reducere semnificativă a vitezei de execuŃie. In plus, posibilitatea
definirii segmentelor având dimensiunea maximă a spaŃiului adreselor fizice de 4
GocteŃi, împreună cu paginarea, au permis introducerea modelului protejat de
adresare liniară în cadrul arhitecturii, în care este necesară o singură componentă
a adresei pentru accesul la întregul spaŃiu de adresare al memoriei.
InstrucŃiunile originale au fost extinse cu noi forme care utilizează operanzi şi
adrese de 32 de biŃi şi au fost introduse instrucŃiuni complet noi, ca de exemplu
instrucŃiuni pentru operaŃii la nivel de bit.
Procesorul 80386 a fost primul din cadrul familiei 80x86 care a utilizat o formă
mai avansată de prelucrare paralelă. Arhitectura acestui procesor cuprinde un
număr de şase unităŃi care funcŃionează în paralel. Acestea sunt următoarele:
1. Unitatea de interfaŃă cu magistrala, care realizează accesul la memorie şi
la dispozitivele de l/E;
2. Unitatea de încărcare a instrucŃiunilor, care primeşte codul instrucŃiunilor
de la unitatea de interfaŃă cu magistrala şi le depune într-o coadă de 16 octeŃi;
3. Unitatea de decodificare a instrucŃiunilor, care decodifică codul obiect al
instrucŃiunilor şi generează un microcod pentru execuŃia acestora;
4. Unitatea de execuŃie, care execută microcodul corespunzător fiecărei
instrucŃiuni;
5. Unitatea de segmentare, care translatează adresele logice în adrese
liniare şi efectuează testele necesare protecŃiei;
6. Unitatea de paginare, care translatează adresele liniare în adrese fizice,
efectuează testele necesare protecŃiei paginilor de memorie şi conŃine o memorie
cache cu informaŃii despre până la 32 de pagini cel mai recent accesate.

10.5. Procesorul I80486


Procesorul I80486 integrează pe un acelaşi cip un procesor I80386
evoluat, un coprocesor matematic I80387 mult mai puternic şi o memorie cache
de 8 KocteŃi. Poate lucra la o frecvenŃă a ceasului între 25 şi 50 MHz. I80486
execută multe instrucŃiuni ale microprocesorului 80386 într-o singură perioadă a
ceasului, fiind de trei ori mai rapid decât un 80386 lucrând la aceeaşi frecvenŃă.
Procesorul I80486 a extins posibilităŃile de execuŃie paralelă a instrucŃiunilor,
în principal prin extinderea unităŃilor de decodificare a instrucŃiunilor şi de
execuŃie ale procesorului I80386 în cinci etaje de tip pipeline, fiecare etaj operând
în paralel cu celelalte asupra a cinci instrucŃiuni aflate în diferite faze de execuŃie.
Fiecare etaj poate termina prelucrările pe care le efectuează asupra unei
instrucŃiuni într-o perioadă de ceas, astfel încât procesorul I80486 poate executa
câte o instrucŃiune în fiecare perioadă de ceas.
Adăugarea memoriei cache a condus în mod semnificativ la creşterea
numărului de instrucŃiuni care se pot executa într-o singură perioadă de ceas.
Au fost adăugaŃi de asemenea noi pini şi noi instrucŃiuni care permit
realizarea unor sisteme mai complexe: sisteme multiprocesor şi sisteme care
conŃin o memorie cache de nivel 2. Astfel pe lângă memoria cache de pe cip,
plăcile de bază ale calculatoarelor cu microprocesor I80486 au, de regulă, o
memorie cache de 256 KocteŃi, numită memorie cache secundară, care poate fi
extinsă în principiu la orice dimensiune.

Fig. 10.5.

La această memorie cache secundară, în mod normal, accesul se


realizează în două perioade de ceas.
Pentru transferarea unor cantităŃi mari de date între memorie şi procesor,
I80486 implementează un nou mod de lucru pe magistrală faŃă de I80386, numit
mod salvă sau burst mode. In modul burst, transferul unei date între memorie şi
procesor se face într-o singură perioadă de ceas, deci rata de transfer a datelor
între memorie şi procesor se dublează. lntr-un ciclu burst pot fi transferaŃi până
la 16 octeŃi consecutivi din acelaşi paragraf de memorie. Un paragraf este o
zonă de memorie de 16 octeŃi, care începe la o adresă multiplu de 16.
In figura 10.4 este prezentată structura internă a procesorului I80486. Din
memoria cache instrucŃiunile sunt transferate în coada de instrucŃiuni -
Prefetcher, care este o memorie de 32 de octeŃi (faŃă de 16 octeŃi la I80386), ce
separă operanzii imediaŃi sau deplasamentele de codul propriu-zis al
instrucŃiunii, trimiŃându-le către ALU, registre sau unitatea de segmentare, unde
vor fi prelucrate. Unitatea de decodificare decodifică instrucŃiunile, aceste
instrucŃiuni decodificate fiind folosite apoi de unitatea de control, pentru a
comanda registrele, ALU, unităŃile de segmentare şi de virgulă mobilă. Nu toate
instrucŃiunile trebuie decodificate, ca la procesoarele anterioare din familia
I80x86, unele instrucŃiuni pot fi executate direct, procesorul I80486 fiind primul
din familie care foloseşte anumite concepte şi tehnologii RISC. ComunicaŃia cu
unitatea de virgulă mobilă, ce corespunde coprocesorului I80387, se face pe o
magistrală internă de 64 de biŃi, ceea ce duce la o viteză mult mai mare de
execuŃie a calculelor matematice, faŃă de cazul în care se foloseşte o pereche
I80386/I80387, care comunică între ele pe o magistrală externă de 32 de biŃi.
Unitatea de segmentare este responsabilă de protecŃia şi gestiunea
memoriei. In plus, I80486 are patru buffere interne pentru scriere, procesorul
transferând datele de ieşire în aceste buffere, în ordine, numai atunci când
magistrala este ocupată, după care procesorul poate executa o altă activitate,
aceste buffere fiind responsabile de livrarea datelor pe magistrală, atunci când
aceasta devine disponibilă. I80386 nu este prevăzut cu aceste buffere de ieşire.
Au fost dezvoltate versiuni ale procesorului I80486 în care au fost incluse
facilităŃi pentru reducerea consumului de putere, ca şi alte facilităŃi de gestiune a
sistemului. Procesorul I80386 SL a fost de fapt primul care conŃinea asemenea
facilităŃi, acestea fiind extinse apoi la procesoarele I80486 SL şi I80486 SL
Enhanced, care au fost utilizate pentru realizarea calculatoarelor "notebook". Una
din aceste facilităŃi este noul mod de gestiune a sistemului (System Management
Mode - SMM), pentru care s-a prevăzut un pin dedicat de întrerupere. Acest mod
permite operaŃii complexe de gestiune a sistemului (ca de exemplu gestiunea
puterii consumate de diferitele subsisteme ale calculatorului), într-un mod
transparent pentru sistemul de operare şi pentru programele de aplicaŃii.
FacilităŃile numite "Stop Clock" şi "Auto Halt Powerdown" permit funcŃionarea
unităŃii centrale la o frecvenŃă redusă a tactului pentru reducerea puterii
consumate, sau chiar oprirea funcŃionării (cu memorarea stării).
2.6. Procesorul Pentium
Procesorul Pentium a adăugat o nouă linie de execuŃie de tip pipeline a
instrucŃiunilor, pentru a se obŃine performanŃe superscalare. Cele două linii de
execuŃie a instrucŃiunilor, numite u şi v, permit execuŃia a două instrucŃiuni pe
durata unei perioade de tact. Capacitatea memoriei cache L1 a fost de asemenea
dublată, fiind alocaŃi 8 KocteŃi pentru instrucŃiuni şi 8 KocteŃi pentru date. Memoria
cache pentru date utilizează protocolul MESI, care permite gestiunea memoriei
cache atât prin metoda mai eficientă "write-back"', cât şi prin metoda "write-through"
utilizată de procesorul I80486.
Procesorul Pentium utilizează predicŃia salturilor pentru a creşte
performanŃele construcŃiilor care utilizează bucle de program. S-au adăugat
extensii pentru a creşte eficienŃa modului virtual I8086 şi pentru a permite atât
pagini cu dimensiunea de 4 MocteŃi, cât şi cu dimensiunea de 4 KocteŃi.
Registrele generale sunt tot de 32 de biŃi, dar s-au adăugat căi interne de
date de 128 şi 256 de biŃi pentru a creşte viteza transferurilor interne, iar
magistrala externă de date a fost extinsă la 64 de biŃi.
Procesorului i s-a adăugat un controler avansat de întreruperi (Advanced
Programmable Interrupt Controller -APIC) pentru a permite realizarea sistemelor
cu mai multe procesoare Pentium, fiind adăugaŃi, de asemenea, noi pini şi un mod
special de procesare duală pentru sistemele cu două procesoare.

2.7. Procesoarele din familia P6


Pentium Pro
Procesorul Pentium Pro este primul din cadrul familiei de procesoare P6.
Acest procesor are o arhitectură superscalară îmbunătăŃită, care permite execuŃia a
trei instrucŃiuni într-o perioadă de tact. Procesorul Pentium Pro, ca şi următoarele
procesoare din familia P6, se caracterizează prin execuŃia dinamică a
instrucŃiunilor, care constă din analiza fluxului de date, execuŃia instrucŃiunilor într-o
altă ordine decât cea secvenŃială, o predicŃie îmbunătăŃită a salturilor şi execuŃia
speculativă. Există trei unităŃi de decodificare a instrucŃiunilor, care lucrează în
paralel pentru decodificarea codului obiect în operaŃii elementare numite
microoperaŃii. Acestea sunt depuse într-un rezervor de instrucŃiuni şi pot fi
executate într-o ordine diferită de cea secvenŃială dacă nu există dependenŃe de
date. ExecuŃia se realizează de către cele cinci unităŃi paralele de execuŃie: două
unităŃi pentru numere întregi, două unităŃi pentru numere în virgulă mobilă şi o
unitate de interfaŃă cu memoria. Unitatea de retragere (Retirement Unit) elimină din
rezervorul de instrucŃiuni microoperaŃiile care au fost executate, Ńinând cont de
salturile posibile. Pe lângă cele două memorii cache L1 de câte 8 KocteŃi, prezente
şi la procesorul Pentium, procesorul Pentium Pro dispune şi de o memorie cache L2
de 256 KocteŃi, aflată în acelaşi circuit cu unitatea centrală, conectată cu aceasta
printr-o magistrală dedicată de 64 de biŃi. Memoria cache L1 are porturi duale
(două porturi de acces), iar memoria cache L2 permite până la 4 accesuri concu-
rente. Magistrala externă de date este orientată pe tranzacŃii, ceea ce înseamnă că
fiecare acces este tratat ca o cerere şi un răspuns separat, fiind permise mai
multe cereri în timp ce se aşteaptă un răspuns. Aceste caracteristici de acces
paralel la date, împreună cu posibilităŃile de execuŃie paralelă a instrucŃiunilor
asigură creşterea gradului de utilizare a procesorului şi îmbunătăŃirea
performanŃelor. Procesorul Pentium Pro are o magistrală de adrese extinsă la 36
de biŃi, astfel încât spaŃiul adreselor fizice este de până la 64 GocteŃi.

Pentium 2
Procesorul Pentium 2 se bazează pe arhitectura Pentium Pro, la care s-au
adăugat extensiile MMX (Multimedia Extensions). La acest procesor s-au utilizat
noile tehnici de încapsulare numite Slot 1 şi Slot 2. In cazul acestor tehnici, în
locul unui soclu se utilizează un conector. Memoria cache L2 a fost mutată în afara
capsulei procesorului. Atât memoria cache L1 pentru date, cât şi memoria cache
L1 pentru instrucŃiuni au fost extinse la 16 KocteŃi fiecare. Dimensiunea memoriei
cache L2 poate fi de 256 KocteŃi, 512 KocteŃi, 1 MocteŃi sau 2 MocteŃi (numai cu
tehnica Slot 2). Procesorul cu Slot 1 utilizează pentru comunicaŃia cu memoria
cache L2 o magistrală care funcŃionează la o frecvenŃă egală cu jumătatea
frecvenŃei de tact a procesorului, în timp ce în cazul procesorului cu Slot 2 această
frecvenŃă este egală cu frecvenŃa de tact a procesorului. Procesorul Pentium 2
utilizează diferite stări cu consum redus de putere, ca de exemplu AutoHALT,
Stop-Grant, Sleep şi Deep Sleep, pentru reducerea puterii consumate în
perioadele de inactivitate.

Pentium 3
Acest procesor din cadrul familiei P6 se bazează pe arhitecturile
procesoarelor Pentium Pro şi Pentium 2. Au fost adăugate 70 de noi instrucŃiuni la
setul de instrucŃiuni existent. Acestea sunt destinate atât unităŃilor funcŃionale
existente la procesoarele precedente, cât şi noii unităŃi de calcul în virgulă mobilă
de tip SIMD (Single Instruction, Multiple Data).

2.8. Microarhitectura procesoarelor din familia P6

2.8.1. Prezentare generală a microarhitecturii


Microarhitectura procesoarelor din familia P6 este una superscalară cu trei
căi. Aceasta înseamnă că, prin utilizarea tehnicilor de prelucrare paralelă,
procesorul poate decodifica şi executa în medie trei instrucŃiuni în fiecare ciclu de
ceas. Pentru a obŃine această rată de execuŃie a instrucŃiunilor, procesoarele din
familia P6 utilizează o cale de date de tip pipeline cu 12 etaje, care permite
execuŃia instrucŃiunilor într-o ordine diferită de cea specificată în program. Figura
2.6 prezintă structura acestei căi de date, care este împărŃită în patru unităŃi de
prelucrare: unitatea de extragere şi decodificare, unitatea de expediere şi execuŃie,
unitatea de retragere şi rezervorul de instrucŃiuni. InstrucŃiunile şi datele sunt
transmise acestor unităŃi prin unitatea de interfaŃă cu magistrala.
Pentru a asigura furnizarea constantă a instrucŃiunilor şi datelor la unităŃile de
execuŃie din calea de date, microarhitectura utilizează două nivele de memorie
cache. Memoria cache L1 este împărŃită într-o memorie cache de 8 KocteŃi pentru
instrucŃiuni şi o memorie cache de 8 KocteŃi pentru date, ambele integrate în
calea de date. Memoria cache L2 este o memorie RAM statică de 256 KocteŃi, 512
KocteŃi sau 1 MocteŃi,

Fig. 2.6

care este conectată la calea de date printr-o magistrală de 64 de biŃi, funcŃionând la


frecvenŃa de ceas a procesorului.
Procesoarele din familia P6 utilizează execuŃia dinamică a instrucŃiunilor.
Mecanismul de execuŃie dinamică cuprinde trei concepte:
1. PredicŃia salturilor;
2. Analiza dinamică a fluxului de date;
3. ExecuŃia speculativă.
PredicŃia salturilor este un concept întâlnit la majoritatea arhitecturilor
performante de calculatoare şi a procesoarelor de viteză ridicată. Acest concept
permite procesorului decodificarea instrucŃiunilor care urmează după cele de salt
pentru a nu goli calea de date pipeline la execuŃia instrucŃiunilor de salt. Unitatea de
extragere şi decodificare a instrucŃiunilor utilizează un algoritm de predicŃie
optimizat pentru anticiparea direcŃiei fluxului de instrucŃiuni prin nivele multiple de
salturi, apeluri de proceduri şi reveniri din proceduri.
Analiza dinamică a fluxului de date implică analiza în timp real a fluxului
datelor prin procesor pentru a determina dependenŃa datelor şi a registrelor şi
pentru a detecta posibilitatea execuŃiei instrucŃiunilor într-o ordine diferită de cea
specificată în program. Unitatea de expediere şi execuŃie a instrucŃiunilor poate
monitoriza simultan mai multe instrucŃiuni şi poate executa aceste instrucŃiuni într-o
ordine în care se optimizează utilizarea unităŃilor multiple de execuŃie ale
microarhitecturii, menŃinând în acelaşi timp integritatea datelor asupra cărora se
operează. Această ordine de execuŃie asigură ocuparea unităŃilor de execuŃie
chiar şi atunci când apar dependenŃe între datele instrucŃiunilor.
ExecuŃia speculativă se referă la posibilitatea procesorului de a executa
instrucŃiuni aflate înaintea instrucŃiunii adresate de contorul de program şi de a
furniza rezultatele în ordinea şirului iniŃial de instrucŃiuni. Pentru ca execuŃia
speculativă să fie posibilă, microarhitectura familiei P6 separă expedierea şi
execuŃia instrucŃiunilor de producerea rezultatelor. Unitatea de expediere şi execuŃie
a instrucŃiunilor utilizează analiza fluxului de date pentru a executa toate
instrucŃiunile din rezervorul de instrucŃiuni şi a memora rezultatele în registre
temporare. Unitatea de retragere a instrucŃiunilor caută apoi instrucŃiunile care au
fost executate şi pentru care nu mai există dependenŃe de date cu alte instrucŃiuni
sau predicŃii nerezolvate ale salturilor. Atunci când se găsesc instrucŃiuni care au
fost executate, unitatea de retragere a instrucŃiunilor depune rezultatele acestor
instrucŃiuni în memorie sau în registrele microarhitecturii (cele opt registre ale
procesorului şi opt registre ale unităŃii de calcul în virgulă mobilă), în ordinea
specificată în program şi retrage aceste instrucŃiuni din rezervorul de instrucŃiuni.

2.8.2. Prezentare detaliată a microarhitecturii


Figura 2.7 prezintă o schemă bloc funcŃională a microarhitecturii
procesoarelor din familia P6.

Fig.2.7

In această schemă, există următoarele blocuri componente ale celor patru


unităŃi de execuŃie şi a subsistemului de memorie din figura 2.5:
1. Subsistemul de memorie: magistrala sistem, memoria cache L2, unitatea
de interfaŃă cu magistrala, memoria cache L1 de instrucŃiuni, memoria cache L1 de
date, unitatea de interfaŃă cu memoria şi bufferul de reordonare al memoriei.
2. Unitatea de extragere şi decodificare: unitatea de extragere a
instrucŃiunilor, bufferul pentru destinaŃia salturilor (BTB - Branch Target Buffer),
decodificatorul de instrucŃiuni, secvenŃiatorul microcodului şi tabela de pseudonime
a registrelor (Register Alias Table).
3. Rezervorul de instrucŃiuni: bufferul de reordonare.
4. Unitatea de expediere si execuŃie: staŃia de rezervare, două unităŃi de
calcul pentru numere întregi, două unităŃi de calcul în virgulă mobilă şi două unităŃi
de generare a adreselor.
5. Unitatea de retragere a instrucŃiunilor: unitatea de retragere şi setul de
registre al arhitecturii Intel.
Subsistemul de memorie al microarhitecturii P6 este format din memoria
principală a sistemului, memoria cache primară (L1) şi memoria cache secundară
(L2). Unitatea de interfaŃă cu magistrala accesează memoria sistemului prin
magistrala sistemului (externă). Această magistrală de 64 de biŃi este o magistrală
orientată pe tranzacŃii, ceea ce înseamnă că fiecare acces la magistrală este tratat
prin operaŃii separate de cerere şi răspuns. In timp ce unitatea de interfaŃă cu
magistrala aşteaptă răspunsul la o cerere de acces la magistrală, se pot emite alte
cereri.
Unitatea de interfaŃă cu magistrala accesează memoria cache L2 printr-o ma-
gistrală de 64 de biŃi a memoriei cache. Această magistrală este de asemenea
orientată pe tranzacŃii, permiŃând până la patru accesuri concurente la memoria
cache şi funcŃionează la aceeaşi frecvenŃă de ceas ca şi procesorul.
Accesul la memoria cache L1 se realizează prin magistrale interne, de
asemenea la frecvenŃa de ceas a procesorului. Memoria cache L1 de 8 KocteŃi
pentru instrucŃiuni este un set asociativ cu patru căi. Memoria cache L1 de 8
KocteŃi pentru date este un set asociativ cu două căi, având două porturi, şi
permite o operaŃie de încărcare şi una de memorare într-un ciclu.
CoerenŃa între memoriile cache şi memoria sistemului este asigurată prin
utilizarea protocolului MESI (Modified, Exclusive, Shared, Invalid). Acest protocol
este utilizat pentru asigurarea coerenŃei între memoriile cache atât la sistemele cu
un singur procesor, cât şi la cele multiprocesor.
Cererile de acces la memorie de la unităŃile de execuŃie ale procesorului trec
prin unitatea de interfaŃă cu memoria şi prin bufferul de reordonare al memoriei. In
cazul unei lipse în memoria cache L1 pentru date, această memorie redirectează
cererea către memoria cache L2 şi apoi, în cazul unei lipse în această memorie,
unitatea de interfaŃă cu magistrala redirectează cererea către memoria sistemului.
Cererile de acces la memoria cache L2 sau la memoria sistemului trec prin
bufferul de reordonare al memoriei, care funcŃionează ca o staŃie de planificare şi
expediŃie. Această unitate păstrează evidenŃa tuturor cererilor de acces la memorie
şi poate reordona anumite cereri pentru a preveni blocajele şi a îmbunătăŃi rata
de transfer. De exemplu, bufferul de reordonare al memoriei permite operaŃii
speculative de încărcare. (OperaŃiile de memorare sunt executate întotdeauna în
ordinea iniŃială, iar operaŃiile speculative de memorare nu sunt permise.)
Unitatea de extragere şi decodificare citeşte un şir de instrucŃiuni din
memoria cache L1 de instrucŃiuni şi le decodifică într-o serie de microoperaŃii. Acest
şir de microoperaŃii este transmis apoi la rezervorul de instrucŃiuni.
Unitatea de extragere a instrucŃiunilor încarcă în fiecare ciclu de ceas o linie
de 32 de octeŃi din memoria cache de instrucŃiuni. Unitatea marchează începutul şi
sfârşitul instrucŃiunilor în cadrul liniilor memoriei cache şi transmite 16 octeŃi aliniaŃi
la decodificatorul de instrucŃiuni. Unitatea de extragere a instrucŃiunilor calculează
valoarea pointerului de instrucŃiuni, pe baza intrărilor de la bufferul pentru
destinaŃia salturilor, a stării excepŃiilor şi a întreruperilor. Pentru a executa predicŃia
salturilor, bufferul pentru destinaŃia salturilor, cu 512 intrări, urmăreşte un număr
mare de instrucŃiuni aflate înaintea contorului de program. In cadrul acestor
instrucŃiuni pot fi numeroase salturi, apeluri de proceduri şi reveniri din proceduri,
care trebuie anticipate în mod corect.
Decodificatorul de instrucŃiuni conŃine trei decodificatoare: două
decodificatoare pentru instrucŃiuni simple şi un decodificator pentru instrucŃiuni
complexe. Fiecare decodificator converteşte o instrucŃiune într-una sau mai multe
microoperaŃii, fiecare având două surse logice şi o destinaŃie logică. MicrooperaŃiile
sunt instrucŃiuni primitive care sunt executate în unităŃile paralele de execuŃie ale
procesorului.
Multe instrucŃiuni ale procesorului sunt convertite direct în câte o singură
microoperaŃie de către decodificatoarele pentru instrucŃiuni simple, iar anumite
instrucŃiuni sunt decodificate într-un număr de până la patru microoperaŃii.
InstrucŃiunile mai complexe sunt decodificate în secvenŃe programate de
microoperaŃii obŃinute de la secvenŃiatorul microcodului. Decodificatoarele de
instrucŃiuni realizează de asemenea decodificarea prefixelor de instrucŃiuni şi a
operaŃiilor de ciclare. Aceste decodificatoare pot genera până la şase microoperaŃii
pe ciclu de ceas (câte una de către decodificatoarele pentru instrucŃiuni simple şi
patru de către decodificatoarele pentru instrucŃiuni complexe).
Setul de registre al procesorului poate cauza blocaje din cauza dependenŃelor
între registre. Pentru a rezolva această problemă, procesorul dispune de 40 de
registre interne, care se utilizează pentru calcule. Aceste registre pot păstra atât
valori întregi, cât şi valori în virgulă mobilă Pentru alocarea registrelor interne,
microoperaŃiile de la decodificatorul de instrucŃiuni sunt transmise la tabela de
pseudonime ale registrelor, unde referinŃele logice la registrele procesorului sunt
convertite în referinŃe fizice la registrele interne.
In etapa finală a procesului de decodificare, alocatorul din cadrul tabelei de
pseudonime ale registrelor adaugă biŃi de stare la microoperaŃii pentru a Ie pregăti
în vederea execuŃiei într-o ordine diferită de cea secvenŃială şi transmite
microoperaŃiile rezultate la rezervorul de instrucŃiuni.
Rezervorul de instrucŃiuni. Înaintea depunerii microoperaŃiilor în rezervorul
de instrucŃiuni (cunoscut şi sub numele de buffer de reordonare), şirul de
instrucŃiuni decodificat în microoperaŃii se află în aceeaşi ordine cu cea în care
acest şir a fost transmis la decodificatorul de instrucŃiuni.
Bufferul de reordonare este o memorie asociativă organizată în 40 de registre.
Bufferul conŃine microoperaŃii care aşteaptă pentru a fi executate, ca şi
microoperaŃii care au fost deja executate, dar ale căror rezultate nu au fost încă
memorate. Unitatea de expediere şi execuŃie poate executa microoperaŃiile din
bufferul de reordonare în orice ordine.
Unitatea de expediere şi execuŃie planifică şi execută microoperaŃiile
depuse în bufferul de reordonare Ńinând cont de dependenŃele de date şi de
disponibilitatea resurselor şi memorează temporar rezultatele acestor execuŃii
speculative.
Planificarea şi expedierea microoperaŃiilor din bufferul de reordonare este
realizată de staŃia de rezervare. Aceasta urmăreşte permanent bufferul de
reordonare pentru a determina microoperaŃiile care sunt gata de execuŃie (cele
pentru care toŃi operanzii sursă sunt disponibili) şi le expediază pe acestea la
unităŃile de execuŃie disponibile. Rezultatele execuŃiei unei microoperaŃii sunt
returnate în bufferul de reordonare şi sunt memorate împreună cu microoperaŃia
până când aceasta este retrasă din buffer. Acest proces de planificare şi expediere
permite execuŃia într-o ordine oarecare, în care microoperaŃiile sunt expediate la
unităŃile de execuŃie strict pe baza constrângerilor fluxului de date şi a disponibilităŃii
resurselor utilizate pentru execuŃie, fără a Ńine cont de ordinea iniŃială a
instrucŃiunilor.
ExecuŃia microoperaŃiilor este realizată de două unităŃi în virgulă fixă (VF),
două unităŃi pentru numere în virgulă mobilă (VM) şi o unitate de interfaŃă cu
memoria, permiŃând planificarea a până la cinci microoperaŃii într-un ciclu de ceas.
Cele două unităŃi în virgulă fixă pot executa în paralel două microoperaŃii
pentru numere întregi. Una din unităŃile în virgulă fixă poate gestiona
microoperaŃiile de salt. Această unitate poate detecta predicŃiile eronate ale
salturilor şi poate semnala bufferului pentru destinaŃia salturilor să iniŃializeze calea
de date pipeline. Această operaŃie este realizată după cum urmează.
Decodificatorul de instrucŃiuni marchează fiecare microoperaŃie de salt cu ambele
adrese posibile: adresa de destinaŃie şi adresa instrucŃiunii următoare. Atunci când
unitatea în virgulă fixă execută microoperaŃia de salt, aceasta este în măsură să
determine destinaŃia care a fost selectată. Dacă a fost selectată destinaŃia
anticipată, atunci microoperaŃiile executate speculativ sunt marcate ca fiind
utilizabile şi execuŃia continuă pe calea anticipată. Dacă destinaŃia anticipată nu a
fost selectată, o unitate de execuŃie din cadrul unităŃii în virgulă fixă modifică
starea tuturor microoperaŃiilor de pe calea care nu a fost selectată pentru a le
elimina din rezervorul de instrucŃiuni. Unitatea respectivă transmite apoi destinaŃia
corectă a saltului la bufferul pentru destinaŃia salturilor, care iniŃializează
calea de date pipeline de la noua adresă.
Unitatea de interfaŃă cu memoria gestionează microoperaŃiile de încărcare şi
de memorare. Un acces de încărcare necesită specificarea doar a adresei de
memorie, astfel încât poate fi codificat într-o microoperaŃie. Un acces de memorare
necesită specificarea atât a adresei, cât şi a datei, astfel încât este codificat în
două microoperaŃii. Partea unităŃii de interfaŃă cu memoria care gestionează
microoperaŃiile de memorare dispune de două porturi, ceea ce îi permite
prelucrarea în paralel a celor două microoperaŃii care codifică accesul de memorie.
Unitatea de interfaŃă cu memoria poate executa deci în paralel atât o încărcare,
cât şi o memorare într-un ciclu de ceas.
Unitatea de retragere a instrucŃiunilor memorează în mod permanent
rezultatele microoperaŃiilor executate speculativ şi elimină microoperaŃiile din
bufferul de reordonare. Ca şi staŃia de rezervare, unitatea de retragere a
instrucŃiunilor testează în mod continuu starea microoperaŃiilor din bufferul de
reordonare, căutând acele microoperaŃii care au fost executate şi nu au
dependenŃe cu alte microoperaŃii din rezervorul de instrucŃiuni. Această unitate
retrage apoi microoperaŃiile executate, în ordinea iniŃială specificată în program,
Ńinând cont de întreruperi, excepŃii şi anticipări eronate ale salturilor.
Unitatea de retragere a instrucŃiunilor poate retrage trei microoperaŃii pe ciclu
de ceas. Pentru retragerea unei microoperaŃii, unitatea scrie rezultatele în
registrele procesorului sau în memorie. După memorarea rezultatelor,
microoperaŃia este eliminată din bufferul de reordonare.

Pentium 4
Pentium 4 este, ca orice procesor începând de la I80386, un produs care
utilizează arhitectura IA-32 („Intel Architecture” pe 32 de biti). Avantajul acestei
arhitecturi este ca deŃine cea mai mare baza de programe din toate celelalte
arhitecturi existente. De asemenea, este asigurata compatibilitatea în urma cu
toate programele scrise pentru 80386, 80486, Pentium etc.
Pentium 4 beneficiază de facilitatea Rapid Execution Engine care permite
ca unitatea aritmetică şi logică (ALU) să funcŃioneze la o frecvenŃă dublă faŃă de
cea a procesorului. Precizăm însă ca ALU se ocupa doar de instrucŃiunile
simple, de tipul adunărilor, scăderilor si înmulŃirilor cu puteri ale lui 2 (ADD, OR,
AND etc.), şi asta înseamnă ca instrucŃiunile Floating Point (FP) şi cele
multimedia (SSE - Streaming SIMD Extensions) se executa tot la frecvenŃa
procesorului.
Pentium 4 a fost dotat cu un sistem hyper pipeline care conŃine 20 de
etaje. ImpărŃirea execuŃiei instrucŃiunilor in bucăŃi mici, care se executa rapid si
in paralel (abordare de tip RISC - Reduced Instruction Set Computing), duce la
o creştere a performantei faŃa de cazul execuŃiei unor instrucŃiuni mari (abordare
CISC - Complex Instruction Set Computing).
Pentru a limita pe cât posibil greşelile de predicŃie a salturilor, ca si pentru
a reduce efectul lor, Pentium 4 a fost introdusă o tehnologie denumită Advanced
Dynamic Execution Engine, care constă în creşterea dimensiunilor ferestrei de
instrucŃiuni şi la creşterea dimensiunii branch target buffer-ului. Rolul celor doua
elemente este să menŃină ocupate tot timpul unităŃile de execuŃie. Fereastra de
instrucŃiuni este locul de unde motorul de execuŃie îşi alege instrucŃiunile pe
care le va executa. Fereastra de instrucŃiuni are acum posibilitatea de a stoca
126 de instrucŃiuni, faŃa de cele 42 la Pentium 3. Deci, se pot executa, practic,
speculativ nu mai puŃin de 126 de instrucŃiuni.
Branch target buffer-ul este un buffer în care se stochează informaŃii
despre instrucŃiunile de salt care se execută sau s-au executat deja. Aceste
informaŃii sunt utile algoritmului de predicŃie a salturilor, care la Pentium 4, a fost
îmbunătăŃit considerabil. Acest procesor dispune de un branch target buffer de 4
KocteŃi, fata de 0,5 KocteŃi la P 3. Pe ansamblu, Intel afirmă că rata de eroare la
predicŃie este cu 33% mai mica decât la P 3, ajungând la 5 - 10%.
Memoria cache L1 de date are 8 KocteŃi iar memoria cache L1 de
instrucŃiuni a fost înlocuită cu un cache pentru microoperaŃii denumit trace
cache. Cu alte cuvinte sunt memorate în cache instrucŃiunile gata decodificate.
Memoriile cache L1 sunt asociative cu patru căi, fapt care le conferă
performanŃe foarte bune.
Memoria cache L2 are o mărime de 256 KocteŃi şi este conectat la
procesor printr-o magistrală de 256 biŃi.

2.9. Gestiunea memoriei la Arhitectura Intel

2.9.1. Prezentare generală a gestiunii memoriei


Sistemul de gestiune a memoriei la procesoarele cu Arhitectura Intel
(Pentium Pro, Pentium 2, Pentium 3, Pentium 4) este împărŃit în două părŃi:
segmentare şi paginare. Segmentarea pune la dispoziŃie un mecanism pentru
izolarea modulelor individuale de cod, de date şi de stivă, astfel încât pe acelaşi
procesor pot rula programe (sau taskuri) multiple fără o interferenŃă între ele.
Paginarea asigură un mecanism pentru implementarea unui sistem de memorie
virtuală cu pagini la cerere, la care secŃiuni ale mediului de execuŃie ale unui
program sunt mapate în memoria fizică după cum este necesar. Atunci când
procesorul funcŃionează în modul protejat, trebuie să se utilizeze o anumită
formă de segmentare. Nu există un bit de mod pentru dezactivarea segmentării,
utilizarea paginării este însă opŃională.
Arhitectura Intel are trei spaŃii de adrese: virtuale, liniare şi fizice. Figura
2.8 prezintă relaŃia dintre aceste spaŃii de adrese. Unitatea de segmentare
translatează o adresă virtuală într-o adresă liniară. Atunci când paginarea nu
este utilizată, adresa liniară corespunde cu adresa fizică. Dacă se utilizează
paginarea, unitatea de paginare translatează adresa liniară într-o adresă fizică.
Fig. 2.8

Adresa virtuală sau logică (care reprezintă un pointer depărtat) constă


dintr-un selector de segment de 16 biŃi şi o adresă efectivă (sau offset) de 32 de
biŃi. Selectorul de segment este un identificator unic al segmentului. Pe lângă
alte informaŃii, selectorul furnizează un offset într-o tabelă a descriptorilor de
segment (cum este tabela descriptorilor globali, GDT, sau tabela descriptorilor
locali, LDT), care conŃine structuri de date numite descriptori de segment.
Fiecare segment are un descriptor de segment, care specifică dimensiunea
segmentului, drepturile de acces şi nivelele de privilegiu ale segmentului, tipul
segmentului şi adresa primului octet al segmentului în spaŃiul adreselor liniare
(numită adresa de bază a segmentului).
Adresa efectivă este calculată prin adunarea unei anumite combinaŃii a
componentelor de adresare. Există trei componente de adresare: deplasament,
bază şi index. Deplasamentul este o valoare imediată de 8 sau 32 de biŃi care
urmează după codul instrucŃiunii. Baza este conŃinutul oricărui registru general
şi adresează de multe ori începutul zonei de variabile locale. Indexul este
conŃinutul oricărui registru general şi este utilizat adesea pentru adresarea
elementelor unui tablou sau a caracterelor dintr-un şir. Indexul poate fi
multiplicat cu un factor de scală (1, 2, 4 sau 8) pentru a facilita anumite tipuri de
adresare, cum este adresarea tablourilor sau a structurilor. După cum rezultă
din figura 2.7, adresa efectivă este calculată astfel:
Adresa efectivă = bază + (index * factor de scală) + deplasament
După cum se arată în figura 2.8, segmentarea asigură un mecanism
pentru divizarea spaŃiului de adrese al procesorului (numit spaŃiu al adreselor
liniare) în spaŃii de adrese protejate mai mici, numite segmente. Segmentele pot
fi utilizate pentru a păstra codul, datele şi stiva unui program, sau pentru a
păstra structurile de date ale sistemului. Dacă pe un procesor rulează mai mult
de un program, fiecărui program i se asignează propriul set de segmente.
Procesorul stabileşte în acest caz limitele între aceste segmente şi asigură să
nu existe interferenŃe între un program şi execuŃia altui program prin scrierea în
segmentele celuilalt program. OperaŃiile care pot fi executate asupra unui
anumit tip de segment pot fi restricŃionate.

Fig. 2.9

Toate segmentele dintr-un sistem fac parte din spaŃiul adreselor liniare al
procesorului. Dimensiunea unui segment poate varia de la 1 octet la
dimensiunea maximă a memoriei principale, 4 GocteŃi (232 octeŃi). Pentru a
localiza un octet dintr-un anumit segment, trebuie furnizată o adresă logică.
Unitatea de segmentare adună adresa de bază a segmentului la partea de
offset a adresei logice (deci, la adresa efectivă) pentru a forma o adresă liniară
de 32 de biŃi în spaŃiul adreselor liniare al procesorului.
Dacă paginarea nu este utilizată, spaŃiul adreselor liniare al procesorului
este mapat direct în spaŃiul adreselor fizice al procesorului. SpaŃiul adreselor
fizice este definit ca domeniul adreselor pe care le poate genera procesorul pe
magistrala sa de adrese.
La utilizarea paginării, fiecare segment este divizat în pagini (de obicei, de
câte 4 KocteŃi), care sunt păstrate fie în memoria principală, fie pe disc. Sistemul
de operare păstrează un director de pagini şi un set de tabele de pagini pentru a
Ńine evidenŃa paginilor. Atunci când un program (sau task) încearcă să acceseze
o locaŃie din spaŃiul adreselor liniare, procesorul utilizează directorul de pagini şi
tabelele de pagini pentru a translata adresa liniară într-o adresă fizică, după
care execută operaŃia cerută (citire sau scriere) cu locaŃia de memorie. Dacă
pagina care trebuie accesată nu se află în memoria fizică, procesorul întrerupe
execuŃia programului, aduce pagina de pe disc în memoria principală şi continuă
apoi execuŃia programului.
2.9.2. Segmentarea
Mecanismul de segmentare pus la dispoziŃie de Arhitectura Intel poate fi
utilizat pentru a implementa o largă varietate de sisteme de memorie, de la
modele liniare care folosesc doar în mod minimal segmentarea pentru protecŃia
programelor, până la modele cu segmente multiple, care utilizează segmentarea
pentru a crea un mediu de operare robust în care pot fi executate programe
multiple.
Cel mai simplu model de memorie pentru un sistem este modelul liniar, în
care sistemul de operare şi programele de aplicaŃie au acces la un spaŃiu de
adrese continuu, nesegmentat. Pentru a implementa un model liniar cu
Arhitectura Intel, trebuie să se creeze cel puŃin doi descriptori de segment, unul
pentru referinŃele la cod şi unul pentru referinŃele la date. Ambele din aceste
segmente sunt mapate însă în întregul spaŃiu al adreselor liniare: deci, ambii
descriptori de segment au aceeaşi adresă de bază egală cu 0 şi aceeaşi limită a
segmentului de 4 GocteŃi. Prin setarea limitei de segment la 4 GocteŃi,
mecanismul de segmentare este prevenit să genereze excepŃii pentru referinŃele
în afara limitelor memoriei, chiar dacă nu există memorie fizică la o anumită
adresă. Memoria ROM (EPROM) este amplasată de obicei la sfârşitul spaŃiului
adreselor fizice, deoarece procesorul începe execuŃia programului de la adresa
FFFF FFFOh. Memoria RAM (DRAM) este amplasată la începutul spaŃiului de
adrese, deoarece adresa de bază iniŃială a segmentului de date după resetarea
procesorului este 0.
Modelul liniar protejat este similar cu modelul liniar, cu excepŃia faptului că
limitele segmentelor sunt setate pentru a include numai domeniul adreselor
pentru care există memorie fizică. Se va genera o excepŃie de protecŃie
generală la fiecare încercare de acces la memoria inexistentă. Acest model
asigură un nivel minim de protecŃie hardware împotriva anumitor tipuri de erori
de program.
Modelul cu segmente multiple utilizează posibilităŃile complete ale
mecanismului de segmentare pentru a asigura protecŃia prin hardware a codului
şi datelor. In acest caz, fiecărui program i se alocă propria tabelă a descriptorilor
de segment şi propriile segmente. Segmentele pot fi private pentru programele
cărora le sunt asignate, sau pot fi partajate între programe. Accesul la toate
segmentele şi la mediile de execuŃie ale programelor individuale rulate de
sistem este controlat prin hardware.
Se pot utiliza verificări ale accesului nu numai pentru protecŃia împotriva
referinŃelor la o adresă în afara limitelor unui segment, dar şi împotriva execuŃiei
operaŃiilor ilegale în anumite segmente. De exemplu, dacă segmentele de cod
sunt desemnate ca segmente care pot fi doar citite, se pot preveni prin
hardware operaŃiile de scriere în segmentele de cod. InformaŃiile despre
drepturile de acces create pentru segmente pot fi utilizate de asemenea pentru
stabilirea unor inele sau nivele de protecŃie. Nivelele de protecŃie pot fi utilizate
pentru protecŃia procedurilor sistemului de operare împotriva accesului
neautorizat de către programele de aplicaŃie.
2.9.3. Paginarea
La funcŃionarea în modul protejat, Arhitectura Intel poate mapa spaŃiul
adreselor liniare direct într-o memorie fizică de dimensiuni mari (de exemplu, o
memorie RAM de 4 GocteŃi), sau indirect (utilizând paginarea) într-o memorie
fizică de dimensiuni mai mici şi un spaŃiu pe disc. A doua metodă de mapare a
spaŃiului adreselor liniare este numită memorie virtuală cu pagini la cerere.
Atunci când se utilizează paginarea, procesorul împarte spaŃiul adreselor
liniare în pagini de dimensiune fixă (în general, de 4 KocteŃi) care pot fi mapate
în memoria fizică şi/sau un spaŃiu pe disc. Atunci când un program face referire
la o adresă logică din memorie, procesorul translatează adresa într-o adresă
liniară şi utilizează apoi mecanismul său de paginare pentru a translata adresa
liniară în adresa fizică corespunzătoare. Dacă pagina care conŃine adresa liniară
nu se află în memoria fizică, procesorul generează o excepŃie de lipsă de
pagină (page-fault exception). Această excepŃie comandă sistemul de operare
pentru a încărca pagina de pe disc în memoria fizică (eventual scriind o altă
pagină din memoria fizică pe disc) iar apoi relansează instrucŃiunea care a
generat excepŃia.
Paginarea este diferită de segmentare prin faptul că utilizează pagini de
dimensiune fixă. Spre deosebire de segmente, care au de obicei aceeaşi
dimensiune ca şi codul sau structurile de date pe care pe păstrează, paginile au
o dimensiune fixă. Dacă segmentarea este singura formă de translatare a
adreselor care se utilizează, o structură de date care este prezentă în memoria
fizică va avea toate părŃile sale în memorie. Dacă se utilizează paginarea, o
structură de date poate fi parŃial în memorie şi parŃial pe disc.
Pentru a minimiza numărul ciclurilor de magistrală necesare pentru
translatarea adreselor, procesorul păstrează cele mai recent accesate intrări ale
directorului de pagini şi ale tabelelor de pagini în memorii cache numite buffere
de translatare (TLB - Translation Lookaside Buffer). Aceste buffere satisfac
majoritatea cererilor pentru citirea directorului curent de pagini fără a fi necesar
un ciclu de magistrală. Cicluri suplimentare de magistrală apar numai dacă
bufferele de translatare nu conŃin o intrare a unei tabele de pagini, ceea ce se
întâmplă, de obicei, atunci când o pagină nu a fost accesată de mult timp.
InformaŃiile pe care procesorul le utilizează pentru a translata adresele
liniare în adrese fizice sunt conŃinute în patru structuri de date:
- Fişierul directorilor de pagini: O tabelă cu intrări de 32 de biŃi conŃinute
într-o pagină de 4 KocteŃi. Intr-un astfel de fişier pot fi păstrate până la 1024 de
intrări (fişe) ale directoarelor de pagini (PDE - Page Directory Entry).
- Fişierul tabelelor de pagini: O tabelă cu intrări de 32 de biŃi conŃinute într-
o pagină de 4 KocteŃi. Intr-o fişier de tabele pot fi păstrate până la 1024 de
intrări (fişe) ale tabelei de pagini (PTE - Page Table Entry). Tabelele de pagini
nu sunt utilizate pentru paginile de 2 MocteŃi şi 4 MocteŃi. Aceste pagini sunt
mapate direct de la unul sau mai multe directoare de pagină.
- Pagina: Un spaŃiu liniar de adrese de 4 KocteŃi, 2 MocteŃi sau 4 MocteŃi.
- Tabela pointerilor la directoarele de pagini: O tabelă cu patru intrări de 64
de biŃi, fiecare din acestea conŃinând un pointer la un director de pagini. Această
structură de date este utilizată numai atunci când este validată extensia
adreselor fizice (PAE - Physical Address Extension). Indicatorul PAE, validează
o extensie a adreselor fizice la Arhitectura Intel de la 32 de biŃi la 36 de biŃi.
Procesorul dispune de 4 pini suplimentari pentru biŃii suplimentari de adresă.
Această opŃiune poate fi utilizată numai atunci când paginarea este validată.
Aceste tabele permit accesul la pagini de 4 KocteŃi sau 4 MocteŃi atunci
când se utilizează adresarea fizică normală de 32 de biŃi şi la pagini de 4 KocteŃi
sau 2 MocteŃi atunci când se utilizează adresarea fizică extinsă de 36 de biŃi.
Cap. 3. Arhitecturi RISC

3.1. Introducere
In general, arhitecturile calculatoarelor au evoluat progresiv spre o
complexitate mai ridicată ca, de exemplu un număr mai mare de instrucŃiuni, un
număr mai mare de moduri de adresare, o putere de calcul mai ridicată a
instrucŃiunilor individuale, registre mai specializate. Calculatoarele care se
încadrează în asemenea tendinŃe sunt numite calculatoare cu set complex de
instrucŃiuni (CISC - Complex Instruction Set Computer).
S-a constatat la un moment dat că adăugarea unei instrucŃiuni complexe
la un set de instrucŃiuni afectează eficienŃa şi costul procesorului. Efectele unei
asemenea instrucŃiuni trebuie evaluate înainte ca aceasta să fie adăugată la
setul de instrucŃiuni. Unele din instrucŃiunile puse la dispoziŃie de procesoarele
CISC sunt utilizate rareori de compilatoare. Conceptul de bază de a nu se
adăuga instrucŃiuni utilizate rar la setul de instrucŃiuni reprezintă un concept
inovativ al arhitecturilor de calculatoare, numit calculator cu set redus de
instrucŃiuni (RISC - Reduced Instruction Set Computer). Filozofia de proiectare
a arhitecturilor RISC este de a se adăuga la setul de instrucŃiuni numai acele
instrucŃiuni care determină un câştig de performanŃă.
Caracteristicile comune ale majorităŃii acestor calculatoare sunt
următoarele:
- Un set de instrucŃiuni limitat şi simplu;
- Un număr mare de registre generale sau memorii cache aflate în aceeaşi
capsulă cu procesorul;
- Un compilator care maximizează utilizarea registrelor şi minimizează
astfel accesurile la memoria principală;
- Accentul pus pe optimizarea sistemului pipeline de instrucŃiuni.

3.2. Cauze ale complexităŃii arhitecturale crescute


Există mai multe motive ale tendinŃei spre o complexitate progresivă mai
ridicată a arhitecturilor de calculatoare. Acestea cuprind facilitarea utilizării
limbajelor de nivel înalt, migrarea funcŃiilor de la implementarea prin software la
implementarea prin hardware şi compatibilitatea în sus.
Facilitarea utilizării limbajelor de nivel înalt. Pe parcursul anilor, mediul
de programare a evoluat de la programarea în limbaj de asamblare la
programarea în limbaje de nivel înalt, astfel încât proiectanŃii au prevăzut
instrucŃiuni mai puternice pentru a facilita codificarea eficientă a programelor
scrise în limbaje de nivel înalt. Aceste instrucŃiuni au determinat nu numai
creşterea dimensiunii setului de instrucŃiuni ci şi creşterea complexităŃii
acestuia, datorită puterii de calcul relativ ridicate a instrucŃiunilor.
Migrarea funcŃiilor de la implementarea prin software la
implementarea prin hardware. O instrucŃiune care este implementată prin
hardware va fi mai eficientă decât una realizată printr-o secvenŃă de instrucŃiuni
mai simple, datorită numărului mare de accesuri la memorie şi a diferenŃei
dintre vitezele UCP şi ale memoriei. Pentru a creşte viteza de procesare a
calculatoarelor, a avut loc un fenomen de migrare a funcŃiilor de la
implementarea prin software la cea prin firmware şi de la implementarea prin
firmware la cea prin hardware. (Firmware reprezintă o secvenŃă de
microinstrucŃiuni.) Această migrare a implementării funcŃiilor din domeniul
software în domeniul hardware creşte dimensiunea setului de instrucŃiuni,
rezultând o complexitate globală crescută a calculatoarelor.
Compatibilitatea în sus. Compatibilitatea în sus este utilizată adesea de
către producători ca o strategie de marketing cu scopul de a prezenta
calculatoarele lor ca fiind mai performante decât alte modele existente. Ca
rezultat al acestei strategii de marketing, uneori producătorii cresc numărul de
instrucŃiuni şi puterea de calcul a acestora, indiferent de utilizarea efectivă a
acestui set complex de instrucŃiuni. Compatibilitatea în sus este un mod de a
îmbunătăŃi un sistem prin adăugarea unor facilităŃi noi şi, de obicei, mai
complexe. Ca rezultat, noul set de instrucŃiuni este un superset al celui vechi.

3.3. Avantajele arhitecturilor RISC


Există totuşi unele criterii care reprezintă obiective universal acceptate de
către proiectanŃii de calculatoare pentru toate sistemele:
1. Maximizarea vitezei de execuŃie sau minimizarea timpului de execuŃie.
2. Minimizarea costului de proiectare.
O posibilitate de a îndeplini primul obiectiv constă în a îmbunătăŃi
tehnologia componentelor, obŃinând funcŃionarea acestora la frecvenŃe mai
ridicate. Viteza mărită poate fi obŃinută prin minimizarea numărului mediu al
ciclurilor de ceas pe instrucŃiune şi/sau execuŃia simultană a mai multor
instrucŃiuni. Pentru a îndeplini ambele obiective, proiectanŃii arhitecturilor RISC
originale s-au concentrat asupra aspectului implementării circuitelor VLSI. Ca
rezultat al unui număr mai redus de instrucŃiuni, moduri de adresare şi formate
de instrucŃiuni, s-a obŃinut un circuit relativ simplu şi de dimensiuni reduse
pentru unitatea de control. Această relativă reducere a dimensiunii şi
complexităŃii circuitelor VLSI conduce la anumite avantaje faŃă de arhitecturile
CISC. Acestea sunt prezentate în continuare.
Scopul principal al tehnologiei VLSI este de a implementa întregul
procesor într-o singură capsulă. Aceasta va reduce în mod semnificativ
întârzierea majoră de transmitere a semnalelor de la un circuit integrat la altul.
Arhitecturile cu o complexitate mai mare (set mai complex de instrucŃiuni, mai
multe moduri de adresare, formate variabile de instrucŃiuni etc.) necesită o
logică mai complexă pentru încărcarea instrucŃiunilor, decodificare şi execuŃie.
Dacă procesorul este microprogramat, este necesar un microprogram complex,
rezultând o memorie de microprogram de dimensiuni mai mari. Prin urmare,
dacă o arhitectură CISC este dezvoltată utilizând tehnologia VLSI, o parte
substanŃială a suprafeŃei circuitului poate fi ocupată de memoria de
microprogram. Mărimea suprafeŃei circuitului necesară pentru unitatea de
control a unei arhitecturi CISC poate varia de la 40% la 60%, în timp ce numai
10% a suprafeŃei este necesară în cazul unei arhitecturi RISC. SuprafaŃa
rămasă în cazul unei arhitecturi RISC poate fi utilizată pentru alte componente,
cum sunt memorii cache în aceeaşi capsulă şi seturi mai mari de registre, prin
care performanŃele procesorului pot fi îmbunătăŃite.
Avantajele arhitecturilor RISC se referă la:
1. Viteza de calcul;
2. Implementarea în circuite VLSI;
3. Timpul de proiectare;
4. Facilitarea utilizării limbajelor de nivel înalt.
1. In ceea ce priveşte viteza de calcul, arhitecturile RISC sunt mai potrivite
pentru utilizarea sistemelor pipeline de instrucŃiuni. Aceste arhitecturi
maximizează rata de transfer a sistemului pipeline prin faptul că au o
dimensiune uniformă şi o durată egală a execuŃiei pentru majoritatea
instrucŃiunilor. Aceste caracteristici reduc perioadele de inactivitate în cadrul
sistemului pipeline.
2. Implementarea în circuite VLSI se referă la faptul că unitatea de control
a arhitecturilor RISC este implementată prin hardware. Un sistem cu o unitate
de control cablată va fi, în general, mai rapid decât unul microprogramat. In
plus, un număr mare de registre şi memoriile cache în cadrul capsulei vor
reduce numărul accesurilor la memorie. Datele mai frecvent utilizate pot fi
păstrate în registre. Registrele pot păstra de asemenea parametrii care trebuie
transmişi altor proceduri. Din cauza progresului tehnologiei VLSI, multe
microprocesoare comerciale au propria memorie cache în cadrul capsulei.
Această memorie cache are, de obicei, o dimensiune mai redusă decât
memoria cache de pe placă şi reprezintă primul nivel al memoriilor cache.
Memoria cache de pe placă, care este apropiată de procesor, reprezintă al
doilea nivel al memoriilor cache. In general, aceste două nivele de memorii
cache îmbunătăŃesc performanŃele comparativ cu cazul utilizării unui singur
nivel de memorie cache. Mai mult, memoria cache din fiecare nivel poate fi
organizată ca o ierarhie de memorii cache. In sfârşit, uneori fiecare memorie
cache din nivelele superioare este divizată în două memorii cache: o memorie
cache de instrucŃiuni şi o memorie cache de date. Procesoarele care au
memorii cache separate pentru instrucŃiuni şi date sunt numite arhitecturi
Harvard, după calculatorul Harvard Mark I. Utilizarea a două memorii cache,
una pentru instrucŃiuni şi una pentru date, poate îmbunătăŃi în mod considerabil
timpul de acces şi, în consecinŃă, îmbunătăŃeşte performanŃele unui procesor, în
special al unuia care utilizează în mod extensiv tehnica pipeline, cum este un
procesor RISC.
3. Un alt avantaj al arhitecturilor RISC este că acestea necesită o
perioadă mai scurtă de proiectare. Timpul necesar pentru proiectarea unei noi
arhitecturi depinde de complexitatea arhitecturii. Timpul de proiectare este mai
lung pentru arhitecturile complexe (CISC). In cazul unei arhitecturi RISC, timpul
necesar pentru testarea şi depanarea circuitelor rezultate este mai redus,
deoarece nu se utilizează microprogramarea şi dimensiunea unităŃii de control
este redusă. In cazul unei arhitecturi mai puŃin complexe, posibilitatea erorilor
de proiectare este mai redusă. Deci, arhitecturile RISC au avantajul unor costuri
de proiectare mai reduse şi al unei fiabilităŃi de proiectare mai ridicate.
4. In sfârşit, arhitecturile RISC oferă anumite caracteristici care facilitează
în mod direct operaŃiile obişnuite ale limbajelor de nivel înalt. Mediul de
programare s-a modificat de la programarea în limbaj de asamblare la
programarea în limbaje de nivel înalt, astfel încât arhitecturile trebuiau să
faciliteze această tendinŃă, prin instrucŃiuni suplimentare care sunt puternice din
punct de vedere funcŃional şi apropiate semantic de caracteristicile limbajelor de
nivel înalt. Totuşi, încărcarea unui calculator cu un număr mare de facilităŃi
pentru limbajele de nivel înalt poate transforma o arhitectură RISC într-o
arhitectură CISC. De aceea, este de dorit să se investigheze frecvenŃa utilizării
facilităŃilor pentru limbajele de nivel înalt prin rularea unei serii de programe
benchmark scrise în limbaje de nivel înalt. Pe baza acestor observaŃii, sunt
adăugate numai acele facilităŃi la setul de instrucŃiuni care sunt utilizate
frecvent şi produc o îmbunătăŃire a performanŃelor.

3.4. Utilizarea unui număr mare de registre


Un grup de cercetători de la Universitatea California din Berkeley, condus
de Patterson şi Sequin, a studiat caracteristicile mai multor programe tipice
Pascal şi C şi a descoperit că, dintre tipurile de instrucŃiuni ale limbajelor de
nivel înalt, apelurile de proceduri şi revenirile din acestea consumă cel mai mult
timp. Un calculator CISC cu un set redus de registre necesită un timp ridicat
pentru gestionarea apelurile de proceduri şi revenirile din acestea, din cauza
necesităŃii de a salva registrele la un apel şi de a le reface la revenire, ca şi din
cauza necesităŃii de a transmite parametri şi rezultate la şi de la procedura
apelată. Această problemă este mai acută la procesoarele RISC, deoarece
instrucŃiunile complexe trebuie implementate prin subrutine utilizând
instrucŃiunile disponibile. De aceea, unul din principiile de proiectare ale
arhitecturilor RISC este de a pune la dispoziŃie un mijloc eficient de gestiune a
mecanismului de apel al procedurilor şi de revenire din acestea.
Aceasta conduce la necesitatea existenŃei unui număr mare de registre
care pot fi utilizate pentru mecanismul de apel şi revenire. In plus, pentru
îmbunătăŃirea eficienŃei, echipa din Berkeley a implementat conceptul
ferestrelor suprapuse de registre. In cazul acestui concept, setul de registre
este împărŃit în grupe de registre numite ferestre. Un anumit grup de registre
este desemnat pentru a fi utilizat ca registre globale şi este accesibil oricărei
proceduri în orice moment. Pe de altă parte, fiecărei proceduri i se asignează o
fereastră separată în cadrul setului de registre. Prima fereastră din setul de
registre, baza ferestrei, este adresată de pointerul ferestrei curente (Current
Window Pointer - CWP), plasat de obicei în registrul de stare al UCP. Ferestrele
de registre pot fi utile pentru transmiterea eficientă a parametrilor între
procedura apelantă şi cea apelată prin ferestre parŃial suprapuse de registre.
Parametrii pot fi transmişi fără a modifica CWP prin plasarea acestora în partea
care se suprapune din cele două ferestre. Prin această suprapunere parametrii
doriŃi vor fi accesibili atât pentru procedura apelantă, cât şi pentru cea apelată.
Ferestrele de registre sunt utilizate atât la arhitecturile CISC, cât şi la cele RISC,
dar unitatea de control a unei arhitecturi CISC nu permite un spaŃiu suficient
pentru un număr mare de registre.
Pentru explicarea conceptului ferestrelor suprapuse de registre,
considerăm un calculator RISC cu 100 de registre. Dintre aceste registre, cele
între 0 şi 9 sunt utilizate ca registre globale pentru memorarea variabilelor
partajate de toate procedurile. Ori de câte ori este apelată o procedură, în plus
faŃă de registrele globale, se alocă 20 de registre suplimentare pentru această
procedură. Acestea cuprind 5 registre numite registre de intrare, pentru
păstrarea parametrilor care sunt transmişi de procedura apelantă, 10 registre
numite registre locale, pentru păstrarea variabilelor locale şi 5 registre numite
registre de ieşire, pentru păstrarea parametrilor care trebuie transmişi unei alte
proceduri. Figura 3.1 ilustrează registrele alocate pentru trei proceduri X, Y şi Z.
De notat că procedurile X şi Y (Y şi Z) partajează acelaşi set de registre pentru
parametrii de ieşire, respectiv parametrii de intrare.

Fig. 3.1

In concluzie, una din ideile principale ale arhitecturii RISC este de a


simplifica toate aspectele arhitecturale ale proiectării unui calculator, astfel încât
implementarea acestuia poate fi realizată mai eficient. Obiectivul unei arhitecturi
RISC este de a include instrucŃiuni simple şi esenŃiale în setul de instrucŃiuni al
calculatorului.

3.5. Caracteristici ale arhitecturilor RISC


In general, o arhitectură RISC are următoarele caracteristici:
1. Majoritatea instrucŃiunilor accesează operanzii din registre, cu excepŃia
unui număr redus dintre ele, cum sunt instrucŃiunile LOAD şi STORE, care
accesează memoria. Cu alte cuvinte, o arhitectură RISC este un calculator de
tip load/store.
2. ExecuŃia majorităŃii instrucŃiunilor necesită un singur ciclu de ceas, cu
excepŃia unui număr redus dintre ele, cum sunt instrucŃiunile LOAD şi STORE.
Totuşi, în prezenŃa memoriilor cache aflate în aceeaşi capsulă, chiar şi
instrucŃiunile LOAD şi STORE pot fi executate, în medie, într-un ciclu.
3. Unitatea de control este cablată. Deci, arhitecturile RISC nu sunt
microprogramate. Codul generat de compilator este executat direct prin
hardware şi nu este interpretat prin microprogramare.
4. Există un număr redus de formate ale instrucŃiunilor (adesea mai mic
decât 4).
5. UCP are un număr mare de registre. O alternativă la un număr mare
de registre este amplasarea unei memorii cache în aceeaşi capsulă.
Producătorii procesoarelor actuale au amplasat memoria cache în aceeaşi
capsulă cu procesorul pentru a asigura o viteză mai ridicată. Deoarece spaŃiul
din capsula procesorului este limitat, în această capsulă poate fi amplasată doar
o memorie cache de dimensiuni reduse. Pe lângă această memorie cache, se
poate amplasa o memorie cache de dimensiuni mari în afara capsulei. In
general, se utilizează o ierarhie de memorii cache. Toate datele de la nivelul
superior (memoria cache din cadrul capsulei) sunt prezente la nivelele inferioare
(memoriile cache din afara capsulei), astfel încât, după o lipsă în memoria
cache, memoria cache din cadrul capsulei poate fi reîncărcată dintr-o memorie
cache de la un nivel inferior, în locul efectuării unui acces la memoria principală.
6. Compilatorul are o complexitate ridicată. De exemplu, compilatorul
trebuie să se ocupe de salturile întârziate. Este posibil să se îmbunătăŃească
performanŃele sistemului pipeline prin rearanjarea automată a instrucŃiunilor din
cadrul unui program astfel încât instrucŃiunile de salt să apară mai târziu decât
se intenŃiona iniŃial.
8. Există relativ puŃine instrucŃiuni (adesea, mai puŃin de 150) şi foarte
puŃine moduri de adresare (adesea mai puŃin de 4).
9. Arhitecturile RISC facilitează operaŃiile limbajelor de nivel înalt printr-o
alegere judicioasă a instrucŃiunilor şi prin utilizarea compilatoarelor care
optimizează codul.
10. Arhitecturile RISC utilizează sistemele pipeline de instrucŃiuni şi
metode pentru rezolvarea problemei salturilor, cum sunt tehnicile de
preîncărcare multiplă şi de predicŃie a salturilor.
3.6. ComparaŃie între arhitecturile RISC şi CISC
In general, timpul necesar unui procesor pentru a realiza execuŃia unui
program poate fi influenŃat de trei factori:
1. Numărul de instrucŃiuni din program;
2. Numărul mediu de cicluri de ceas necesare pentru execuŃia unei
instrucŃiuni;
3. Durata ciclului de ceas.
Arhitecturile CISC reduc numărul de instrucŃiuni necesare într-un program
prin furnizarea unor instrucŃiuni speciale care pot executa operaŃii complexe.
Spre deosebire de acestea, arhitecturile RISC reduc numărul mediu al ciclurilor
de ceas necesare pentru execuŃia unei instrucŃiuni. Atât arhitecturile CISC cât şi
cele RISC profită de îmbunătăŃirile tehnologiei circuitelor integrate pentru a
reduce durata ciclului de ceas.
Arhitecturile RISC sunt calculatoare de tip load/store; acestea pot obŃine
un nivel ridicat al concurenŃei prin separarea execuŃiei instrucŃiunilor de
încărcare şi memorare de alte instrucŃiuni. Arhitecturile CISC nu pot obŃine
întotdeauna acelaşi nivel al concurenŃei din cauza setului lor de instrucŃiuni de
tip memorie-registru.
Majoritatea aspectelor negative ale arhitecturilor RISC sunt direct legate
de aspectele lor pozitive. Din cauza instrucŃiunilor simple, performanŃele unei
arhitecturi RISC depind de eficienŃa compilatorului. De asemenea, datorită
numărului mare de registre, alocarea registrelor este mai complexă, crescând
astfel complexitatea compilatorului. De aceea, principalul dezavantaj al unei
arhitecturi RISC este necesitatea de a scrie un compilator eficient. In general,
timpul de dezvoltare al sistemelor software pentru calculatoarele RISC este mai
lung decât cel pentru calculatoarele CISC. Un alt dezavantaj este că anumite
instrucŃiuni CISC sunt echivalente cu două sau trei instrucŃiuni RISC, ceea ce
determină ca programele RISC să fie mai lungi. Deci, considerând avantajele
ambelor arhitecturi CISC şi RISC, proiectarea unui procesor RISC poate fi
îmbunătăŃită prin utilizarea unora din principiile CISC care au fost dezvoltate şi
îmbunătăŃite de-a lungul anilor.

3.7. AplicaŃii ale procesoarelor RISC


Sistemele RISC au fost proiectate de grupuri diferite într-o diversitate de
moduri. Primul calculator RISC a fost minicalculatorul 801, realizat de firma IBM
în 1975. InformaŃii despre acest calculator au fost publicate abia în 1982.
Minicalculatorul 801 a fost predecesorul calculatorului IBM PC/RT (RISC
Technology).
In 1980, un grup de cercetători de la Universitatea California din Berkeley,
conduşi de David Patterson, a început proiectarea circuitului VLSI RISC I, urmat
de circuitul RISC II. Circuitul RISC I a reprezentat baza arhitecturii SPARC
(Scalable Processor ARChitecture), proiectată la firma Sun Microsystems.
Actualmente, circuitele SPARC sunt produse de numeroase firme, ca Fujitsu,
Bipolar Integrated Technology, LSI Logic, Texas Instruments, Matra, Philips,
Weitek şi altele. Arhitectura SPARC constituie baza staŃiilor de lucru ale firmei
Sun Microsystems (de exemplu, Sun-4, SPARCstation, SPARCengineUltraAX,
Ultra60).
In 1982, o echipă de la Universitatea Stanford, condusă de John
Hennessy, a proiectat un circuit numit MIPS (Microprocessor without
Interlocking Pipe Stages), deci un microprocesor fără interblocarea etajelor
pipeline. Pe baza acestui circuit, au fost proiectate următoarele procesoare:
MIPS R2000, MIPS R3000, MIPS R4000, MIPS R8000, MIPS R10000 şi altele.
Actualmente, procesoarele MIPS sunt fabricate de firme ca Integrated Device
Technology (IDT), LSI Logic, NEC, NKK, Toshiba, Philips, Siemens şi Sony.
In timpul anilor '80 au fost dezvoltate numeroase alte arhitecturi RISC.
Unele din acestea sunt: transputerul Inmos, dezvoltat la Universitatea din
Oxford; procesorul iWarp al firmei Intel, care a fost influenŃat de proiectul
anterior i432 al Intel şi de arhitectura WARP a lui Kung; proiectul R-6000 al IBM.
In prima generaŃie, noua tehnologie RISC a fost reprezentată de
proiectele IBM, şcoala de la Berkeley şi şcoala de la Stanford. Tehnologia RISC
a fost aplicată pentru staŃiile de lucru de înaltă performanŃă, iar utilitarele
software erau limitate. PerformanŃele erau egale sau puŃin mai bune decât cele
ale calculatoarelor CISC convenŃionale.
In următoarea generaŃie, tehnologia RISC a început să domine staŃiile de
lucru inginereşti şi staŃiile grafice performante. Utilitarele software au fost mult
îmbunătăŃite şi au fost demonstrate avantaje decisive asupra calculatoarelor
CISC. Nucleul RISC a fost integrat în controlerele de periferice pentru aplicaŃii
dedicate.
In a treia generaŃie, RISC a devenit o tehnologie tradiŃională, iar tehnicile
RISC au fost aplicate pentru calculatoarele CISC. Sfera aplicaŃiilor s-a lărgit de
la calculele tehnice la aplicaŃiile comerciale. ProiectanŃii RISC au încercat
tehnicile superscalare sau superpipeline, având căi de 64 de biŃi la memorie.
Arhitecturile au fost optimizate pentru multiprocesare.
In prezent, conceptele RISC sunt înglobate în procesoarele
convenŃionale. Este uşor de constatat influenŃa procesoarelor RISC i860 şi i960
ale firmei Intel asupra procesoarelor Pentium. Similar, se poate constata
influenŃa procesoarelor RISC ale firmei Motorola din seria 88000 asupra
procesoarelor 680x0 şi PowerPC.
Un alt domeniu pentru arhitecturile RISC sunt procesoarele încorporate
(embedded processors). Aceste procesoare au posibilităŃi intensive de I/E, dar,
de obicei, nu au interfaŃă directă cu utilizatorul. Ele reprezintă un subsistem al
unui sistem mai mare. AplicaŃiile acestor procesoare cuprind imprimante cu
laser, aparate fax, dispozitive de comunicaŃie celulară, aparate de uz casnic,
jocuri video performante, imprimante şi scannere color, terminale X şi altele.
Controlerele de discuri RAID {Redundant Array of Inexpensive Disks) şi
tehnologiile avansate de reŃea ca ATM (Asynchronous Transfer Mode) necesită
de asemenea controlere încorporate mai complexe. Procesoarele care sunt
destinate acestui domeniu sunt Intel i960, familia AMD 29000, unele din
procesoarele SPARC, cum este SPARClite al firmei Fujitsu şi anumite
procesoare MIPS.
O piaŃă importantă pentru procesoarele RISC este cea a unităŃilor de
extensie TV pentru aplicaŃii multimedia interactive. Aceste unităŃi trebuie să fie
ieftine, să permită producŃia de masă şi să fie de tip plug-and-play în ceea ce
priveşte simplitatea operării. Televiziunea de înaltă definiŃie (HDTV - High-
Definition Television) va impune cerinŃe crescute asupra lăŃimii de bandă.
UnităŃile de extensie asigură funcŃii de interfaŃă pentru reŃea, decompresia în
timp real a imaginilor video, conversia şi controlul formatului, şi decriptarea.
Unele din procesoarele RISC pentru acest domeniu cuprind MIPS, ARM
(Advanced RISC Machine) şi PowerPC.
O altă piaŃă este reprezentată de calculatoarele "palmtop". Clasa acestor
calculatoare, numite şi PDA (Personal Digital Assistant), impune cerinŃe
speciale asupra procesoarelor RISC. Prima dintre acestea este gestiunea
inteligentă a puterii consumate. Toate circuitele trebuie să fie complet statice. O
altă cerinŃă este o dimensiune redusă, cu un înalt nivel de integrare. Principalii
rivali pentru această piaŃă sunt procesoarele AT&T 92010, ARM, NEC V-800 şi
modelele Hitachi SH-7000.
O cerinŃă de bază a utilizatorilor pentru calculatoarele PDA este
conectivitatea - în mod ideal, conectivitate globală fără fir la un cost redus.
Aceasta este o extensie a pieŃei de pagere şi telefoane celulare. Aceste unităŃi
sunt prea mici pentru a permite conectarea unei tastaturi, astfel încât accentul a
fost pus pe recunoaşterea scrisului. Sunt necesare ecrane mici, dar cu rezoluŃie
ridicată, pentru a permite vizibilitatea în toate condiŃiile de iluminare.
Conceptele RISC sunt utilizate şi în prelucrarea digitală a semnalelor
(DSP - Digital Signal Processing). Dezvoltările majore sunt efectuate de Texas
Instruments, AT&T şi Motorola. Circuitele iniŃiale permiteau numai operaŃii în
virgulă fixă, dar circuitele ulterioare au evoluat pentru a permite şi aritmetica în
virgulă mobilă. Dimensiunile cuvântului au crescut de la 16 la 24 şi 32 de biŃi.
OperaŃiile executate în aplicaŃiile DSP sunt simple şi repetitive, însă, viteza de
operare este importantă.
Firma Motorola a dezvoltat familiile DSP 5600x şi 9600x. Modelele
ulterioare au fost influenŃate de conceptele RISC.
AT&T, cu circuitul DSP32C, s-a concentrat asupra aplicaŃiilor de
prelucrare a semnalelor şi a vocii. Texas Instruments, cu familia TMS 320C0x0,
are procesoare DSP care sunt cele mai apropiate de cele RISC, inclusiv
procesorul TMS 320C080.
In anumite aplicaŃii, un procesor DSP poate fi utilizat ca un accelerator.
Nucleul DSP, optimizat pentru operaŃia de înmulŃire şi acumulare necesară
pentru filtrarea digitală, este suficient de general pentru a permite de asemenea
o gamă largă de calcule. Procesoarele DSP au aplicaŃii în domeniul multimedia,
pentru prelucrarea sunetelor şi redarea imaginilor video în mişcare. Aceste
procesoare sunt utilizate, de asemenea, pentru aplicaŃii de
modulare/demodulare (modem) şi codare/decodare (codec) la calculatoarele
PC.
|Cap.4. Introducere în Multithreading, Superthreading şi Hyperthreading

4.1. Procese şi fire de execuŃie


Un sistem de operare execută la un moment dat o multitudine de programe.
Utilizatorul poate să ruleze în acelaşi timp un editor de texte, un browser de
Internet şi un player audio. Toate aceste programe lansate în execuŃie poartă
numele de procese şi acestea sunt executate într-o manieră secvenŃială,
concurând pentru folosirea resurselor comune ale sistemului de calcul precum
procesor, memorie sau hard-disk.
Un proces este constituit din unul sau mai multe segmente de cod şi
segmente de date mapate într-un spaŃiu virtual de adresare. Fiecare proces
deŃine un număr de resurse alocate de către sistemul de operare, cum ar fi
fişiere deschise sau zone de memorie alocate dinamic. Resursele alocate
procesului sunt eliberate la terminarea execuŃiei procesului. Un aspect
fundamental al proceselor este faptul că două procese diferite au întotdeauna
spaŃii de adresă distincte, fiecare rulând ca şi când toată memoria ar fi a sa.
Astfel procesele sunt izolate între ele şi nu pot accesa în mod direct datele
celorlalte procese.
Sistemul de operare şi sistemul hardware cooperează pentru a realiza
mecanismul de multitasking, prin care controlul UCP este comutat pe rând între
diverse programe.
Un fir de execuŃie este unitatea de execuŃie a unui proces. Acesta poate fi
văzut ca un program în execuŃie fără spaŃiu de adresă propriu. Firul de execuŃie
rulează în cadrul unui proces partajând spaŃiul de adresă al acestuia. Fiecărui fir
de execuŃie i se asociază o secvenŃa de instrucŃiuni, un set de registri CPU şi o
stiva. Procesul nu executa instrucŃiuni, acesta fiind spaŃiu de adresare comun
pentru unul sau mai multe fire de execuŃie. Firele de execuŃie sunt cele care
execută instrucŃiunile.
Fiecare proces are cel puŃin un fir de execuŃie. Uneori însă apare nevoia să
lucrăm în paralel asupra aceloraşi date şi atunci putem crea mai multe fire de
execuŃie în cadrul aceluiaşi proces. De exemplu, în cazul editorului de texte de
care s-a amintit la început, atât utilizatorul cât şi task-ul care salvează o copie
de siguranŃă lucrează asupra aceloraşi date, deci vom avea două fire de
execuŃie în cadrul aceleiaşi aplicaŃii. Cu toate că firele de execuŃie partajează
spaŃiul de adresă al unui proces, unele resurse sunt individuale, cum ar fi stiva,
regiştrii şi contorul program. Aceasta permite mai multor fire de execuŃie din
cadrul aceluiaşi proces să urmeze căi diferite de instrucŃiuni.
Considerăm pentru început un program format dintr-un singur fir de
execuŃie. In figura 4.1. se prezintă funcŃionarea unei CPU cu un singur fir de
execuŃie (single-thread CPU).
In CPU au fost evidenŃiate unitatea de alimentare cu instrucŃiuni formată din
patru sisteme pipeline şi unitatea de execuŃie formată din şapte sisteme pipeline
funcŃionând în paralel.
Dreptunghiurile colorate din RAM reprezintă instrucŃiunile a patru programe
diferite aflate în curs de execuŃie. După cum se poate vedea, în acest moment
sunt executate numai instrucŃiunile programului „roşu”, în timp ce celelalte
programe îşi aşteaptă rândul.
După cum se observă din această figură, sistemele pipeline conŃin o
mulŃime de etaje goale, numite pipeline bubbles (bule), care apar deoarece, din
motivele prezentate anterior, CPU nu poate asigura alimentarea continuă a
sistemelor pipeline.

Fig. 4.1.

Evident, această situaŃie reduce eficienŃa procesorului. Astfel, deşi unitatea


de alimentare cu instrucŃiuni, poate emite patru instrucŃiuni în fiecare ciclu de
ceas, în situaŃia prezentată în figura 4.1, aceasta emite doar două instrucŃiuni şi
numai într-un singur ciclu reuşeşte să emită trei instrucŃiuni.
Pentru un program lansat în execuŃie se utilizează termenul de „proces”.
Fiecărui proces i se asociază un context de execuŃie. Prin context de execuŃie
se înŃeleg toate informaŃiile care descriu la un moment dat starea curentă de
execuŃie a procesului (de exemplu conŃinutul registrelor CPU, program counter,
indicatorii de condiŃie, etc.).
Proceselor sau firelor de execuŃie li se alocă pe rând câte o cuantă de timp
pentru a fi executate. La momentul potrivit un anumit proces (sau fir de
execuŃie) este eliminat din procesor, după ce contextul sau a fost salvat şi un alt
proces (sau fir de execuŃie) este adus în procesor. AcŃiunea de salvare a
contextului vechiului proces şi încărcarea contextului noului proces se numeşte
comutarea contextului. Comutarea contextului pentru un proces format din mai
multe fire de execuŃie, evident, va dura mai mult decât comutare unui singur fir
de execuŃie, dar oricum, această operaŃie iroseşte un număr de cicluri de ceas.
O modalitate de a reduce numărul de comutări ale contextelor şi de a
asigura mai mult timp CPU pentru fiecare proces este aceea de a construi un
sistem care să poată executa mai multe procese în acelaşi timp. Modul
convenŃional de a realiza acest lucru este de a adăuga sistemului încă un CPU,
obŃinând un sistem multiprocesor (SMP). Intr-un SMP sistemul de operare poate
programa ca două procese să fie executate exact în acelaşi timp, fiecare proces
fiind executat pe un CPU diferit. Evident că nu i se permite niciunui proces să
monopolizeze CPU şi în acest caz fiecărui proces fiindu-i alocată o cuantă de
timp CPU. Rezultatul final este totuşi că este disponibil un timp de execuŃie mai
mare astfel încât într-un, anumit interval de timp, fiecare proces aşteaptă mai
puŃin până obŃine acces la CPU.

Fig. 4.2

In figura 4.2 este prezentat un single-thread SMP. După cum se constată în


acest moment sunt executate simultan programul „roşu” şi programul „galben”,
fiecare pe câte un procesor. După ce cuanta de timp alocată fiecărui program
expiră, contextul lor este salvat, codul şi datele acestora sunt eliminate din CPU
şi două noi procese vor fi pregătite pentru execuŃie.
Se observă din figura 4.2 că, deşi acest sistem poate executa două procese
simultan numărul de bule (pipeline bubbles) s-a dublat, fiecare din cele două
procesoare contribuind cu la aceasta cu gradul sau de ineficienŃă.

4.2. Multithreading şi superthreading


O metodă de a creşte performanŃele procesorului constă în utilizarea
tehnicii superthreading. Un procesor care utilizează această tehnică se numeşte
procesor multithreaded, şi un astfel de procesor este capabil ca la un moment
dat să execute mai mult de un singur fir. Figura 4.3 explică cum funcŃionează
metoda superthreading.

Fig.4.3

După cum se observă din această figură, deoarece procesorul execută


instrucŃiuni din ambele fire de execuŃie, atât unitatea de alimentare cât şi
unitatea de execuŃie au mai puŃine etaje neutilizate (mai puŃine pipeline bublles).
SăgeŃile din stânga arată că, într-un anumit ciclu de ceas, etajele pipeline conŃin
instrucŃiuni numai dintr-un singur fir de execuŃie.
Pentru a înŃelege cum funcŃionează un procesor multithreaded să analizăm
cum funcŃionează CPU din figura 4.3. In cazul procesoarelor prezentate anterior
unitatea de alimentare cu instrucŃiuni conŃinea la un moment dat un singur fir de
execuŃie, care apoi, când se consuma cuanta de timp alocată, era comutat
pentru a face loc altui fir de execuŃie.
In acest caz unitatea de alimentare cu instrucŃiuni poate furniza în fiecare
ciclu de ceas patru instrucŃiuni către oricare dintre cele şapte unităŃi funcŃionale.
Toate aceste patru instrucŃiuni trebuie însă să provină din acelaşi fir de execuŃie.
Ca efect fiecare fir de execuŃie este limitat la o cuantă de timp, care acum
constă dintr-un singur ciclu de ceas.
Procesoarele multithreaded pot sigura atenuarea unor probleme de latenŃă
introduse de încărcarea operanzilor din memorie. De exemplu să consideram
cazul procesorului din figura 4.3, care execută două fire de execuŃie, pe cel roşu
şi pe cel galben. Dacă firul roşu necesită încărcarea unei date şi această dată
nu este prezentă în memoria cache, acest fir va fi întârziat multe cicluri de ceas
aşteptând data să sosească. Intre timp, totuşi, procesorul va executa firul
galben, menŃinând astfel pipeline-ul plin.
Deşi procedeul superthreading poate reduce substanŃial întârzierile
datorate latenŃei sistemului de memorie, nu are totuşi efectul scontat în cazul
unui paralelism redus la nivelul instrucŃiunilor dintr-un anume fir de execuŃie.
Dacă, la un moment dat, blocul de comandă reuşeşte să găsească în firul roşu
numai două instrucŃiuni care pot fi încărcate în paralel în unitatea de execuŃie,
celelalte două etaje ale unităŃii de încărcare vor rămâne neutilizate.

4.3. Simultaneous multithreading


Această problemă este rezolvată de procedeul numit simultaneous
multithreading (SMT) sau cum l-a denumit Intel hyper-threading. Procedeul
hyper-threading elimină restricŃia procedeului superthreading de a încărca într-
un anumit ciclu de ceas instrucŃiuni care aparŃin numai unui singur fir de
execuŃie. Această idee este prezentată în figura 4.4.

Fig. 4.4

După cum se poate constata atât unitatea de alimentare cu instrucŃiuni cât


şi unitatea funcŃională sunt utilizate mult mai eficient. Comparând cu sistemul
multiprocesor din figura 4.2, se constată imediat că cele două fire de execuŃie
care ocupau fiecare câte un procesor sunt acum comasate într-un singur
procesor. In acest mod toate etajele unităŃii de alimentare cu instrucŃiuni sunt
ocupate iar unităŃile de execuŃie sunt acum mult mai eficient utilizate. De fapt
procesorul hyper-hreading acŃionează ca şi cum ar avea două CPU. Evident
exemplul prezentat, în care cele două fire de execuŃie sunt în totalitate
complementare, este pur didactic, însă ne permite să ne realizăm eficienŃa
procedeului hyper-threading.
Din punct de vedere al sistemului de operare un procesor SMT este
compus din două sau mai multe procesoare logice şi firele de execuŃie pot fi
programate să fie executate de oricare din cele două sau mai multe procesoare
logice, exact ca într-un sistem multiprocesor.
Puterea sistemului hyper-threading constă în faptul că permite maximum de
flexibilitate la încărcarea etajelor unităŃii de alimentare cu instrucŃiuni,
îmbunătăŃind astfel gradul de utilizare al resurselor existente. Dacă comparăm
diagramele din figurile 4.2. şi 4.4. constatăm că ambele sisteme execută
aceeaşi cantitate de muncă dar sistemul hyper-threading utilizează mai puŃine
resurse şi are mai puŃini cicli de ceas pierduŃi în comparaŃie cu sistemul SMP.
Pentru a înŃelege mai bine cum acŃionează în practică un sistem hyper-
threading să considerăm următorul exemplu: Să presupunem unitatea de
programare a extras toate instrucŃiunile care pot fi executate în paralel din firul
de execuŃie roşu şi că acestea sunt numai două. Aceasta înseamnă că în
următorul ciclu de ceas vor fi încărcate numai două instrucŃiuni. Trebuie să
remarcăm că acesta este un scenariu foarte comun deoarece cercetările au
stabilit că media instrucŃiunilor paralele care pot fi extrase din cele mai multe
coduri este de 2,5 pe ciclu. Pentru acest motiv, Pentium 4, la fel ca şi multe alte
procesoare au fost echipate pentru a putea furniza 3 instrucŃiuni în fiecare ciclu
de ceas. Deoarece unitatea de programare din exemplul nostru ştie că ea poate
furniza până la patru instrucŃiuni pe ciclu, va căuta instrucŃiuni independente în
alt fir de execuŃie. In acest mod este eliminată gâtuirea care apare în procesul
de alimentare cu instrucŃiuni.

4.4. Implementarea tehnicii hyper-threading.


Deşi s-ar putea părea că implementarea tehnicii, hyper-threading necesită
un mare număr de circuite de comandă suplimentare, în realitate se pare că nu
este chiar aşa. Intel raportează că la procesorul Pentium Xeon circuitele
suplimentare care implementează sistemul hyper-threading nu depăşesc 5%
din suprafaŃa pastilei de siliciu.
Pentium Xeon este capabil să execute în paralel cel mult două fire de
execuŃie pe două procesoare logice. Pentru a prezenta sistemului de operare
două procesoare logice, procesorul Xeon trebuie să fie capabil să memoreze
informaŃiile corespunzătoare a două contexte distincte, corespunzătoare celor
două fire de execuŃie. Acest deziderat a fost realizat prin modificarea
microarhitecturii resurselor; unele dintre acestea au fost replicate iar altele
partiŃionate.
Pentru a asigura independenŃă totală a contextelor pentru fiecare procesor
logic există câteva resurse care trebuie dublate. De exemplu este evident că
fiecare procesor trebuie să aibă propriul său registrul IP (instruction pointer).
In mod similar procesorul Xeon are două tabele de alocare a registrelor,
fiecare dintre acestea Ńinând evidenŃa celor 8 registre pentru întregi şi a celor 8
registre pentru virgulă mobilă pentru fiecare din cele două procesoare logice.
De asemenea fiecare procesor logic are propriul său TLB (Translation
Look-aside Buffer ).
La procesorul Xeon resursele partiŃionate pot fi găsite sub formă de cozi
care decuplează unele de altele majoritatea etajelor pipeline-urilor.

Fig.4.5

De exemplu în figura 4.5. este prezentată una din cele trei cozi de
programare (scheduling queues) ale acestui procesor. Dacă această coadă de
programare are 12 instanŃe, 6 dintre acestea sunt alocate procesorului 0
(culoarea roşie), iar celelalte 5, procesorului 1 (culoarea galbenă), în funcŃie ce
cerere. Acest tip de partiŃionare ar putea fi considerat ca fiind „dinamică”. Spre
deosebire de aceasta cele două cozi din partea de sus a figurii 4.5 sunt
partiŃionate „static” în sensul că cele 12 instanŃe ale cozii sunt împărŃite în două,
câte 6 pentru fiecare procesor logic.
Cozile de programare (scheduling queues) ale procesorului Xeon sunt
partiŃionate dinamic pentru a evita ca unul dintre procesoarele logice să le poată
monopliza. Dacă fiecare coadă de programare nu ar limita numărul de instanŃe
pe care le poate utiliza fiecare procesor, atunci instrucŃiunile unui fir de execuŃie
ar putea umple coada, celălalt procesor rămânând fără instrucŃiuni de executat.
Dacă procesorul Xeon execută un singur fir toate resursele partiŃionate vor
fi combinate astfel încât acel fir de execuŃie să obŃină performanŃa maximă.
Cap. 5. Sisteme Multiprocesor

1.1. Taxonomia arhitecturilor de calculatoare


Una dintre cele mai cunoscute taxonomii (clasificări) ale arhitecturilor de
calculatoare este taxonomia lui Flynn. Michael Flynn a clasificat arhitecturile de
calculatoare în patru categorii, în funcŃie de prezenŃa unui singur şir sau a mai
multor şiruri de instrucŃiuni şi de date. Un şir de instrucŃiuni este un set de
instrucŃiuni secvenŃiale executate de un singur procesor, iar un şir de date este
fluxul secvenŃial de date necesar şirului de instrucŃiuni. Cele patru categorii ale
lui Flynn sunt următoarele:
1. SISD (Single Instruction stream, Single Data stream). Această categorie
corespunde arhitecturii von Neumann, în care se execută în orice moment o
singură instrucŃiune. Calculatoarele SISD sunt numite şi calculatoare seriale
scalare. Aceste calculatoare utilizează un registru numit contor de program,
care determină execuŃia serială a instrucŃiunilor. Pe măsură ce fiecare
instrucŃiune este încărcată din memorie, contorul de program este actualizat
pentru a conŃine adresa următoarei instrucŃiuni care se va încărca şi se va
executa în ordine secvenŃială. Există actualmente doar un număr redus de
calculatoare SISD; chiar şi procesoarele din calculatoarele personale utilizează
paralelismul în scopul creşterii eficienŃei. In cele mai multe situaŃii, acestea pot
executa două sau mai multe instrucŃiuni simultan.
2. MISD (Multiple Instruction stream, Single Data stream). In acest caz,
mai multe instrucŃiuni operează asupra unei singure date. Există două posibilităŃi
de interpretare a structurii calculatoarelor MISD. Prima posibilitate este de a se
considera o clasă de calculatoare la care mai multe unităŃi de prelucrare
distincte primesc instrucŃiuni distincte care operează asupra aceloraşi date.
Această clasă de calculatoare este considerată ca nepractică sau imposibilă de
către unii proiectanŃi de calculatoare şi în prezent nu există exemple de acest
tip. A doua posibilitate este de a se considera o clasă de calculatoare în care
datele sunt trecute printr-o serie de unităŃi de prelucrare.
Unele arhitecturile de tip pipeline, ca de exemplu procesoarele vectoriale
sau arhitecturile sistolice, sunt considerate calculatoare de acest tip.
Arhitecturile de tip pipeline execută o prelucrare vectorială utilizând o serie de
etaje, iar fiecare din acestea execută o anumită funcŃie şi produce un rezultat
intermediar. Motivul pentru care asemenea arhitecturi sunt clasificate ca sisteme
MISD este faptul că elementele unui vector pot fi considerate ca aparŃinând
aceleiaşi date, iar fiecare etaj pipeline prelucrează mai multe instrucŃiuni care
operează asupra acelui vector.
3. SIMD (Single Instruction stream, Multiple Data stream). In acest caz, o
singură instrucŃiune prelucrează simultan date diferite. La calculatoarele de
acest tip, există mai multe unităŃi de prelucrare şi o singură unitate de control.
Calculatoarele SIMD pot executa de asemenea prelucrări vectoriale. Aceasta se
realizează prin asignarea elementelor vectorilor unor unităŃi de prelucrare
diferite pentru o prelucrare concurentă. In această categorie pot fi considerate
procesoarele matriciale.
4. MIMD (Multiple Instruction stream, Multiple Data stream). Această
categorie cuprinde calculatoare cu mai multe unităŃi de prelucrare în care mai
multe instrucŃiuni pot opera simultan asupra unor date diferite. Calculatoarele
MIMD reprezintă arhitecturile cele mai complexe, obŃinând o eficienŃă ridicată
prin prelucrare concurentă. In acest caz, concurenŃa implică faptul că nu există
doar procesoare multiple care operează în paralel, dar şi faptul că se execută
procese multiple în acelaşi timp.
Taxonomia lui Flynn s-a dovedit o metodă corespunzătoare pentru
clasificarea arhitecturilor de calculatoare. Totuşi, progresele industriei de
calculatoare au creat arhitecturi care nu pot fi clasificate în mod clar prin
taxonomia lui Flynn. De exemplu, această taxonomie nu clasifică în mod
adecvat procesoarele vectoriale (SIMD şi MISD) şi arhitecturile hibride. Pentru a

Fig. 5.1

rezolva această problemă, au fost propuse mai multe taxonomii.


Figura 5.1 prezintă o taxonomie care cuprinde caracteristici ale unor
taxonomii propuse. Această taxonomie clasifică arhitecturile mai recente, dar nu
reprezintă o caracterizare completă a arhitecturilor paralele.
După cum se arată în figura 5.1, categoria calculatoarelor MIMD este
împărŃită în patru tipuri de arhitecturi paralele: multiprocesoare,
multicalculatoare, multi-multiprocesoare şi calculatoare cu flux de date. In
categoria SIMD, există un singur tip de arhitectură, reprezentată de
procesoarele matriciale. Categoria MISD este împărŃită în două tipuri de
arhitecturi: procesoare vectoriale de tip pipeline şi matrici sistolice. Celelalte
arhitecturi sunt grupate în două categorii: calculatoare hibride şi procesoare
speciale. Aceste arhitecturi sunt descrise în secŃiunea următoare.

5.2. Prezentare generală calculatoare a arhitecturilor de calculatoare

5.2.1. Sisteme Multiprocesor


Multiprocesorul este un calculator paralel constând din mai multe
procesoare interconectate care partajează un sistem de memorie. Procesoarele
pot fi configurate astfel încât toate să execute câte o parte diferită a aceluiaşi
program, sau astfel încât fiecare să execute simultan mai multe programe
diferite. O schemă bloc a unui multiprocesor este prezentată în figura 5.2.

Fig. 5.2.

In general, un multiprocesor constă din n procesoare şi m module de


memorie ( n > 1 , m > 0 ). Procesoarele sunt notate cu P1 , P2 ,..., Pn iar modulele de
memorie sunt notate cu M 1 , M 2 ,..., M m . ReŃeaua de interconectare RI
conectează fiecare procesor la un anumit subset al modulelor de memorie. O
instrucŃiune de transfer determină transferul datelor de la un anumit procesor
către memoria cu care este conectat procesorul. Pentru transferul datelor între
două procesoare, trebuie să se execute o secvenŃă programată de transferuri
de date, care transferă datele între memorii şi procesoare intermediare.
Pe baza organizării sistemului de memorie, multiprocesoarele pot fi
împărŃite în două grupe, cu legătură strânsă şi cu legătură slabă.
In cazul unui multiprocesor cu legătură strânsă, un sistem central de
memorie, numită memorie principală sau memorie globală, asigură acelaşi timp
de acces pentru fiecare procesor. Sistemul central de memorie poate fi
implementat fie ca un singur modul de memorie, fie ca un set de module de
memorie care pot fi accesate în paralel de diferite procesoare. In ultimul caz, se
reduce conflictul la memorie şi astfel sistemul este mai eficient. Conflictul la
memorie se referă la situaŃia în care mai multe procesoare solicită acces la
memorie într-un interval scurt de timp, rezultând întârzieri mari de acces la
memorie. Pe lângă sistemul central de memorie, fiecare procesor poate avea şi
o memorie cache de dimensiuni reduse. Aceste memorii cache ajută de
asemenea la reducerea conflictelor la memorie.
In cazul unui multiprocesor cu legătură slabă, pentru a se reduce
conflictele la memorie, sistemul de memorie este partiŃionat între procesoare,
deci, fiecărui procesor i se ataşează o memorie locală. Astfel, fiecare procesor
poate accesa în mod direct memoria sa locală şi toate memoriile locale ale
celorlalte procesoare. Timpul de acces la o memorie care nu este locală este
însă mult mai ridicat decât cel la memoria locală.
Indiferent de tipul multiprocesorului, toate procesoarele acestuia utilizează
acelaşi sistem de operare. Sistemul de operare asigură interacŃiunea dintre
procesoare şi taskurile acestora. De obicei, procesoarele sunt de acelaşi tip; în
acest caz, multiprocesorul se numeşte omogen. Dacă procesoarele sunt de
tipuri diferite, multiprocesorul se numeşte eterogen. Oricare din procesoare
poate accesa oricare din dispozitivele de I/E.

5.2.2. Sisteme multicalculator


Spre deosebire de un multiprocesor, un multicalculator poate fi considerat
un calculator paralel în care fiecare procesor are o memorie locală proprie. Un
procesor are acces direct doar la memoria sa locală şi nu poate adresa
memoriile locale ale altor procesoare. Această adresabilitate locală este o
caracteristică importantă care deosebeşte multicalculatoarele de
multiprocesoare. O schemă bloc a acestei arhitecturi este prezentată în figura
5.3.

Fig. 5.3

In figura 5.3, există n noduri de procesare (NP) şi fiecare nod constă dintr-
un procesor şi o memorie locală. ReŃeaua de interconectare (RI) conectează
fiecare nod de procesare la un anumit subset al celorlalte noduri de procesare.
O instrucŃiune de transfer determină transferul datelor de la un anumit nod la
unul din nodurile cu care este conectat. Pentru transferul datelor între două
noduri care nu pot fi conectate direct prin reŃeaua de interconectare, datele
trebuie transferate prin noduri intermediare utilizând un mecanism cu
transmitere de mesaje.
Intr-un mecanism cu transmitere de mesaje, un procesor poate transmite
(sau recepŃiona) un bloc de informaŃii la (sau de la) fiecare din celelalte
procesoare prin canale de comunicaŃie. Aceste canale sunt conexiuni fizice între
procesoare, aranjate pe baza unei topologii a reŃelei de interconectare. Fiecare
procesor este conectat la un canal de comunicaŃie printr-un dispozitiv numit
interfaŃă de comunicaŃie. Acest dispozitiv poate transmite sau recepŃiona date
printr-un canal de comunicaŃie şi poate executa funcŃii pentru a asigura că
datele sunt transmise şi recepŃionate corect.
Înainte ca un bloc de informaŃii să fie transmis printr-un canal, blocul este
împachetat într-un mesaj cu un câmp al antetului la început şi un câmp al sumei
de control la sfârşit. Câmpul antetului constă din informaŃii de identificare,
cuprinzând adresa sursă, adresa destinaŃie şi lungimea mesajului. Câmpul
sumei de control constă din mai mulŃi biŃi de detecŃie a erorilor de transmisie. La
anumite implementări, interfaŃa de comunicaŃie este capabilă de a crea şi a
decodifica câmpul antetului şi al sumei de control.
Comparând multiprocesoarele şi multicalculatoarele, primele pot fi
programate mai uşor decât cele din urmă. Multiprocesoarele reprezintă
arhitectura dominantă în cazul sistemelor paralele de dimensiuni reduse. In
general, pe măsură ce numărul de procesoare creşte, multicalculatoarele devin
mai economice decât multiprocesoarele. Multicalculatoarele sunt arhitecturi
eficiente pentru sistemele paralele de dimensiuni mari. Aceasta se datorează
următoarelor motive:
- Calculele ştiinŃifice pot fi partiŃionate astfel încât aproape toate
operaŃiile pot fi executate local;
- Se obŃine o îmbunătăŃire semnificativă a performanŃelor dacă
majoritatea referinŃelor la memorie sunt efectuate la memoriile locale.

5.2.3. Sisteme Multi-multiprocesoare


Odată cu progresele tehnologiei VLSI, a devenit posibilă construirea unor
calculatoare paralele de dimensiuni mari utilizând microprocesoare cu
performanŃe ridicate. Pentru proiectarea unor asemenea calculatoare, pot fi
combinate caracteristicile multiprocesoarelor şi multicalculatoarelor, într-o
arhitectură numită multi-multiprocesor (sau multiprocesor distribuit). Deci, un
multi-multiprocesor poate fi considerat un multicalculator în care fiecare nod de
procesare este un multiprocesor. Figura 5.4 prezintă structura generală a unui
multi-multiprocesor.

Fig. 5.4.
Fiecare nod permite ca taskurile cu un grad relativ ridicat de interacŃiune
să fie executate local de către un multiprocesor, reducând astfel timpul necesar
comunicaŃiei. Dacă fiecare nod este un multiprocesor, complexitatea programării
paralele a unui multicalculator va fi redusă.

5.2.4. Arhitecturi cu flux de date


Intr-o arhitectură cu flux de date (dataflow), o instrucŃiune este gata pentru
execuŃie atunci când datele care reprezintă operanzii instrucŃiunii devin
disponibile. Rezultatele instrucŃiunilor executate anterior formează operanzii
instrucŃiunilor care aşteaptă să fie executate. Se formează astfel un flux de date,
care declanşează execuŃia instrucŃiunilor. Astfel, nu este necesar un contor de
program care există într-o arhitectură von Neumann pentru a controla execuŃia
instrucŃiunilor.
InstrucŃiunile unui calculator cu flux de date nu adresează variabile într-o
memorie partajată globală, ci ele conŃin valorile variabilelor utilizate. Intr-o
arhitectură cu flux de date, execuŃia instrucŃiunilor nu afectează alte instrucŃiuni
care sunt gata pentru execuŃie. Astfel, mai multe instrucŃiuni pot fi executate
simultan, ceea ce conduce la posibilitatea unor calcule cu un grad ridicat de
concurenŃă.
Figura 5.5 prezintă o schemă bloc a unui calculator cu flux de date.
InstrucŃiunile, împreună cu operanzii acestora, sunt păstrate în memoria de
instrucŃiuni şi date (I&D). Ori de câte ori o instrucŃiune este gata pentru execuŃie,
aceasta este transferată la unul din elementele de procesare (EP) prin reŃeaua
de arbitrare. Fiecare element de procesare este un simplu procesor cu o
memorie locală limitată. La recepŃionarea unei instrucŃiuni, elementul de
procesare execută operaŃia cerută şi transmite rezultatul la destinaŃia din
memorie prin intermediul reŃelei de distribuŃie.

Fig. 5.5

Arhitecturile cu flux de date pot fi clasificate în două grupe: statice şi


dinamice. Intr-o arhitectură statică, o instrucŃiune este validată ori de câte ori toŃi
operanzii necesari sunt recepŃionaŃi şi o altă instrucŃiune aşteaptă rezultatul
acestei instrucŃiuni; în caz contrar, instrucŃiunea rămâne invalidată. Această
constrângere poate fi impusă prin utilizarea semnalelor de achitare. Intr-o
arhitectură dinamică, o instrucŃiune este validată ori de câte ori toŃi operanzii
necesari sunt recepŃionaŃi. In acest caz, pot deveni disponibile mai multe seturi
de operanzi ale unei instrucŃiuni în acelaşi timp. Comparativ cu arhitecturile
statice cu flux de date, arhitecturile dinamice permit un grad mai ridicat de
paralelism, deoarece o instrucŃiune nu trebuie să aştepte după o altă
instrucŃiune înainte de a-şi plasa rezultatul. In cazul metodei dinamice trebuie
stabilit însă un mecanism pentru a distinge diferitele seturi de operanzi pentru o
instrucŃiune.
5.2.5. Procesoare matricIale
Un procesor matricial (figura 5.6) constă dintr-un set de noduri de
procesare (NP) şi un procesor scalar, care funcŃionează sub controlul unei
unităŃi de control centralizate. Unitatea de control încarcă instrucŃiunile din
memoria principală, le decodifică şi apoi le transmite fie la procesorul scalar, fie
la nodurile de procesare, în funcŃie de tipul acestora. Dacă instrucŃiunea
încărcată este o instrucŃiune vectorială, aceasta este transmisă la toate nodurile
de procesare. Toate nodurile execută simultan aceeaşi instrucŃiune asupra
datelor diferite păstrate în memoriile lor locale. Astfel, un procesor matricial
necesită un singur program pentru a controla toate nodurile de procesare din
sistem şi nu este necesară duplicarea codului programului la fiecare nod de
procesare.

Fig. 5.6.

Un procesor matricial poate fi definit, de exemplu, sub forma unei grile în


care fiecare intersecŃie reprezintă un NP, iar liniile dintre intersecŃii reprezintă căi
de comunicaŃie. Fiecare NP din matrice poate transmite (sau recepŃiona) date la
(sau de la) cele patru noduri vecine. Unul dintre procesoare, reprezentând
unitatea de control, decide operaŃiile care trebuie executate de fiecare NP în
timpul fiecărui ciclu de procesare şi transferurile de date necesare între nodurile
de procesare.
Ideea principală a unui procesor matricial este de a se exploata
paralelismul existent în setul de date al unei anumite probleme şi nu de a se
paraleliza secvenŃa de execuŃie a instrucŃiunilor pentru acea problemă. Calculul
paralel se realizează prin asignarea fiecărui procesor la o partiŃie a datelor.
Dacă setul de date este un vector, partiŃia va fi un element al vectorului.
Matricele de procesoare îmbunătăŃesc performanŃele prin operarea simultană
asupra tuturor partiŃiilor de date. Aceste procesoare pot executa operaŃii
aritmetice sau logice asupra vectorilor. De aceea, ele se numesc şi procesoare
vectoriale.
5.2.6. Procesoare vectoriale de tip pipeline
Un procesor vectorial de tip pipeline poate prelucra în mod eficient
operanzi vectoriali (şiruri continue de date). In timp ce procesoarele matriciale
sunt controlate de instrucŃiuni, procesoarele vectoriale de tip pipeline sunt
controlate de şiruri continue de date. Aceasta este diferenŃa principală între un
procesor matricial sau vectorial şi un procesor vectorial de tip pipeline. Figura
5.7 prezintă structura de bază a unui procesor vectorial de tip pipeline.
Există două procesoare principale: un procesor scalar şi un procesor
vectorial. Procesorul scalar execută instrucŃiunile scalare, iar procesorul
vectorial execută instrucŃiunile vectoriale utilizând mai multe etaje de prelucrare.
Unitatea de control încarcă instrucŃiunile din memoria principală, le decodifică şi
apoi le transmite fie la procesorul scalar, fie la procesorul vectorial realizat sub
formă de sistem pipeline, în funcŃie de tipul acestora.

Fig. 5.7

Procesoarele vectoriale de tip pipeline utilizează mai multe module de


memorie pentru a furniza etajelor de prelucrare un şir continuu de date. Adesea
se utilizează un compilator cu vectorizare pentru a aranja datele într-un şir care
poate fi utilizat apoi de cele două procesoare.

5.2.7. Matrice sistolice


Pentru calculele ştiinŃifice, adesea este necesară rezolvarea unor sisteme
de ecuaŃii liniare de dimensiuni mari. De obicei, pentru rezolvarea unor
asemenea sisteme de ecuaŃii se utilizează algebra matriceală. Datorită
secvenŃelor lungi ale calculelor aritmetice, majoritatea operaŃiilor algebrice
matriciale sunt executate pe calculatoare digitale cu viteză ridicată utilizând
pachete software dedicate. Un dezavantaj major al execuŃiei operaŃiilor
algebrice matriciale pe calculatoare generale este timpul de execuŃie ridicat. De
asemenea, în cazul unui calculator general memoria principală nu are o
dimensiune suficientă pentru a permite plasarea unor matrice foarte mari. De
aceea, sunt necesare numeroase transferuri de I/E, ceea ce creşte timpul de
execuŃie.
Pentru rezolvarea acestei probleme, au fost introduse arhitecturi speciale.
O soluŃie constă în utilizarea unei matrice sistolice (figura 5.8). In cazul acestei
arhitecturi, există un număr mare de elemente de procesare (EP) identice.
Fig. 5.8

Fiecare element de procesare are o memorie locală limitată şi, pentru a nu


se limita numărul de elemente de procesare plasate într-o matrice, fiecare EP
poate fi conectat numai cu elementele de procesare vecine prin reŃele de
interconectare. Deci, elementele de procesare sunt aranjate într-o structură de
tip pipeline, sub forma unei matrice liniare sau bidimensionale. Intr-o matrice
sistolică elementele de date şi rezultatele parŃiale parcurg elementele de
procesare în timpul execuŃiei, constând din mai multe cicluri de procesare. In
fiecare ciclu de procesare, anumite elemente de procesare execută aceeaşi
operaŃie relativ simplă (de exemplu, adunare sau înmulŃire) asupra elementelor
de date şi transmit aceste elemente sau rezultate parŃiale la alte elemente de
procesare vecine.
De obicei, o matrice sistolică are o formă rectangulară sau hexagonală,
dar poate avea orice formă. Utilizând tehnologia VLSI, este posibil să se obŃină
o putere de calcul foarte ridicată cu un sistem constând dintr-un număr mare de
procesoare identice organizate într-o manieră structurală.

5.2.8. Arhitecturi hibride


Arhitecturile hibride cuprind caracteristici ale unor arhitecturi diferite pentru
a obŃine performanŃe mai ridicate ale calculelor paralele. In general, există două
tipuri de paralelism care se pot utiliza: paralelism de control şi paralelism de
date. In cazul paralelismului de control, se execută simultan două sau mai multe
operaŃii de către procesoare diferite. Calculatoarele MIMD sunt ideale pentru
implementarea paralelismului de control. Acestea sunt adecvate pentru
probleme care necesită executarea simultană a unor operaŃii diferite asupra
datelor diferite. In cazul paralelismului de date, se execută aceeaşi operaŃie
asupra mai multor partiŃii ale datelor de către mai multe procesoare.
Calculatoarele SIMD sunt ideale pentru implementarea paralelismului de date.
Acestea sunt adecvate pentru probleme în care aceeaşi operaŃie poate fi
executată simultan asupra unor porŃiuni diferite ale datelor. Calculatoarele MISD
sunt de asemenea potrivite pentru paralelismul de date. Aceste calculatoare
permit procesarea vectorilor utilizând tehnica pipeline.
In practică, cele mai mari avantaje se obŃin prin utilizarea paralelismului de
date. Aceasta deoarece în acest caz se beneficiază de pe urma paralelismului
în mod proporŃional cu cantitatea datelor implicate în calcule. Totuşi, uneori nu
este posibil să se exploateze la maxim paralelismul de date, fiind necesară
utilizarea atât a paralelismului de control cât şi a celui de date. De exemplu, în
cazul unor programe de aplicaŃie rezultatele cele mai bune se pot obŃine atunci
când aceste programe sunt divizate în mai multe părŃi care utilizează
paralelismul de date, iar părŃile componente utilizează paralelismul prin tehnica
pipeline. Un grup de procesoare culege datele şi execută anumite prelucrări
preliminare. Procesoarele transmit apoi rezultatele lor la al doilea grup de
procesoare care execută alte calcule asupra rezultatelor. Al doilea grup
transmite rezultatele obŃinute la al treilea grup de procesoare, care obŃine
rezultatele finale. Deci, un calculator paralel care cuprinde atât caracteristici ale
arhitecturilor MIMD, cât şi cele ale SIMD (sau MISD) poate rezolva în mod
eficient o gamă largă de probleme.

5.2.9. ReŃele neuronale artificiale


Un exemplu de arhitectură specială este o reŃea neuronală artificială. O
asemenea reŃea constă dintr-un număr mare de elemente de procesare (EP)
care funcŃionează în paralel. Aceste reŃele pot rezolva într-un mod mai eficient
unele probleme pentru care arhitecturile von Neumann sunt ineficiente, ca de
exemplu emularea informaŃiilor naturale sau recunoaşterea formelor.
Arhitecturile bazate pe reŃele neuronale sunt capabile de învăŃare şi sunt
adaptive la schimbările de mediu.

Fig. 5.9

Figura 5.9 prezintă structura generală a unei reŃele neuronale artificiale.


Fiecare element de procesare emulează unele caracteristici ale neuronului
biologic. Acesta are un set de intrări şi una sau mai multe ieşiri. Fiecărei intrări i
se asignează o pondere numerică. Această pondere corespunde potenŃialului
sinaptic al unui neuron biologic. O sinapsă reprezintă conexiunea dintre un
neuron şi un terminal al altui neuron (terminal numit axon). Transmiterea
informaŃiilor de la un neuron la altul are loc prin intermediul sinapselor şi
axonilor. Intrările unui element de procesare sunt multiplicate cu ponderile lor şi
sunt apoi însumate pentru a determina nivelul de activare al neuronului. După
determinarea nivelului de activare, se aplică o funcŃie de activare pentru a
produce semnalul de ieşire. Ieşirile combinate ale unui strat (nivel) precedent
devin intrările următorului strat, în care acestea sunt din nou însumate şi
evaluate. Acest proces este repetat până când se traversează reŃeaua şi se
ajunge la o anumită decizie.
Spre deosebire de arhitecturile von Neumann, la care elementul primar de
calcul este procesorul, în cazul reŃelelor neuronale artificiale acest element este
reprezentat de conexiunile dintre elementele de procesare. Pentru o problemă
dată, trebuie să se determine valorile corecte ale ponderilor astfel încât reŃeaua
să poată executa prelucrările necesare. De multe ori, determinarea valorilor
corespunzătoare ale ponderilor se realizează prin ajustarea iterativă a
ponderilor cu scopul de a creşte performanŃele reŃelei. Regula de ajustare a
ponderilor este numită regulă de învăŃare, iar întregul proces de obŃinere a
ponderilor corespunzătoare este numit învăŃare.
Toate modelele de reŃele neuronale artificiale sunt caracterizate prin
operarea paralelă şi interconectarea densă între elementele de procesare. In
acelaşi timp, există diferenŃe majore între modelele individuale în ceea ce
priveşte arhitectura lor, regulile de învăŃare şi modul de interacŃiune cu mediul.
O taxonomie generală a acestor modele este prezentată în continuare.
DistincŃia cea mai generală între diferitele modele de reŃele neuronale artificiale
este metoda de învăŃare. Dacă mediul furnizează exemplele de învăŃare sub
forma perechilor de vectori de intrare/ieşire, metoda de învăŃare este numită
supervizată. Această metodă este numită şi învăŃare cu un profesor, deoarece
mediul are rolul unui profesor pentru reŃeaua neuronală, punând la dispoziŃie
exemple detaliate despre ceea ce trebuie învăŃat. Dacă, din contră, mediul
specifică intrarea dar nu şi ieşirea, învăŃarea este nesupervizată. In acest caz,
reŃeaua neuronală trebuie să descopere soluŃia la problema de învăŃare. In
cazul învăŃării cu ajutor (reinforcement learning), mediul furnizează anumite
informaŃii de ieşire, dar aceste informaŃii sunt sub forma evaluării unei
performanŃe a reŃelei neuronale şi nu sub forma unor exemple de învăŃare.
Această metodă este numită şi învăŃare cu un critic, spre deosebire de
învăŃarea cu un profesor, deoarece mediul nu specifică ceea ce trebuie învăŃat,
ci numai dacă ceea ce se învaŃă este corect.
O altă distincŃie între diferite modele de reŃele neuronale artificiale se
bazează pe arhitectura acestora. Arhitectura se referă la tipul de prelucrare
executată de neuronii artificiali şi la interconexiunile dintre aceştia. Modelele de
reŃele neuronale artificiale pot fi împărŃite în două grupe: deterministe şi
stohastice. ReŃelele deterministe produc întotdeauna acelaşi rezultat la ieşire
pentru aceeaşi intrare, în timp ce la reŃelele stohastice ieşirea pentru o intrare
dată poate varia în funcŃie de o anumită distribuŃie a probabilităŃii de ieşire.
Modelele stohastice sunt de obicei mai dificil de analizat şi simulat, dar în
acelaşi timp ele sunt mai realiste în numeroase aplicaŃii.
Adesea, modelele de reŃele neuronale artificiale sunt simulate prin
program. Această metodă este flexibilă, dar este lentă. Metoda cea mai eficientă
pentru implementarea unei reŃele neuronale artificiale este implementarea prin
hardware. In ultimii ani, au fost dezvoltate mai multe circuite pentru reŃelele
neuronale artificiale. In general, sunt disponibile trei tehnologii diferite pentru
implementarea prin hardware a unei reŃele neuronale artificiale: electronică,
optică şi electro-optică.
Tehnologia electronică poate fi împărŃită la rândul ei în trei tipuri de
implementări: analogică, digitală şi hibridă. O implementare analogică reduce
complexitatea circuitului, dar este mai puŃin precisă şi, de multe ori, nu permite
obŃinerea unui grad de precizie de 6 biŃi. Aceasta se datorează în principal
nivelului redus de precizie al rezistoarelor. O implementare digitală asigură o
precizie mai ridicată, dar de multe ori necesită un spaŃiu mai mare în cadrul
circuitului integrat. O implementare hibridă conŃine elemente analogice şi
digitale pentru a obŃine avantajele ambelor implementări.
Tehnologia optică poate soluŃiona anumite probleme ale tehnologiei
electronice, în special cele legate de conectivitatea între neuroni, din cauza
întârzierilor şi a spaŃiului necesar în cadrul circuitului integrat. Prin utilizarea
interconexiunilor optice, nu este necesară nici o izolaŃie între traseele
semnalelor, deoarece razele de lumină pot trece unele prin altele fără a
interacŃiona între ele. De asemenea, traseele semnalelor pot fi realizate
tridimensional. In sfârşit, ponderile pot fi memorate sub forma unor holograme.
Cu toate aceste avantaje, există numeroase probleme asociate cu tehnologia
optică, în special faptul că unele caracteristici fizice ale dispozitivelor optice nu
sunt compatibile cu cerinŃele reŃelelor neuronale.
Intr-o implementare electro-optică, interconexiunile sunt realizate optic.
Deoarece reŃelele neuronale artificiale sunt puternic interconectate, această
metodă devine o alternativă atractivă de implementare.

5.2.10. Procesoare bazate pe logica fuzzy


Un alt exemplu de arhitectură specială este reprezentată de un procesor
bazat pe logica fuzzy. Logica fuzzy a fost propusă de Lofti Zadeh pentru a
îmbunătăŃi utilizarea tehnicilor inteligenŃei artificiale în anumite domenii cum este
recunoaşterea vorbirii. In inteligenŃa artificială, logica cu două valori reprezintă
semnificaŃia unei propoziŃii ca adevărată sau falsă, dar nu poate reprezenta o
propoziŃie cu o semnificaŃie imprecisă. In logica fuzzy, o propoziŃie poate fi
adevărată sau falsă, sau poate avea o valoare intermediară (de exemplu, foarte
adevărat).
Logica fuzzy se ocupă de principiile formale ale raŃionamentului
aproximativ. Această logică încearcă să trateze în mod eficient complexitatea
procesului cognitiv uman şi elimină unele dezavantaje asociate cu logica clasică
binară, care nu reflectă în mod corespunzător procesele cognitive umane
complexe. Logica clasică binară consideră clase cu limite clare, de exemplu,
negru sau alb. In acest fel, un obiect este fie un membru al unei clase, fie nu.
Spre deosebire de această logică, logica fuzzy consideră clase care nu au limite
clare, o măsură indicând gradul de apartenenŃă al unui obiect la o clasă.
Logica fuzzy a fost aplicată în numeroase domenii, cum sunt controlul
proceselor, recunoaşterea imaginilor, robotică şi sisteme expert. Controlul fuzzy
este prima aplicaŃie industrială a logicii fuzzy. Un controler fuzzy poate controla
sisteme care puteau fi controlate anterior numai de către operatori
experimentaŃi. In Japonia, s-au obŃinut progrese semnificative în logica fuzzy, iar
această logică a fost aplicată unei mari varietăŃi de produse, cum sunt sisteme
de control al navigaŃiei pentru automobile, camere video şi maşini de spălat.
Deşi implementarea prin software a logicii fuzzy asigură rezultate bune pentru
unele aplicaŃii, pentru implementarea aplicaŃiilor cu performanŃe ridicate sunt
necesare procesoare fuzzy dedicate, numite acceleratoare fuzzy.
Cap. 6. Indicatori de performanŃă

6.1. Timpul de execuŃie


PerformanŃa unui calculator se referă la viteza sa efectivă şi la fiabilitatea
sa hardware şi software. De obicei, măsura performanŃei este timpul.
Calculatorul care execută aceleaşi operaŃii în timpul cel mai scurt este mai
performant. Timpul de execuŃie al unui program este măsurat în secunde.
PerformanŃa este măsurată în mod frecvent ca o rată (măsură) a unor
evenimente pe secundă, astfel încât un timp mai redus indică o performanŃă mai
ridicată.
Există mai mulŃi indicatori care măsoară timpul. Unul din aceştia este numit
timp de răspuns. Acesta este timpul necesar terminării unui task, cuprinzând şi
accesele la memorie, operaŃiile de intrare/ieşire şi operaŃiile executate de
sistemul de operare. Utilizatorul este interesat în reducerea timpului de răspuns.
Deoarece în cazul multiprogramării UCP execută un alt program în timp ce
aşteaptă pentru o operaŃie de I/E şi nu minimizează neapărat timpul de răspuns
al unui program, este necesară o distincŃie între cele două activităŃi. Această
distincŃie este indicată de timpul UCP, care este timpul în care UCP execută
efectiv un program, fără a cuprinde timpul de aşteptare pentru operaŃiile de I/E
şi timpul în care UCP execută alte programe. Timpul UCP poate fi divizat în
timpul UCP pentru execuŃia programului utilizator, numit timpul UCP al
utilizatorului şi timpul UCP pentru execuŃia funcŃiilor apelate de program din
sistemul de operare, numit timpul UCP al sistemului.
Adesea se doreşte compararea performanŃelor a două calculatoare
diferite, de exemplu X şi Y . Calculatorul X este mai rapid decât Y dacă timpul
de execuŃie al lui X este mai redus decât cel al lui Y pentru taskul dat. In
particular, „calculatorul X este cu n% mai rapid decât Y " înseamnă că:
t E (Y ) n
=1+ (6.1)
tE ( X ) 100
unde t E este timpul de execuŃie.
Se poate defini performanŃa P a unui calculator ca fiind inversul timpului
de execuŃie t E .
In acest caz se poate scrie următoarea relaŃie:
t E (Y ) P ( X ) n
= =1+ (6.2)
t E ( X ) P(Y ) 100
Creşterea performanŃei n va fi:
P( X ) − P(Y ) t (Y ) − t E ( X )
n= ∗ 100 = E ∗ 100 (6.3)
P(Y ) tE ( X )
Deci creşterea performanŃei este diferenŃa dintre performanŃa
calculatorului mai rapid şi a celui mai lent, împărŃită la performanŃa calculatorului
mai lent.
Exemplul 6.1
Dacă un calculator A execută un program în 12 secunde şi un alt
calculator B execută acelaşi program în 15 secunde, creşterea performanŃei
calculatorului A faŃă de calculatorul B poate fi exprimată astfel: calculatorul A
este cu 25% mai rapid decât calculatorul B .
In general, performanŃa nu se poate caracteriza printr-o singură metrică.
Aceasta deoarece performanŃa unui calculator depinde de interacŃiunile dintre
diferitele componente ale sale şi datorită faptului că diferiŃi utilizatori sunt
interesaŃi de diferite aspecte ale posibilităŃilor calculatorului. Se prezintă în
continuare unii indicatori de performanŃă ai calculatoarelor.

6.2. Timpul UCP


Calculatoarele numerice utilizează un ceas cu o rată constantă. Ceasul
este definit prin durata ciclului de ceas (de exemplu, 2,5 ns) sau prin frecvenŃa
(rata) ceasului (de exemplu, 400 MHz).
Pentru un program, timpul UCP ( tUCP ) poate fi exprimat în două moduri:
tUCP = CUCP ∗ tC (6.6)
unde CUCP este numărul ciclurilor de ceas ale UCP necesare pentru execuŃia
programului, iar tC este durata ciclului de ceas. Timpul UCP se mai poate scrie
sub forma:
C
tUCP = UCP (6.7)
f
unde f este frecvenŃa ceasului.
Pe lângă numărul ciclurilor de ceas necesare pentru execuŃia unui
program, se poate considera şi numărul de instrucŃiuni executate N , informaŃie
care se regăseşte în contorul de instrucŃiuni. Dacă pentru un program se
cunoaşte numărul ciclurilor de ceas şi contorul de instrucŃiuni, se poate calcula
numărul mediu al ciclurilor de ceas pe instrucŃiune (CPI)
C
CPI = UCP (6.8)
N
Din relaŃia de mai sus, numărul ciclurilor de ceas ale UCP poate fi definit
ca produsul dintre CPI şi contorul de instrucŃiuni. Aceasta permite definirea
timpului UCP astfel:
tUCP = N ∗ CPI ∗ tC (6.9)
sau
N ∗ CPI
tUCP = (6.10)
f
łinând seama de unităŃile de măsură din relaŃia (6.9) se obŃine
Instructiuni Cicluri.de.ceas Secunde Secunde
tUCP = ∗ ∗ = (6.11)
Pr ogram Instructiune Cicluri.de.ceas Pr ogram
După cum arată această ecuaŃie, performanŃa UCP depinde de trei
caracteristici: contorul de instrucŃiuni, numărul ciclurilor de ceas pe instrucŃiune
şi frecvenŃa ceasului (sau rata). Aceste caracteristici nu se pot modifica
independent unele de altele, deoarece tehnologiile de bază implicate în
modificarea fiecărei caracteristici sunt de asemenea interdependente.
Uneori este util să se calculeze numărul total al ciclurilor de ceas ale UCP
astfel:
n
CUCP = ∑ (CPI i ∗ I i ) (6.12)
i =1
unde CPI i , reprezintă numărul mediu al ciclurilor de ceas pentru instrucŃiunea i ,
iar I i , reprezintă numărul de execuŃii ale instrucŃiunii i într-un program. Timpul
UCP poate fi exprimat atunci ca:
n
tUCP = tC ∗ ∑ (CPI i ∗ I i ) (6.13)
i =1
iar numărul total al ciclurilor pe instrucŃiune ca:
n
∑ (CPI i ∗ I i )
i =1
n
 I  n
CPI = = ∑  CPI i ∗ i  = ∑ (CPI i ∗ Fi ) (6.14)
N i =1  N  i =1
unde Fi reprezintă frecvenŃa instrucŃiunii i .
Modificarea setului de instrucŃiuni pentru a reduce contorul de instrucŃiuni,
de exemplu, poate conduce la o structură cu o durată mai mare a ciclului de
ceas, care reduce efectul îmbunătăŃirii contorului de instrucŃiuni. Atunci când se
compară două calculatoare, trebuie să se considere toate cele trei componente
pentru a determina performanŃa relativă.

Exemplul 6.2
Considerăm un calculator la care toate operaŃiile sunt executate cu
registrele, pentru transferul cu memoria existând numai instrucŃiuni de încărcare
(load) şi de memorare (store). Reamintim că asemenea calculatoare sunt
numite calculatoare load/store. In tabelul 6.1 se indică frecvenŃa diferitelor tipuri
de instrucŃiuni şi numărul ciclurilor de ceas pentru acestea.

Tabelul 6.1. Un exemplu cu frecvenŃele de utilizare ale instrucŃiunilor.


Tip instrucŃiune FrecvenŃa Cicluri de ceas
UAL 50% 1
Load 20% 2
Store 10% 2
Salt 20% 2

Presupunem că 20% din instrucŃiunile UAL utilizează direct un operand


încărcat din memorie, operand care nu este utilizat ulterior.
Propunem adăugarea unor instrucŃiuni UAL care au un operand sursă în
memorie. Aceste noi instrucŃiuni care operează cu registrele şi memoria
necesită două cicluri de ceas. Presupunem că setul extins de instrucŃiuni creşte
cu 1 numărul ciclurilor de ceas pentru executarea salturilor, dar nu afectează
durata ciclului de ceas. Întrebarea care se pune este dacă modificarea efectuată
creşte performanŃa UCP.
SoluŃie
Dacă ignorăm aspectele legate de sistemul de operare, putem utiliza ca
indicator de performanŃă timpul UCP. Valoarea CPI iniŃială se calculează prin
ecuaŃia (6.14):
CPI init = (0,5 ∗ 1 + 0,2 ∗ 2 + 0,1 ∗ 2 + 0,2 ∗ 2) = 1,5
PerformanŃa iniŃială este (din ecuaŃia 6.9):
tUCPinit = N init ∗ CPI init ∗ tCinit = 1,5 ∗ N init ∗ tCinit
20% din instrucŃiunile UAL devin instrucŃiuni care operează cu registrele şi
memoria. Există cu (0,2*0,5) mai puŃine operaŃii UAL (din numărul total de
instrucŃiuni), cu (0,2*0,5) mai puŃine instrucŃiuni de încărcare şi (0,2*0,5) noi
instrucŃiuni UAL cu registrele şi memoria. Salturile necesită 3 cicluri de ceas în
loc de 2. Noul contor de instrucŃiuni este cu (0,2*0,5) mai mic decât cel vechi.
Noua valoare pentru CPI va fi:
[0,5 − (0,2 ∗ 0,5)] ∗ 1 + [0,2 − (0,2 ∗ 0,5)] ∗ 2 + 0,1 ∗ 2 + 0,2 ∗ 3 + (0.2 ∗ 0,5) ∗ 2
CPI init =
1 − (0,2 ∗ 0,5)
= 1,777
Deoarece durata ciclului de ceas este nemodificată, performanŃa noului
UCP va fi:
tUCPnou = (0,9 ∗ N init ) ∗ 1,777 ∗ tCinit
= 1,6 ∗ N init ∗ tCinit

Cu aceste considerente, răspunsul la întrebarea anterioară este negativ:


prin adăugarea noilor instrucŃiuni timpul UCP creşte, deoarece aceste
instrucŃiuni nu compensează creşterea timpului de execuŃie a salturilor.

6.3. MIPS
Cel mai important indicator de performanŃă este timpul de execuŃie al
programelor reale. Conform unor autori, acesta este singurul indicator de
performanŃă consecvent şi fiabil. Totuşi, s-au adoptat diferiŃi indicatori populari
de performanŃă pentru măsurarea standard a performanŃei calculatoarelor.
Una din alternativele la timpul de execuŃie este indicatorul numit MIPS
(Millions of Instructions per Second). MIPS reprezintă viteza unui calculator prin
indicarea numărului de "instrucŃiuni medii" pe care le poate executa pe secundă.
Pentru un program dat, MIPS este definit astfel:
N
MIPS = (6.15)
t E ∗ 10 6
unde N este contorul de instrucŃiuni.
Exprimând timpul de execuŃie (timpul UCP) din ecuaŃia (6.10), obŃinem:
f
MIPS = (6.16)
CPI ∗106
Această formă este convenabilă, deoarece frecvenŃa ceasului este fixă
pentru un calculator, iar CPI este de obicei un număr mai mic, spre deosebire
de contorul de instrucŃiuni sau timpul de execuŃie.
Din ecuaŃia (6.15), timpul de execuŃie poate fi exprimat în funcŃie de
indicatorul MIPS astfel:
N
tE = (6.17)
MIPS ∗ 10 6
Atunci când un calculator poate executa peste un miliard de instrucŃiuni pe
secundă, se poate utiliza indicatorul BIPS (Billions of Instructions Per Second)
(sau GIPS). Acest indicator poate fi definit în mod similar cu indicatorul MIPS.
Indicatorul MIPS are avantajul că este uşor de înŃeles, mai ales de către
utilizatori, iar o valoare mai mare a acestui indicator înseamnă un calculator mai
rapid. Totuşi, există anumite probleme atunci când MIPS este utilizat ca o
măsură pentru comparaŃie.
- MIPS este dependent de setul de instrucŃiuni, ceea ce face dificilă
compararea valorilor acestui indicator la calculatoarele cu seturi diferite de
instrucŃiuni.
- MIPS variază pentru programe diferite ale aceluiaşi calculator.
- MIPS poate varia invers proporŃional cu performanŃa.
Un exemplu al ultimului caz este valoarea MIPS a unui calculator cu un
coprocesor opŃional pentru calcule în virgulă mobilă. Programele care utilizează
coprocesorul necesită un timp mai redus pentru execuŃie decât programele care
emulează instrucŃiunile de calcul în virgulă mobilă, dar au o valoare MIPS mai
redusă. Emularea se realizează prin instrucŃiuni mai simple, rezultând o valoare
MIPS mai mare, dar trebuie să se execute un număr mai mare de instrucŃiuni,
ceea ce creşte timpul total de execuŃie.
Asemenea anomalii pot apare şi în cazul compilatoarelor care efectuează
optimizarea codului.

Exemplul 6.3
Presupunem că se realizează un compilator cu optimizarea codului pentru
calculatorul load/store din exemplul anterior. Compilatorul elimină 50% din
instrucŃiunile UAL, dar nu poate reduce numărul instrucŃiunilor de încărcare, de
memorare şi de salt. Presupunând un ceas cu o frecvenŃă de 400 MHz (durata
ciclului de 2,5 ns), care este valoarea MIPS pentru codul neoptimizat şi pentru
cel optimizat ?
SoluŃie
Din exemplul anterior, CPI neopt = 1,5 , astfel încât:
400 ∗ 10 6
MIPS neopt = = 266,6
1,5 ∗ 10 6
PerformanŃa codului neoptimizat este:
tUCPneopt = N neopt ∗ CPI neopt ∗ tC
= N neopt ∗ 1,5 ∗ 2,5 ∗ 10 −9
= 3,75 ∗ 10 −9 ∗ N neopt
Pentru codul optimizat, deoarece jumătate din instrucŃiunile UAL sunt
eliminate (0,5/2), iar contorul de instrucŃiuni este redus prin eliminarea acestor
instrucŃiuni, CPI va fi:
(0,5 / 2) ∗ 1 + 0,2 ∗ 2 + 0,1 ∗ 2 + 0,2 ∗ 2
CPI opt = = 1,66
1 − (0,5 / 2)
Deci
400 ∗ 10 6
MIPS opt = = 240
1,66 ∗ 10 6
PerformanŃa codului optimizat este
tUCPopt = (0,75 ∗ N neopt ) ∗ 1,66 ∗ 2,5 ∗ 10 −9 = 3,112 ∗ 10 −9 ∗ N neopt
Codul optimizat este cu 17% mai rapid, dar valoarea MIPS
corespunzătoare este mai redusă.

6.4. MFLOPS
Deşi valoarea MIPS este un indicator al vitezei unui calculator, aceasta nu
reprezintă o metrică adecvată pentru calculatoarele care execută calcule
ştiinŃifice şi inginereşti, ca de exemplu procesoarele vectoriale. Pentru
asemenea calculatoare este important să se măsoare numărul operaŃiilor de
calcul în virgulă mobilă pe care le pot executa pe secundă. Această valoare este
exprimată prin indicatorul MFLOPS (Millions of Floating-Point Operations per
Second) sau GFLOPS (Billions of Floating-Point Operations per Second).
Formula de calcul pentru indicatorul MFLOPS este simpla definiŃie a
acronimului acestuia:
NVM
MFLOPS = (1.18)
t E ∗ 10 6
unde NVM este numărul de operaŃii în virgulă mobilă din program, iar t E este
timpul de execuŃie.
Valoarea MFLOPS este dependentă de calculator şi de program. Una din
problemele legate de acest indicator constă în faptul că setul operaŃiilor de
calcul în virgulă mobilă diferă de la un calculator la altul. O altă problemă este
că valoarea MFLOPS se modifică nu numai în funcŃie de combinaŃia operaŃiilor
întregi şi a operaŃiilor în virgulă mobilă, dar şi în funcŃie de combinaŃia operaŃiilor
în virgulă mobilă mai rapide şi mai lente. De exemplu, un program care conŃine
numai adunări în virgulă mobilă va avea o valoare MFLOPS mai ridicată decât
un program care conŃine numai împărŃiri în virgulă mobilă. SoluŃia la ambele
probleme este de a se utiliza operaŃii normalizate în virgulă mobilă. Tabelul 6.2
indică modul în care autorii unui program de test (benchmark) numit Livermore
Loops calculează numărul de operaŃii normalizate în virgulă mobilă pentru un
program în funcŃie de operaŃiile reale din codul sursă. OperaŃiile reale în virgulă
mobilă conduc la valoarea nativă pentru MFLOPS, iar operaŃiile normalizate în
virgulă mobilă conduc la valoarea normalizată pentru MFLOPS.

Tabelul 6.2. OperaŃii reale şi normalizate în virgulă mobilă (VM).


OperaŃii reale în VM OperaŃii normalizate în VM

ADD, SUB, COMP, MULT 1


DIV, SQRT 4
EXP, SIN,... 8

Indicatorii MIPS şi MFLOPS sunt utili pentru compararea calculatoarelor


din aceeaşi familie. Aceşti indicatori nu pot fi utilizaŃi pentru compararea
calculatoarelor cu seturi diferite de instrucŃiuni şi cu cicluri de ceas diferite.
Aceasta deoarece un program se poate translata într-un număr diferit de
instrucŃiuni la diferite calculatoare.

6.5. AlŃi indicatori de performanŃă


Pe lângă timpul de execuŃie, MIPS şi MFLOPS, adesea se utilizează şi alŃi
indicatori pentru o caracterizare mai completă a sistemului. Dintre aceşti
indicatori se amintesc următorii:
- numărul de Rata (throughput) unui procesor indică numărul de programe
(taskuri sau cereri) pe care le poate executa procesorul în unitatea de timp.
- Utilizarea unui procesor se referă la fracŃiunea de timp în care
procesorul este ocupat cu execuŃia programelor. Acest indicator reprezintă
raportul între timpul în care procesorul este ocupat şi timpul total de răspuns
într-o perioadă dată.
- Rata de transfer a memoriei indică numărul cuvintelor de memorie care
pot fi accesate în unitatea de timp.
- Timpul de acces al memoriei este intervalul de timp mediu necesar
procesorului pentru accesul la memorie, exprimat în nanosecunde.

6.6. Programe de evaluare a performanŃelor


Una dintre cele mai utilizate măsuri ale performanŃei unui calculator este
timpul executării unui set reprezentativ de programe pe acel calculator Acest
timp poate fi timpul total de execuŃie al programelor din set, media aritmetică
sau geometrică a timpilor de execuŃie, sau o altă metrică similară Pentru
evaluarea performanŃei se poate utiliza un set de programe reale care sunt
reprezentative pentru un anumit mediu de calcul. Asemenea programe sunt
numite programe benchmark şi acestea sunt rulate de utilizator pe calculatorul
care se evaluează.
Cele mai adecvate tipuri de programe care pot fi utilizate pentru evaluare
sunt aplicaŃiile reale. Acestea pot fi aplicaŃii folosite de utilizatori în mod curent
sau aplicaŃii tipice. De exemplu, în medii inginereşti se poate utiliza un set de
programe de evaluare care conŃine mai multe aplicaŃii tipice inginereşti sau
ştiinŃifice.

6.6.1. Compararea şi sintetizarea performanŃelor


După selectarea programelor care se vor utiliza pentru evaluare, problema
care se pune este modul în care se poate sintetiza performanŃa unui grup de
programe de evaluare. Tabelul 6.3 ilustrează o situaŃie în care compararea
performanŃei a două calculatoare este dificilă.

Tabelul 6.3. Timpii de execuŃie a două programe pe două calculatoare diferite.


Calculator A Calculator B
Program 1 (s) 1 10
Program 2 (s) 1000 100
Timp total (s) 1001 110

Pentru programul 1, calculatorul A este de 10 ori mai rapid decât


calculatorul B. Pentru programul 2, calculatorul B este de 10 ori mai rapid decât
calculatorul A. Utilizând aceste măsurători, nu se poate defini performanŃa
relativă a calculatoarelor A şi B.
Metoda cea mai simplă de a sintetiza performanŃa relativă este de a se
utiliza timpul total de execuŃie a celor două programe. Astfel, calculatorul B este
de 1001/110 = 9,1 ori mai rapid decât A pentru programele 1 şi 2.
Media aritmetică ( MA ) a timpilor de execuŃie este:
1 n
MA = ∑ t Ei (6.19)
n i =1
unde t Ei este timpul de execuŃie al programului i din totalul de n programe din
set. O medie mai redusă indică un timp mediu de execuŃie mai redus şi deci o
performanŃă mai ridicată.
Media aritmetică indică timpul de execuŃie presupunând că numărul de
execuŃii ale tuturor programelor de evaluare dintr-un set este acelaşi. In caz
contrar, se poate asigna fiecărui program o pondere pi pentru a indica
frecvenŃa de execuŃie a programelor din set. Rezultă astfel media aritmetică
ponderată. O metodă posibilă de determinare a mediei ponderate este de a se
alege ponderile astfel încât pe un calculator de referinŃă timpii de execuŃie
ponderaŃi ai fiecărui program să fie egali.
O altă metodă de a prezenta performanŃele unui calculator este de a se
normaliza timpii de execuŃie faŃă de un calculator de referinŃă, iar apoi de a se
considera media timpilor de execuŃie normalizaŃi. Totuşi, dacă se calculează
media aritmetică a valorilor timpilor de execuŃie, rezultatul va depinde de
alegerea calculatorului utilizat ca referinŃă. De exemplu, timpii de execuŃie din
tabelul 6.4 sunt normalizaŃi faŃă de ambele calculatoare A şi B, calculându-se
media aritmetică a acestora.
Tabelul 6.4. Timpii de execuŃie a două programe pe calculatoarele A şi B,
normalizaŃi faŃă de ambele calculatoare, media aritmetică şi media geometrică a
timpilor de execuŃie.
Timp de execuŃie Timp de execuŃie Normalizat faŃă de A Normalizat faŃă de B
pe A pe B

A B A B
Program 1 1 10 1 10 0,1 1
Program 2 1000 100 1 0,1 10 1
Medie 500,5 55 1 5,05 5,05 1
aritmetică
ă
Medie 31,6 31,6 1 1 1 1
geometrică
Atunci când timpii de execuŃie sunt normalizaŃi faŃă de calculatorul A,
media aritmetică indică faptul că A este mai rapid faŃă de B cu un factor de 5,05.
Atunci când timpii de execuŃie sunt normalizaŃi faŃă de calculatorul B, media
aritmetică indică faptul că B este mai rapid faŃă de A cu un factor de 5,05.
Numai unul din aceste rezultate poate fi corect. Dificultatea provine din utilizarea
mediei aritmetice a timpilor de execuŃie.
In locul utilizării mediei aritmetice, timpii de execuŃie normalizaŃi trebuie
combinaŃi prin media geometrică ( MG ). Formula pentru media geometrică
este:
n
MG = n ∏ t Ei (6.20)
i =1
unde t Ei este timpul de execuŃie normalizat faŃă de calculatorul de referinŃă
pentru programul i din totalul de n programe din setul de evaluare.
Media geometrică este independentă de seria datelor utilizate pentru
normalizare, deoarece are următoarea proprietate:
MG ( X i ) X 
= MG i  (6.21)
MG (Yi )  Yi 
ceea ce înseamnă că raportul mediilor geometrice a două valori este acelaşi cu
media geometrică a raportului valorilor.
Deci, media geometrică produce acelaşi rezultat indiferent dacă timpii de
execuŃie sunt normalizaŃi faŃă de calculatorul A sau faŃă de calculatorul B, după
cum se observă din tabelul 6.4. Atunci când timpii de execuŃie sunt normalizaŃi,
se poate utiliza numai media geometrică pentru a se combina rezultatele
normalizate.
Avantajul mediei geometrice constă în faptul că este independentă de
timpii de execuŃie a programelor individuale şi nu are importanŃă care calculator
este utilizat pentru normalizare. Totuşi, dezavantajul utilizării mediei geometrice
a timpilor de execuŃie este că această medie nu anticipează timpul de execuŃie.
Mediile geometrice din tabelul 6.4 sugerează faptul că pentru programele 1 şi 2
performanŃele calculatoarelor A şi B sunt aceleaşi. Media aritmetică a timpilor de
execuŃie sugerează faptul că B este de 9,1 ori mai rapid decât A.
6.6.2. EvoluŃia programelor de evaluare a performanŃelor
Deşi actualmente pare evident că soluŃia cea mai bună este de a se
dezvolta un set de aplicaŃii reale care pot fi utilizate ca programe standard de
evaluare, acesta a reprezentat o sarcină dificilă până relativ recent. DiferenŃele
între sistemele de operare şi standardele limbajelor au reprezentat motive
pentru care a fost dificilă scrierea programelor complexe care puteau fi mutate
de pe un calculator pe altul prin simpla recompilare. După elaborarea metricilor
MIPS şi MFLOPS, următoarea etapă a fost dezvoltarea programelor artificiale
sau sintetice de evaluare. Scopul era de a se crea un singur program de
evaluare în care frecvenŃele de execuŃie ale instrucŃiunilor sunt aceleaşi cu
frecvenŃele de execuŃie dintr-un set complex de programe de evaluare.
Whetstone şi Dhrystone au fost cele mai populare programe sintetice de
evaluare.
Programul sintetic Whetstone a fost creat pe baza măsurătorilor efectuate
asupra aplicaŃiilor ştiinŃifice şi inginereşti scrise în limbajul ALGOL. Acest
program a fost rescris ulterior în limbajul FORTRAN şi a fost utilizat pe scară
largă pentru caracterizarea programelor ştiinŃifice. Programul Dhrystone, care a
fost inspirat de către programul Whetstone, a fost creat mai recent pentru
evaluarea programelor de sistem, fiind bazat pe un set publicat de măsurători
ale frecvenŃelor de execuŃie ale instrucŃiunilor. Dhrystone a fost scris iniŃial în
limbajul Ada şi a fost convertit ulterior în limbajul C, după care a devenit foarte
popular.
Deoarece programele sintetice de evaluare nu sunt programe reale, ele nu
reflectă de obicei comportamentul programelor reale. In plus, optimizările
executate de către compilator sau prin hardware pot amplifica performanŃele
acestor programe, cu mult peste ceea ce se poate obŃine prin aceleaşi
optimizări pentru programele reale. De exemplu, compilatoarele care execută
optimizări pot elimina cu uşurinŃă 25% din codul programului Dhrystone.
Programele "kernel" de evaluare sunt fragmente de dimensiuni mici, dar
solicitante din punct de vedere al timpului de execuŃie, extrase din programe
reale. Acestea au fost elaborate în primul rând pentru evaluarea calculatoarelor
performante, în special a supercalculatoarelor. Exemplele cele mai cunoscute
sunt Livermore Loops şi Linpack. Programul Livermore Loops constă dintr-o
serie de 21 de bucle de dimensiuni mici. Programul Linpack constă dintr-o parte
a unui pachet de subrutine pentru algebra liniară. Programele "kernel" pot fi
utilizate mai ales pentru a izola performanŃele caracteristicilor individuale ale
unui calculator şi pentru a explica motivele diferenŃelor între performanŃele
programelor reale. Aceste programe sunt utilizate în special pentru
caracterizarea performanŃelor aplicaŃiilor ştiinŃifice.
O etapă importantă în evaluarea performanŃelor a fost reprezentată de
formarea grupului SPEC (Standard Performance Evaluation Corporation) în anul
1988. SPEC este o corporaŃie non-profit care elaborează şi menŃine seturi
standardizate de programe de evaluare bazate pe programe reale. Seturile de
programe de evaluare conŃin codul sursă al acestora şi utilitare pentru
generarea rapoartelor de performanŃă, fiind testate în mod extensiv înaintea
publicării pentru a asigura portabilitatea acestora.
Primul set de programe de evaluare (numit SPEC89) a fost publicat în anul
1989. Acest set conŃinea şase programe de evaluare pentru calcule cu numere
în virgulă mobilă şi patru programe pentru calcule cu numere întregi. Pe baza
evaluării, se calcula o singură metrică, numită SPECMark, utilizând media
geometrică a timpilor de execuŃie normalizaŃi faŃă de calculatorul VAX-11/780.
Această metrică favoriza calculatoarele cu performanŃe ridicate ale operaŃiilor în
virgulă mobilă.
In anul 1992 a fost introdus un nou set de programe (numit SPEC92). In
acest set au fost incluse noi programe de evaluare, fiind prevăzute metrici
separate (numite SPECINT şi SPECFP) pentru evaluarea calculelor cu numere
întregi, respectiv a calculelor cu numere în virgulă mobilă.
Actualmente, organizaŃia SPEC este formată din trei grupuri, fiecare
elaborând propriile programe de evaluare.
- Open Systems Group (OSG): Programe la nivel de componente şi de
sistem, pentru mediile UNIX / Windows / VMS.
- High Performance Group (HPG): Programe pentru calcule numerice de
înaltă performanŃă.
- Graphics Performance Characterization Group (GPCG): Programe
pentru subsisteme grafice, OpenGL şi XWindows.

6.6.3. CPU95
Setul de programe de evaluare CPU95 a fost introdus de către organizaŃia
SPEC în anul 1995 pentru înlocuirea setului mai vechi CPU92. Acest set a fost
dezvoltat de grupul OSG, care cuprinde peste 30 de producători de
calculatoare, integratori de sistem, editori şi consultanŃi. Aceste programe
măsoară performanŃa UCP, a sistemului de memorie şi generării codului de
către compilator. Ele au fost elaborate iniŃial pentru sistemul UNIX, dar au fost
apoi modificate şi pentru alte sisteme de operare. Procentajul de timp necesar
executării funcŃiilor sistemului de operare şi a operaŃiilor de I/E este în general
neglijabil.
Setul de programe CPU95 este compus din două colecŃii:
- CINT95: programe de calcul cu numere întregi, reprezentând
programe de sistem şi programe de aplicaŃii comerciale;
- CFP95: programe de calcul cu numere în virgulă mobilă, reprezentând
programe de aplicaŃii numerice şi ştiinŃifice.
Programele de evaluare a UCP pot fi utilizate pentru două tipuri de
măsurători:
- Măsurarea vitezei de execuŃie;
- Măsurarea ratei.
Măsurarea vitezei de execuŃie
Rezultatul fiecărui program de evaluare, numit "raport SPEC", este
exprimat ca raportul între timpul necesar executării programului o singură dată
şi un timp de referinŃă fix. Pentru setul CPU95, s-a ales ca şi calculator de
referinŃă calculatorul Sun SPARCstation 10/40 cu 128 MB de memorie.
Diferitele raporturi SPEC pentru un anumit calculator pot varia
considerabil. Utilizatorii trebuie să considere acele programe de evaluare care
aproximează cel mai bine aplicaŃiile lor. SPEC a definit de asemenea
următoarele valori medii pentru măsurarea vitezei de execuŃie cu setul CPU95:
• SPECint_base95: media geometrică a 8 raporturi SPEC pentru colecŃia
CINT95 atunci când fiecare program component este compilat cu opŃiuni
conservative de optimizare;
• SPECfp_base95: media geometrică a 10 raporturi SPEC pentru colecŃia
CFP95 atunci când fiecare program component este compilat cu opŃiuni
conservative de optimizare;
• SPECint95: media geometrică a 8 raporturi SPEC pentru colecŃia
CINT95 atunci când fiecare program component este compilat cu opŃiuni
agresive de optimizare;
• SPECfp95: media geometrică a 10 raporturi SPEC pentru colecŃia
CFP95 atunci când fiecare program component este compilat cu
opŃiuni agresive de optimizare.
SPEC CPU95 cuprinde reguli de rulare şi de raportare care permit
obŃinerea atât a unor rezultate neoptimizate, cât şi a unor rezultate optimizate
pentru colecŃiile CINT95 şi CFP95. Rezultatele neoptimizate (numite "baseline")
sunt obŃinute prin optimizare conservativă, iar cele optimizate sunt obŃinute prin
optimizare agresivă. Regulile "baseline" limitează numărul opŃiunilor de
optimizare care se pot utiliza la compilarea programelor de evaluare.

Măsurarea ratei
In cazul acestor măsurători, un anumit program de evaluare este executat
de mai multe ori. Aceste măsurători sunt utile mai ales pentru sistemele
multiprocesor. Rezultatul unei măsurători, numit "rată SPEC", exprimă numărul
de aplicaŃii de un anumit tip care pot fi executate într-un timp dat. Timpul de
referinŃă SPEC este de o zi (24 de ore). Timpii de execuŃie sunt normalizaŃi faŃă
de calculatorul de referinŃă. Ratele SPEC caracterizează astfel capacitatea unui
sistem de a executa aplicaŃii intensive din punct de vedere al calculelor, cu
caracteristici similare.
Ca şi în cazul metricii pentru viteza de execuŃie, SPEC a definit mai multe
valori medii pentru măsurarea ratei:
• SPECint_rate_base95: media geometrică a 8 rate SPEC pentru colecŃia
CINT95 atunci când fiecare program component este compilat cu opŃiuni
conservative de optimizare;
• SPECfp_rate_base95: media geometrică a 10 rate SPEC pentru colecŃia
CFP95 atunci când fiecare program component este compilat cu opŃiuni
conservative de optimizare;
• SPECint_rate95: media geometrică a 8 rate SPEC pentru colecŃia
CINT95 atunci când fiecare program component este compilat cu opŃiuni
agresive de optimizare;
• SPECfp_rate95: media geometrică a 10 rate SPEC pentru colecŃia
CFP95 atunci când fiecare program component este compilat cu opŃiuni
agresive de optimizare.

1.3.6.4. CPU2000
CPU2000 este ultima versiune a standardului SPEC pentru evaluarea
performanŃei unităŃilor centrale, publicată la sfârşitul anului 1999. Noul set de
programe poate fi utilizat sub diferite versiuni ale sistemelor de operare UNIX şi
Microsoft Windows. Acest set reflectă progresele înregistrate în ultimii cinci ani
în tehnologia microprocesoarelor, a compilatoarelor şi a aplicaŃiilor.
Noua versiune înlocuieşte versiunea SPEC CPU95, care a fost
abandonată în luna iulie 2000, dată de la care SPEC nu mai publică rezultate
CPU95. Măsurătorile performanŃelor obŃinute cu setul CPU2000 nu pot fi
comparate cu cele obŃinute cu setul CPU95, deoarece au fost adăugate noi
programe de evaluare şi unele existente au fost modificate.
SPEC CPU2000 cuprinde două seturi de programe "benchmark":
CINT2000 pentru măsurarea performanŃei calculelor cu numere întregi, şi
CFP2000, pentru măsurarea performanŃei calculelor cu numere în virgulă
mobilă. îmbunătăŃirile introduse în noul set cuprind timpi de execuŃie mai ridicaŃi,
probleme de dimensiuni mai mari, o diversitate mai mare a aplicaŃiilor şi
platforme de dezvoltare standard care vor permite producerea unor versiuni
pentru alte sisteme de operare.
Similar cu versiunea SPEC CPU95, setul CPU2000 permite măsurarea
vitezei de execuŃie şi măsurarea ratei. Metricile pentru viteza de execuŃie,
SPECint2000 şi SPECfp2000, măsoară timpul în care se execută toate
programele "benchmark" din setul CINT2000, respectiv CFP2000. Metricile
pentru rata de execuŃie, SPECint_rate2000 şi SPECfp_rate2000, măsoară
numărul de taskuri executate de calculator într-un timp dat.
SPEC a selectat ca şi calculator de referinŃă staŃia de lucru Sun
Microsystems Ultra 5/10 cu un procesor SPARC de 300 MHz şi 256 MB de
memorie internă. Toate rezultatele sunt raportate la calculatorul de referinŃă,
pentru care valoarea SPECint2000 şi SPECfp2000 este de 100. Fiecare
program a fost rulat pe calculatorul Ultra 5/10 pentru a stabili un timp de
referinŃă.
Tabelul 6.5 prezintă valorile metricilor SPECint2000 şi SPECfp2000
măsurate pentru unele calculatoare. De notat că aceste valori depind de mai
mulŃi factori, ca tipul şi frecvenŃa de ceas a procesorului, tipul plăcii de bază,
tehnologia şi dimensiunea memoriei, etc. Din aceşti factori, în tabel se indică
numai tipul şi frecvenŃa de ceas a procesorului.

Tabelul 6.5. Rezultate SPEC CPU2000.


Firma Procesor CINT2000 CFP2000
AMD AMD Athlon, 1,33 GHz 438 348
AMD Athlon XP 1700+ 633 561
AMD Athlon XP 2200+ 738 624
AMD Athlon XP 2800+ 898 782
Dell Intel Pentium III, 1,4 GHz 648 437
Intel Xeon, 2,0 GHz 685 672
Intel Xeon, 2,8 GHz 879 774
Intel Pentium 4, 1,4 GHz 493 524
Intel Pentium 4, 2,0 GHz 744 649
Intel Pentium 4, 2,8 GHz 970 938
Intel Pentium 4, 3,06 GHz 1032 972
HP Intel Itanium 2, 1,0 GHz 810 1174
Intel Intel Pentium 4, 2,0 GHz 681 735
Intel Pentium 4, 2,4 GHz 922 840
Intel Pentium 4, 3,06 GHz 1099 1077
Sun Microsystems SPARC, 1,015 GHz 516 682
SPARC, 300 MHz 100 100

SPEC a considerat următoarele criterii în procesul de selecŃie a aplicaŃiilor


care sunt utilizate ca programe "benchmark":
• Portabilitatea pe toate arhitecturile hardware SPEC de 32 şi 64 de
biŃi
(cuprinzând arhitecturile Alpha, Intel Architecture, RxxOO, SPARC,
etc);
• Portabilitatea pe diferite sisteme de operare, în particular UNIX şi
MS
Windows;
• Programele nu trebuie să conŃină operaŃii semnificative de I/E, grafice
sau de reŃea;
• Programele trebuie să ruleze într-o memorie RAM de 256 MB fără a
utiliza memoria virtuală;
• Nu trebuie să se utilizeze un timp mai mare de 5% din timpul total
pentru prelucrarea codului care nu este furnizat de SPEC.

6.2.7. Factori de calitate


In plus faŃă de indicatorii de performanŃă, există diferiŃi factori de calitate
care influenŃează de asemenea succesul unui calculator. Dintre aceşti factori se
amintesc generalitatea, simplitatea utilizării, expandabilitatea, compatibilitatea şi
fiabilitatea.
• Generalitatea este un factor care determină gama aplicaŃiilor care pot fi
rulate pe o anumită arhitectură. Anumite arhitecturi sunt potrivite pentru aplicaŃii
ştiinŃifice, iar altele pentru aplicaŃii comerciale. Arhitectura este mai avantajoasă
dacă permite rularea unei game largi de aplicaŃii.
• Simplitatea utilizării este un factor care indică uşurinŃa dezvoltării
programelor pentru arhitectura respectivă.
• Expandabilitatea indică uşurinŃa cu care se poate extinde o arhitectură
cu procesoare, memorie şi dispozitive de I/E.
• Compatibilitatea indică în ce măsură pot fi executate pe noile
arhitecturi programe elaborate pentru arhitecturile precedente din aceeaşi
familie de calculatoare.
• Fiabilitatea indică probabilitatea defectelor sau timpul mediu între
defecte.

Vous aimerez peut-être aussi