TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos TKT-3200 Tietokonetekniikka I Harjoitustyö 4: Cache, osa 2.. 2010 Ryhmä Nimi Op.num.
1 Valmistautuminen Cache-työn toisessa osassa on tarkoituksena tutustua lyhyesti modernin työasematietokoneen välimuistiin Valgrind-ohjelmiston sisältämän Callgrind-työkalun avulla. Tämä osa kannattaa tehdä Cache-työn kahdesta osasta jälkimmäisenä, sillä tässä työssä oletetaan jo hallittavan välimuistin perustoiminnallisuus. Tehtävät voi tehdä ainakin Tietokonetekniikan laitoksen Linux-luokassa TC417 ja Lintulan Linuxluokassa TB217, mutta Valgrind-ohjelmiston voi asentaa myös omalle koneelle, mikäli käytössäsi on Linux. Luokan TC417 koneiden käyttämiseen tarvitset Lintulan tunnukset ja erilliset kulkuoikeudet Tietokonetekniikan laitokselta, luokan TB217 koneille riittää Lintulan tunnukset. Tulosta tämä dokumentti ja kirjoita vastaukset niille varattuihin kohtiin. Muista kirjoittaa vastauksiin perustelut ja/tai välivaiheet joilla lopullinen vastaus on saatu. Valgrind-ohjelmiston lisäksi tarvitset harjoitustyön nettisivulta tiedoston array slow.c, jonka voit tallettaa haluamaasi paikkaan koneelle jolla olet harjoitustyötä tekemässä (esim. /TKT3200/Cache/). 2 Testiohjelma Aluksi tutkitaan annetun C-koodin sisältöä. Avaa tiedosto array slow.c haluamallasi ohjelmalla, ja tutki sen sisältöä. Ohjelma on yksinkertainen, joten sen toiminnallisuuden pitäisi olla helposti ymmärrettävissä. Vastaa ohjelmakoodin perusteella seuraaviin kysymyksiin: 2.1. Jos yksi int-tyypin muuttuja vie tilaa 4 tavua, kuinka monta tavua ohjelmassa käytetty taulukko a kokonaisuudessaan vie? (Muista laskun välivaiheet!) 2.2. Kaksiulotteisella taulukolla ensimmäinen kokoparametri määrittelee taulukon rivin, toinen taulukon sarakkeen. Tutki pääohjelman ja apufunktion sisäkkäisiä for-silmukoita. Käydäänkö taulukko läpi yhden rivin alkiot peräkkäin käsiteltyinä, vai yhden sarakkeen alkiot peräkkäin? 1
3 L2-välimuistin vaikutus suoritukseen Avaa komentorivi ja siirry kansioon, johon tiedosto array slow.c on tallennettu. Nyt käännämme ohjelman suorittamalla seuraavan komennon komentorivillä: gcc -g -o array_slow array_slow.c Komennon ei pitäisi tulostaa mitään, mikäli ohjelma kääntyy onnistuneesti. Seuraavaksi suoritetaan ensimmäinen mittaus Callgrindilla. Suorita seuraava komento komentorivillä: valgrind -- tool = callgrind -- simulate - cache = yes -- cacheuse = yes --I1 =32768,8,64 --D1 =32768,8,64 --L2 =3145728,24,64./ array_slow Parametrin I1 perässä on ensin 1. tason käskyvälimuistin koko tavuina, sitten assosiatiivisuuden aste ja lopuksi yhden välimuistirivin koko tavuina. Vastaavasti D1 määrittää 1. tason datavälimuistin ja L2 2. tason yhteisen välimuistin. Suoritetussa simulaatiossa molemmat tason 1 välimuistit ovat siis 32 KiB kokoisia (huomaa kertoimena toimiva 1024), 8-tie -assosiatiivisia ja 64 B rivin koolla, kun taas tason 2 välimuisti on 3 MiB kokoinen, 24-tie -assosiatiivinen ja 64 B kokoisella rivillä. Simulaation päätyttyä komentoriville pitäisi tulostua tietoja välimuistin käytöstä: Ensin suoritettujen käskyjen määrä ja niihin liittyvät välimuistin käytön tiedot, sitten dataviittausten määrä ja niihin liittyvä välimuistin käyttö. Lopuksi on vielä yhteenveto tason 2 välimuistin käytöstä. Kirjoita arvot niille varattuihin kohtiin alla olevaan taulukkoon. Taulukko 1: Mittaukset ohjelmalla array slow Mittauksen Käskyjen määrä L1i osumia L1d osumia L2i osumia L2d osumia välimuistit L1i huteja L1d huteja L2i huteja L2d huteja L2: 3145728,24,64 L2: 6291456,24,64 3.1. Vertaa simulaatiossa käytetyn L2-välimuistin kokoa aiemmin laskemaasi taulukon viemään tilaan. Mitä huomaat kokojen suhteesta, ja mitä seurauksia tällä on? Suoritetaan toinen mittaus. Kaksinkertaista tällä kertaa L2-välimuistin koko ja aja simulaatio muuten samoin parametrein. Täytä saamasi tulokset taulukkoon. 3.2. Millainen vaikutus L2-välimuistin kasvattamisella oli käskyjen ja datan L2-hutien määrään, ja miksi? 2
4 Ohjelman toteutuksen vaikutus suoritukseen Tee käytetystä lähdekooditiedostosta array slow.c kopio nimellä array fast.c. Muokkaa tätä uutta tiedostoa niin, että vaihdat sekä main-funktiossa että array sum-apufunktiossa taulukon indeksoinnin kohdalla muuttujien i ja j paikkoja. Tallenna tiedosto, ja käännä se: gcc -g -o array_fast array_fast.c Aja nyt simulaatio edellisiä mittauksia vastaavasti uudella ohjelmalla alkuperäisellä 3 MiB L2-välimuistilla ja kasvatetulla 6 MiB L2-välimuistilla. Ajettava ohjelma on viimeinen valgrindille annettava parametri, eli uuden ohjelman simulointi 3 MiB L2-välimuistilla onnistuu seuraavalla komennolla: valgrind -- tool = callgrind -- simulate - cache = yes -- cacheuse = yes --I1 =32768,8,64 --D1 =32768,8,64 --L2 =3145728,24,64./ array_fast Kirjaa saamasi tulokset alla olevaan taulukkoon, ja vertaa niitä alkuperäisellä ohjelmalla saatuihin tuloksiin. Taulukko 2: Mittaukset ohjelmalla array fast Mittauksen Käskyjen määrä L1i osumia L1d osumia L2i osumia L2d osumia välimuistit L1i huteja L1d huteja L2i huteja L2d huteja L2: 3145728,24,64 L2: 6291456,24,64 4.1. Vaikuttiko ohjelmakoodin muuttaminen L2-välimuistin huteihin? Miksi? 4.2. Millainen vaikutus ohjelmaan tehdyillä muutoksilla on L1-välimuistin huteihin? Miksi? 4.3. Vertaillaan vielä ohjelmien suoritusaikoja. Oletetaan, että yhden käskyn suorittaminen normaalisti kestää yhden kellojakson, tähän päälle tiedon etsiminen L1-välimuistista kolme kellojaksoa, tiedon etsiminen L2-välimuistista viisi kellojaksoa ja tiedon hakeminen muistista kymmenen kellojaksoa. Laske suoritusajat ohjelmalle array slow 3 MiB L2- välimuistilla ja ohjelmalle array fast 6 MiB L2-välimuistilla. Voit olettaa, että dataa pyydettäessä pyyntö lähetetään kaikille muistitasoille samanaikaisesti. 3
5 Yhteenveto 5.1. Tarkastele vielä ohjelmasuoritusta, jossa tapahtui vähiten huteja. Olisiko kummankaan, tason 1 tai tason 2, välimuistin kasvattamisesta suurta hyötyä ohjelman nopeuteen? Entä miten rivikoon kasvatus vaikuttaisi tapahtuviin huteihin? Olet nyt suorittanut tämän osan Cache-harjoitustyöstä. Palauta täytetty dokumentti yhteen nidottuna oikeaan postilaatikkoon, muista täyttää etusivulle ryhmän tiedot. 4