simulatorul pcspim-cachewebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 ·...

19
Computer Science and Automation Control Adrian FLOREA 1 SIMULATORUL PCSPIM-CACHE 1.1. SCOPUL LUCRĂRII Memoriile cache reprezintă un mecanism omniprezent în microprocesoarele curente, dedicat mascării latenţei ridicate a memoriei principale. Datorită importanţei lor, acestea sunt considerate elemente cheie (fundamentale) în programa specifică arhitecturii calculatoarelor. În acest sens, lucrarea de faţă urmăreşte evidenţierea conceptelor legate de cache-uri – modul de organizare, regulile de mapare, algoritmii de înlocuire a blocurilor conflictuale, strategia de scriere – din prisma unor aplicatii scrise in limbaj de asamblare MIPS. Lucrarea continuă cu descrierea detaliată a simulatorului PCspim-cache, instrument software care permite vizualizarea grafica in fiecare ciclu de executie a impactului unor algoritmi simpli atat asupra setului de registrii generali cat şi asupra arhitecturii cache-ului [Pet06]. Simulatorul, de tip execution-driven, a fost dezvoltat de colectivul de cercetători de la Departamentul Ştiinţa şi Ingineria Calculatoarelor din cadrul Universităţii Politehnica din Valencia condus de profesor Ana Pont şi extinde simulatorul SPIMSal scris pentru uz didactic de către James Larus [Lar93] şi care a fost prezentat detaliat în lucrarea [Flo03]. În finalul lucrării sunt explicate două aplicaţii de complexitate medie şi propuse alte două probleme pentru rezolvare având ca scop înţelegerea aspectelor arhitecturale specifice procesoarelor RISC, formarea deprinderilor practice privind programarea în asamblare MIPS dar şi vizualizarea efectului optimizărilor software de tip loop interchange asupra reducerii ratei de miss în cache-uri. 1.2. MEMENTO TEORETIC În acest subcapitol vor fi trecute în revistă doar câteva aspecte privitoare la memoriile cache (definiţie, arhitectură, metrici, strategii de scriere şi metode de îmbunătăţire a performanţei acestora), întrucât există suficientă documentaţie care tratează în detaliu acest subiect [Hill88, Jou90, Sti94, Hen07], inclusiv autorii acestei cărţi având astfel de contribuţii [Flo00, Vin00, Flo03]. Practic se vor prezenta acele noţiuni care intervin apoi în procesul de simulare a interfeţei microprocesor - cache. Conform dicţionarului american „Webster’s New World Dictionary of the American Languagecache-ul reprezintă a safe place for hiding or storing things. Sintetic, despre memoria cache se poate spune ca este: situată din punct de vedere logic între CPU şi memoria principală (uzual DRAM) mai mică, mai rapidă şi mai scumpă (per byte – de tip SRAM) decât aceasta gestionată prin hardware astfel încât să existe o cât mai mare probabilitate statistică de găsire a datei accesate de către CPU, în cache. In evaluarea performantei memoriilor cache si a întregului sistem de calcul sunt folosite următoarele metrici: Rata de Hit = raportul statistic între numărul acceselor cu hit (găsesc informaţia căutata) în cache respectiv numărul total al acceselor CPU la memorie. Rata de miss =1 – Rata de Hit Timpul mediu de acces al CPU la sistemul ierarhic de memorie (MP) = T_acces_cache*R_hit + T_acces_ DRAM *(1-R_hit) Rata de procesare (viteza de execuţie) = Nr. Instrucţiuni executate / Timp total execuţie

Upload: others

Post on 06-Feb-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

1

SIMULATORUL PCSPIM-CACHE

1.1. SCOPUL LUCRĂRII

Memoriile cache reprezintă un mecanism omniprezent în microprocesoarele curente, dedicat mascării latenţei ridicate a memoriei principale. Datorită importanţei lor, acestea sunt considerate elemente cheie (fundamentale) în programa specifică arhitecturii calculatoarelor. În acest sens, lucrarea de faţă urmăreşte evidenţierea conceptelor legate de cache-uri – modul de organizare, regulile de mapare, algoritmii de înlocuire a blocurilor conflictuale, strategia de scriere – din prisma unor aplicatii scrise in limbaj de asamblare MIPS. Lucrarea continuă cu descrierea detaliată a simulatorului PCspim-cache, instrument software care permite vizualizarea grafica in fiecare ciclu de executie a impactului unor algoritmi simpli atat asupra setului de registrii generali cat şi asupra arhitecturii cache-ului [Pet06]. Simulatorul, de tip execution-driven, a fost dezvoltat de colectivul de cercetători de la Departamentul Ştiinţa şi Ingineria Calculatoarelor din cadrul Universităţii Politehnica din Valencia condus de profesor Ana Pont şi extinde simulatorul SPIMSal scris pentru uz didactic de către James Larus [Lar93] şi care a fost prezentat detaliat în lucrarea [Flo03]. În finalul lucrării sunt explicate două aplicaţii de complexitate medie şi propuse alte două probleme pentru rezolvare având ca scop înţelegerea aspectelor arhitecturale specifice procesoarelor RISC, formarea deprinderilor practice privind programarea în asamblare MIPS dar şi vizualizarea efectului optimizărilor software de tip loop interchange asupra reducerii ratei de miss în cache-uri.

1.2. MEMENTO TEORETIC

În acest subcapitol vor fi trecute în revistă doar câteva aspecte privitoare la memoriile cache (definiţie, arhitectură, metrici, strategii de scriere şi metode de îmbunătăţire a performanţei acestora), întrucât există suficientă documentaţie care tratează în detaliu acest subiect [Hill88, Jou90, Sti94, Hen07], inclusiv autorii acestei cărţi având astfel de contribuţii [Flo00, Vin00, Flo03]. Practic se vor prezenta acele noţiuni care intervin apoi în procesul de simulare a interfeţei microprocesor - cache.

Conform dicţionarului american „Webster’s New World Dictionary of the American Language” cache-ul reprezintă „a safe place for hiding or storing things”. Sintetic, despre memoria cache se poate spune ca este:

• situată din punct de vedere logic între CPU şi memoria principală (uzual DRAM) • mai mică, mai rapidă şi mai scumpă (per byte – de tip SRAM) decât aceasta • gestionată prin hardware astfel încât să existe o cât mai mare probabilitate statistică de găsire a

datei accesate de către CPU, în cache. In evaluarea performantei memoriilor cache si a întregului sistem de calcul sunt folosite următoarele

metrici: • Rata de Hit = raportul statistic între numărul acceselor cu hit (găsesc informaţia căutata) în cache

respectiv numărul total al acceselor CPU la memorie. Rata de miss =1 – Rata de Hit

• Timpul mediu de acces al CPU la sistemul ierarhic de memorie (MP) = T_acces_cache*R_hit + T_acces_DRAM*(1-R_hit)

• Rata de procesare (viteza de execuţie) = Nr. Instrucţiuni executate / Timp total execuţie

Page 2: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

2

Din punct de vedere arhitectural, există 3 tipuri distincte de memorii cache în conformitate cu

gradul de asociativitate: 1. cache-urile cu mapare directă – un bloc din memoria principala (MP) poate fi găsit în cache

(hit) într-un bloc unic determinat. Regula de mapare a unui bloc in MP în cache (daca blocul contine un singur cuvant de date – 1 byte) este:

(Adresa bloc MP) modulo (Nr. blocuri din cache) %

Daca insa dimensiunea blocului din cache este mai mare de 1 byte atunci indexul blocului din cache se determina dupa regula:

(Adresa bloc MP / Dimensiunea_blocului in bytes) % Nr. blocuri din cache)

Stricteţea regulii de mapare constituie atat un avantaj intrucat conduce la o simplitate constructivă a acestor memorii, o implementare hardware usoara (accesul la cache se face folosind ultimii biti de adresa) dar constituie totodata şi un dezavantaj datorita fenomenului de interferenţă al blocurilor din MP în cache.

2. la cache-urile N-way asociative (semiasociative) există mai multe seturi, fiecare set având N

blocuri componente. Blocul dorit se poate mapa oriunde în setul respectiv (asociativitate

maxima in set). Regula de mapare precizează strict doar setul în care se poate afla blocul dorit:

(Adresa bloc MP) modulo (Nr. seturi din cache) Daca insa dimensiunea blocului din cache este mai mare de 1 byte atunci indexul blocului din cache

se determina dupa regula:

(Adresa bloc MP / Dimensiunea_blocului in bytes) modulo (Nr. seturi din cache)

La un miss în cache, înainte de încărcarea noului bloc din MP, memoriile asociative implica evacuarea unui anumit bloc din setul respectiv. În principiu există implementate două-trei tipuri de algoritmi de evacuare: FIFO (primul bloc introdus in set este primul bloc care va fi evacuat la un miss in cache), PseudoRandom (cvasialeator) şi LRU (“Least Recently Used”). Algoritmul LRU evacuează blocul din cache cel mai demult neaccesat, în baza principiului de localitate temporală (aflat oarecum în contradicţie cu o probabilistică markoviană care ar sugera să fie păstrat!).

Politica de înlocuire LRU este departe de a fi cea optimă pentru unele din programe. Această anomalie poate fi evitată prin folosirea algoritmului “optim” (OPT) în loc de LRU ca bază pentru clasificarea miss-urilor în cache. Algoritmul OPT, înlocuieşte întotdeauna blocul care va fi adresat cel

mai târziu în viitor (eventual nu va mai fi adresat deloc). Un astfel de algoritm s-a dovedit a fi cvasi-optimal pentru toate pattern-urile de program, ratele de miss fiind cele mai mici în acest caz, dintre mai toate politicile de înlocuire folosite. Politica se dovedeşte optimă doar pentru fluxuri de instrucţiuni read-only. Pentru cache-urile cu modalitate de scriere write-back algoritmul de înlocuire nu este întotdeauna optim (spre exemplu poate fi mai costisitor să se înlocuiască blocul cel mai târziu referit în viitor dacă blocul trebuie scris şi în memoria principală, fiind "murdar", faţă de un bloc "curat" referit în viitor puţin mai devreme decât blocul "murdar" anterior; în plus, blocul curat nu mai trebuie evacuat, ci doar supra-scris). Este evident un algoritm speculativ, practic imposibil de implementat în practică. Totuşi el are două calităţi majore: (1) reprezintă o metrică de evaluare teoretică a eficenţei algoritmului de evacuare implementat în realitate, absolut necesară şi (2) induce ideea fecundă a predictibilităţii valorilor de folosinţă ale blocurilor din cache, conducând astfel la algoritmi predictivi rafinaţi de evacuare (memoria SVC implementează un astfel de algoritm).

Intr-un astfel de cache rata de interferenţă se reduce odată cu creşterea gradului de asociativitate (N “mare”), determinând îmbunătăţirea ratei de hit şi deci a performanţei globale (vezi paragraful de mai sus referitor la metrici). Pe de altă parte însă, asociativitatea impune căutarea după conţinut (se caută deci

Page 3: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

3

într-un set dacă există memorat blocul respectiv) ceea ce conduce la complicaţii structurale şi deci la creşterea timpului de acces la cache şi implicit la diminuarea performanţei globale. Optimizarea gradului de asociativitate, a capacităţii cache, a lungimii blocului din cache etc., nu se poate face decât prin laborioase simulări software, variind toţi aceşti parametrii în vederea maximizării ratei globale de procesare a instrucţiunilor [instr./cicli].

3. cache-urile complet asociative există un singur set permiţând maparea blocului practic

oriunde în cache. Memoriile cache total asociative, implementează practic un singur set permiţând maparea blocului

practic oriunde în cache. Ele nu se implementează deocamdată în siliciu datorită complexităţii deosebite şi a timpului prohibit de căutare. Reduc însă (practic) total interferenţele blocurilor la aceeaşi locaţie cache şi constituie o metrică superioară utilă în evaluarea ratei de hit pentru celelalte tipuri de cache-uri (prin comparaţie).

Folosind CACTI 4.0 (instrument software de evaluare al unui model arhitectural de cache din punct de vedere al timpului de acces, perioadei de tact, al modului de organizare şi al ariei de integrare, precum şi al puterii consumate) cu o tehnologie de integrare de 90 nm, timpul de acces la un cache –

2-way, 4-way, şi 8-way asociativ este de 1.32, 1.39 şi 1.43 mai mare decât timpul de acces la un cache

mapat direct de aceeaşi capacitate.

Memorii Harvard – spaţii şi busuri separate pentru instrucţiuni şi date vs. Memorii Princeton

(unificate). Avantaje Harvard (se reduc coliziunile în procesoarele pipeline – IF/MEM). Dezavantaje Harvard (rata de hit mai mică). De regula cache-urile de nivel 1 (L1) sunt implementate on chip separat pe instrucţiuni şi date respectiv unificat, offchip, cache-urile de nivel 2 sau chiar 3 (L2; L3).

Strategii de scriere

– write back (informaţia este scrisă numai în cache, blocul modificat fiind transferat în MP numai la evacuarea din cache). Bit Dirty marcheaza modificarea => minimizează evacuările de blocuri în MP.

– write through (informaţia este scrisă de către procesor atât în blocul aferent din cache cât şi în blocul corespunzător din memoria principală). Util pentru pastrarea coerenţei cache-urilor cu precădere în sistemele multimicroprocesor, Chip Multiprocessor Architecture.

In general există doua opţiuni la o scriere cu miss:

Write Allocate - the block is loaded on a write miss, followed by the write-hit action. No Write Allocate - the block is modified in the main memory and not loaded into the cache.

Întrucât ambele opţiuni pot fi asociate cu strategia de scriere implementata (write back / write through), rezulta 4 scenarii posibile. Write Through with Write Allocate:

on hits it writes to cache and main memory on misses it updates the block in main memory and brings the block to the cache Bringing the block to cache on a miss does not make a lot of sense in this combination because

the next hit to this block will generate a write to main memory anyway (according to Write Through policy) Write Through with No Write Allocate:

on hits it writes to cache and main memory; on misses it updates the block in main memory not bringing that block to the cache;

Page 4: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

4

Subsequent writes to the block will update main memory because Write Through policy is employed. So, some time is saved not bringing the block in the cache on a miss because it appears useless anyway.

Write Back with Write Allocate: on hits it writes to cache setting “dirty” bit for the block, main memory is not updated; on misses it updates the block in main memory and brings the block to the cache; Subsequent writes to the same block, if the block originally caused a miss, will hit in the cache

next time, setting dirty bit for the block. That will eliminate extra memory accesses and result in

very efficient execution compared with Write Through with Write Allocate combination.

Write Back with No Write Allocate: on hits it writes to cache setting “dirty” bit for the block, main memory is not updated; on misses it updates the block in main memory not bringing that block to the cache; Subsequent writes to the same block, if the block originally caused a miss, will generate misses

all the way and result in very inefficient execution.

La o scriere cu miss în cache se poate face scrierea în cache (alocarea blocului – write allocate) sau realizarea scrierii direct în memorie (nealocând bloc în cache – write no-allocate). În general, dar nu este obligatoriu:

• write allocate este asociată cu strategia de scriere în cache write-back. • write no-allocate este asociată cu strategia de scriere în cache write-through.

3C – caracterizarea acceselor cu miss – Compulsory - sau de start rece. Apar la primul acces al unui anumit bloc în cache. – De capacitate - apar în situaţia în care cache-ul nu poate reţine toate blocurile necesare iar cele

care sunt evacuate la un moment dat vor fi necesare ulterior. Cache-ul este plin. – De conflict - sau de interferenţă. Apar dacă strategia de plasare a blocurilor în cache este mapată

direct sau semi-asociativă, situaţie în care mai multe blocuri din memoria principală pot interfera (accesa) acelaşi bloc din cache. Setul este plin dar cache-ul nu.

Metode de îmbunătăţire a performanţei cache-urilor:

1. Reducerea ratei de miss în cache � Creşterea dimensiunii blocurilor (din păcate cresc şi penalităţile de miss la evacuare-

încărcare bloc) � Creşterea capacităţii cache (creşte timpul de acces la hit şi costuri) � Creşterea gradului de asociativitate a cache-ului (creşte timpul de acces la hit) � Utilizarea mecanismelor de prefetch asupra instrucţiunilor (buffer de prefetch) şi datelor

(data write buffer) � Optimizarea de programe prin compilator

- intrarea într-un basic-block să reprezinte începutul unui bloc în cache - exploatarea localităţilor spaţiale ale datelor din cache – loop interchange, loop fusion,

merging array etc.

2. Reducerea penalităţii în caz de miss în cache � Niveluri multiple de cache-uri (multi-level inclusion, exclusion, hibrid); � Utilizarea conceptului de victim cache respectiv selective victim cache (a se vedea capitolul 5

din lucrarea [Flo03])

3. Reducerea timpului de execuţie în caz de hit în cache. � Way prediction, Trace caches.

Page 5: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

5

Alte consideraţii privind performanţa cache-urilor de instrucţiuni Cercetătorii au arătat ca performanta cache-urilor de instrucţiuni poate varia in funcţie de tipul

aplicaţiilor: procedurale sau obiectuale. Din punct de vedere dinamic, funcţiile din limbajul C execută de aproximativ trei ori mai multe instrucţiuni decât funcţiile şi metodele din limbajul C++. Dimensiunea funcţiilor reprezintă un factor important atât în optimizări precum macroexpandarea, fiind direct proporţională cu spaţiul de ”overhead” al fiecărei funcţii - destinat salvării regiştrilor (scrieri / citiri repetate din stivă), transmiterii parametrilor, păstrării rezultatului, precum şi în performanţa cache-ului de instrucţiuni. Caracteristica programelor obiectuale de a realiza multe apeluri de funcţii “scurte” (reduse ca număr de instrucţiuni) constituie unul din principalele motive pentru care acest tip de programe nu beneficiază de avantajele localităţii spaţiale oferite de blocurile “mari” de cache. În cercetările sale, Calder afirmă că programele obiectuale necesită un cache de instrucţiuni de două mai mare pentru a obţine rate de miss egale cu programele procedurale [Cal94].

Pornind de la limitările tehnicilor de optimizare tradiţionale bazate pe "eliminarea / adăugarea" unor instrucţiuni, doi cercetători angajaţi ai firmei Hewlett-Packard, Pettis şi Hansen, au propus o tehnică nouă de optimizare globală "procedure splitting", în vederea reducerii ratei de miss la cache-ul de instrucţiuni şi îmbunătăţirea performanţei arhitecturilor de calcul. Având la bază informaţii de profil culese în urma execuţiei anterioare a programelor, procedure splitting urmăreşte partajarea în zone fizice de memorie distincte a basic-block-urilor executate mai frecvent (codul util) şi separat basic-block-urile executate foarte rar sau deloc. Prin această separare se creează noi proceduri, mai scurte şi mai dense (executate în întregime mult mai des) şi care pot fi stocate împreună într-un număr mai mic de pagini de memorie decât iniţial, când codul util era dispersat. Basic-block-urile foarte rar executate sunt mutate la sfârşitul procedurii, pagina care le cuprinde nefiind necesar a fi încărcată în memorie decât foarte rar. De asemenea, în urma aplicării acestei tehnici, la implementarea mecanismului de memorie virtuală, dimensiunea paginii de memorie poate fi aleasă mai mică, de capacitate optimă însă, astfel încât să compenseze timpul mare de acces la disc. Procedure splitting a fost implementată cu succes în cadrul optimizatorului de cod realizat pentru procesorul PA-RISC al companiei Hewlett-Packard [Pett90].

1.3. DESFĂŞURAREA LUCRĂRII

1.3.1. GHID DE UTILIZARE AL SIMULATORULUI

Simulatorul PCspim-cache a fost prezentat la workshopul internaţional dedicat educaţiei in arhitectura calculatoarelor (WCAE) realizat in conjuncţie cu cea mai prestigioasa conferinţa din domeniu (ISCA) ţinute in anul 2006 la Boston, SUA [WCAE06]. PCspim-cache reprezintă un simulator puternic parametrizabil care permite vizualizarea grafica in fiecare ciclu de execuţie a impactului unor algoritmi simpli atât asupra setului de registrii generali cat si asupra arhitecturii cache-ului. De exemplu, se poate determina rata de hit in cache-urile de instrucţiuni si date (I/D) variind dimensiunea blocului, gradul de asociativitate, algoritmii de înlocuire a blocurilor conflictuale sau strategia de scriere. Codul simulatorului (sursa şi executabil) poate fi descărcat în mod gratuit de la adresa: http://www.disca.upv.es/spetit/spim.htm. Având în vedere caracterul didactic al lucrării, pentru o vizualizare adecvată şi pentru o mai bună înţelegere a modului de lucru a interfeţei microprocesor – cache, s-a optat pentru un cache cu o organizare mai simplă, pe un singur nivel, integrat în procesorul Intel Pentium II.

Dupa lansarea in executie a aplicatiei spim-cache_080605.exe pe ecranul sistemului va aparea meniul simulatorului (File / Simulator / Window / Help / CacheSimulation), o fereastra principala cu 6 subferestre (frame-uri) asezate in maniera „Tile” (Registers / Instruction Main Memory / Data Main

Page 6: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

6

Memory / Instruction Cache / Data Cache / Session sau Messages) precum si fereastra Console folosita in scopul introducerii informatiilor de la tastatura si afisarii rezultatelor programelor simulate– vezi figura 1.1.

Pasul următor ar fi încărcarea unui fişier care urmează a fi executat. Se selectează opţiunea Open din meniul File, care va declanşa apariţia ferestrei de selecţie a fişierelor. PCspim-cache acceptă fişiere cu extensia “.s”, care sunt fişiere în limbaj de asamblare MIPS. Fişierul selectat este analizat sintactic, iar tipurile de erori depistate sunt scrise în fereastra Sesiune. Încărcarea fişierelor se poate face totodată şi din linia de comandă.

Pentru reluarea unui program sau încărcarea unui nou fişier e necesară reiniţializarea stărilor maşinii şi a regiştrilor. Reincarcarea aceluiasi program se realizeaza folosind optiunea Reload din meniul Simulator. Reiniţializarea stărilor maşinii (memoriei de instructiuni si date precum si a celor doua cache-uri aferente) şi a regiştrilor se obtine folosind optiunea Reinitialize din meniul Simulator. In general, pentru aceasta situatie se opteaza daca s-a corectat codul in urma gasirii unor erori si trebuie incarcat din nou in memorie si rulat. Daca se selectează opţiunea Clear Registers din meniul Simulator atunci se reinitializeaza doar continutul registrilor, memoria principala si cache-urile pastrandu-si continutul nemodificat. Pentru aceasta situatie se opteaza daca se urmareste simularea in diverse configuratii arhitecturale ale aceluiasi program sursa, de data aceasta, nemodificat.

Execuţia programului poate fi realizată în mod continuu, mai multi pasi de executie simultan, sau pas cu pas. Pentru această ultima variantă, se selectează Single Step din meniul Simulator sau tasta F10. Daca se opteaza pentru un numar mai mare de pasi de executie se selecteaza Multiple Step din meniul Simulator sau tasta F11. Pe ecran apare o caseta de dialog care permite introducerea numărului de paşi (instructiunile care vor fi executate simultan). Instrucţiunile sunt executate de la adresa specificata prin intermediul registrului PC. In orice moment executia programului poate continua (spre finalizarea acestuia) prin simpla alegere a optiunii Continue din meniul Simulator. Daca se doreste executia in intregime a programului atunci se poate apasa tasta functionala F5 sau alege optiunea Go din meniul Simulator.

Managementul operaţiilor de întrerupere execuţie program (breakpoint) se face prin selecţia opţiunii Breakpoint din meniul Simulator, sau apasand combinatia de taste (Ctrl+B) sau apasand butonul

breakpoint din bara de instrumente . O cutie de dialog va apare pe ecran din care se va selecta operaţia (adaugare / stergere punct de intrerupere) şi adresa ţintă pentru operaţia de breakpoint. În cazul selecţiei unei adrese la care nu există instrucţiuni se generează un mesaj de eroare. Când este întâlnit un punct de întrerupere în execuţia programului, programul se opreşte iar la adresa specificata se insereaza in fereastra Text instructiunea break $1.

Stabilirea unei date se face alegând opţiunea Set Value din meniul Simulator. O cutie de dialog va apărea pe ecran şi prin intermediul ei se va specifica adresa de memorie sau registrul in care vrem să scriem şi data pe care o setăm la adresa respectivă.

Afişarea tabelei de simboluri globale (declarate folosind directiva de asamblare .globl) se face selectand optiunea Display symbol table din meniul Simulator. In fereastra Sesiune vor aparea toate simbolurile (numele variabilelor) din codul asamblare insotite de litera g (simbol global) si de valoarea adresei pe care o substituie.

Modificarea fontului aferent textului scris in ferestrele simulatorului se poate face alegand optiunea Set Font din meniul Simulator.

Din fereastra Setings care apare la selectarea optiunii cu acelasi nume din meniul Simulator se poate alege modul de lucru simplu al asamblorului MIPS - Bare şi Quiet pentru a nu afişa mesaje la excepţie (vezi figura 1.2).

Fereastra principala (cea cu cele 6 frame-uri) a simulatorului PCspim-cache poate fi redimensionată, minimizată, maximizată şi închisă. In cadrul (frame-ul) Sesiune (Messages) sunt afişate mesaje sistem. Există un buffer de dimensiune fixă asociat ferestrei sesiune. Cele mai recent scrise mesaje din fereastră sunt pierdute la fel ca şi mesajele sosite după ce capacitatea buffer-ului s-a atins. In frame-ul

Page 7: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

7

DATA se afişeaza conţinutul memoriei de date. In frame-ul TEXT se afişeaza conţinutul memoriei de instructiuni. In subfereastra Registru sunt ilustrate valorile registrilor microprocesorului.

Spre deosebire de simulatorul SpimSAL la care fereastra Console era de dimensiune fixă, in cadrul simulatorului PCspim-cache fereastra de recepţionare a ieşirilor programului şi care asigură intrarea pentru programe, poate fi minimizată, ascunsă, maximizată, redimensionată sau derulată. Programele interacţionează cu fereastra Console prin apeluri sistem.

Figura 1.1. PCspim-cache: Interfaţa cu utilizatorul

Pentru a starta o simulare cu studiul cache-ului incorporat utilizatorul trebuie sa selecteze mai intai

optiunea <CacheSimulation> din fereastra <Setings> care apare dupa un simplu click pe optiunea cu acelasi nume din meniul <Simulator>. Trebuie specificat ca, in situatia in care nu se opteaza pentru simularea cache-urilor (I/D) atunci functionarea simulatorului PCspim-cache este identica cu cea a mai vechiului SpimSAL implementat de catre James Larus [Lar93]. In acest caz toate instructiunile si datele se scriu / citesc in / din memoria principala (cu zonele Text, Data si Stack).

Page 8: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

8

Figura 1.2. PCspim-cache: simulare cu studiul cache-ului incorporat

Dupa cum se poate observa in figura 1.3, cu ajutorul optiunii <CacheConfiguration> din meniul <CacheSimulation> utilizatorul poate alege sa simuleze doar cache-ul de date, sau doar cel de instructiuni, sau ambele intr-o arhitectura Harvard (bus-uri si cache-uri separate pentru instructiuni si date). Daca se opteaza doar pentru un anumit tip de cache (instructiuni sau date) atunci in fereastra principala a simulatorului nu vor apare informatii referitoare la structura cache-ului nedorit. Totusi, pentru o mai buna intelegere a modului de lucru a intefetei procesor – cache in aplicatiile propuse se va exemplifica pe o arhitectura Harvard de memorii cache, care reprezinta de fapt configuratia implicita implementata in simulatorul PCspim-cache.

Page 9: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

9

Figura 1.3. PCspim-cache: Configurarea cache-ului simulatorului

Cu ajutorul optiunii <CacheSetings> din meniul <CacheSimulation> utilizatorul poate stabili geometria cache-ului anterior selectat prin <CacheConfiguration> (vezi figura 1.4). Pentru a putea configura independent cele doua tipuri de memorii cache (instructiuni si date) se va selecta corespunzator din controlul de tip combo box, din dreapta ferestrei de configurare <CacheSetings>. Principalii parametri aferenti cache-ului care pot fi setati prin intermediul interfetei sunt:

− Capacitatea, care variaza intre 128 bytes si 1 Kbyte. − Dimensiunea blocului (4, 8 sau 16 bytes). − Gradul de asociativitate (mapat direct, 2-way, 4-way sau complet asociativ). − Politica de scriere in cache (la hit sau miss) – write through sau write back cu alocare de bloc

(write allocate) sau nealocare (write noallocate). − Algoritmul de inlocuire a blocurilor conflictuale in caz de miss in cache-urile asociative (LRU

sau FIFO).

Page 10: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

10

Figura 1.4. PCspim-cache: Stabilirea configuratiei cache-urilor

Intrucat cache-ul de instructiuni nu poate fi modificat de catre programele utilizator, politica de scriere la hit sau miss este disponibila doar pentru cache-ul de date. Daca este selectata optiunea <<ShowRate>> vor fi afisate statistici referitoare la numarul de accese cu miss, numarul total de accese corespondent fiecarui tip de cache (I/D), daca exista. Ferestrele specifice memoriilor cache de instructiuni si date vor ilustra continutul acestora. Configuratia implicita o reprezinta arhitectura mapata direct si este organizata sub forma unei matrici. Fiecare rand in matrice constituie o linie din cache (in cazul cache-urilor mapate direct o linie este echivalenta cu un singur bloc iar in cazul cache-urilor semiasociative o linie este echivalenta cu un numar de blocuri egal cu gradul de asociativitate). Prima coloana contine identificatorul liniei (sau al setului), in timp ce celelalte coloane contin informatii de date respectiv de control. In cazul cache-ului de instructiuni informatia de date o constituie codificarea fiecarei instructiuni in parte (in hexazecimal). In cazul cache-ului de date, informatia de date o reprezinta data propriu-zisa folosita de programul sursa. Informatia de control aferenta fiecarei linii din cache o reprezinta bitul de validare si campul de tag (in hexazecimal). Din scop pur didactic a fost adaugat campul <<Acc>> care indica rezultatul accesului la cache (hit sau miss). Odata cu cresterea gradului de asociativitate layout-ul cache-ului se modifica. Numarul coloanelor utilizate in cazul cache-urilor mapate direct sunt multiplicate cu gradul de asociativitate specificat in momentul configurarii. Procedand astfel, fiecare rand din fereastra reprezinta un singur set (linia apartinatoare setului), iar prima coloana indica identificatorul setului. In vederea implementarii politicii de evacuare a fost adaugata coloana (LRU/FIFO), pentru fiecare grad de asociativitate, care contine valoarea contorului corespondent algoritmului de inlocuire. In plus, daca utilizatorul specifica politica de scriere write back, este adaugata coloana M pentru fiecare grad de asociativitate (bloc din set) in parte, pentru a arata daca blocul respectiv a fost modificat (este Dirty) si nu reprezinta copia fidela a celui stocat in nivelul inferior de memorie. Pentru o mai buna afisare, in cazul unui cache complet asociativ nu se mai aplica politica de replicare a coloanelor corespunzatoare fiecarui bloc din set. In acest caz, fiecare linie corespunde unui bloc.

Pentru cei familiarizati anterior cu simulatorul SpimSAL [Lar93], se impune in continuare precizarea unor detalii de simulare care il diferentiaza pe PCspim-cache de instrumentul propus de James Larus. Astfel: � La versiunea anterioara de simulator de procesor MIPS (SPIMSal) un pas de executie (single step)

presupunea executia intregii instructiuni (indiferent de cati ciclii ar presupune in realitate un load sau un branch).

� In versiunea actuala (PCspim-cache), daca este utilizata optiunea de memorii cache, instructiunile load / store sunt executate in mai mult de 1 ciclu. Executia unei instructiuni cu referire la memorie implica 2 accese la cache: unul pentru extragerea instructiunii din ICache si unul pentru aducerea sau scrierea datei din / in DCache. In cazul unui Hit in cache-ul de date, executia instructiunii se face intr-un ciclu. In caz de Miss, numarul de pasi de executie difera in functie de strategia de scriere. Se disting urmatoarele cazuri: o I – Load cu miss – 3 pasi

• I1. Detectia si marcarea ca miss a accesului • I2. Aducerea blocului din MP in DCache

• I3. Incarcarea informatiei (blocului din DCache) in registrul destinatie. o II – Store cu miss – 2 sau 3 pasi

o IIa. Folosind strategia write no-allocate � IIa1. Detectia si marcarea ca miss a accesului � Iia2. Stocheaza registrul sursa in memoria principala (nu mai aduce blocul si in cache).

Este eficient in cazul in care s-a optat pentru Write Trough. o IIb. Folosind strategia write allocate

� IIb1. Detectia si marcarea ca miss a accesului � IIib2. Extrage blocul din MP in DCache

Page 11: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

11

� IIib3. Scrie datele noi in cache (valoarea registrului sursa) si in paralel in memoria principala (aduce blocul si in cache). Este eficient in cazul in care s-a optat pentru Write Back.

o III – Miss in ICache ⇔ Load cu miss – doar ca al 3-lea pas (I3) reprezinta executia instructiunii (aducerea instructiunii din MP in registrul instructiunii)

1.4. PROBLEME DE LABORATOR PROPUSE SPRE REZOLVARE

1.4.1. EXECUTIA UNOR PROBLEME REZOLVATE FOLOSIND SIMULATORUL

PCSPIM-CACHE

In acest subcapitol sunt propuse doua aplicaţii: prima (g_cache.s) are un caracter explicativ cu rolul de a evidenţia eficienta memoriilor cache din prisma celor două principii de localitate: temporală şi spaţială. De asemenea, sunt ilustrate interferentele produse de accesul în aceeaşi zona a cache-ului de date din partea a doua tablouri (aflate evident la adrese diferite in memoria principala). A doua aplicaţie se referă la implementarea unei metode software de optimizare care sa determine creşterea ratei de hit, şi anume interschimbarea buclelor. Problema 1.

Se consideră următorul programul de test g_cache.s care realizează suma a 8 elemente întregi pe 4 octeţi fiecare – 1,1,1,1,2,2,2,2 stocate în memorie la adresa 0x10000480. Aceasta operaţie este intercalată cu citirea a cate unui element dintr-un al doilea tablou de 8 elemente 3,3,3,3,4,4,4,4 stocat la adresa 0x10000500. Să se ruleze pas cu pas secvenţa de cod şi să se vizualizeze dinamic modificările de stare ale memorie cache. Observaţi respectarea principiului de localitate temporala în cache-ul de instrucţiuni, respectiv a celui de localitate spaţială în cache-ul de date. Realizaţi o statistică privind impactul asupra ratei de hit în cache-uri a următorilor parametri: – dimensiunea blocului de date, gradul de asociativitate, algoritmul de înlocuire, strategia de scriere.

Secventa C – aferenta problemei 1

int j; long suma=0; long Array_A={1,1,1,1,2,2,2,2}; long Array_B={3,3,3,3,4,4,4,4}; int main(){ for (j=8; j>0; j--){ suma+=Array_A[j];

/* instructiune ce presupune citirea elementului Array_B[j], poate fi chiar si o afisare

cout<< Array_B[j]; */ } } Secventa MIPS – aferenta problemei 1

.data 0x10000480 # adresa de memorie a primului tablou (Array_A) Array_A: .word 1,1,1,1,2,2,2,2

Page 12: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

12

.data 0x10000500 # adresa de memorie a celui de-al doilea tablou (Array_B) Array_B: .word 3,3,3,3,4,4,4,4 .text .globl __start __start: la $2, Array_A # incarcare in registrul $2 a adresei primului element al tabloului Array_A la $3, Array_B # incarcare in registrul $3 a adresei primului element al tabloului Array_B li $6, 0 # $6 – suma li $4, 8 # $4 – contorul j loop: lw $5, 0($2) # se citeşte elementul curent din tabloul Array_A lw $7, 0($3) # se citeşte elementul curent din tabloul Array_B add $6, $6, $5 # suma+= Array_A[j] add $2, $2, 4 # elementele tabloului Array_A sunt de tip word, pe 4 octeti add $3, $3, 4 # elementele tabloului Array_B sunt de tip word, pe 4 octeti addi $4, $4, -1 # decrementare contor: j-- bgt $4, $0, loop # test continuare bucla: j>0 li $v0, 10 # apel sisistem de incheiere program si cedare control catre sistemul de syscall # operare

La încărcarea codului sursa in memoria simulatorului apar modificări in trei dintre ferestrele acestuia (vezi figura 1.5). Astfel, in fereastra registru, PC-ul se va actualiza cu valoarea 0x00400000, adresa de început a segmentului de cod specific ISA procesoarelor MIPS. De asemenea, registrul SP – indicatorul de stivă, care pointează la primul cuvânt liber pe stivă, va lua valoarea 0x7FFFEFFC, adresa primei zone libere din stiva. In fereastra de cod (TextSegment), apar instrucţiunile programului. Se disting 4 coloane (de la stânga spre dreapta): adresa instrucţiunilor, codificarea pe 4 octeţi a acestora, exprimarea instrucţiunilor in mnemonica asamblare MIPS aşa cum se procesează si codificarea in mnemonica pseudo-asamblare (aşa cum a scris utilizatorul codul).

Page 13: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

13

Figura 1.5. PCspim-cache: Ferestrele Registru, Text si Data dupa incarcarea unui program de test

De exemplu, prima instrucţiune din codul sursa la $2, Array_A, este in realitate o pseudo-instrucţiune, care se executa din doua instrucţiuni reale MIPS: lui $1, 4096 [Array_A] si ori $2, $1, 1152. Prima dintre cele doua instrucţiuni este stocata in memoria la adresa 0x00400000. Practic, registrul $1 este folosit de către asamblorul MIPS pentru stocarea adreselor de baza in cazul instrucţiunilor de încărcare a adreselor. Astfel, instrucţiunea lui $1, 4096 [Array_A] încarcă in partea superioara (high) a registrului $1 valoarea 409610=0x1001 rezultând valoarea 0x10010000 – adresa de început a segmentului de date dinamice. A doua instrucţiune finalizează operaţia propusa prin pseudo-instrucţiunea la $2, Array_A, si anume, adaugă deplasamentul 115210=0x0480 (pe 16 biti) la registrul $1, printr-o operaţie de SAU logic cu ultimii (mai puţin semnificativi) 16 biţi ai acestuia, depunând rezultatul in registrul destinaţie $2 (ori $2, $1, 1152 [Array_A]), obţinându-se in acest fel adresa primului element al tabloului Array_A.

In fereastra Data, vor fi stocate pe cate 4 octeţi (datorita directivei de asamblare .word) elementele celor doua tablouri începând cu adresele 0x10000480 respectiv 0x10000500.

Înainte de a prezenta detalii privind execuţia pas cu pas a programului se considera o arhitectura

Harvard implicita, cu următoarele caracteristici: cache-uri de instrucţiuni si date mapate direct, de 128 bytes fiecare, cu blocuri de 4 bytes. Astfel, rezulta 32 de seturi (intrări/linii) in cache. Ţinând cont de regula de mapare a unui bloc din memoria principala in cache (vezi capitolul 2) si ştiind parametrii cache-urilor si adresa primei instrucţiuni din memoria principala care este 0x400000 se poate trece la calculul Tagului emis prin adresa si a indexului de bloc din cache. Evident ca primul acces la cache va fi cu miss (de start rece), biţii de validare aferenţi fiecărui bloc din cache fiind resetaţi (vezi in figura 1.6 la cache-ul de instrucţiuni pentru toate blocurile exceptându-l pe primul, cel de Set=0).

Page 14: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

14

Figura 1.6. PCspim-cache: Modificări in cache-ul de instrucţiuni la execuţia programului

Astfel, Index_bloc_in cache = (Adresa bloc MP / Dimensiunea_blocului in bytes) % Nr. blocuri din cache => Index_bloc_in cache = (0x400000 / 4) % 0x20 = 0x100000 % 0x20 = 0.

De asemenea, Tag_Emis = (Adresa bloc MP / Dimensiunea_blocului in bytes) / Nr. blocuri din cache sau Tag_Emis = (Adresa bloc MP / Dimensiunea cache-ului => Tag_Emis = (0x400000 / 4) / 0x20 = 0x8000.

Primul acces la indexul 0 (setul 0) – emis prin adresa, va determina miss in campul Acc, dupa care bitul de validare (V) va fi setat pe 1, marcand blocul valid in cache. Tagul din cache este inlocuit cu Tagul blocului reprezentat de prima instructiune din program (0x8000). Urmeaza apoi aducerea instructiunii in campul cu informatii de date a cache-ului de instructiuni (0x3c011000 – codificarea instructiunii lui $1, 4096). Odata adusa instructiunea in cache, ea este excutata intr-un singur pas, practic rezultatul operatiei se va regasi in registrul destinatie. Astfel, in registrul $1 se va incarca valoarea 0x1000000.

In acelasi fel se procedeaza pentru aducerea si executia urmatoarelor instructiuni. Diferenta este data de faptul ca acestea vor fi inscrise in cache la alte adrese (indexi) si continutul va fi dat de instructiunile respective. Spre exemplu, instructiunea urmatoare este stocata in memorie la adresa 0x400004. Astfel, indexul si tagul vor fi cele de mai jos iar continutul este: ori $2, $1, 1152.

Index_bloc_in cache = (Adresa bloc MP / Dimensiunea_blocului in bytes) % Nr. blocuri din cache => Index_bloc_in cache = (0x400004 / 4) %0x20 = 0x10001 % 0x20 = 1.

De asemenea, Tag_Emis = (Adresa bloc MP / Dimensiunea_blocului in bytes) / Nr. blocuri din cache sau Tag_Emis = (Adresa bloc MP / Dimensiunea cache-ului => Tag_Emis = (0x400004 / 4) / 0x20 = 0x8000. Continuand in acest mod, cele 14 instructiuni reale ale codului sursa sunt aduse in cache-ul de

instructiuni la adrese distincte. La aducerea instructiunii cu referire la memorie lw $5, 0($2), dupa tratarea accesului la cache-ul de instructiuni (cu miss la prima executie a acesteia) se va accesa si cache-ul de date. Valoarea adresei specificata prin registrul $2 (0x10000480) va determina tagul si indexul din cache-ul de date, dupa aceeasi regula de mapare, avand in vedere setarile stabilite initial. Astfel, indexul si tagul

Page 15: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

15

vor fi cele de mai jos iar continutul este 1 (primul element al tabloului Array_A, stocat pe 4 octeti) – vezi figura 1.7.

Index_bloc_in cache = (Adresa bloc MP / Dimensiunea_blocului in bytes) % Nr. blocuri din cache => Index_bloc_in cache = (0x10000480 / 4) % 0x20 = 0x4000120 % 0x20 = 0.

De asemenea, Tag_Emis = (Adresa bloc MP / Dimensiunea_blocului in bytes) / Nr. blocuri din cache sau Tag_Emis = (Adresa bloc MP / Dimensiunea cache-ului => Tag_Emis = (0x10000480 / 4) / 0x20 = 0x200009

Toate aceste accese cu miss au fost de tip „compulsory” intrucat au reprezentat primele accese la cache (atat pentru instructiuni cat si pentru date). Urmează execuţia celei de-a doua instrucţiuni cu referire la memorie lw $7, 0($3). Se va accesa cache-ul de date cu adresa specificata prin registrul $3 (0x10000500) obţinându-se tagul (0x20000A) si indexul (0). Din cate se observa, accesul este cu miss, insa de conflict de aceasta data deoarece la indexul 0 in cache se găseşte alt tag decât cel emis, si anume 0x200009. Conţinutul locaţiei 0 din cache se va modifica cu valoarea 3, (primul element al tabloului Array_B, stocat pe acelaşi număr de octeţi, si anume 4).

Figura 1.7. PCspim-cache: Primul acces la cache-ul de date

Page 16: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

16

A 15-a instrucţiune dinamica (al 15 acces la cache-ul de instructiuni) presupune reluarea primei instrucţiuni din bucla loop si anume: lw $5, 0($2), ceea ce conduce la aparitia primului acces cu hit la cache-ul de instrucţiuni. Continuând execuţia practic se vor obţine accese cu hit la cache-ul de instrucţiuni pana când se parcurg ambele tablouri. Ultimele doua instrucţiuni (apelul sistem de încheiere a execuţiei si cedare a controlului către sistemul de operare) sunt aduse abia la final după repetarea instrucţiunilor din bucla. Din punct de vedere statistic cache-ul de instrucţiuni este caracterizat de următoarele rezultate: 56 accese cu hit dintr-un total de 72 accese. Practic sunt 4 pseudo-instrucţiuni in afara buclei (6 instrucţiuni reale MIPS), 2 după bucla, iar aceasta conţine 7 pseudo-instrucţiuni care în realitate sunt 8 instrucţiuni reale MIPS si care se reiau de 8 ori (6+8*8+2). Din cele 8 iteratii ale buclei doar prima va fi cu miss => 7*8 accese cu hit. In ce priveşte cache-ul de date, la aceasta configuraţie (cache mapat direct) sunt 0 accese cu hit din 16 accese (atâtea elemente sunt in cele doua tablouri). Creştem dimensiunea blocului. Creştem asociativitatea, reluam execuţia, determinam statisticile.

Problema 2 (atenţie variabile declarate să coincidă în C cu MIPS – de finisat, eventual tratat şi subliniat câştigul prin interschimbare dar cu creştere a dimensiunii blocului). Se consideră următorul programul de test cache_loop.s care realizează în paralel suma elementelor întregi (pe un octet) ale unei matrice Array_A[10,20] mai întâi toate elementele unei coloane. Se aplică metoda loop interchange (însumarea întâi a tuturor elementelor de pe o linie – cod sursa cache_loop_i.s) şi se vizualizează comparativ rata de hit in cache. Să se studieze localitatea temporală, variind numărul de iteraţii (1, 5, 10 şi 20) ale buclei exterioare (numărul de coloane ale matricei). Secvenţa C – aferenta problemei 2, buclele in configuraţia iniţială

s=0;

for(j=0;j<20;j++)

for(i=0;i<10;i++)

s+=a[i][j]; # s=a[0][j]+a[1][j]+...+a[9][j]

Secventa MIPS – aferenta problemei 2, buclele in configuratia initiala

.data 0x10000480 Array_A: .byte 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 .byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 .byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 .byte 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 .byte 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 .byte 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 .byte 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 .byte 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 .text .globl __start __start: la $2, Array_A li $6, 0 # s - suma

Page 17: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

17

li $4, 10 # m - nr. linii din matrice li $5, 20 # n - nr. coloane din matrice li $10,0 # j - indexul pe coloane loop_j: # addi $10, $10, 1 li $8, 0 # i - indexul pe linie loop_i: # addi $8, $8, 1 multu $5,$8 # $11 <- n * i mflo $11 # mulou $11,$5,$8 add $9,$11,$10 # $9 <- n * i + j add $9, $2, $9 # calculez adresa el. a[i][j] lb $7, 0($9) add $6, $6, $7 addi $8, $8, 1 blt $8, $4, loop_i addi $10, $10, 1 blt $10, $5, loop_j li $v0, 10 syscall Secvenţa C – aferenta problemei 2, buclele interschimbate

s=0;

for(i=0;i<10;i++)

for(j=0;j<20;j++)

s+=a[i][j]; # s=a[i][0]+a[i][1]+...+a[i][19] Secvenţa MIPS – aferenta problemei 2, buclele interschimbate

.data 0x10000480 Array_A: .byte 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 .byte 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 .byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3 .byte 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 .byte 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 .byte 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 .byte 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 .byte 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 .byte 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 .text .globl __start

Page 18: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

18

__start: la $2, Array_A li $6, 0 # s - suma li $4, 10 # m - nr. linii din matrice li $5, 20 # n - nr. coloane din matrice li $8,-1 # i - indexul pe coloane loop_i: addi $8, $8, 1 li $10, 0 # j - indexul pe linie loop_j: multu $5,$8 # $11 <- n * i mflo $11 add $9,$11,$10 # $9 <- n * i + j add $9, $2, $9 # calculez adresa el. a[i][j] lb $7, 0($9) add $6, $6, $7 addi $10, $10, 1 blt $10, $5, loop_j blt $8, $4, loop_i li $v0, 10 syscall

1.4.2. PROBLEME PROPUSE SPRE REZOLVARE

a) Să se verifice execuţia tuturor programelor implementate în limbaj de asamblare MIPS pe parcursul lucrărilor L2÷L4. Adaptaţi codul sursă pentru buna funcţionare pe noul simulator. b) Analizaţi influenţa unor opţiuni de simulare de tipul (Delayed Branches, Delayed Load şi Cache Setings) asupra execuţiei programelor anterioare.

BIBLIOGRAFIE

[Cal94] Calder B., Grunwald D., Zorn B. – Quantifying Behavioral Differences Between C and C++ Programs, Journal of Programming Languages, pages 323-351, Vol. 2, Num. 4, 1994.

[Flo00] Florea A., Egan C. – Reducing the Technological Gap Between an Advanced Processor and the Memory Hierarchy System –the 4th International Conference on Technical Informatics (CONTI ’00) Timişoara, 2000.

[Flo03] Florea, A., Vinţan N. L. – Simularea şi optimizarea arhitecturilor de calcul în aplicaţii practice, Editura Matrix ROM, Bucureşti, ISBN 973-685-605-4, 2003 (443 pg. + CD atasat). Cartea a obtinut Premiul “Tudor Tanasescu” al Academiei Romane pe anul 2003, decernat in 23 decembrie 2005.

[Hen07] Hennessy J. L., Patterson D. A. – Computer Architecture: A Quantitative Approach, Morgan Kaufmann, 2007 (4th edition).

Page 19: SIMULATORUL PCSPIM-CACHEwebspace.ulbsibiu.ro/adrian.florea/html/simulatoare/... · 2010-03-26 · specifice procesoarelor RISC, formarea deprinderilor practice privind programarea

Computer Science and Automation Control

Adrian FLOREA

19

[Hill88] Hill, M. – A Case for Direct-Mapped Caches, IEEE Computer, December 1988.

[Jou90] Jouppi, N. – Improving Direct-Mapped Cache Performance by the addition of a Small Fully Associative Cache and Prefetch Buffers, Proc. 17th International Symposium On Computer Architecture, 1990.

[Lar93] Larus J. - SPIM S20: A MIPS R2000 Simulator, Morgan Kaufmann Publishers, 1993.

[Pett90] Pettis K., Hansen R.C. – Profile guided code positioning. In Proceedings of the ACM SIGPLAN'90 Conference on Programming Language Design and Implementation, pages 16-27, June 1990.

[Pet06] Petit S., Tomás N., Sahuquillo J., Pont A. - An Execution-Driven Simulation Tool for Teaching Cache Memories in Introductory Computer Organization Courses, Proceedings of the 2006 workshop on Computer architecture education, Boston, MA Saturday, June, 2006.

[Sti94] Stiliadis, D., Varma, A. – Selective Victim Caching: A Method to Improve the Performance of Direct-Mapped Caches, TR UCSC-CRL-93-41, University of California, 1994 (republished in a shorter version in IEEE Trans. on Computers, May 1997).

[Vin00] Vinţan N. L., Florea A. – Microarhitecturi de procesare a informaţiei, Editura Tehnică, Bucureşti, ISBN 973-31-1551-7, 2000 (312 pg.)

[Yi06] Yi J.J., Lilja D.J. – Simulation of Computer Architectures: Simulators, Benchmarks, Methodologies, and Recommendations, IEEE Transactions on Computers, vol. 55, No. 3, March 2006.

[WCAE06] Workshop on Computer Architecture Education held in conjunction with 33rd International Symposium on Computer Architecture, Boston, USA, http://www4.ncsu.edu/~efg/wcae2006.html