Documente Academic
Documente Profesional
Documente Cultură
În prima fază, o instrucŃiune este citită din memorie utilizând registrul program counter ca
pointer pentru locaŃia de memorie. În ultima parte a ciclului fetch instrucŃiunea este
decodificată. După decodificare se trece la ciclul (faza) de execuŃie a instrucŃiunii. În prima
parte a execuŃiei vor fi obŃinuŃi operanzii din registre UC sau din memorie şi apoi operaŃia
specificată se aplică acestor operanzi. Rezultatele sunt depuse în registre UC sau în locaŃii
de memorie, la finele ciclului de execuŃie.
ExecuŃia unei instrucŃiuni şi fetch-ul instrucŃiunii următoare pot fi executate
simultan în anumite condiŃii. Prima condiŃie necesară pentru suprapunerea cu succes a
ciclurilor fetch şi respectiv execuŃie este aceea că instrucŃiunea ce va fi extrasă din memorie
(faza fetch) trebuie identificată înaintea execuŃiei instrucŃiunii anterioare. Această condiŃie
este îndeplinită în cazul instrucŃiunilor executate secvenŃial. Există însă instrucŃiuni care
perturbă caracterul secvenŃial al execuŃiei cum ar fi, de exemplu, instrucŃiunile de salt. În
aceste cazuri instrucŃiunea ce va fi extrasă din memorie va fi identificată doar după execuŃia
completă a instrucŃiunii de salt (calculul adresei de salt). În consecinŃă, execuŃia unei
instrucŃiuni de salt nu poate fi suprapusă cu fetch-ul instrucŃiunii următoare.
1
Dezvoltări arhitecturale în domeniul sistemelor de calcul
Cele două cicluri de bază, fetch şi execuŃie, pot fi divizate mai fin în trei cicluri
care, în anumite condiŃii, pot fi suprapuse:
1. fetch instrucŃiune
2. decodificare instrucŃiune şi fetch operanzi
3. execuŃie
ExecuŃia, la rândul ei, poate fi divizată într-un număr de suboperaŃii dependente de tipul
instrucŃiunii. OperaŃiile aritmetice cu numere întregi sunt relativ simple şi pot fi
implementate într-un singur pas (modul) în timp ce operaŃiile mai complexe, cum ar fi
înmulŃirea sau împărŃirea în virgulă flotantă, pot necesita câŃiva paşi succesivi care vor fi
executaŃi într-o cascadă de module.
În procesoarele performante cele 3 operaŃii de bază ce compun ciclul instrucŃiunii
(fetch instrucŃiune, decodificare instrucŃiune şi fetch operanzi, execuŃie instrucŃiune) sunt
implementate într-o structură pipeline.
Structura pipeline (fig. 1.1.) este formată dintr-un număr de module conectate în
cascadă. Fiecare modul execută una din operaŃiile de bază evidenŃiate.
Ieşirea unui modul este aplicată ca intrare în modulul următor. InformaŃia care va
declanşa cascada de operaŃii în structura pipeline va fi aplicată pe intrarea primului modul
iar rezultatele sunt produse de către modulul final (uneori de module intermediare).
Modulele intermediare produc rezultate parŃiale.
Timpul consumat pentru procesarea unei instrucŃiuni în cascada pipeline va fi cel
puŃin tot atât de mare cu cel consumat pentru execuŃia aceleiaşi instrucŃiuni într-un procesor
convenŃional format dintr-o singură unitate funcŃională complexă şi omogenă. Totuşi,
procesorul pipeline poate fi substanŃial mai rapid comparativ cu procesorul convenŃional
omogen. Deşi rezultatele sunt întârziate cu timpul total de procesare (obŃinut prin
cumularea timpilor de procesare aferenŃi tuturor modulelor pipe), totuşi, aceste rezultate
sunt livrate la rata la care procesorul pipeline este alimentat cu instrucŃiuni. Rata de
alimentare va fi egală cu timpul de procesare aferent celui mai lent modul din structura pipe.
Pentru instrucŃiuni secvenŃiale procesorul pipeline va fi substanŃial mai rapid decât
procesorul clasic omogen.
2
ARHITECTURA SISTEMELOR DE CALCUL
3
Dezvoltări arhitecturale în domeniul sistemelor de calcul
4
ARHITECTURA SISTEMELOR DE CALCUL
Aşa cum se indică în figura 1.4., este posibilă organizarea şi cu un singur bus de
date. Fiecare modul va fi prevăzut cu un registru buffer de date bidirecŃional care va reŃine
datele de scris în modul sau respectiv datele citite din modul.
5
Dezvoltări arhitecturale în domeniul sistemelor de calcul
6
ARHITECTURA SISTEMELOR DE CALCUL
Este posibilă aplicarea aceleiaşi adrese tuturor modulelor de memorie astfel încât
vor fi accesate cuvinte consecutive în memorie (în cazul întreŃeserii de ordin inferior).
Activitatea în timp a unui astfel de sistem este prezentată în figura 1.6.
Memoria cu adresare întreŃesută poate fi utilizată în sistemele pipeline pentru a
extrage simultan mai multe instrucŃiuni din memorie. După extragere, aceste instrucŃiuni vor
fi executate secvenŃial în tehnică pipeline. Prin această adresare întreŃesută interfaŃa
procesor-memorie este eliberată pentru accesarea operanzilor.
B. Buffer-e de prefetch
7
Dezvoltări arhitecturale în domeniul sistemelor de calcul
C. Memorii cache
InstrucŃiunile programului şi datele sunt mai întâi încărcate în cache din memoria
principală şi apoi accesate rapid în cache de către procesor. Presupunând că informaŃiile vor
fi accesate mai mult decât o singură dată, lucru de regulă valabil pentru instrucŃiunile din
cadrul buclelor de program, se pot obŃine creşteri substanŃiale în ceea ce priveşte viteza de
operare a sistemului. Cele mai multe sisteme cu microprocesoare au memorii cache interne
(on-chip) şi/sau externe microprocesorului. Există sisteme cu cache-uri separate, pentru
instrucŃiuni şi respectiv date, sau cu cache-uri unificate, care găzduiesc atât instrucŃiuni cât
şi date. IniŃial, memoriile cache erau mici. Motorola MC 68040 are cache-uri separate
pentru instrucŃiuni (4 KByte) şi respectiv date (4 KByte). Intel 486 are un cache unificat de 8
KByte în timp ce Pentium are din nou cache-uri separate, fiecare de 8 KByte. TendinŃa
actuală este de a implementa cache-uri separate tot mai mari, şi chiar de a implementa
cache-uri pe două nivele (un prim nivel de capacitate relativ redusă dar de viteză extrem de
mare în interiorul microprocesorului şi un al doilea nivel de capacitate mai mare dar şi de
viteză mai mică în exteriorul acestuia). Totuşi, cache-ul (chiar de pe nivelul 2) trebuie să
opereze mai rapid decât memoria principală, altfel implementarea sa nu mai are sens.
8
ARHITECTURA SISTEMELOR DE CALCUL
întreŃesut (interleaved) pe unităŃi de disc diferite, ca în figura 1.8. Tehnica descrisă este
cunoscută ca “file striping”. Dimensiunea blocului poate fi de un octet, caz în care unităŃile
de disc vor trebui probabil sincronizate, sau de mai mulŃi octeŃi. Cu n unităŃi de disc
lărgimea benzii de comunicaŃie va creşte de n ori.
Mai multe unităŃi de disc de capacitate mică pot înlocui o unitate de capacitate
mare şi în scopul creşterii toleranŃei la defect. În cazul defectării unei unităŃi sistemul va fi
reconfigurat, unitatea defectă izolată şi eliminată din configuraŃie, şi sistemul va utiliza în
continuare doar restul unităŃilor de disc. Termenul RAID (Redundant Array of Inexpensive
Disks) este utilizat pentru a descrie acest tip de organizare. Există o varietate de periferice
magnetice, cum ar fi discurile Winchester, discurile flexibile, benzile magnetice etc.
Discurile optice, cum sunt CD-ROM-urile, oferă o capacitate foarte mare de memorare şi
reprezintă un nou nivel în memoria ierarhizată a sistemului. O mare parte a îmbunătăŃirilor
arhitecturale vizează eficientizarea acestei memorii ierarhizate; ea trebuie să constituie un
suport eficient pentru multiprogramare.
Multiprogramarea este termenul utilizat pentru descrierea sistemului de
programare în care mai multe programe utilizator sunt executate, aparent concurent, prin
execuŃia secvenŃială a câte unei părŃi din fiecare program. În prezenŃa memoriei ierarhizate
este necesar transferul programelor din memoria externă în memoria principală înainte de
lansarea acestora în execuŃie. În mod similar şi datele trebuie transferate. Deoarece memoria
principală are o capacitate limitată, programele şi datele nenecesare la un moment dat vor fi
transferate înapoi pe disc până în momentul în care sunt din nou solicitate. Acest trafic
permanent de programe şi date între memoria principală şi memoria externă necesită un
9
Dezvoltări arhitecturale în domeniul sistemelor de calcul
10
ARHITECTURA SISTEMELOR DE CALCUL
11
Proiectarea setului de instrucŃiuni
De asemenea, pe măsură ce creşte numărul de registre (în termenii puterilor lui 2),
creşte şi timpul de acces la registre şi acest lucru trebuie evitat. Evident că şi memoria
trebuie accesată pentru citirea şi încărcarea în registre a diverşilor operanzi şi pentru
memorarea diverselor rezultate obŃinute în registre. Transferurile cu memoria sunt
gestionate prin instrucŃiuni de tip load şi respectiv store şi acestea sunt principalele
instrucŃiuni care accesează memoria. Formatul load/store este caracteristic procesoarelor
RISC.
Vom nota cele 32 registre R0 - R31. Deşi toate vor fi registre generale, adiŃional
câteva dintre acestea vor avea şi funcŃii speciale. R0 va conŃine permanent constanta 0 şi nu
poate fi utilizat în alt scop. Acesta este un principiu general de proiectare şi este respectat
deoarece este foarte avantajos să avem un registru care conŃine constanta zero pentru
instrucŃiunile de ştergere (iniŃializate cu zero) şi de comparare cu zero. Nu vom prevedea o
instrucŃiune explicită de tip “move” registru - registru. Aceste transferuri vor fi realizate
prin instrucŃiuni ADD (adunare) în care unul dintre operanzi va fi R0 (constanta zero).
12
ARHITECTURA SISTEMELOR DE CALCUL
Vom aloca 6 biŃi, biŃii 31 la 26, pentru câmpul principal de opcode, ceea ce va
permite codificarea a 64 instrucŃiuni diferite. În ideea extinderii numărului de instrucŃiuni,
pentru instrucŃiunile care nu utilizează toŃi biŃii rămaşi (biŃii 25 la 0), vom utiliza în anumite
cazuri un câmp secundar de sub-opcode. De exemplu, câmpul principal de opcode ar putea
specifica o clasă de instrucŃiuni (aritmetice), în timp ce câmpul sub-opcode va selecta
operaŃia (aritmetică) propriu-zisă. Vom avea cinci clase de instrucŃiuni:
Pentru eficienŃă şi viteză aceste instrucŃiuni vor opera numai cu operanzi preluaŃi
din registre. O operaŃie aritmetico-logică se va aplica celor doi operanzi preluaŃi din registre
iar rezultatul va fi depus tot într-un registru; 15 biŃi vor fi necesari pentru a specifica cele 3
registre.
13
Proiectarea setului de instrucŃiuni
utilizează un singur registru sursă, cum ar fi cele care operează cu un registru şi o constantă,
vor specifica unicul registru sursă în câmpul 20 la 16 (Rs1). BiŃii neutilizaŃi din codul
instrucŃiunii conduc la o slabă compactare a secvenŃelor de cod şi deci la o ineficientă
stocare a acestora în memorie. Dar nu acesta este factorul esenŃial care trebuie luat în
considerare; factorul esenŃial este viteza cu care instrucŃiunea poate fi decodificată şi
executată.
Un exemplu de instrucŃiune registru – registru – registru ar fi:
ADD R1,R4,R5 ; R1 = R4 + R5
Utilizând R0, care memorează permanent constanta zero, putem crea o instrucŃiune
“move”:
Sunt foarte frecvente situaŃiile în care unul dintre operanzii unei instrucŃiuni
aritmetico-logice este o constantă. Pentru codificarea constantei respective se utilizează un
câmp din codul instrucŃiunii şi de aceea acest mod de adresare se numeşte imediat, iar
formatul se mai numeşte şi registru - registru - imediat.
Cel mai adesea constantele necesare sunt constante mici. O dimensiune rezonabilă
pentru aceste constante este 16 biŃi şi această dimensiune se încadrează bine în formatul din
fig. 2.2. Combinând două constante de 16 biŃi se obŃine o constantă pe 32 biŃi. Câmpurile
“opcode”, Rd şi Rs1 rămân pe aceleaşi poziŃii pe care au fost fixate în formatul R-R-R
(important pentru reducerea complexităŃii decodificatorului instrucŃiunii).
Un exemplu de instrucŃiune R-R-I ar fi:
ADD R4,R5,64 ; R4 = R5 + 64
14
ARHITECTURA SISTEMELOR DE CALCUL
15
Proiectarea setului de instrucŃiuni
if((x!=y)&&(z<0))
{
a=b-3 ;
b=b+4 ;
}
16
ARHITECTURA SISTEMELOR DE CALCUL
if (x relaŃie y ) goto L1
unde relaŃie poate fi orice relaŃie permisă în limbajele de nivel înalt: <, >, <=, >=, ==, !=.
De exemplu, secvenŃa C anterioară poate fi compilată într-o secvenŃă echivalentă
de instrucŃiuni maşină:
17
Proiectarea setului de instrucŃiuni
if (x==y) goto L1
18
ARHITECTURA SISTEMELOR DE CALCUL
O soluŃie care evită atât utilizarea registrului de condiŃii cât şi necesitatea execuŃiei
succesive a celor două instrucŃiuni constă în combinarea celor două instrucŃiuni într-o
singură instrucŃiune de branch condiŃionat. Această instrucŃiune compară conŃinutul a două
registre şi execută saltul pe baza unei condiŃii specificate (de exemplu de egalitate):
O astfel de instrucŃiune este necesară pentru fiecare condiŃie deşi instrucŃiunea BEQ în
combinaŃie cu o instrucŃiune BL (sau BG) formează un set care face posibil orice tip de test.
Să presupunem că dispunem şi de instrucŃiunea:
Cele două instrucŃiuni (BEQ şi BL) sunt suficiente pentru a implementa toate tipurile de
test necesare:
R1 < R2 BL R1,R2,L1
R1 > R2 BL R2,R1,L1
R1 >= R2 BL R2,R1,L1
BEQ R1,R2,L1
R1 <= R2 BL R1,R2,L1
BEQ R1,R2,L1
R1 == R2 BEQ R1,R2,L1
R1 != R2 BL R1,R2,L1
BL R2,R1,L1
19
Proiectarea setului de instrucŃiuni
În cazul nostru aceste teste sunt uşor de realizat utilizând registrul R0 (care memorează
permanent constanta zero) şi instrucŃiunile BEQ şi BNE:
BEQ Ri,Rj,L1
BNE Ri,Rj,L1
BL Ri,Rj,L1
BGE Ri,Rj,L1
20
ARHITECTURA SISTEMELOR DE CALCUL
ieşire din buclă este calculată la începutul buclei. InstrucŃiunea jump va fi utilizată la
sfârşitul buclei pentru revenirea pe începutul acesteia. Utilizând mnemonica JMP, vom avea
instrucŃiunea:
21
Proiectarea setului de instrucŃiuni
sau chiar:
Să notăm că, în aceste cazuri, adresa de salt este o adresă absolută şi nu relativă la
PC deşi, dacă se dovedeşte util, ea ar putea fi interpretată şi ca adresă relativă. Să mai
notăm că notaŃia [R1] utilizată aici nu înseamnă “conŃinutul locaŃiei de memorie a cărei
adresă este dată de R1“ ca în cazul instrucŃiunilor load/store.
A. InstrucŃiunile CALL/RET
22
ARHITECTURA SISTEMELOR DE CALCUL
B. Stiva
Stiva este o structură de date de tip coadă care funcŃionează pe principiul LIFO
(Last-In-First-Out). Stivele pot fi implementate în memoria principală sau utilizând registre
interne procesorului. Stiva a fost preferată în memorie (mai cu seamă în cazul procesoarelor
CISC) datorită numărului aproape nelimitat de apeluri imbricate sau recursive. Un registru
special al procesorului numit SP (Stack Pointer) memorează permanent adresa vârfului
stivei. La memorarea unui cuvânt (de exemplu, de 32 biŃi) în stivă, mai întâi este
decrementat cu 4 registrul SP (cuvântul este format din 4 octeŃi) şi apoi cuvântul respectiv
este scris în memorie la adresa SP. La citirea unui cuvânt din stivă, mai întâi se citeşte
locaŃia de la adresa SP şi apoi SP este incrementat cu 4. A rezultat astfel o stivă care creşte
în jos (depunerea în stivă se face cu decrementare de adresă).
23
Proiectarea setului de instrucŃiuni
Set de registre
Registre disponibile
tuturor procedurilor Pointer-ul de fereastră
(variabile globale) (selectează fereastra curentă)
Registre pentru
procedura 4
24
ARHITECTURA SISTEMELOR DE CALCUL
25
Proiectarea setului de instrucŃiuni
Pointerul ferestrei curente (CWP - Current Window Pointer) are 3 biŃi şi selectează
permanent fereastra care va fi accesată. Registrul care va fi accesat în cadrul ferestrei va fi
specificat în instrucŃiune prin numărul său (0 - 31). Registrele numerotate de la 0 la 9 referă
întotdeauna registrele globale indiferent de numărul ferestrei curente. Registrele globale
sunt accesibile tuturor procedurilor. Registrele numerotate de la 10 la 31 referă întotdeauna
registre din cadrul ferestrei curente. Adresa efectivă a unui registru din setul R10 - R31 se
obŃine prin concatenarea celor 3 biŃi ce formează adresa de fereastră (conŃinutul CWP) cu
cei 5 biŃi care specifică adresa registrului în cadrul ferestrei. Să observăm că prin
suprapunerea ferestrelor apar grupuri de registre care răspund la două adrese. De exemplu,
registrul 0:26 din fereastra 0 (programul principal) este în acelaşi timp şi registrul 1:10 din
fereastra 1 (procedură pe primul nivel de imbricare).
În general numărul procedurilor imbricate este limitat şi aranjamentul circular al
ferestrelor se potriveşte bine acestei caracteristici. Ori de câte ori acest număr depăşeşte
valoarea 8, va trebui utilizată memoria principală pentru salvarea conŃinutului anumitor
registre. Un alt dezavantaj potenŃial apare în sistemele de operare multitasking, la
comutarea task-urilor; salvarea contextului consumă timp suplimentar (număr mare de
registre).
26
ARHITECTURA SISTEMELOR DE CALCUL
SUB R29,R29,4
ST [R29],R31
SUB R29,R29,4
ST [R29],Parametru1
SUB R29,R29,4
ST [R29],Parametru2
JAL Proc_Label
27
Proiectarea setului de instrucŃiuni
28
ARHITECTURA SISTEMELOR DE CALCUL
- câmpul Rs1 din codul instrucŃiunii pentru citirea primului registru sursă în A
- câmpul Rs2 din codul instrucŃiunii pentru citirea celui de-al doilea registru
sursă în B
- câmpul Rd din codul instrucŃiunii pentru scrierea datelor din C în registrul
destinaŃie specificat.
În structura din figura 2.11. aceste transferuri pot fi realizate numai prin intermediul ALU,
ceea ce implică:
29
Proiectarea setului de instrucŃiuni
Pentru transferul a) este utilizat unul din busurile sursă (S1 sau S2), iar pentru transferul b)
este utilizat busul destinaŃie (D). Cele două transferuri sunt simultane ceea ce înseamnă că,
global, transferul Rj←Ri se va executa într-o singură perioadă de tact. Registrele Ri şi Rj
trebuie să fie registre conectate direct la busuri. Registrele generale R31-R0 nu sunt
conectate direct şi de aceea vor realiza transferuri prin intermediul registrelor tampon
A,B,C.
Prima operaŃie trebuie executată înaintea celei de a doua, dar a doua şi a treia pot fi
executate simultan dacă incrementarea registrului PC nu implică utilizarea ALU (registrul
PC implementat cu logică specială de incrementare). EvidenŃiind operaŃiile simultane,
ciclul fetch instrucŃiune devine:
MAR ← PC
IR ← MDR , PC ← PC + 4
Procesorul operează sincron astfel că fiecare operaŃie sau grup de operaŃii simultane
startează la începutul perioadei de tact. Ciclul fetch instrucŃiune este independent de tipul
instrucŃiunii şi conŃine întotdeauna aceleaşi operaŃii. Procesarea unei instrucŃiuni începe
întotdeauna cu ciclul (faza) fetch instrucŃiune.
30
ARHITECTURA SISTEMELOR DE CALCUL
A ← Rs1
B ← Rs2
BiŃii IR20 - 16 din codul instrucŃiunii selectează registrul Rs1, iar biŃii IR15 - 11 selectează
registrul Rs2 (fig. 2.1.). Deoarece cele două câmpuri de selecŃie a registrelor sursă sunt
situate, în general, pe aceleaşi poziŃii indiferent de tipul instrucŃiunii, este posibilă
extragerea lor şi adresarea setului de registre generale înainte de decodificarea instrucŃiunii
(decodificarea câmpului opcode). Putem, de asemenea, permite ca cele două operaŃii de
transfer a registrelor sursă în registrele A şi respectiv B să se facă automat pentru toate
instrucŃiunile chiar dacă cei doi operanzi sursă nu vor fi utilizaŃi (cum ar fi cazul
instrucŃiunii de salt necondiŃionat JMP care poate să nu specifice nici o sursă - vezi fig.
2.6.). Pentru aceste instrucŃiuni care nu au operanzi sursă, conŃinutul registrelor A şi B nu
va mai fi utilizat ulterior. Aceasta nu conduce la o degradare a performanŃelor procesorului
deoarece am prevăzut căi de date dedicate şi independente între setul de registre generale şi
registrele tampon A şi B. Dacă setul RG (registre generale) este implementat ca o memorie
multiport atunci cele 2 operaŃii pot fi executate simultan:
A ← Rs1 , B ← Rs2
31
Proiectarea setului de instrucŃiuni
În concluzie:
C ← A <operaŃie> B
Rd ← C
S1bus ← A , S2bus ← B
Dbus ← S1bus <operaŃie> S2bus
C ← Dbus
OperaŃia ALU va fi specificată prin decodificarea câmpului opcode (sau sub-opcode dacă
există).
C ← A <operaŃie> IR15-0
Constanta poate fi extrasă din codul instrucŃiunii (aflat în IR) pe unul din busurile S1 sau S2
(fig. 2.11.) de unde va fi aplicată pe una din intrările ALU.
Să ne reamintim că nu am prevăzut o instrucŃiune specială de transfer (move)
registru-registru. Transferurile registru-registru pot fi executate numai prin ALU utilizând
instrucŃiunea ADD în care unul dintre operanzi va fi R0 (constanta zero).
MAR ← A + IR15-0
Această adunare poate fi efectuată în ALU. Următoarele operaŃii sunt dependente de tipul
referinŃei la memorie: load sau store.
32
ARHITECTURA SISTEMELOR DE CALCUL
Un timp acoperitor trebuie să treacă (timpul de acces la memorie) din momentul încărcării
adresei în MAR şi până la transferul datelor din MDR în C.
Pentru instrucŃiunile store ne confruntăm cu o excepŃie: registrul sursă este
specificat în câmpul destinaŃie al codului instrucŃiunii (IR25 - 21). O primă soluŃie ar fi ca în
primul pas al fazei de execuŃie, simultan cu încărcarea registrelor A şi B, să fie încărcat şi
registrul C cu conŃinutul registrului destinaŃie:
A ← Rs1 , B ← Rs2 , C ← Rd
După acest prim pas conŃinutul registrului C va fi emis spre memorie prin intermediul
registrului MDR. SecvenŃa completă pentru execuŃie va fi:
În acord cu structura procesorului din figura 2.11., în ultimele două operaŃii (încărcarea
adresei în MAR şi respectiv a datelor de scris în memorie în MDR), traseul datelor
transferate trece prin ALU. Din acest motiv cele două operaŃii nu pot fi executate simultan.
Dacă în structura procesorului s-ar implementa o cale de date directă între registrele B şi
MDR atunci cele două transferuri ar fi putut fi simultane.
33
Proiectarea setului de instrucŃiuni
D. InstrucŃiunile de branch
condiŃie ← A <operaŃie> B
Adresa de salt se calculează adunând offset-ul specificat în instrucŃiune (fig. 2.5.) la adresa
curentă din PC:
ALUR ← PC + IR15-0
Cu resurse hard suficiente, adresa de salt poate fi calculată simultan cu evaluarea condiŃiei
de salt. Din păcate, calculul adresei de salt revendică ALU şi busurile de date interne.
Acesta e motivul pentru care anumite procesoare RISC operează cu o singură condiŃie de
branch, A = 0, care poate fi evaluată utilizând un hardware simplu şi rapid de detecŃie de
zero.
Pasul final din faza de execuŃie constă în încărcarea adresei de salt în PC dacă este
îndeplinită condiŃia testată:
PC ← PC + IR25-0
PC ← A + IR15-0
34
ARHITECTURA SISTEMELOR DE CALCUL
Registrul specificat a fost încărcat în A în pasul anterior, iar offset-ul are doar 16 biŃi
(fig.2.7.).
InstrucŃiunea de apel procedură, JAL, este similară cu instrucŃiunea JMP;
suplimentar JAL va încărca adresa de revenire în R31. ExecuŃia instrucŃiunii JAL va fi:
R31 ← PC
PC ← PC + IR25-0
F. InstrucŃiunile de control
Sunt instrucŃiuni cel mai adesea fără operanzi şi care specifică doar o operaŃie.
InstrucŃiunea NOP (No OPeration) este prezentă în orice set de instrucŃiuni. Este utilizată la
separarea dependenŃelor între instrucŃiuni (procesoare pipeline) şi la depanarea programelor
când NOP înlocuieşte instrucŃiunile eliminate. Cel mai convenabil cod pentru NOP este
zero (32 biŃi de 0) ceea ce înseamnă că o memorie iniŃializată cu zero va conŃine numai
instrucŃiuni NOP.
InstrucŃiunea HALT opreşte procesorul (inhibă semnalul de tact). Ieşirea din
această stare de oprire se poate face, de regulă, numai printr-o întrerupere sau prin
iniŃializarea procesorului (RESET).
35
Proiectarea setului de instrucŃiuni
36
ARHITECTURA SISTEMELOR DE CALCUL
3. MEMORII CACHE
Memoria cache este o memorie de capacitate relativ mică dar de viteză foarte
ridicată care se intercalează între procesor şi memoria principală a sistemului (memoria
centrală). Pentru creşterea performanŃelor unui sistem de calcul, principial există două
direcŃii posibile:
Pentru obŃinerea unor performanŃe globale superioare trebuie acŃionat concertat şi corelat pe
ambele direcŃii. Memoria cache este introdusă în sistem pentru a reduce timpul efectiv de
acces la memoria principală şi deci vizează creşterea vitezei de transfer a datelor în cadrul
sistemului. Toate calculatoarele moderne conŃin memorii cache.
37
Memorii cache
în cache şi accesate apoi aici de către procesor. În mod normal programele şi datele sunt
încărcate şi păstrate în memoria principală (MP) astfel că memoria cache va conŃine copiile
unor locaŃii din memoria principală (vezi locaŃia X din fig. 3.1). Pentru fiecare locaŃie MP
copiată în cache este necesar ca în cache să se memoreze şi adresa din MP a locaŃiei
respective astfel încât procesorul să poată adresa cache-ul cu aceleaşi adrese cu care
adresează şi MP. Aceasta înseamnă că la orice acces la memorie procesorul va utiliza
adresa MP. Dacă locaŃia MP respectivă are o copie în cache procesorul va accesa această
copie, iar dacă locaŃia MP respectivă nu are o copie în cache procesorul va accesa chiar
locaŃia MP respectivă. FuncŃionarea cache-ului devine astfel transparentă. Orice cuvânt de
date care urmează a fi scris în memorie de către procesor va fi scris (în primul rând) în
cache şi scris şi în MP, fie în acelaşi timp, fie ulterior când locaŃia cache respectivă trebuie
să preia copia unei alte locaŃii MP (cache-ul fiind de dimensiune redusă va putea reŃine doar
copiile aferente unui subset de locaŃii MP).
Memoria principală
Transfer de date
Memoria cache X
Transfer de date
Procesor
38
ARHITECTURA SISTEMELOR DE CALCUL
ta = tm + tc (3.1)
Din fericire, deşi codul este în general executat secvenŃial, de fapt toate
programele repetă anumite secŃiuni de cod şi repetă şi accesele la aceleaşi date. Aceste
caracteristici sunt cuprinse în principiul localizării care se aplică la ambele tipuri de
referinŃe la memorie (referinŃe la instrucŃiuni şi respectiv date), deşi este mult mai evident
în cazul referinŃelor la instrucŃiuni. Principiul localizării are două componente:
Programele conŃin bucle şi în general buclele sunt scurte. După încărcarea în cache
a unei bucle de program, instrucŃiunile din buclă vor fi reaccesate în cache la fiecare reluare
a buclei respective. Accesarea unor noi instrucŃiuni în MP se va face doar la ieşirea din
buclă. Presupunând că bucla este reluată de n ori atunci, la prima parcurgere a buclei
instrucŃiunile vor fi accesate în MP şi copiate în cache, iar următoarele n-1 parcurgeri se
vor realiza cu accesarea instrucŃiunilor în cache.
Timpul mediu de acces la instrucŃiunile buclei respective va fi:
(n ⋅ t c + t m ) t
Timp mediu de acces = = tc + m (3.2)
n n
39
Memorii cache
Pentru a obŃine avantaje din localizarea spaŃială, vom transfera nu numai un octet
sau un cuvânt din MP în cache (şi viceversa) ci un număr de locaŃii secvenŃiale care
formează o linie sau un bloc. Pentru performanŃe maxime, linia (blocul) trebuie transferată
simultan prin intermediul unui bus de date extins, preluând câte un octet sau un cuvânt din
fiecare modul de memorie principală. Organizarea memoriei MP în mai multe module
conectate la memoria cache prin intermediul unui bus de date extins permite şi egalizarea
timpilor de acces la cache şi respectiv MP. Structura de principiu este redată în fig. 3.2
(vezi şi paragraful 1.2). În exemplul din fig. 3.2, opt module de memorie creează o linie de
opt octeŃi pentru cache. Adresele sunt distribuite succesiv celor 8 module de memorie astfel
încât octeŃi succesivi sunt locaŃi în module succesive, aşa cum indică figura 3.2. Câmpul
superior de adresă (câmpul Linie) este transmis tuturor modulelor pentru a selecta o locaŃie
în cadrul fiecărui modul. Cei mai puŃin semnificativi 3 biŃi (câmpul Byte) identifică octetul
(modulul din care provine octetul respectiv). Deci opt locaŃii consecutive pot fi citite în
cache, sau scrise din cache în MP, simultan. Desigur că această tehnică presupune că cei
opt octeŃi consecutivi sunt şi necesari (procesorului).
Numărul de module de memorie, în cazul general m, se alege astfel încât să rezulte
o egalizare a vitezelor de operare aferente cache-ului şi respectiv MP. Pentru o egalizare
perfectă m va fi ales astfel încât:
m · tc = tm
Cuvintele (octeŃii) din cadrul unei linii cache vor putea fi accesate de procesor în
ordine secvenŃială în alte m·tc secunde. Deci, timpul mediu de acces la aceste cuvinte, când
sunt pentru prima dată referite, va fi 2·m·tc / m = 2·tc . Dacă aceste cuvinte vor fi referite de
n ori (buclă de program), timpul mediu de acces va fi:
2 ⋅ t c + (n - 1) ⋅ t c (n + 1) ⋅ t c
Timp mediu de acces = = (3.3)
n n
40
ARHITECTURA SISTEMELOR DE CALCUL
8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7
Byte
Linie Byte
Linie
Adresă Memorie Cache
Procesor
(50 + 9 ⋅ 25)
Timpul mediu de acces = = 27,5 ns
10
Pentru valori mari ale lui n timpul mediu de acces va fi aproximativ tc.
Să notăm că dacă localizarea în cadrul programelor s-ar reduce doar la localizarea
secvenŃială a instrucŃiunilor, şi dacă instrucŃiunile ar fi întotdeauna adresate şi localizate
secvenŃial, memoria cache n-ar mai fi necesară deoarece o memorie principală cu lungimea
cuvântului extinsă împreună cu un buffer extins plasat între procesor şi MP ar fi suficiente
pentru alimentarea procesorului cu instrucŃiuni la rata solicitată de către acesta (vezi 1.2.A).
Totuşi, situaŃia reală este alta şi excepŃiile de la principiul localizării secvenŃiale atât în ceea
ce priveşte fetch-ul instrucŃiunilor cât şi referinŃele la date trebuie luate în considerare.
Pentru fetch-ul unui cuvânt am presupus că este necesară accesarea cache-ului
înainte de accesarea MP, că este deci uzual să se caute întâi în cache pentru a vedea dacă
informaŃia solicitată există acolo sau nu. Avantajul cache-ului rezultă din informaŃiile pe
care acesta le conŃine, deşi atunci când procesorul referă un cuvânt inexistent în cache ar fi
necesară o a doua referinŃă la cache după ce cuvântul a fost transferat din MP în cache (vezi
relaŃia 3.1). Cu hardware adiŃional corespunzător, capabil să gestioneze şi un bus de date
direct procesor - MP, performanŃele pot fi îmbunătăŃite în sensul că un cuvânt citit din MP
poate fi transmis simultan spre cache şi respectiv spre procesor (se elimină cea de-a doua
referinŃă la cache).
41
Memorii cache
Rata de hit reprezintă şi probabilitatea ca un cuvânt să fie găsit în cache. Rata de miss este
dată de 1 - h. Timpul mediu de acces, ta, este dat de:
presupunând din nou că pentru fetch-ul unui cuvânt se accesează mai întâi cache-ul şi, în
caz de miss, se accesează apoi şi MP. Accesele la MP adaugă timpul (1-h)·tm. De exemplu,
dacă rata de hit este 0,85 (o valoare tipică), timpul de acces la MP este 100 ns şi timpul de
acces la cache este 25 ns, atunci timpul mediu de acces va fi 25+0,15·100 = 35 ns.
Rearanjând ecuaŃia (3.4) obŃinem:
ta t
= 1 + (1-h ) ⋅ m (3.5)
tc tc
Obiectivul urmărit este de a obŃine pentru raportul ta/tc o valoare cât mai apropiată
de 1 ceea ce este posibil atunci când h se apropie de 1 şi când raportul tm/tc se apropie de
valoarea 1. Pentru memoriile cache implementate în sistemele actuale raportul tm/tc ia
valori în domeniul [2, 10]. În acest caz, pentru h în domeniul 70-90%, raportul ta/tc ia valori
apropiate de 1.
În cele ce urmează vom considera că atunci când data este citită din MP în cache
(miss) aceasta va fi imediat disponibilă şi pentru procesor fără a mai fi nevoie de o nouă
citire din cache (există un bus de date direct între MP şi procesor).
Există diverse interpretări care se dau timpului de acces. De exemplu, timpul de
acces la cache, tc, este compus din timpul necesar interogării cache-ului (pentru a descoperi
42
ARHITECTURA SISTEMELOR DE CALCUL
dacă data căutată este prezentă sau nu în cache) şi timpul necesar producerii (citirii) acestei
date. Dacă data solicitată nu este prezentă în cache, atunci sunt necesare tm secunde pentru a
transfera data din MP în procesor (incluzând orice timp adiŃional de încărcare a datei
respective în cache). Dacă separăm tc în tci (timp de interogare a cache-ului) şi tcr (timp de
citire din cache), relaŃia (3.4) devine:
sau:
adică, timpul de acces este (tci + tcr) dacă data este prezentă în cache (timp de hit) şi
respectiv (tci +tm) dacă data nu este prezentă în cache (timp de miss).
EcuaŃia (3.6) poate fi rearanjată:
sau:
unde:
thit = timpul de acces când data se află în cache
tmiss-pen = timpul suplimentar care se adaugă atunci când data nu se află în cache
(miss penalty)
43
Memorii cache
Cea mai simplă metodă de a asocia data memorată în cache cu adresa locaŃiei MP
de unde provine este de a memora în aceeaşi locaŃie cache atât data cât şi adresa MP de
unde aceasta provine. Acesta este principiul mapării complet asociative (fully associative
cache). Pentru implementarea cache-urilor complet asociative se utilizează memorii
asociative (memorii adresabile prin conŃinut). În fiecare locaŃie cache se memorează atât
adresa MP cât şi data memorată în MP la acea adresă. Când procesorul lansează o citire din
memorie, adresa MP este comparată cu toate adresele memorate în cache (memorie
asociativă) aşa cum se indică în figura 3.3.
Dacă o locaŃie cache raportează egalitate (hit), câmpul Data din locaŃia respectivă este citit
şi încărcat în procesor (locaŃia cache respectivă a fost încărcată anterior cu datele conŃinute
în locaŃia MP selectată cu adresa emisă de procesor). Dacă compararea nu detectează
egalitate pe nici o locaŃie cache (miss), atunci procesorul va accesa şi va citi data solicitată
din MP. Dacă partea asociativă din cache (zona "Adresa MP") este capabilă să memoreze
întreaga adresă MP (fără trunchiere), atunci orice locaŃie MP poate fi actualizată
(memorată) în orice locaŃie cache.
Memoria cache
Validare acces în
MP la miss
Validare acces la
hit (adresă găsită)
Procesorul accesează
locaŃia (hit)
44
ARHITECTURA SISTEMELOR DE CALCUL
Pentru a exploata avantajele localizării spaŃiale (în toate tipurile de cache), într-o
locaŃie cache se poate memora mai mult decât o locaŃie MP (o linie sau un bloc de locaŃii
MP consecutive). În figura 3.4., o linie cache este constituită din 4 cuvinte (locaŃii) MP
consecutive, fiecare cuvânt MP fiind format din 4 octeŃi. Cea mai puŃin semnificativă parte
din adresa emisă de procesor (câmpul Byte) selectează octetul, câmpul următor (câmpul
word) selectează cuvântul în cache, iar biŃii cei mai semnificativi care rămân se compară cu
adresele memorate în cache. Întreaga linie poate fi transferată printr-o singură tranzacŃie
cache - MP dacă se implementează un bus de date extins între cache şi MP. Cu un bus
redus (de dimensiunea unui cuvânt), cuvintele unei linii trebuie transferate în tranzacŃii
succesive, şi drept consecinŃă un bit adiŃional trebuie memorat în cache alături de fiecare
cuvânt pentru a indica starea de validitate/invaliditate a cuvântului respectiv (la un moment
dat anumite cuvinte din cadrul liniei pot fi valide şi altele nu şi această stare este descrisă cu
ajutorul biŃilor de validare).
Uzual unitatea adresabilă în MP este octetul. Patru octeŃi consecutivi formează un
cuvânt de 32 biŃi. Procesorul poate iniŃia citirea unui octet, cuvânt de 16 biŃi, cuvânt de 32
biŃi (sau chiar mai mare). Există diverse tehnici utilizate pentru specificarea dimensiunii
cuvântului adresat în MP. În cadrul acestei lucrări vom considera că procesorul generează
adrese de byte şi prin câteva semnale adiŃionale specifică dimensiunea cuvântului ce
urmează a fi transferat (un octet, 2 octeŃi, 4 octeŃi, mai mulŃi octeŃi). Patru octeŃi reprezintă
o dimensiune convenabilă pentru linia cache deoarece aceasta coincide cu lungimea unei
instrucŃiuni de 32 biŃi. O linie cache de 8 octeŃi va găzdui două instrucŃiuni pe 32 biŃi. Deşi
dimensiunea minimă a liniei pare a fi 4 octeŃi totuşi va fi necesară accesarea individuală a
octeŃilor în cadrul liniei; aceasta se realizează cu ajutorul câmpurilor word şi byte din cadrul
adresei emise de procesor (fig. 3.4).
Cache-ul complet asociativ oferă flexibilitate maximă în ceea ce priveşte
combinarea liniilor în cache (orice linie MP poate fi încărcată în orice locaŃie cache) şi
pentru o anumită capacitate a cache-ului oferă minimum de conflict, dar este în acelaşi timp
şi cel mai scump datorită costului memoriilor asociative (zona cache în care se memorează
adresele MP este un plan de memorie asociativă). În ciclurile miss informaŃia solicitată de
procesor se va citi din MP şi linia din care provine această informaŃie trebuie actualizată
(copiată) în cache înlocuind astfel o altă linie actualizată anterior în cache. Linia care va fi
înlocuită va fi selectată pe baza unui algoritm de înlocuire şi acest algoritm trebuie
implementat în hardware deoarece trebuie să opereze la viteză ridicată. Implementarea
complet asociativă este viabilă (din punct de vedere al costului) doar pentru cache-uri de
capacitate mică până la moderată. Microprocesoarele cu cache-uri interne (on-chip) mici
folosesc frecvent implementarea complet asociativă deoarece asigură performanŃe maxime.
BiŃii de validare
În toate cache-urile, dacă dimensiunea liniei este mai mare decât dimensiunea
busului de date cache - MP, vor fi necesare mai multe transferuri pentru a umple o linie
cache cu cuvinte din MP şi respectiv pentru a transfera liniile modificate în cache (prin
cicluri de scriere date în memorie executate de procesor) înapoi în MP.
45
Memorii cache
M e m o r i a c a c h e
Linie
Deoarece cuvintele sunt transferate în cache succesiv este posibil ca la un moment dat o
linie cache să nu conŃină toate cuvintele asociate liniei respective; o parte dintre cuvinte
sunt încă neactualizate şi deci aparŃin liniei anterioare care fusese memorată în cache în
aceeaşi locaŃie. Pentru a gestiona astfel de situaŃii, fiecare cuvânt cache este prevăzut cu un
bit de validare care este setat atunci când cuvântul face într-adevăr parte din linia a cărei
adresă este memorată în cache în linia respectivă. Când un cuvânt este încărcat în cache,
bitul său de validare este setat. Câmpul de adresă din cadrul unei linii cache identifică linia,
deşi nu toate cuvintele din linia respectivă aparŃin cu adevărat liniei curente; unele dintre
cuvinte sunt moştenite din linia precedentă. Când procesorul accesează cache-ul, adresa
emisă de procesor este comparată cu toate adresele memorate în cache. Dacă se obŃine o
corespondenŃă (egalitate), linia respectivă este selectată şi bitul de validare asociat
cuvântului selectat (în cadrul liniei) este verificat pentru a se vedea dacă cuvântul respectiv
este o parte validă a liniei sau nu. Dacă este valid (bitul de validare setat), cuvântul este
46
ARHITECTURA SISTEMELOR DE CALCUL
accesat în cache, în caz contrar cuvântul va fi citit din MP, încărcat în procesor şi simultan
actualizat (scris) în cache. La actualizarea cuvântului în cache pot apărea 2 situaŃii:
Termenul sub-bloc este utilizat pentru a descrie entitatea care necesită un bit de
validare. Pentru un bus de date de 32 biŃi între cache şi MP, sub-blocul va avea 32 biŃi;
pentru un bus de 64 biŃi acesta va avea 64 biŃi, etc. Chiar dacă o întreagă linie poate fi
transferată din MP în cache printr-un singur transfer pe bus, biŃii de validare sunt în general
necesari în toate tipurile de cache pentru a gestiona perioadele de "start-up" ale sistemului
când cache-ul are un conŃinut aleator.
47
Memorii cache
Când procesorul referă memoria, index-ul este mai întâi utilizat pentru a selecta o
locaŃie cache. Apoi tag-ul memorat în locaŃia respectivă este citit şi comparat cu tag-ul
rezultat din adresa emisă de procesor. Dacă cele 2 tag-uri sunt identice (hit) data citită din
cache se încarcă în procesor. Dacă cele 2 tag-uri sunt diferite (miss) se accesează MP. Se
citeşte locaŃia MP adresată şi cuvântul citit se încarcă în cache (în locaŃia deja selectată cu
index). Dacă există un bus de date direct procesor - MP este posibil ca informaŃia să se
încarce simultan şi în procesor (read - through la miss).
Tag Data i
Read
N
Comparator
= =
Validare acces
în MP la miss
Validare acces la
hit (adresă găsită)
Procesorul accesează
locaŃia (hit)
În cazul unei operaŃii de scriere locaŃia cache (identic selectată) va fi modificată (scrisă).
LocaŃia MP aferentă poate fi modificată în acelaşi timp (write-through) sau mai târziu
(write-back). OperaŃiile de scriere vor fi discutate în secŃiunea 3.2.2.
În fig. 3.6 se prezintă un cache cu mapare directă care conŃine în cadrul unei linii
mai multe cuvinte. Adresa MP este compusă din câmpurile tag, line (sau index) şi word
care selectează cuvântul în cadrul liniei cache. Tag-ul este asociat liniei (toate cuvintele din
cadrul unei linii au acelaşi tag). Câmpul line (index) este utilizat pentru adresarea memoriei
cache şi tag-ul memorat în linia cache selectată este comparat cu tag-ul rezultat din adresa
emisă de procesor. În cazul operaŃiilor de citire, dacă cele 2 tag-uri sunt identice (hit), se
48
ARHITECTURA SISTEMELOR DE CALCUL
citeşte cuvântul selectat în cadrul liniei cache selectate şi se încarcă în procesor. Dacă cele
2 tag-uri sunt diferite (miss), linia ce conŃine cuvântul dorit este mai întâi transferată din
MP în cache.
M e m o r i a c a c h e
Index
Read
Comparator
= = Validare acces
49
Memorii cache
adresarea locaŃiilor cache. Această tehnică şi avantajele ei vor fi prezentate în cazul TLB
(Translation Look-aside Buffer), în capitolul 4.
Pentru cache-urile cu mapare directă pot fi identificate următoarele avantaje:
Dezavantajele sunt:
Totuşi, pe măsură ce capacitatea cache-ului creşte diferenŃa dintre ratele de hit aferente
celor 2 tipuri de cache-uri se reduce şi devine nesemnificativă.
50
ARHITECTURA SISTEMELOR DE CALCUL
Câmpul tag se alege întotdeauna ca fiind cel mai semnificativ în cadrul adresei MP
emisă de procesor. Este urmat de câmpul index care selectează setul (linia), iar câmpul
word/byte reprezintă partea cea mai puŃin semnificativă din adresă. Acest format este cel
mai performant deoarece linii consecutive din MP vor fi distribuite în seturi cache
succesive (vezi 3.1.1. – 3.1.3.) şi este utilizat în toate sistemele cunoscute. Să notăm că
pentru un cache organizat în seturi asociative poziŃia relativă a celor 3 câmpuri poate fi
oricare şi se stabileşte în faza de proiectare.
M e m o r i a c a c h e
Index
Comparatoare
= = = = = = = = Validare acces
în MP (miss)
Validare acces Validare acces Validare acces Validare acces
la hit la hit la hit la hit
SelecŃie Word
51
Memorii cache
asociative (adresabile prin conŃinut). În cazul cache-ului organizat în seturi asociative, setul
poate fi selectat rapid (pe baza index-ului) şi toate liniile din set pot fi citite în paralel şi
simultan cu citirea tag-urilor pentru comparare. După compararea tag-urilor (presupunând
că se obŃine hit), linia corespondentă mai trebuie doar selectată.
Algoritmul de înlocuire (evacuare) aplicat la cache-ul organizat în seturi asociative
trebuie să ia în considerare doar liniile din componenŃa setului deoarece setul este
predeterminat prin index. Deci, cu două linii în fiecare set, de exemplu, un singur bit
adiŃional ar fi suficient pentru a specifica linia ce trebuie înlocuită (evacuată). Tipic,
dimensiunea setului este 2, 4, 8 sau 16 linii. Când dimensiunea setului este 1 organizarea cu
seturi asociative se reduce la organizarea cu mapare directă iar când cache-ul conŃine un
singur set se reduce la organizarea complet asociativă. Numărul total de linii din cache este
dat de 2 parametri:
Pentru un anumit număr total de linii (capacitate cache), valorile celor 2 parametrii se
stabilesc la proiectare (evaluări de performanŃe).
Organizarea în seturi asociative este foarte populară în cache-urile interne
implementate în microprocesoarele actuale şi poate fi găsită la Motorola MC 68040 (4-way
set associative), Intel 486 (4-way set associative), Intel i860 (4-way set associative), Intel
Pentium (2-way set associative), etc.
52
ARHITECTURA SISTEMELOR DE CALCUL
Să notăm că, deşi sectoarele pot fi plasate oriunde în cache, odată ce sectorul a fost
plasat într-o anumită poziŃie, liniile sale trebuie plasate în locaŃiile corespunzătoare din
cadrul sectorului (linia i va fi plasată în locaŃia i). Deci, câmpul line din adresă acŃionează
ca un index în cadrul sectorului; algoritmul de înlocuire va lua în considerare doar adresele
de sector.
Organizarea în sectoare a fost utilizată în primul sistem comercial dotat cu
memorie cache: IBM 360 - model 85. Cache-ul acestui sistem avea 16 sectoare şi fiecare
sector avea 16 linii. Fiecare linie avea 64 octeŃi rezultând 1024 octeŃi în fiecare sector şi un
cache cu capacitatea de 16 KBytes. La miss 4 octeŃi erau transferaŃi din MP în cache şi
simultan în procesor. MP era organizată în 4 blocuri cu adresare întreŃesută. Algoritmul de
înlocuire utilizat era algoritmul LRU (Least Recently Used), funcŃiona la nivelul sectoarelor
şi era implementat în hardware.
Organizarea în sectoare poate fi privită ca o organizare complet asociativă cu biŃi
de validare. Fiecare linie din cache-ul complet asociativ corespunde unui sector, şi fiecare
octet ar corespunde unei linii. Deşi organizarea în sectoare a pierdut din popularitate după
IBM 360 - 85 (probabil datorită ratei de hit inferioare celei aferente organizării în seturi
asociative), o formă a organizării în sectoare a reapărut în sistemele cu microprocesoare.
Lărgimea limitată a busului în sistemele cu microprocesoare face imposibil transferul
simultan a unui număr mare de cuvinte.
1. fetch la cerere
2. prefetch
3. fetch selectiv
Fetch la cerere este strategia prin care o linie este extrasă din MP şi încărcată în
cache atunci când devine necesară (procesorul o accesează) şi nu se află deja în cache
(fetch-ul unei linii la miss). Această strategie este cea mai simplă şi nu necesită hardware
sau tag-uri adiŃionale în cache pentru a înregistra referinŃele la memorie, exceptând
hardware-ul de identificare a liniei cache ce va fi înlocuită.
Termenul de prefetch identifică strategia de extragere a liniilor din MP în cache înainte ca
acestea să fie solicitate. O strategie simplă de prefetch constă în prefetch-ul (fetch-ul
anticipat) liniei i + 1 când linia i este pentru prima dată referită (presupunând că linia i + 1
nu se află deja în cache), în baza presupunerii că este foarte probabil ca linia i + 1 să
urmeze a fi referită din moment ce linia i este referită. Această strategie de prefetch
secvenŃial poate reduce rata de miss cu 50 % dacă se implementează într-un cache suficient
de mare. Inevitabil, prefetch-ul liniei i + 1 înseamnă înlocuirea altei linii din cache, şi în
anumite cazuri chiar linia înlocuită ar urma să fie referită şi nu linia i + 1. Este însă clar că,
şi în cazul acestei simple strategii de prefetch secvenŃial, nu toate primele referinŃe vor
53
Memorii cache
induce miss deoarece multe vor referi linii încărcate anticipat în cache (secvenŃialitatea
instrucŃiunilor în program). Prefetch-ul ar putea fi limitat la situaŃiile în care fetch-ul liniei i
se face cu miss (prefetch la miss).
Fetch-ul selectiv descrie tehnica de condiŃionare a fetch-ului liniilor din MP în
cache. Fetch-ul se va executa pe baza unui criteriu definit, şi criteriul va defini situaŃii în
care MP va fi desemnată să reŃină anumite informaŃii şi nu memoria cache. De exemplu,
datele read/write partajate ar putea fi mai uşor de gestionat dacă sunt menŃinute permanent
în MP şi nu transferate în cache (în special în sistemele multiprocesor). În acest caz cache-
ul trebuie astfel proiectat încât procesorul să poată accesa MP direct, şuntând cache-ul.
Anumite locaŃii ar putea fi definite astfel non-cache-abile.
54
ARHITECTURA SISTEMELOR DE CALCUL
Memorie Principală
(MP)
InstrucŃiuni Date
Dacă automodificarea este permisă vor apărea probleme cu instrucŃiunile memorate atât în
cache-ul de instrucŃiuni cât şi în cel de date. Dacă instrucŃiunea se modifică în cache-ul de
date, copia sa din cache-ul de instrucŃiuni va rămâne diferită. De asemenea, momentul în
care modificarea survine depinde de structura pipeline specifică a procesorului şi
modificarea nu este posibilă înainte de fetch-ul instrucŃiunii vizate (ce va fi modificată).
Foarte multe procesoare permit de asemenea încărcarea instrucŃiunilor şi a datelor în locaŃii
de memorie consecutive sau învecinate, astfel încât devine posibil ca o linie cache să
conŃină atât instrucŃiuni cât şi date. Din nou vom avea 2 copii ale aceleiaşi linii în cache-uri
separate, şi deci o problemă cu consistenŃa celor 2 copii. Desigur toate aceste probleme pot
fi eliminate dacă se insistă ca instrucŃiunile şi datele să fie separate în memorie (aşa cum ar
fi normal să fie) şi dacă se interzice scrierea de cod automodificabil. În caz contrar o soluŃie
ar fi să se invalideze linia din cache-ul de instrucŃiuni în momentul în care copia ei din
cache-ul de date este modificată (scrisă). Acest aranjament permite duplicarea unei linii în
ambele cache-uri dar numai până în momentul modificării copiei din cache-ul de date.
Dacă se iau în considerare doar operaŃiile de citire din memorie este evident că nu
pot să apară diferenŃe între cuvintele din MP şi copiile acestora din cache. Totuşi, în timpul
55
Memorii cache
execuŃiei unui program, se execută şi operaŃii de scriere (în cache) şi astfel devine posibil
ca cuvântul din cache şi copia sa din MP să devină diferite. Dacă transferurile de intrare-
ieşire din sistem (transferurile DMA - Direct Memory Acces - implementate pentru
perifericele rapide) operează cu conŃinutul MP, sau dacă mai multe procesoare operează cu
conŃinutul MP (ca în sistemele multiprocesor cu memorie partajată), este necesar ca
locaŃiile cache şi copiile acestora din MP să se menŃină identice.
Dacă se ignoră penalităŃile cauzate de operaŃiile suplimentare introduse pentru
menŃinerea consistenŃei copiilor, şi timpul necesar scrierii datelor înapoi în MP, atunci
timpul mediu de acces va fi dat de relaŃia (3.4) de la 3.1.3 (presupunând că toate accesele se
fac întâi în cache):
ta = tc + (1-h)·tm
OperaŃiile de scriere vor adăuga un timp adiŃional în ecuaŃia de mai sus, timp care depinde
de mecanismul utilizat pentru menŃinerea consistenŃei datelor. Dacă nu este necesar să se
menŃină consistente conŃinutul cache-ului şi conŃinutul MP (de exemplu în sistemele în care
toate procesoarele şi toate controllere-le I/E accesează datele în cache), atunci timpul
mediu de acces va fi dat de relaŃia de mai sus.
Deşi timpul mediu de acces în cache reprezintă un factor care determină în mod
esenŃial performanŃele globale ale sistemului şi din această cauză îl vom evalua pentru
diverse strategii de scriere/citire, viteza globală de procesare este influenŃată şi de alŃi
factori. În particular, viteza de execuŃie a instrucŃiunii este determinată de diversele operaŃii
interne CPU (Central Processing Unit) la care se adaugă operaŃiile de fetch instrucŃiune şi
accesele la operanzi. De asemenea, arhitectura maşinii poate influenŃa profund
performanŃele globale. O simplă creştere a lungimii liniei cache fără o extindere (lărgire)
adecvată a busului de date MP - cache poate conduce la diminuarea performanŃelor globale
deoarece copierea unei linii din MP în cache revendică transferuri multiple pe busul
respectiv.
Există două mecanisme alternative de actualizare a conŃinutului MP în cadrul
operaŃiilor de scriere:
− mecanismul write-through
− mecanismul write-back (numit uneori copyback)
56
ARHITECTURA SISTEMELOR DE CALCUL
unde:
tl - timpul de transfer a unei linii în cache (considerând că la miss întreaga linie
trebuie transferată)
w - procentul de referinŃe la memorie cu write (numărul de scrieri raportat la
numărul total de referinŃe la memorie)
Termenul (tm - tc) reprezintă timpul adiŃional indus de scrierea unui cuvânt în MP
(la hit sau miss), considerând că operaŃiile de scriere în cache şi respectiv MP se derulează
simultan şi că operaŃia de scriere trebuie să se încheie (inclusiv în MP) înaintea startării
următoarei operaŃii read/write în cache. Dacă lungimea liniei este identică cu lăŃimea
busului de date MP - cache atunci o linie completă va putea fi transferată într-o singură
tranzacŃie pe bus şi tl = tm. Dacă linia este mai lungă decât lăŃimea busului de date extern
atunci tl = l·tm unde l reprezintă numărul de tranzacŃii pe bus necesare pentru transferul unei
linii complete.
Presupunând tc = 25 ns, tm = 200 ns, h = 99 %, w = 20 % şi lungimea liniei cache
egală cu lăŃimea busului extern (l = 1), timpul mediu de acces va fi 62 ns, din care 2 ns se
datorează ciclurilor miss şi 35 ns se datorează scrierilor în tehnica write-through. Când
lăŃimea busului extern este mai mică decât lungimea liniei cache, vor fi necesare mai multe
tranzacŃii pe bus pentru transferul unei linii şi penalităŃile cauzate de ciclurile miss devin
mai semnificative. De exemplu, dacă l = 16 (linia de 16 ori mai lungă decât lăŃimea busului
extern), timpul mediu de acces devine 92 ns, din care 32 ns se datorează ciclurilor miss şi
35 ns se datorează scrierilor în tehnica write-through.
În cazul unui ciclu miss, linia ar putea fi transferată din MP în cache indiferent
dacă ciclul miss a fost cauzat de o operaŃie de scriere sau de una de citire. Termenul fetch
on write este utilizat pentru a descrie strategia de aducere a liniei/cuvântului din MP în
cache în cazul operaŃiilor de scriere cu miss. În strategia write-through, transferurile fetch
on write sunt cel mai adesea evitate (se aplică strategia no fetch on write în care informaŃia
este scrisă doar în MP). Termenul allocate on write este uneori utilizat pentru a descrie
strategia fetch on write deoarece o linie cache este alocată unei linii noi în caz de miss în
cache. Termenul non-allocate on write se asociază uneori strategiei no fetch on write.
Timpul mediu de acces în cazul strategiei no fetch on write va fi:
57
Memorii cache
Rata de hit va fi uşor mai mică decât în cazul strategiei fetch on write deoarece
liniile alterate prin scriere în MP nu mai sunt aduse în cache şi, în funcŃie de program, ar
putea fi din nou accesate prin operaŃii de citire ulterioare. Presupunând că rata de hit şi
ceilalŃi parametrii au aceleaşi valori ca în exemplul anterior, timpul mediu de acces în cazul
strategiei no fetch on write (relaŃia 3.11) va fi 61,6 ns, pentru l = 1, şi respectiv 85,6 ns,
pentru l = 16.
Mecanismul write-through poate fi îmbunătăŃit prin introducerea unor buffer-e, ca
în fig. 3.9, pentru reŃinerea informaŃiilor ce urmează a fi scrise înapoi în MP, eliberând
cache-ul pentru următoarele accese. Astfel de buffer-e apar şi în cazul strategiei write-back
(secŃiunea 3.3.5). În cazul strategiei write-through, fiecare cuvânt ce trebuie scris înapoi în
MP va fi plasat în buffer împreună cu adresa locaŃiei MP în care va fi memorat (dacă
transferul nu poate fi executat imediat). O capacitate de 4 locaŃii pentru write-buffer este în
general suficientă (Intel 486 utilizează strategia write-through şi un buffer de 4 locaŃii).
Dacă operaŃiile write-through devin total transparente, atunci timpul mediu de acces va fi
dat de relaŃiile stabilite în secŃiunea 3.1.3). Buffer-ul de scriere revendică o logică de control
complexă care trebuie să asigure verificarea conŃinutului său la orice acces la MP iniŃiat de
către procesor/cache sau un alt dispozitiv. Toate adresele cu care se accesează MP trebuie
comparate cu adresele memorate în buffer.
Read
58
ARHITECTURA SISTEMELOR DE CALCUL
unibus. Această creştere a traficului pe unibus devine semnificativă dacă busul este accesat
şi de alte dispozitive sau procesoare aşa cum se întâmplă în sistemele multiprocesor.
unde primul termen (1-h)·tl se datorează operaŃiilor de fetch linie din MP în cache iar al
doilea termen (1-h)·tl se datorează operaŃiilor write-back în MP. Mecanismul write-back în
general aplică strategia fetch on write în cazul ciclurilor de scriere cu miss, spre deosebire
de mecanismul write-through care aplică de regulă strategia no fetch on write.
Un mecanism write-back îmbunătăŃit scrie înapoi în MP doar liniile care au fost
alterate (modificate) în cache (liniile nealterate nu mai trebuie scrise înapoi în MP deoarece
copia din MP este încă identică cu cea din cache). Pentru a implementa această strategie un
bit suplimentar (A-altered) va fi asociat fiecărei linii în cache şi acest bit va fi setat ori de
câte ori se face scriere în linia cache respectivă. În momentul înlocuirii, bitul A este
examinat pentru a determina dacă linia respectivă trebuie scrisă sau nu înapoi în MP. În
această situaŃie timpul mediu de acces devine:
unde wl reprezintă probabilitatea ca o linie cache să fie alterată (procentul de linii alterate).
Probabilitatea ca o linie să fie alterată (wl) are ca limită maximă valoarea w (probabilitatea
ca o referinŃă la memorie să fie scriere sau, altfel spus, procentul de accese cu scriere din
totalul acceselor la memorie). Este foarte probabil ca wl să ia valori mult mai mici decât w
deoarece, până în momentul write-back, este foarte probabilă execuŃia mai multor operaŃii
de scriere în aceeaşi linie cache. Rata de hit este aceeaşi ca şi în cazul strategiilor write-
back simplă şi respectiv write-through cu fetch on write dar ta se reduce chiar semnificativ
(cu (1-h)·(1-wl)·tl faŃă de strategia write-back simplă). Totuşi, şi această strategie, în
momentul write-back scrie o linie completă în MP, chiar dacă în linia respectivă a fost
alterat doar un singur cuvânt. Cuvintele nealterate care se transferă necondiŃionat vor crea
un trafic suplimentar (nenecesar) pe bus şi acest trafic suplimentar creşte dacă lăŃimea
busului MP - cache este mai mică decât lungimea liniei cache. Chiar şi în aceste condiŃii
strategia write-back va provoca un trafic mai redus decât strategia write-through care
determină transferul în MP a fiecărei linii cache în momentul alterării ei. Strategia write-
back poate fi îmbunătăŃită (ca şi strategia write-through) prin introducerea unor buffer-e
(fig. 3.9) pentru reŃinerea informaŃiei ce urmează a fi transferată înapoi în MP.
59