TKT-3200 Tietokonetekniikka I 1. Harjoitustyön tarkoitus Harjoitustyö 4: Cache - simulaattorin ohje Välimuistilla (cache) on suuri merkitys nykyaikaisessa muistihierarkiassa. Tämän harjoitustyön tarkoitus on auttaa ymmärtämään millainen suorituskyvyn parannus saadaan aikaan välimuistilla. Välimuistilla on suuri merkitys nykyaikaisessa muistihierarkiassa. Harjoitustyössä käytetty cache-simulaattori on myös tehty Ruotsissa Lundin yliopistossa ja on paikoitellen oikea käyttöliittymäsuunnittelun helmi, mutta pääasiassa ihan fiksu. Jos simulaattori jossain vaiheessa menee nurin, saattaa x- ikkunointi ottaa itseensä, eikä ohjelma toimi uudelleen käynnistäessä kunnolla. Helpointa on logata pihalle ja varmistaa ettei mitään ylimääräisiä prosesseja (xgraph yms.) jää roikkumaan (esim. ps -u <tunnari>). Tässä dokumentissa heksadesimaalilukuja merkitään etuliitteellä 0x, esim. 0xA50. 1.1. Asennus ja käynnistys Varmista että sinulla on quotaa jäljellä ainakin noin 1 MB. Kopioi ohjelmahakemisto itsellesi komennolla: korppi 52% cp -r /share/www/vhosts/www.tkt.cs.tut.fi/kurssit/ 3200/Harkat/Cache/CACHE/. Jolloin kopioit tarvittavat tiedostot itsellesi uuteen hakemistoon nimeltä CACHE. Varmista että sinulla ympäristömuuttujassa path myös nykyinen hakemisto eli piste (.). korppi 52% echo $path Jos ei ole, komentotulkista riippuen voit lisätä sen esim. tyyliin: korppi 53% set path = ($path.) tai korppi 53% export PATH=$PATH:.
Jos haluat, että yo. lisäys hakupolussasi aina, lisää piste shellin alustustiedoston (esim..bashrc tai.cshrc) path-muuttujan asetuskohtaan. Turvallisuussyistä lisäys kannattaa tehdä hakupolussa viimeiseksi. Simulaattorin käynnistäminen (CACHE-hakemistossa) tapahtuu seuraavasti (Huom! Assembly-tiedoston nimi ilman s-päätettä): korppi 54% cache <assembly-tiedosto-ilman-s-päätettä> (Jos käynnistys ei onnistu kuin komennolla./cache example0, et ole asettanut hakupolkua oikein) Käynnistyksen jälkeen ruutuun ilmestyy ohjelman pääikkuna, ks. Kuva 1. Kuva1. Cache-simulaattorin pääikkuna 2. Simulaattorin toiminnot Avatussa ikkunassa näkyvät kolme suurta laatikkoa kuvaavat CPU:ta, välimuistia (cache) ja päämuistia. CPU:un ja välimuistin sekä välimuistin ja päämuistin välissä on kolme kenttää, jotka simulaation aikana ilmoittavat muistioperaation osoitteen, väylällä
liikkuvan datan ja operaation tyypin. Osoite ja data ovat heksadesimaalimuodossa. Osoite näytetään myös CPU:ta ja välimuistia yhdistävän viivan yläpuolella kolmeen osaan jaettuna: tag, set sekä word. Kirjassa vastaavat termit ovat hämäävästi tag, index sekä block offset. (Yleisen sekaannuksen lisäämiseksi usein käytetään vielä termiä line size tarkoittamaan samaa kuin lohkon koko eli block size). CPU on täysverinen DLX-prosessori, jossa on tietenkin liukuhihna käytössä. Kuva2. Cache-simulaation suoritus Osuman (hit) tapahtuessa välimuisti näkyy mustana laatikkona (ks. Kuva 2.), ja jos operaatio kohdistuu päämuistiin (miss), niin päämuisti on väriltään musta. Esimerkiksi yllä olevassa kuvassa on tapahtunut osuma, koska välimuisti on musta. Välimuistista ollaan lukemassa käskyä (Read=lukuoperaatio, L=32-bittinen pitkä sana, I=käskyviittaus) osoitteesta 0x4. Käskyn heksadesimaaliarvo on 0x0001 2080. Jossain tapauksissa sekä välimuisti että päämuisti voivat olla samanaikaisesti mustia. Huomaa, että kaikki muistioperaatiot ovat 32-bittisiä. Muisteille menevät osoitteet ovat sen sijaan tavuosoitteita. Ohjelmalla on kuitenkin hieman kerettiläinen käsitys heksadesimaalien esittämisestä, koska ohjelma jättää lukujen alussa olevat nollat näyttämättä. Tällöin heksadesimaaliluvusta ei välttämättä voi päätellä montako bittiä
vastaavassa kohdassa oikeasti on. (Ohjelma näyttää arvon 0x08 siis muodossa 8 ja arvon 0xF8 muodossa F8. Molemmissa tapauksissa arvo vaatii 8 bittiä.) 2.1. Ohjelman suoritus Ohjelma voidaan suorittaa kolmella eri tavalla. Ohjelma voidaan suorittaa täydellä nopeudella komenolla Go tai siihen saakka, kunnes seuraava muistiviittaus tapahtuu komennolla Step. Kolmas tapa suorittaa ohjelma tapahtuu määrittelemällä suoritettavien askelien määrä (No of steps) ja antamalla komento Go tai Visual. Komennolla Visual ohjelma suoritetaan puolella nopeudella, eli simulaattorin ikkunaan tulostetaan samat tiedot ohjelman suorituksen aikana, kuten vastavaasti komento Step tulostaisi. Ohjelman suoritus voidaan pysäyttää sijoittamalla keskeytyskohtia haluttuihin muistiosoitteisiin. Osoita hiirellä CPU:ta ja pidä vasen nappula pohjassa. Valitse aukeavasta alasvetovalikosta komento Break On Address ja syötä osoite heksadesimaalimuodossa. Ohjelman suoritus pysähtyy seuraavan osoitteen kohdalle. 2.2. CPU:n, välimuistin ja päämuistin parametrien muuttaminen Osoittamalla hiirellä joko CPU:ta, välimuistia tai päämuistia ja pitämällä hiiren vasenta/oikeaa nappulaa pohjassa saat esille kolme erilaista alasvetovalikkoa. CPU-valikko: Reset - Resetoi CPU:n. Change - CPU:n kellojakson pituuden muuttaminen. Break On Address - Keskeytyskohtien asettaminen. Quit - Simulaattorista poistuminen. Välimuistivalikko: Change - Välimuistin asetuksien muuttaminen. Contents - Välimuistin sisällön tutkiminen. Komennolla Change aukeaa seuraava ikkuna (Kuva 3.), josta välimuistin rakennetta voidaan muuttaa.
Kuva3. Välimuistin asetusikkuna Komennolla Contents voidaan tutkia välimuistin sisältöä ajonaikana. Alla olevassa on kuvassa esimerkki välimuistin sisällöstä yllä olevilla asetuksilla. Jokaista lohkoa kohti on yksi rivi tietoa: statusbitit (V=Valid, D=Dirty ja R=reference LRU:n ja FIFO:n toteuttamista varten), tag ja data (1 sana on 4 tavua). Kaikilla välimuistityypeillä ei ole statusbittejä D ja R. Kuva 3 esittää välimuistin asetusikkunaa ja Kuva 4 vastaavan välimuistin sisältöä. Kuvassa 4 näkyy 4 joukkoa, jossa jokaisessa on 2 lohkoa. Lohkon koko on 2 sanaa. Välimuistin koko on siis 4*2*2=16 sanaa. Päämuistivalikko: Change - Päämuistin asetuksien muuttaminen. Contents - Päämuistin sisällön tutkiminen. Muistin leveys määrittelee montako sanaa saadaan sirrettyä kerralla päämuistin ja välimuistin välillä. Leveys näkyy tulosikkunassa (ks. alla) nimellä interleave factor. Jos leveys on enemmän kuin yksi, simulaatioikkunassa ei näy mitään arvoja muistin ja välimuistin välisellä dataväylällä vaan ainoastaan osoite. Kannattaa huomata, että stepkäsky suorittaa koko muistioperaation kerralla eikä siis yhtä prosessorin kellojaksoa. Toisin sanoen, yksi step voi vie eri pituisen ajan rippuen päämuistin leveydestä (Show results -> Execution time).
Kuva4. Välimuistin sisältö Muistin sisältö päivittyy ajonaikana ja se on listattu heksadesimaalina big-endian - muodossa (ts. sanan eniten merkitsevä tavu on pienimmässä osoitteessa). Muistin 32- bittiset sanat on jaoteltu tavuihin ja yhden 8-bittisen tavun esittäminen vie max. kaksi merkkiä heksadesiaamaalina. Kuten todettua, alussa olevat nollat jätetään näyttämättä (the väärä tapa). Yhdellä rivillä näkyy yksi lohko tavuittain. Lohkon koko asetetaan välimuistin asetuksista. Vasemmassa ylänurkassa on muistin osoite 0x0 ja siitä oikealle ensimmäisellä rivillä ovat osoitteet 0x1, 0x2, 0x3 jne. Rivin alussa kerrotaan rivin ensimmäisen (vasemmanpuoleisimman) alkion osoite. Jos blockin koko on yksi, näkyy rivillä yksi 32-bittinen muistipaikka. 2.3. Simulointitulosten tarkastelu Osoittamalla simulaattorin ikkunaa ja painamalla hiiren keskimmäistä nappulaa, aukeaa Showmenu. Showmenun komennoilla voidaan simulaation tuloksia tarkastella vaihtelevalla menestyksellä.
Showmenu: Show Result - Tulokset (ja käytetyt asetukset) numeromuodossa (ks. Kuva 5) Show Hitgraph, All - Kaikkien viittausten osumat välimuistiin (ks. Kuva 6). Show Hitgraph, Data - Dataviittausten osumat välimuistiin. Show Hitgraph, Instr - Käskyosumat välimuistiin. ÄLÄ KÄYTÄ! Saattaa kaataa ohjelman! Show Localitygraph, All. - Kaikki ohjelman suorittamat muistiviittaukset (ks. Kuva 6). Show Localitygraph, Data. - Ohjelman dataviittaukset Show Localitygraph, Instr - Ohjelman käskyviittaukset Tulosvalikko Show Result päivittyy joka käskyn jälkeen, mutta valitettavasti kuvaajat eivät päivity reaaliaikaisesti. Jos esimerkiki otat kuvaajan esiin ohjelman puolivälissä ja suoritat ohjelmaa käsky kerrallaan, pysyy kuvaaja ennallaan. Avaamalla uuden kuvaajan saat päivtetyn tilanteen näkyviin. Kuvaajia voi zoomata painamalla hiiren vasenta/oikeaa nappia ja rajaamalla haluamasi alueen. Kuvaajia ei saa näkyviin ennen kuin ohjelmaa on suoritettu muutaman käskyn verran. Vaaka-akselilla on muistiviittauksen järjestysnumero eli aika kasvaa oikealle. Hitgrapheissa pystyakselilla on osumaprosentti (hit ratio). Localitygraph-kuvaajassa pallukka ilmaisee (4-tavuisen) muistipaikan tavuosoitteen 10-kantaisena. Localitygraph ei jostain syystä tunnu näyttävän viittausta osoitteeseen nolla ohjelman alussa (ko. viittauksen järjestynumero on 0), mikä on varsin hämäävää. Aina ei voi voittaa, mutta aina voi hävitä.
Kuva5. Tekstimuotoiset tulokset Kuva6.Graafimuotoiset tulokset
3. Ohjelmalistaukset Käytetyt testiohjelmat on listattu tässä. 3.1. example0.p program FIBONACCI; var x0,x1,x2.temp,i : integer x0 := 1; x1 := 1; for i := 1 to 10 do temp := x0 + x1; x0 := x1; X1 := temp; X2 := temp; end; end. 3.2. Koodista example0.p käännetty DLX assembly-koodi: 0000 addi r1,r0,#1 ; x0 := 1; 0004 addi r2,r0,#1 ; x1 := 1; 0008 addi r5,r0,#x2 000C addi r3,r0,10 ; i := 10; 0010 L1: add r4,r1,r2 ; temp := x0+x1; 0014 add r1,r0,r2 ; x0 := x1; 0018 add r2,r0,r4 ; x1 := temp 001C sw 0(r5),r4 ; x2 := temp; 0020 subi r3,r3,#1 0024 bnez r3,l1 ; then branch L1 0028 nop 002C trap #0 ; halt execution 0038 x2:
3.3. example1.p program BUBBLESORT; var X,Y : array[1..10] of integer; i,j,temp : integer; for i:= 1 to 10 do X[i] := 11-i; for i := 1 to 9 do for j := 10 downto i+1 do if X[j] < X[j-1] then temp := X[j-1]; X[j-1] := X[j]; X[j] := temp; end; end; (*** for2 (j)***) end; (*** for1 (i)***) for i := 1 to 10 do Y[i] := X[i]; end. 3.4. example2.p program MATRIXADD; var A,B,C : array[1..10] of array[1..10] of integer; i,j : integer; for i := 1 to 10 do for j := 1 to 10 do C[i,j] := A[i,j]+B[i,j]; end.