Académique Documents
Professionnel Documents
Culture Documents
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
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
Fig.8.7
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.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.
Fig. 8.9
Fig. 8.10
Fig. 8.11
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.
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.
Fig. 8.14
Fig.8.15
Fig. 8.16
Fig. 8.17
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.
Adresa reala Ar
B+1
.
.
B+i
B+m-1
Fig. 8.18
Fig. 8.19
Fig. 8.20
Adresa de baza
reala a paginii
Fig. 8.21
Fig. 8.22
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.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.
Fig. 8.24
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ă.
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
Unitate de Control
Date de Date de
intrare ieşire
R1 C1 R2 C2 Rm Cm
m
Fig. 9.1
Registru
Etaj 1
Circuit de
prelucrare
Registru
Etaj 2
Circuit de
prelucrare
Registru
Etaj 3
Circuit de
prelucrare
Ieşire
Fig. 9.2
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
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
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
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
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
Fig. 9.10
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
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
Fig. 9.11
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
Fig. 9.13
Fig. 9.14
Fig. 9.15
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
Fig. 9.17
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.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.
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ă
Fig. 9.20
Fig. 9.21
Fig. 9.22
Adunare Inmultire
Normalizare
exponenti mantise
Rotunjire Normalizare
mantisa finala
Fig. 9.23
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
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.
Fig. 9.26
Fig. 9.27
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.
Fig. 10.1
Fig. 10.3
Fig.10.4
Fig. 10.5.
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).
Fig. 2.6
Fig.2.7
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.
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.
Fig. 3.1
Fig. 4.1.
Fig. 4.2
Fig.4.3
Fig. 4.4
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
Fig. 5.1
Fig. 5.2.
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.
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ă.
Fig. 5.5
Fig. 5.6.
Fig. 5.7
Fig. 5.9
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.
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.
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.