TKT-3201 Tietokonearkkitehtuuri 2 Luku 5: Muistihierarkian hyödyntäminen Adapted from Computer Organization and Design, 4 th Edition, Patterson & Hennessy, 2008 Adapted from slides by Mary Jane Irwin, PSU
Tietokoneen pääkomponentit Processor Devices Control Memory Input Datapath Output Secondary Memory (Disk) Main Memory Cache #2
Muistiseinä Prosessorin vs DRAM-muistin nopeusero kasvaa kellojaksoa per käsky 1000 100 10 1 0,1 Core Memory 0,01 VAX/1980 PPro/1996 2010+ kellojaksoa per DRAM-viittaus SRAM-muistin virrankulutus 90nm 130nm 180nm 2ns 6ns 3.5ns Hyvä muistihierarkian (välimuisti) suunnittelu yhä tärkeämpää suorituskyvyn aikaansaamiseksi #3
Muistihierarkian tavoite fakta: suuret muistit ovat hitaita ja nopeat muistit pieniä Kuinka luoda muisti, joka antaa (suurimman osan ajasta) kuvan suuresta, nopeasta ja halvasta muistista? hierarkia rinnakkaisuus #4
Tyypillinen muistihierarkia Hyödynnetään paikallisuuden periaatetta ja osoitetaan käyttäjälle muistia määrä, joka on saavutettavissa halvinta teknologiaa käyttäen, mutta nopeimman teknologian viittausajalla On-Chip Components Control Datapath RegFile ITLB DTLB Instr Cache Data Cache Second Level Cache (SRAM) Main Memory (DRAM) Secondary Memory (Disk) nopeus (jaksoa): ½ 1 10 100 s 10,000 s koko (tavuja): 100 10K M G T kustannus: korkein matalin #5
Muistiteknologiat Välimuisteissa käytössä SRAM (nopeus, teknologiayhteensopivuus) #6 nopea (hakuaika: 0.5-2.5 nsec) Matala integrointitiheys (6 transistorin muistisolu), korkeampi virrankulutus, kallis ($2000 - $5000 per GB, 2008) Staattinen: sisältö säilyy aina (niin kauan kuin käyttöjännite on kytkettynä) Päämuisteissa käytössä DRAM (koko ja integrointitiheys) hidas (tyypillinen hakuaika 50-70 nsec) Korkea integrointitiheys (1 transistorin muistisolu), alhaisempi virrankulutus, halvempi ($20 - $75 per GB, 2008) Dynaaminen: virkistettävä säännöllisesti (~ 8 ms välein) - kuluttaa 1% - 2% DRAM-muistin aktiivisista jaksoista Osoite jaettu kahteen osaan (rivi ja sarake) - RAS, Row Access Strobe syötetään muistin rividekooderille - CAS, Column Access Strobe syötetään muistin sarakedekooderille
Muistihierarkia: toiminta Temporaalinen lokaalisuus (paikallisuus ajassa) Kun muistipaikkaan on viitattu, niin usein siihen tullaan viittaamaan pian uudelleen Pidä viimeksi haetut datayksiköt lähellä prosessoria Spatiaalinen lokaalisuus (paikallisuus tilassa) Kun muistipaikkaan on viitattu, tullaan pian tekemään viittaus muistipaikan naapureihin siirrä vierekkäisiä sanoja sisältäviä datablokkeja lähelle prosessoria #7
Muistihierarkian piirteet Kasvava etäisyys prosessorista viittausajalla mitattuna prosessori L1$ 4-8 bytes (word) 8-32 bytes (block) L2$ 1 to 4 blocks Päämuisti 1,024+ bytes (disk sector = page) L1$:n sisältö on alijoukko L2$:n sisällöstä, joka on osajoukko päämuistin sisällöstä, joka on osajoukko sekundäärimuistin sisällöstä Sekundäärimuisti (suhteellinen) muistinkoko eri tasoilla #8
#9 Muistihierarkia: terminologia lohko (block, line): informaation minimiyksikkö, joka on sijoitettu (tai puuttuu) välimuistissa osumasuhde (hit rate): niiden muistiviittauksien osuus, jotka löytyvät muistihierarkian tasolta osuma-aika (hit time): aika, joka tarvitaan viittaukseen ko. muistihierarkian tasolla, koostuen lohkon viittauksen kuluva aika + osuman/hudin määrittämiseen kuluva aika hutisuhde (miss rate): niiden muistiviittauksien osuus, joita ei löydetä annetulta muistihierarkian tasolta 1 - (HitRate) hutisakko (miss penalty): aika, joka kuluu lohkon korvaamisen vastaavalla alemmalla hierarkiatasolla olevalla lohkolla, koostuen alemman tason lohkon viittaukseen kuluva aika + lohkon lähettämiseen hudin kokeneelle tasolle kuluva aika + lohkon lisäämiseen tälle tasolle kuluva aika + lohkon toimittamiseen sitä pyytäneelle kuluva aika HitTime << MissPenalty!!!
Miten hierarkia hallitaan? rekisterit muisti kääntäjä (ohjelmoija?) välimuisti päämuisti välimuistiohjaimen laitteisto päämuisti levyjärjestelmä käyttöjärjestelmä (virtuaalimuisti) Laitteistoavusteinen virtuaaliosoitteiden käännös fyysisiin osoitteisiin (translation lookaside buffer, TLB) Ohjelmoija (tiedostot) #10
Välimuistin perusteet Kaksi ongelmaa (laitteistolle): 1: Mistä tiedetään, että datayksikkö on sijoitettu välimuistiin? 2: Jos datayksikkö on välimuistissa, mistä se löydetään? Suorasijoitettava (direct mapped) välimuisti Jokainen muistilohko kuvataan yhteen ainoaan välimuistin lohkoon Useampi alemman hierarkiatason muistilohko jakaa välimuistin lohkon Osoitteen kuvaus (vastaus ongelmaan 2): (lohkon osoite) modulo (välimuistin lohkojen lukumäärä) Jokaiseen välimuistin lohkoon liitetään tagi, joka sisältää osoitetiedon (osoitteen ylempiä osoitebittejä) muistilohkon identifioimiseksi #11
välimuisti Indeksi #13 00 01 10 11 Välimuisti: yksinkertainen esimerkki Validi Tagi Data 1: Onko data välimuistissa? Vertaa välimuistin tagia muistiosoitteen 2:een ylimpään osoitebittiin varmistamaan, että lohko on välimuistissa (validi-kenttä kertoo onko lohkossa käypää dataa) päämuisti 0000xx Yhden sanan lohko 0001xx 2 vähiten merkitsevää 0010xx osoitebittiä määrittävät tavun 0011xx sijainnin 32-bittisessä sanassa 0100xx 0101xx 0110xx 0111xx 1000xx 1001xx 1010xx 1011xx 1100xx 1101xx 1110xx 1111xx 2: Kuinka data löydetään? Käytä 2 toiseksi vähiten merkitsevää muistiosoitteen bittiä indeksi määrittämään välimuistin lohko (modulo lohkojen lukumäärä) indeksi = (lohkon osoite) modulo (välimuistin lohkojen lukumäärä)
Suorasijoitettava välimuisti Tarkastellaan viittauksia päämuistiin osoituksilla: 0 1 2 3 4 3 4 15 Aloitetaan tyhjällä välimuistilla kaikki lohkot merkitään tyhjiksi, validi-kenttä nollataan 0 huti 1 huti 2 huti 3 huti 00 Mem(0) 00 Mem(0) 00 Mem(0) 00 Mem(0) 00 Mem(1) 00 Mem(1) 00 Mem(2) 4 huti 3 osuma 4 osuma 15 0001 Mem(0) 4 00 Mem(1) 00 Mem(2) 00 Mem(3) 00 Mem(1) 01 Mem(4) 00 Mem(1) 00 Mem(2) 00 Mem(3) 00 Mem(2) 01 Mem(4) 00 Mem(1) 00 Mem(2) 00 Mem(3) 00 Mem(3) huti 01 Mem(4) 00 Mem(1) 00 Mem(2) 00 11 Mem(3) 15 #15 8 pyyntöä, 6 hutia
MIPS: suorasijoitettava välimuisti, esim. Yhden sanan lohkot, välimuistin koko = 1Ksanaa (4KB) Hit 31 11 210 Tag 20 10 Index tavupoikkeama Data Index 0 1 2 Valid Tag Data... 1021 1022 1023 20 32 Millaista paikallisuutta hyödynnetään? #16
Hit Useamman sanan suorasijoitettava välimuisti 4 sanaa/lohko, välimuistin koko = 1Ksanaa 31 11 4 210 tavupoikkeama Data Tag 20 Index 8 lohkopoikkeama Index 0 1 2 Valid Tag Data... 253 254 255 20 #17 Millaista paikallisuutta tässä hyödynnetään? 32
Hyödynnetään paikallisuutta avaruudessa oletetaan lohkokoko >1 sanaa Aloitetaan tyhjällä välimuistilla kaikki lohkot merkitty tyhjiksi 0 1 2 3 4 3 4 15 0 huti 1 osuma 2 huti 00 Mem(1) Mem(0) 00 Mem(1) Mem(0) 00 Mem(1) Mem(0) 00 Mem(3) Mem(2) 3 osuma 4 huti 3 osuma 00 Mem(1) Mem(0) 00 Mem(3) Mem(2) 00 01 Mem(1) 5 Mem(0) 4 00 Mem(3) Mem(2) 01 Mem(5) Mem(4) 00 Mem(3) Mem(2) 4 osuma 15 huti 01 Mem(5) Mem(4) 00 Mem(3) Mem(2) 01 Mem(5) Mem(4) 00 11 Mem(3) 15 Mem(2) 14 #19 8 pyyntöä, 4 hutia
Hutisuhde vs lohkon koko vs muistin koko Hutisuhde nousee, jos lohkokoko on merkittävän suuri välimuistin kokoon verrattuna #20 Välimuistiin mahtuvien lohkojen lukumäärä on pieni (kasvattaen kapasiteettihuteja)
Välimuistin kenttien koko Välimuistin bittimäärä sisältää tilan sekä datalle että tageille Oletetaan 32-bittinen tavuosoite Suorasijoitettavassa välimuistissa, jossa 2 n lohkoa, n bittiä käytetään indeksiin Jos lohkon koko on 2 m sanaa (2 m+2 tavua), m bittiä käytetään osoittamaan sanaa lohkon sisällä ja 2 bittiä tarvitaan osoittamaan tavu sanan sisällä Tagi-kentän koko? Suorasijoitettavan välimuistin bittien kokonaismäärä on 2 n x (lohkon koko + tagi-kentän koko + validi-kentän koko) Kuinka monta bittiä tarvitaan suorasijoitettavaan välimuistiin, jossa on 16KB dataa ja 4-sanaisia lohkoja ja oletetaan 32- bittiset osoitteet? #21
Välimuistiosumien käsittely Lukuosumat (I$ ja D$) Näitä nimenomaan halutaan! Kirjoitusosumat (ainoastaan D$) Vaaditaan väli- ja päämuistin olevan yhdenmukaisia (write-through cache) Kirjoita data aina sekä välimuistin lohkoon että seuraavaan tasoon muistihierarkiassa (läpikirjoitus, write-through) Kirjoitukset tapahtuvat seuraavan muistihierarkiatason nopeudella hidas! tai voidaan käyttää kirjoituspuskuria ja liukuhihna pysäytetään ainoastaan puskurin täyttyessä Sallitaan väli- ja päämuistin olevan ristiriidassa (write-back cache) Kirjoitetaan data ainoastaan välimuistin lohkoon (takaisinkirjoitus seuraavalle tasolle tapahtuu, kun lohko häädetään (evict) välimuistista) Jokaiselle välimuistin lohkolle tarvitaan likainen-bitti (dirty bit), joka kertoo tarvitseeko lohko kirjoittaa takaisin muistiin häädettäessä voidaan myös käyttää kirjoituspuskuria helpottamaan likaisten lohkojen takaisinkirjoituksessa #22
Välimuistin hutien syitä Pakollisia (kylmäkäynnistys tai prosessin vaihto, 1. viittaus): Ensimmäinen viittaus lohkoon. Jos ajetaan miljoonia käskyjä, pakollisten hutien määrä on merkityksetön ratkaisu: kasvata lohkon kokoa (kasvattaa hutisakkoa; erittäin suuri lohkon koko voi kasvattaa hutisuhdetta) Kapasiteetti: Välimuisti ei voi sisältää kaikki ohjelman viittaamia lohkoja ratkaisu: kasvata välimuistin kokoa (voi kasvattaa hakuaikaa) Konflikti: Useampia muistipaikkoja on kuvattu samaan välimuistin paikkaan ratkaisu 1: kasvata välimuistin kokoa ratkaisu 2: kasvata assosiatiivisuutta (käsitellään myöhemmin luennoilla) (voi kasvattaa hakuaikaa) #23
Välimuistihutien käsittely (1-sanan lohkot) Lukuhudit (I$ ja D$) Pysäytä liukuhihna, hae lohko seuraavalta muistihierarkian tasolta, tallenna se välimuistiin ja lähetä pyydetty sana prosessorille. Tämän jälkeen liukuhihna jatkaa toimintaa Kirjoitushudit (ainoastaan D$) 1. Pysäytä liukuhihna, hae lohko seuraavalta muistihierarkian tasolta, tallenna lohko välimuistiin (mikä voi vaatia likaisen lohkon häätämisen, jos käytetään takaisinkirjoittavaa välimuistia), kirjoita prosessorilta tuleva sana välimuistiin ja jatka liukuhihnan suoritusta. tai 2. Write allocate kirjoita sana välimuistiin päivittämällä sekä tagi että data. Ei tarvetta tarkastaa välimuistiosumaa. Ei tarvetta pysäyttää liukuhihnaa tai 3. No-write allocate ohita välimuistinkirjoitus (mitätöi välimuistin lohko, koska se sisältää nyt pilaantunutta dataa) ja kirjoita data suoraan kirjoituspuskuriin (ja sitä mukaa seuraavalle hierarkiatasolle). Ei tarvetta pysäyttää liukuhihnaa, jos kirjoituspuskuri ei ole täynnä. #24
Useamman sanan lohkon käsittelystä Lukuhudit (I$ ja D$) Prosessoidaan samoin kuin yhden sanan lohkot huti palauttaa koko lohkon välimuistiin Hutisakko kasvaa lohkon koon kasvaessa Early restart prosessori jatkaa suoritusta heti, kun pyydetty lohkon sana on toimitettu. Toimii parhaiten I$:n yhteydessä. Requested word first pyydetty sana toimitetaan muistista välimuistiin (ja prosessorille) ensimmäisenä Nonblocking cache sallii prosessorin jatkavan välimuistin viittauksia, vaikka välimuisti on käsittelemässä aiempaa hutia Kirjoitushudit (D$) Jos käytetään write allocate -menetelmää, on ensimmäiseksi haettava lohko muistista ja sitten kirjoitettava sana lohkoon (tai aikaansaadaan sotkuinen välimuistilohko, esim. 4-sanaisessa lohkossa, uusi tagi (yksi datasana uudesta lohkosta, ja kolme datasanaa vanhasta lohkosta). #25
Välimuistia tukevat muistijärjestelmät Piirin ulkoisella kytkentäverkolla ja muistiarkkitehtuurilla on merkittävä vaikutus järjestelmän kokonaissuorituskykyyn 32-bittinen data #26 & 32-bittinen osoite per jakso on-chip CPU välimuisti väylä DRAM- muisti Yhden sanan leveä organisaatio (yhden sanan leveä väylä ja yhden sanan leveä muisti) Oletetaan 1. 1 muistiväylän kellojakso osoitteen lähettämiseen 2. 15 muistiväylän kellojaksoa lohkon 1. sanan saamiseen DRAM:sta (rivin jaksoaika), 5 muistiväylän kellojaksoa 2., 3. ja 4. sanan vastaanottoon (sarakkeen hakuaika) 3. 1 muistiväylän kellojakso yhden datasanan toimittamiseen Muistiväylästä välimuistiin kaistanleveys Tavujen lukumäärä, joita on viitattu muistissa ja siirretty välimuistiin/prosessoriin per muistiväylän kellojakso
Review: (DDR) SDRAM toiminta After a row is into the SRAM register Column Address Input CAS as the starting burst address along with a burst length Transfers a burst of data (ideally a cache block) from a series of sequential addr s within that row - The memory bus clock controls transfer of successive words in the burst read Cycle Time N rows +1 N cols DRAM N x M SRAM M-bit Output Row Address M bit planes 1 st M-bit Access 2 nd M-bit 3 rd M-bit 4 th M-bit RAS CAS Row Address Col Address Row Add #27
#28 DRAM-muistin koon kasvu
1:n sanan väylä, 1:n sanan lohkot on-chip CPU välimuisti väylä DRAMmuisti Jos lohkon koko on 1, niin hudista johtuvan muistiviittauksen takia liukuhihna on pysäytettävä siksi aikaa kun muistista saadaan haettua yksi datasana 1 15 1 17 muistiväylän kellojaksoa osoitteen lähetykseen muistiväylän kellojaksoa DRAM:n lukemiseen muistiväylän kellojaksoa data toimittamiseen kellojaksoa kokonaissakkoa Kellojaksossa siirrettyjen tavujen määrä (muistin kaistanleveys) yhden hudin tapauksessa on 4/17 = 0.235 tavua per kellojakso #30
1:n sanan väylä, 4:n sanan lohkot on-chip CPU välimuisti Entäpä, jos lohkon koko on 4 sanaa ja jokainen sana sijaitsee eri DRAM-rivillä? 1 jaksoa 1:n osoitteen lähettämiseen 4 x 15 = 60 jaksoa DRAM:n lukemiseen 1 jaksoa viimeisen datasanan toimittamiseen 62 kellojaksoa sakkoa väylä DRAM- muisti 15 cycles 15 cycles 15 cycles Kellojaksossa siirrettyjen tavujen määrä (muistin kaistanleveys) yhden hudin tapauksessa on (4 x 4)/62 = 0.258 tavua per kellojakso 15 cycles #32
1:n sanan väylä, 4:n sanan lohkot on-chip CPU välimuisti Entäpä, jos lohkon koko on 4 sanaa, mutta kaikki sanat ovat samalla DRAM:n rivillä? 1 15 + 3*5 = 30 1 32 jaksoa 1:n osoitteen lähettämiseen jaksoa DRAM:n lukemiseen jaksoa viimeisen datasanan toimittamiseen kellojaksoa sakkoa väylä DRAM- muisti 15 cycles 5 cycles 5 cycles 5 cycles Kellojaksossa siirrettyjen tavujen määrä (muistin kaistanleveys) yhden hudin tapauksessa on (4 x 4)/32 = 0.5 tavua per kellojakso #34
Lomitettu muisti, 1:n sanan väylä on-chip CPU välimuisti Lohkon koko 4 sanaa: 4*1 = 1 15 4 20 jaksoa 1:n osoitteen lähettämiseen jaksoa DRAM:n lukemiseen jaksoa viimeisen datasanan toimittamiseen kellojaksoa sakkoa väylä 15 cycles DRAM- muisti- pankki 0 DRAMmuistipankki 1 DRAMmuistipankki 2 DRAM- muisti- pankki 3 15 cycles 15 cycles 15 cycles #36 Kellojaksossa siirrettyjen tavujen määrä (muistin kaistanleveys) yhden hudin tapauksessa on (4 x 4)/20 = 0.8 tavua per kellojakso
DRAM-muistijärjestelmän yhteenveto Tärkeää sovittaa välimuistin ominaisuudet välimuisti viittaa yhteen lohkoon kerrallaan (usein enemmän kuin yksi sana) sekä DRAM:n ominaisuuksien käytä DRAM:ia joka tulee nopeaa useamman sanan viittausta, mieluummin sellaisia, jotka vastaavat välimuistin lohkon kokoa että muistiväylän ominaisuuksien suhteen varmista, että muistiväylä tukee DRAM:n hakuaikaa ja hakukuviota tavoitteena muistiväylän ja välimuistin välisten siirtojen kaistanleveyden maksimointi #37