CPU-välimuisti
CPU-välimuisti on välimuisti , jota tietokoneen CPU käyttää keskimääräisen muistin käyttöajan lyhentämiseen [1] . Se on pieni mutta erittäin nopea muistityyppi, joka säilyttää kopiot useimmin käytetyistä tiedoista päämuistissa . Tämä on osa prosessoria ja sijaitsee hyvin lähellä sitä. Ohjelmisto ei näe sitä, mutta sitä ohjaa ja hallitsee laitteisto . Tämä sisältyy älypuhelimiin ja tabletteihin, ja se näkyy suoraan ohjelmistosta.
Ominaisuudet
Vasemmalla oleva kaavio näyttää kaksi muistia, päämuistin ja välimuistin. Jokainen välimuistipaikka sisältää dataa ( välimuistirivi ), joka vaihtelee eri välimuistityyppien välillä 512 tavua ja 8 Mt :n välimuistin koko on normaalisti pienempi kuin normaalin muistin, joka vaihtelee tyypillisesti välillä 1 - 16 Gt . Jokaisella muistipaikalla on indeksi, joka on yksilöllinen tunniste, jota käytetään viittaamaan kyseiseen sijaintiin. Päämuistissa olevan sijainnin indeksiä kutsutaan muistiosoitteeksi. Jokaisella välimuistipaikalla on myös tunniste, joka sisältää sinne ladattujen tietojen päämuistiindeksin. Tietovälimuistissa näitä arvoja kutsutaan välimuistilohkoiksi tai välimuistiriveiksi. Niin kauan kuin useimmat muistin käyttöoikeudet koskevat välimuistia, keskimääräinen muistin käyttöviive on lähempänä välimuistin viivettä kuin päämuisti, joten suorituskyky on parempi.
Kun prosessorin täytyy lukea tai kirjoittaa tiettyyn paikkaan päämuistissa, se tarkistaa aluksi, onko tämän sijainnin sisältö ladattu välimuistiin. Tämä tehdään vertaamalla muistipaikan osoitetta kaikkiin välimuistin tarroihin, jotka saattavat sisältää tietoja kyseisessä osoitteessa. Jos prosessori havaitsee, että muistipaikka on välimuistissa, sitä kutsutaan välimuistiosumaksi, muuten välimuistin puuttumiseksi. Välimuistin osuman sattuessa prosessori lukee tai kirjoittaa tiedot välittömästi välimuistiriville. Välimuistin osumien suhdetta osumien kokonaismäärään kutsutaan myös osumasuhteeksi, ja se on välimuistialgoritmin tehokkuuden epäsuora mitta.
Jos välimuisti puuttuu, se seuraa (useimmille välimuistille) uuden entiteetin luomista, joka sisältää prosessorin juuri pyytämän tunnisteen ja kopion päämuistissa olevista tiedoista. Tällainen epäonnistuminen on suhteellisen hidasta, koska se vaatii tietojen siirtämistä päämuistista, joissain tapauksissa sen jälkeen, kun ei ole enää voimassa.
Tästä syystä erittäin suuri välimuisti, vaikka sitä hallittaisiin tehokkaalla algoritmilla, voi joissain olosuhteissa olla haitallista suorituskyvyn kannalta. Itse asiassa vanhentuneiden ja virheellisten tietojen poistaminen välimuistista ja oikean tiedon lataaminen välimuistiin kestää yleensä kauemmin kuin silloin, kun suoritin lukee tiedot suoraan päämuistista käyttämättä välimuistia. Toisin sanoen suuri välimuisti voi tietyissä laskentatilanteissa, esimerkiksi ei-iteratiivisissa, johtaa useampaan välimuistin menettämiseen kuin välimuistin osumiin, mikä heikentää merkittävästi suorituskykyä.
Joitakin toiminnallisia yksityiskohtia
Välimuistin on yleensä poistettava yhden rivin sisältö, jotta uusille tiedoille jää tilaa välimuistin puuttuessa. Heuristiikkaa , jonka avulla se valitsee poistettavat tiedot, kutsutaan korvauspolitiikaksi. Kaikkien korvauskäytäntöjen perusongelma on ennakoida välimuistitiedot, joita pyydetään vähemmän todennäköisesti tulevaisuudessa.
Tulevaisuuden ennustaminen on vaikeaa, varsinkin laitteistovälimuistissa, joiden on hyödynnettävä sääntöjä, jotka voidaan helposti toteuttaa piirissä, joten korvaavia käytäntöjä on useita, eikä mitään niistä voida pitää täydellisenä. Yksi suosituimmista, LRU (englanninkielisestä sanasta Least Recently Used , jota käytetään vähemmän äskettäin ), korvaa itse asiassa vähemmän äskettäin käsitellyt tiedot.
Kun tiedot kirjoitetaan välimuistiin, ne on silti kirjoitettava päämuistiin jonkin ajan kuluttua . Päätöstä siitä, milloin tämä kirjoittaminen tulisi tapahtua, hallitsee kirjoituspolitiikka. Kirjoitusvälimuistissa kukin välimuistiin kirjoittaminen johtaa samanaikaiseen kirjoitukseen päämuistiin. Vaihtoehtoisesti takaisinkirjoitusvälimuisti ei suorita tätä toimintoa välittömästi: päinvastoin, välimuisti pitää kirjaa riveistä, jotka sisältävät päivitettävää dataa asettamalla asianmukaisesti niin sanotun dirty-bitin . Tiedot kirjoitetaan muistiin vain silloin, kun ne on tyhjennettävä välimuistista, jotta uusille tiedoille jää tilaa. Tästä syystä epäonnistunut haku takaisinkirjoitusvälimuistissa luo usein kaksi muistin käyttöä: toinen lukee uusia tietoja ja toinen kirjoittaa vanhat tiedot (jos likainen bitti osoittaa). Sekä takaisinkirjoitus että läpikirjoitus auttavat ylläpitämään yhtenäisyyttä muistitasojen välillä.
On myös joitain välivaiheita. Esimerkiksi välimuisti voi olla läpikirjoitettu, mutta kirjoitukset voidaan asettaa väliaikaisesti jonoon useiden kirjoitusten käsittelemiseksi yhdessä, mikä optimoi pääsyn väylään .
Päämuistissa olevat tiedot, joista välimuistissa on kopio, voivat muuttua muista syistä (ei epätodennäköinen tapahtuma, esimerkiksi moniprosessorijärjestelmässä ), joten välimuistissa olevat tiedot voivat vanhentua. Välimuistin hallintajärjestelmien välisiä tiedonsiirtoprotokollia, jotka ylläpitävät tietojen yhdenmukaisuutta, kutsutaan johdonmukaisuusprotokolliksi.
Datan lukemiseen muistista kuluva aika (lukuviive) on tärkeä, koska usein CPU saattaa suorittaa toimintojononsa odottaessaan pyydettyjen tietojen saapumista. Kun mikroprosessori saavuttaa tämän tilan, sitä kutsutaan CPU-juoksuksi. Kun mikroprosessorit nopeutuvat, välimuistin keskeytys kuluttaa paljon laskentatehoa; Nykyaikaiset suorittimet voivat itse asiassa suorittaa satoja käskyjä samassa ajassa, joka kuluu yhden datan lataamiseen muistista. Siksi on tutkittu erilaisia tekniikoita "pitää CPU kiireisenä" tämän vaiheen aikana. Jotkut mikroprosessorit, kuten Pentium Pro , yrittävät suorittaa tietoja odottavaa operaatiota, jos ne ovat siitä riippumattomia (siksi niitä kutsutaan englanniksi out-of-order ). Pentium 4 käyttää samanaikaista monisäikeistystä (kutsutaan Intelin terminologiassa HyperThreadingiksi ), mikä sallii toisen ohjelman käyttää prosessoria, kun ensimmäinen ohjelma odottaa tietojen saapumista päämuistista.
Assosiatiivisuus
Korvauskäytäntö päättää, missä välimuistissa tietyn muistipaikan kopio voi sijaita. Jos korvauskäytäntö voi vapaasti valita, mille välimuistiriville tiedot ladataan, välimuistia kutsutaan täysin assosiatiiviseksi (tai jopa täysin assosiatiiviseksi). Toisaalta, jos jokin muistissa oleva data voidaan sijoittaa vain tietylle välimuistiriville, sitä kutsutaan suoraksi kartoitukseksi (tai jopa suoraksi kartoitukseksi). Useimmat välimuistit toteuttavat kuitenkin kompromissin, jota kutsutaan assosiatiiviseksi (tai jopa osittain assosiatiiviseksi) joukoksi. Esimerkiksi AMD Athlon tason 1 datavälimuisti on 2-way set assosiatiivinen , eli tietty muistipaikka voidaan tallentaa välimuistiin kahdessa eri paikassa tason 1 välimuistissa.
Jos jokainen päämuistin paikka voidaan ladata kahteen eri paikkaan, herää kysymys: mitkä? Useimmiten käytetty kaavio näkyy sivun kaaviossa: muistipaikan indeksin vähiten merkitseviä bittejä käytetään välimuistin indekseinä ja jokaiseen indeksiin liittyy kaksi välimuistiriviä. Tämän mallin hyvä ominaisuus on, että välimuistiin ladattujen tietojen otsikot eivät saa sisältää sitä osaa indeksistä, joka on jo koodattu valitulla välimuistirivillä. Koska tunnisteet ilmaistaan pienemmillä biteillä, ne vievät vähemmän muistia ja niiden käsittelyyn kuluu vähemmän aikaa.
Muita järjestelmiä on ehdotettu, kuten vino välimuisti , jossa tien 0 indeksi on suora, kuten edellä, kun taas tavan 1 indeksi lasketaan hash-funktiolla. Hyvällä hash-funktiolla on ominaisuus, joka osoittaa, että suoran kartoituksen kanssa ristiriidassa olevat osoitteet eivät yleensä törmää, kun se yhdistetään tiivistefunktioon, joten ohjelma ei todennäköisesti kärsi arvaamattoman suuresta törmäysmäärästä hash-funktion vuoksi. Erityisesti patologinen menetelmä pääsy. Haittapuolena on lisäviive, joka tarvitaan hash-funktion tuloksen laskemiseen. Lisäksi, kun on tarpeen ladata uusi rivi ja poistaa vanha, voi olla vaikeaa määrittää, mitä olemassa olevista riveistä on käytetty viime aikoina, koska uusi rivi on ristiriidassa kunkin "rivien" eri "joukkojen" kanssa. tapa"; itse asiassa LRU-jäljitys lasketaan normaalisti kullekin rivijoukolle.
Assosiaatio on kompromissi. Jos virkoja on kymmenen, korvauskäytäntö voi täyttää uuden rivin, mutta tietoja haettaessa on tarkistettava kaikki 10 paikkaa. Useiden asentojen hallinta vaatii enemmän tehoa, aluetta ja aikaa. Toisaalta välimuistit, joissa on enemmän assosiatiivisuutta, kärsivät harvemmasta välimuistista (katso myös alla). Nyrkkisääntönä on, että assosiatiivisuuden kaksinkertaistamisella on suunnilleen sama vaikutus osumaprosenttiin kuin välimuistin koon kaksinkertaistamisella 1-suuntaisesta ( suora kartoitus ) nelisuuntaiseksi. Assosiatiivisuuden lisäämisellä 4-suuntaa pidemmälle on paljon vähemmän vaikutusta osumaprosenttiin, ja niitä käytetään yleensä muista syistä (katso virtuaalinen aliasointi alla).
Yksi suoraan kartoitetun välimuistin eduista on, että se mahdollistaa nopean ja helpon spekulatiivisen suorituksen . Kun osoite on laskettu, tiedetään, mikä välimuistirivi saattaa sisältää tiedot. Tämä voidaan lukea ja prosessori voi jatkaa työskentelyä näiden tietojen kanssa ennen kuin se tarkistaa, että tarra todella vastaa pyydettyä osoitetta.
Ajatusta siitä, että prosessori käyttää välimuistissa olevia tietoja jo ennen kuin tarran ja osoitteen välinen vastaavuus on varmistettu, voidaan soveltaa myös assosiatiivisiin välimuistiin. Tunnisteen osajoukkoa, jota kutsutaan englanniksi vihjeeksi , voidaan käyttää tilapäisesti valitsemaan yksi pyydettyyn osoitteeseen liittyvistä välimuistiriveistä. CPU voi käyttää näitä tietoja rinnakkain, kun tarra on täysin tarkistettu. Tämä tekniikka toimii parhaiten, kun sitä käytetään osoitteiden kääntämisen yhteydessä, kuten alla selitetään.
Välimuisti puuttuu
Välimuistin puuttuminen tarkoittaa epäonnistunutta yritystä lukea tai kirjoittaa välimuistissa olevaa dataa, mikä johtaa paljon pidempään päämuistin käytön viiveeseen. Jos käskyvälimuistista lukeminen epäonnistuu, prosessorin on odotettava ( pysähdyttävä ), kunnes käsky ladataan päämuistista. Tietojen lataamisen aiheuttama välimuistivika voi olla vähemmän tuskallinen, koska muut siihen liittymättömät käskyt voidaan silti suorittaa, kunhan tietojen lataamista vaativa toiminto voidaan suorittaa. Tietoa käytetään kuitenkin usein heti latausohjeen jälkeen. Viimeinen välimuistin puuttuminen eli kirjoitusvirhe on vähiten huolestuttava, koska kirjoittaminen yleensä puskuroidaan. Prosessori voi jatkaa turvallisesti, kunnes puskuri on täynnä. (Käskyvälimuistiin kirjoittaminen ei onnistu, koska ne ovat vain luku -tilassa.)
Välimuistin puuttumisasteen minimoimiseksi välimuistin käyttäytymistä on analysoitu paljon parhaan koon, assosiatiivisuuden, lohkokoon ja niin edelleen yhdistelmän löytämiseksi. Vertailuohjelmien luomat muistiviitesekvenssit tallennetaan osoitejäljiksi . Lisäanalyysi simuloi monia erilaisia välimuistin toteutusmahdollisuuksia näiden pitkien osoitejälkien perusteella . Sen ymmärtäminen, kuinka useat muuttujat muuttavat välimuistin osumaprosenttia , voi olla melko hämmentävää. Merkittävän panoksen antoi Mark Hill, joka jakoi erilaiset välimuistivirheet kolmeen luokkaan (tunnetaan nimellä "kolme C:tä" ):
- Pakolliset poikkeamat ovat vikoja, jotka johtuvat ensimmäisestä viittauksesta annettuun. Välimuistin koolla ja assosiatiivisuudella ei ole merkitystä pakollisten ohitusten määrässä . Esihaku voi auttaa tässä, samoin kuin suuret välimuistilohkokoot (joka on eräänlainen esihaku).
- Kapasiteetin puutteet ovat vikoja, joita tietyn kokoinen välimuisti aiheuttaa assosiatiivisuudesta tai lohkon koosta riippumatta. Kapasiteetin menettämistiheyden käyrä välimuistin koon funktiona tarjoaa jonkin verran mittaa tietyn referenssivirran tilapäisestä sijainnista.
- Ristiriitatilanteet ovat vikoja, jotka olisi voitu välttää, jos välimuisti ei olisi tyhjentänyt tietoja aiemmin. Konfliktit voidaan jakaa edelleen kartoitusvirheisiin , jotka ovat väistämättömiä tietyn assosiatiivisuuden vuoksi, ja korvaaviin misseihin , jotka johtuvat tietyn korvaussäännön valinnasta.
Oikealla oleva kaavio esittää yhteenvedon välimuistin suorituskyvystä SPEC CPU2000:n kokonaislukuosan vertailuarvoilla, Hillin ja Cantinin [1] . Nämä vertailuarvot edustavat sitä työkuormitusta, jonka työasema voisi kokea minä tahansa päivänä. Tässä kaaviossa näemme kolmen C :n erilaiset vaikutukset .
Oikeassa reunassa, kun välimuistin koko saa "Inf"-arvon (joka toisin sanoen pyrkii äärettömään), meillä on pakollisia poikkeamia . Jos haluaisimme parantaa SpecInt2000:n ominaisuuksia, välimuistin koon kasvattaminen yli 1 megatavun olisi käytännössä hyödytöntä.
Täysin assosiatiivisen välimuistin epäonnistumisprosentti edustaa täysin kapasiteetin menetysten määrää . Simulaatioissa valittiin LRU-korvaussääntö: tämä osoittaa, että täydellinen korvaussääntö tarvittaisiin kapasiteetin menetysten taajuuden minimoimiseksi , ikään kuin näkijä etsisi esimerkiksi tulevaisuutta löytääkseen välimuistisijainnin, joka ei aio käyttää.
Huomaa, kuinka arviossamme kapasiteetin menettämistiheydestä kaaviossa on jyrkkä pudotus 32 kt:n ja 64 kt:n välillä. Tämä osoittaa, että vertailuarvolla on noin 64 kilotavua. Välimuistisuunnittelijalla, joka tarkastelee näitä vertailuarvoja, olisi voimakas houkutus asettaa välimuistin koko hieman yli 64 kilotavua tämän arvon alapuolelle. On myös huomattava, että tässä simulaatiossa mikään assosiatiivisuus ei voi suorittaa 32 kt:n välimuistia sekä 64 kt:n 4-suuntaista tai jopa suoraan kartoitettua 128 kt.
Lopuksi huomaa, että 64 kt:n ja 1 megatavun välillä on suuri ero suoraan kartoitetun ja täysin assosiatiivisen välimuistin välillä. Tämä ero on ristiriitatilanteiden taajuus . Vuoden 2004 tietojen mukaan suoraan prosessorisirulle asennetut toisen tason välimuistit jäävät yleensä tälle alueelle, koska pienet välimuistit ovat riittävän nopeita ensimmäisen tason välimuistiksi, kun taas isommat ovat liian kalliita asentaakseen halvalla itse sirulle ( Itanium 2 : ssa on 9 Mt:n kolmannen tason välimuisti, joka on suurin markkinoilla saatavilla oleva sirullinen välimuisti vuonna 2004). Konfliktin ohitustiheyden kannalta näyttää siltä, että toisen tason välimuisti hyötyy suuresti korkeasta assosiatiivisuudesta.
Tämä etu tunnettiin hyvin 1980-luvun lopulla ja 1990-luvun alussa , jolloin suorittimen suunnittelijat eivät pystyneet sovittamaan suuria välimuistia siruille eivätkä heillä ollut tarpeeksi kaistanleveyttä korkean assosiatiivisuuden toteuttamiseksi prosessorisirun ulkopuolisissa välimuistissa. Erilaisia ratkaisuja kokeiltiin: MIPS R8000 käytti kalliita omistettuja off-chip SRAMeja , jotka sisälsivät tarravertajia ja suuria ohjaimia 4 Mt:n 4-suuntaisen assosiatiivisen välimuistin toteuttamiseen. MIPS R10000 käytti tarroihin tavallisia SRAM-siruja. Tarrojen käyttäminen molempiin suuntiin vaati kaksi jaksoa: latenssin vähentämiseksi R10000 yritti ennustaa jokaiselle pääsylle, mikä välimuistitila olisi oikea.
Välimuisti osuma
Välimuistiosuma viittaa sen sijaan siihen, että prosessori on onnistunut löytämään muistipaikan osoitteen eri välimuistin otsikoiden joukosta, jotka voivat sisältää sen. Jos onnistuu, prosessori voi lukea ( Cache Read Hit ) tai kirjoittaa ( Cache Write Hit ) tiedot välimuistirivillä.
Lukuosuma sattuessa prosessori lukee sanan suoraan välimuistista ilman päämuistia. Mitä tulee kirjoitusosumaan , katso kirjoitusvälimuistikäytännön perusteellinen analyysi
Osoitekäännös
Yleisimmin käytetyt CPU:t toteuttavat jonkinlaisen virtuaalimuistin . Käytännössä jokainen koneella ajettava ohjelma näkee oman muistitilansa, joka sisältää yksinkertaistetusti koodin ja tiedot itse ohjelmalle. Jokainen ohjelma sijoittaa kaiken omaan muistitilaansa välittämättä siitä, mitä muut ohjelmat tekevät vastaavissa muistipaikoissaan.
Virtuaalimuisti vaatii prosessorin kääntämään ohjelman luomat virtuaaliosoitteet fyysisiksi osoitteiksi päämuistissa. Prosessorin osaa, joka tekee tämän käännöksen, kutsutaan muistinhallintayksiköksi (MMU). MMU pääsee nopeasti käännöstaulukkoon Translation Lookaside Bufferin (TLB) kautta, joka on käyttöjärjestelmän sivutaulukon kartoitusvälimuisti.
Osoitteen kääntämisessä on kolme tärkeää ominaisuutta:
- Latenssi: Yleensä MMU asettaa fyysisen osoitteen saataville muutaman jakson sen jälkeen, kun osoitegeneraattori on laskenut virtuaaliosoitteen.
- Aliasing: Useat virtuaaliosoitteet voivat viitata samaan fyysiseen osoitteeseen. Useimmat prosessorit varmistavat, että kaikki päivitykset yhteen fyysiseen osoitteeseen tehdään järjestyksessä. Tämän mahdollistamiseksi prosessorin on varmistettava, että välimuistissa on kerrallaan vain yksi kopio kustakin fyysisestä osoitteesta.
- Tarkeus: Virtuaalinen osoiteavaruus on jaettu sivuihin. Esimerkiksi 4 Gt:n virtuaalinen osoiteavaruus voidaan jakaa 1048576 4 kt:n sivuiksi, joista kuhunkin voidaan viitata itsenäisesti. Katso vaihtuvan kokoisten sivujen tuki virtuaalimuistin kohdasta .
Historiallinen huomautus: varhaiset virtuaalimuistijärjestelmät olivat erittäin hitaita ja vaativat sivutaulukon pääsyn (muistissa olevaan) ennen suunniteltua muistin käyttöä. Ilman välimuistia tämä puolittaa koneen muistin käytön nopeuden. Tästä syystä ensimmäinen tietokoneessa käytetty laitteistovälimuisti ei ollut data- tai käskyvälimuisti, vaan sen sijaan TLB.
Fyysisten ja virtuaalisten osoitteiden olemassaolo herättää kysymyksen siitä, kumpaa niistä tulisi käyttää välimuistin nimikkeisiin ja indekseihin. Virtuaaliosoitteiden käytön motiivi on nopeus: datavälimuisti, jossa on virtuaalisia indeksejä ja otsikoita, estää MMU:n lataamasta ja käyttämästä tietoja muistista. Tietojen lataamisen RAM-muistista aiheuttama viive ( latausviive ) on ratkaisevan tärkeä suorittimen suorituskyvyn kannalta: tästä syystä useimmat tason 1 välimuistit indeksoidaan virtuaalisilla osoitteilla, jolloin MMU voi etsiä TLB:tä samanaikaisesti tietojen hakemisen kanssa RAM-välimuistista.
Virtuaalinen osoitus ei ole aina paras valinta: se tuo esimerkiksi virtuaalialiaksien ongelman , eli välimuisti voi tallentaa saman fyysisen osoitteen arvon useisiin paikkoihin. Virtuaalialiaksien hallinnan kustannukset kasvavat välimuistin koon myötä, ja tämän seurauksena useimmat tason 2 ja sitä korkeammat välimuistit indeksoidaan fyysisillä osoitteilla.
Virtuaalisten osoitteiden käyttö tarroissa ( virtuaalinen taggaus ) ei kuitenkaan ole yleistä. Jos haku TLB:ssä päättyisi ennen hakua RAM-välimuistista, fyysinen osoite olisi ajoissa käytettävissä tarrojen vertailua varten, joten virtuaalinen taggaus ei olisi tarpeen. Siksi suuret välimuistit merkitään yleensä fyysisesti , ja vain pienet välimuistit, joilla on pieni latenssi, merkitään käytännössä. Uudemmissa suorittimissa virtuaalinen taggaus on korvattu vhinteillä alla kuvatulla tavalla.
Virtuaalinen indeksointi ja virtuaaliset aliakset
Tyypillinen tapa prosessori varmistaa, että virtuaaliset aliakset toimivat oikein, on järjestää ne siten, että kerrallaan vain yksi virtuaalialias voi olla välimuistissa.
Joka kerta kun välimuistiin lisätään uusi arvo, prosessori etsii muita virtuaalisia aliaksia ja poistaa ne. Tämä tehdään vain välimuistivian sattuessa. Välimuistin osuman aikana ei vaadita erityistä työtä, mikä auttaa pitämään nopean polun välimuistissa mahdollisimman nopeasti.
Helpoin tapa löytää aliaksia on kartoittaa ne kaikki samalle välimuistialueelle. Näin tapahtuu esimerkiksi, jos TLB:ssä on 4 kilotavua sivuja ja välimuisti on suoraan kartoitettu 4 kilotavuksi tai pienemmäksi.
Nykyaikaiset huipputason välimuistit ovat paljon suurempia kuin 4 kt, mutta virtuaalimuistisivut ovat pysyneet samana. Jos välimuisti on esimerkiksi 16 kt ja virtuaalisesti indeksoitu, jokainen fyysinen osoite voidaan osoittaa 4 eri paikasta välimuistissa yhtä monelle virtuaaliselle osoitteelle. Jos välimuisti epäonnistuu, kaikki neljä sijaintia tulee tarkistaa, jotta varmistetaan, vastaavatko niiden vastaavat fyysiset osoitteet epäonnistuneen kirjautumisen fyysistä osoitetta.
Nämä säätimet ovat samoja säätimiä, joita assosiatiivinen välimuistijoukko käyttää tietyn vastaavuuden valitsemiseen. Joten jos käytännössä 16 kt:n indeksoitua välimuistia, 4-suuntaista assosiatiivista, käytetään 4 kt:n virtuaalimuistisivujen kanssa, virtuaalisten aliasten poistamiseen ei tarvita lisätyötä välimuistin puuttuessa, koska tarkistukset on jo tehty. .
Otetaan AMD Athlonia jälleen esimerkkinä: siinä on 64 kt:n huipputason datavälimuisti, 4 kt:n sivut, 2-suuntainen assosiaatiosarja. Kun ylimmän tason välimuisti epäonnistuu, 2 16 (= 64 kt / 4 kt) mahdollisesta virtuaalisesta aliaksesta on jo tarkistettu ja tarran tarkistussilmukan seitsemän lisäsykliä tarvitaan ylimääräisten virtuaalisten aliasten poistamiseksi.
Virtuaaliset tunnisteet ja vinkit
Myös virtuaalinen merkintä on mahdollista. Virtuaalitunnisteen suuri etu on, että assosiatiivisten välimuistien kohdalla ne mahdollistavat tarran täsmäytyksen ennen kuin virtuaalisesta fyysiseksi käännös tehdään. Joka tapauksessa,
- Johdonmukaisuus- ja poistotarkistukset näyttävät fyysisen osoitteen toimintoa kohden. Laitteistossa on oltava jokin menetelmä fyysisen osoitteen muuntamiseksi välimuistiosoitteeksi, yleensä tallentamalla fyysisiä tunnisteita sekä virtuaalisia tarroja. Vertailun vuoksi: fyysisesti merkityn välimuistin ei tarvitse säilyttää virtuaalisia tunnisteita, mikä on yksinkertaisempaa.
- Kun virtuaalisesta fyysiseen viittaus poistetaan TLB:stä, välimuistitiedot näiden virtuaalisten osoitteiden kanssa on tyhjennettävä jollain tavalla. Jos välimuistitiedot ovat sallittuja sivuilla, joita TLB ei ole kartoittanut, nämä tiedot on tyhjennettävä, kun näiden sivujen käyttöoikeudet muuttuvat sivutaulukossa.
Käyttöjärjestelmä voi varmistaa, että välimuistissa on samanaikaisesti useita virtuaalisia aliaksia. Käyttöjärjestelmä varmistaa tämän rasittamalla sivun väritystä , joka on kuvattu alla. Jotkut viimeaikaiset RISC-prosessorit (SPARC, RS / 6000) ovat omaksuneet tämän lähestymistavan. Sitä ei ole käytetty viime aikoina, koska virtuaalisten aliasten löytämiseen ja poistamiseen tarvittavien laitteistojen kustannukset ovat laskeneet, kun taas täydellisen sivun väritysohjelmiston monimutkaisuus ja suorituskyky ovat nousseet.
Saattaa olla hyödyllistä erottaa kaksi merkintätoimintoa assosiatiivisessa välimuistissa: niitä käytetään määrittämään, mikä tietojoukon tila valitaan, ja niiden avulla määritetään, epäonnistuuko välimuisti vai ei. Toisen funktion on aina oltava oikea, mutta ensimmäinen funktio saa arvailla ja saada toisinaan vastauksen väärin.
Joissakin prosessoreissa (kuten uusimmissa SPARCissa) on välimuistit sekä virtuaalisilla että fyysisillä tunnisteilla. Virtuaalisia tarroja käytetään tilan valintaan, ja fyysisiä tarroja käytetään keskuksen tai vian määrittämiseen. Tämän tyyppinen välimuisti suosii virtuaalisen tarravälimuistin latenssietua ja fyysisen tarravälimuistin yksinkertaista ohjelmistokäyttöliittymää. Se tukee kuitenkin päällekkäisten tarrojen lisäkustannuksia. Jopa epäonnistumisprosessien aikana välimuistirivin vaihtoehtoiset tilat on tarkistettava virtuaalisten aliasten ja mahdollisten osumien varalta.
Ylimääräistä aluetta (ja jonkin verran latenssia) voidaan vähentää pitämällä virtuaalisia vihjeitä missä tahansa välimuistitiedossa virtuaalisten tunnisteiden sijasta. Nämä vihjeet ovat virtuaalisen tunnisteen osajoukko tai hash, ja niitä käytetään valitsemaan välimuistitila, jolla tiedot ja fyysinen nimike haetaan. Virtuaalisesti merkityllä välimuistilla voi olla virtuaalinen vihjeosuma, mutta fyysinen otsikko ei täsmää, tässä tapauksessa välimuistin tiedot vihjeen täsmäävyyden kanssa on poistettava, jotta se pääsee välimuistiin välimuistin täyttämisen jälkeen tässä osoitteessa. on yksi vihje ottelu. Koska vihjeissä on vähemmän bittejä kuin virtuaalitunnisteissa, jotka erottavat ne toisistaan, virtuaalisia vihjeitä sisältävä välimuisti kärsii enemmän ristiriitapuutteista kuin virtuaalinen etikettivälimuisti.
Ehkäpä virtuaalisten vihjeiden lopullinen vähennys löytyy Pentium 4:stä (Willamette ja Northwood -ytimet). Näissä prosessoreissa virtuaalinen vihje on itse asiassa vain 2 bittiä ja välimuisti on 4-suuntainen assosiatiivinen. Itse asiassa laitteisto ylläpitää yksinkertaista permutaatiota virtuaaliosoitteista välimuistiosoitteisiin, joten CAM-moduulia ei tarvita oikean neljästä hakutilasta valitsemiseen.
Sivun väritys
Fyysisesti suuret indeksoidut välimuistit (yleensä toissijaiset välimuistit) kohtaavat ongelman: käyttöjärjestelmä hallitsee sen sijaan, mitkä sivut törmäävät toisiinsa välimuistissa. Erot ohjelman sivujen allokoinnissa johtavat seuraavan tason eroihin välimuistin törmäyspoluissa, mikä voi johtaa erittäin suuriin eroihin ohjelman suorituskyvyssä. Nämä erot voivat vaikeuttaa johdonmukaisen ja toistettavan vertailuajan saamista ohjelmien suorittamiseen, minkä vuoksi palkalliset ja lohduttomat insinöörit vaativat käyttöjärjestelmän tekijöitä korjaamaan ongelman.
Ymmärtääksesi ongelman, harkitse CPU:ta, jossa on 1 Mt fyysisesti indeksoitua suoraan kartoitettua tason 2 välimuistia ja 4 kt virtuaalimuistisivuja. Peräkkäiset fyysiset sivut kartoitetaan välimuistin peräkkäisiin paikkoihin, kunnes 256 sivun jälkeen polku palaa itseensä. Voimme merkitä jokaisen fyysisen sivun värillä 0-255 osoittamaan, mihin välimuistiin se voi mennä. Eriväristen fyysisten sivujen sijainnit eivät voi olla ristiriidassa välimuistissa.
Ohjelmoija, joka haluaa käyttää välimuistia parhaalla mahdollisella tavalla, voisi järjestää ohjelmakäyttönsä siten, että vain 1 megatavua dataa tarvitsee tallentaa välimuistiin kerralla, samalla kun vältetään kapasiteettihäiriöt. Mutta sen pitäisi myös varmistaa, että sisäänkirjautumisissa ei ole ristiriitavirheitä. Yksi tapa ajatella tätä ongelmaa on jakaa ohjelman käyttämät virtuaalisivut ja määrittää niille virtuaaliset värit samalla tavalla kuin fyysiset värit määritettiin fyysisille sivuille aiemmin. Ohjelmoija voi sitten järjestää koodinsa pääsyt niin, että kaksi saman virtuaalisen värin sivua eivät ole käytössä yhtä aikaa. Näistä optimoinneista on olemassa laajaa kirjallisuutta (esim. Loop nest -optimointi ), joka tulee enimmäkseen High Performance Computing (HPC) -yhteisöstä.
Ajatuksena on, että vaikka kaikilla kulloinkin käytössä olevilla sivuilla voi olla erilaisia virtuaalisia värejä, joillakin voi olla sama fyysinen väri. Itse asiassa, jos käyttöjärjestelmä määrittää fyysiset sivut virtuaalisille sivuille satunnaisella ja yhtenäisellä tavalla, se on erittäin todennäköistä, että joillakin sivuilla on sama fyysinen väri, ja siksi näiden sivujen paikat ovat samat välimuistissa (tämä on syntymäpäiväparadoksi ).
Ratkaisu on, että käyttöjärjestelmä yrittää määrittää erivärisiä fyysisiä sivuja erilaisille virtuaalisille väreille, jota kutsutaan sivun väritykseksi . Vaikka todellinen virtuaalinen ja fyysinen värikartoitus on epäolennainen järjestelmän suorituskyvyn kannalta, parittomat kartoitukset on vaikea jäljittää ja niillä on pieniä etuja, joten useimmat sivun väritysmenetelmät yrittävät yksinkertaisesti pitää fyysiset ja virtuaaliset sivut samalla värillä.
Jos käyttöjärjestelmä voi taata, että jokainen fyysinen sivu viittaa yhteen virtuaaliseen väriin, virtuaalisia aliaksia ei ole, ja prosessori voi käyttää virtuaalisesti indeksoituja välimuistia tarvitsematta ylimääräisiä virtuaalisia aliastarkistuksia vianhallinnan aikana. Vaihtoehtoisesti käyttöjärjestelmä voi tyhjentää sivun välimuistista, vaikka se muuttuisi virtuaaliväristä toiseen. Kuten aiemmin mainittiin, tätä lähestymistapaa käytettiin joissakin viimeaikaisissa SPARC- ja RC / 6000 -malleissa.
Välimuistihierarkia modernissa prosessorissa
Nykyaikaisilla prosessoreilla on useita välimuistia sirussa, joiden kanssa voi olla vuorovaikutuksessa. Erityisesti kaksi syytä ovat johtaneet nykyisen välimuistihierarkian kehittämiseen.
Erikoisvälimuistit
Ensimmäinen syy on se, että liukuhihnaprosessorit käyttävät muistia useista liukuhihnan pisteistä: käskyjen hausta, virtuaalisen osoitteen muuntamisesta fyysiseen osoitteeseen ja tiedonhakuun. Yksinkertainen esimerkki: Classic RISC Pipeline . Luonnollinen toteutus on käyttää eri fyysisiä välimuistia kullekin näistä pisteistä, joten mitään fyysisiä resursseja ei tarvitse ohjelmoida palvelemaan kahta prosessissa olevaa pistettä. Vaikka liukuhihna luonnollisesti päätyy ainakin kolmeen erilliseen välimuistiin (ohjeet, TLB ja data), kukin niistä on erikoistunut tiettyyn rooliin.
Uhrin välimuisti
Uhrivälimuisti on välimuisti, jota käytetään estojen poistamiseen suorittimen välimuistista ristiriidan tai kapasiteetin puutteen vuoksi. Uhrivälimuisti sijaitsee ensisijaisen välimuistin ja taustalla olevan muistin välissä, ja se pitää vain lohkot poistetuista virheiden jälkeen. Tätä tekniikkaa käytetään pienentämään välimuistivirheen rangaistusta, koska voi käydä niin, että uhrin välimuistissa olevia tietoja pyydetään jonkin aikaa myöhemmin, ja sitten sen sijaan, että julistettaisiin puuttuva tieto ja menisi muistiin hakemaan nämä tiedot, uhrin välimuisti tarkistetaan ja siinä vielä olevia tietoja käytetään.
HP PA7200:n alkuperäinen uhrivälimuisti oli pieni, täysin assosiatiivinen välimuisti. Myöhemmät prosessorit, kuten AMD Athlon , Athlon XP ja Athlon 64 , käyttävät erittäin suurta toissijaista välimuistia uhrivälimuistina välttääkseen kontekstimuistien toistamisen ensisijaisessa välimuistissa.
Jäljitysvälimuisti
Yksi äärimmäisistä esimerkeistä välimuistin erikoistumisesta on Pentium 4 - mikroprosessoreissa käytetty jäljitysvälimuisti . Jäljitysvälimuisti on mekanismi, jolla lisätään käskyjen hakukaistanleveyttä tallentamalla jäljet jo tallennetuista käskyistä. Mekanismia ehdottivat ensimmäisenä Eric Rotenberg , Steve Bennett ja Jim Smith vuoden 1996 artikkelissaan: " Trace Cache: a Low Latency Approach to High Bandwidth Instruction Fetching. "
Jäljitysvälimuisti tallentaa käskyt senkin jälkeen, kun ne on suoritettu tai kun ne on poistettu. Yleensä ohjeet lisätään jäljitysvälimuistiin ryhmissä, jotka edustavat sekä yksittäisiä peruslohkoja että dynaamisia käskyjälkiä. Peruslohko koostuu ryhmästä ei-haaraisia (jakamattomia) käskyjä, jotka päättyvät haaraan. Dynaaminen jäljitys ("trace path" tai "trace of the path") koostuu vain käskyistä, joiden tulosta todellisuudessa käytetään, ja eliminoi seuraavat lauseet, jotka ottavat haaroja (koska niitä ei suoriteta); dynaaminen raita voi olla peruslohkojen moninkertainen ketju. Tämän ansiosta käskyjen hakuyksikkö voi noutaa useita peruslohkoja ilman, että sinun tarvitsee huolehtia haaroittumisesta suoritusvirtaan.
Jäljitysviivat tallennetaan jäljitysvälimuistiin jäljityksen ensimmäisen käskyn ohjelmalaskurin ja haaraennusteiden joukon perusteella. Tämä mahdollistaa samalla osoitteella alkavien eri polkujälkien tallentamisen, joista jokainen edustaa eri haaroitustuloksia. Ohjeputken käskyjen tallennusvaiheessa nykyinen ohjelmalaskuri ja joukko haaraennusteita tarkistetaan jäljitysvälimuistista osuman varalta . Jos osuma tapahtuu, jäljitysrivi tarjotaan noutaakseen, mikä ei tarvitse mennä tavalliseen välimuistiin tai muistiin näitä lausekkeita varten. jäljitysvälimuisti jatkaa hakuyksikön syöttämistä, kunnes jäljityslinja päättyy tai kunnes liukuhihnassa on virheellinen ennuste . Jos tapahtuu vika, uuden raidan luominen alkaa. Etuna normaaleihin koodivälimuistiin verrattuna on, että kaikkia haaraa seuraavat käskyt, jotka ovat ehdottomia tai joita ei noudateta, ei tallenneta välimuistiin: tuloksena on, että käyttämättömästä koodista ei muodostu "kuplia", jotka tuhlaavat tilaa. välimuistia.
Jäljitysvälimuistia käytetään myös prosessoreissa, kuten Intel Pentium 4 , tallentamaan jo dekoodattuja mikrotoimintoja tai monimutkaisten x86-käskyjen käännöksiä, jotta sitä ei tarvitse purkaa seuraavan kerran, kun samaa käskyä pyydetään.
Jäljitysvälimuistin taustalla on ajatus, että sisäisesti RISC -käskyjä käyttävissä CISC-prosessoreissa , kuten Pentium 4:ssä, käskyjen purkaminen on erittäin kallista toimenpidettä ja sen tulosta tulisi hyödyntää täysillä. Jäljitysvälimuistin käyttämisellä tavallisen välimuistin sijaan on juuri tämä etu: ohjelman suorittamisen aikana jo havaittua käskyä ei tarvitse purkaa.
Jäljitysvälimuisti ei ole saanut paljon suosiota viime aikoina joidenkin virheiden vuoksi. Ensimmäinen on, että monet RISC-käskyt käännetään yhdeksi CISC-käskyksi yhdessä kellojaksossa, ja käskyt, jotka vaativat useita kellojaksoja muuntumaan useiksi RISC-käskyiksi, ovat suhteellisen vähän ja harvoin, joten jäljitysvälimuistin todellinen hyöty on rajallinen. . Tähän lisätään se tosiasia, että Intel-arkkitehtuurin tapauksessa CISC-käskyjen pituus on yleensä 1-6 tavua (8-48 bittiä), kun taas kaikkien sisäisesti käytettävien RISC-käskyjen kiinteä pituus on 118 bittiä. . Siksi samankokoinen jäljitysvälimuisti sisältää paljon vähemmän ohjeita kuin tavallinen välimuisti. Nämä haitat saivat Intelin käyttämättä jäljitysvälimuistia uusimmissa arkkitehtuureissaan: Intel Core ja Intel Core 2 .
Katso teksti Smithin, Rotenbergin ja Bennettin paperi . Haettu 30. marraskuuta 2019 (arkistoitu alkuperäisestä 3. huhtikuuta 2008) . Citeseerissä . _
Monitasoinen välimuisti
Toinen syy on perustavanlaatuinen kompromissi välimuistin viiveen ja osumanopeuden välillä. Suuremmat välimuistit ovat hitaampia ja niillä on parempi osuvuus. Tämän kompromissin parantamiseksi monet järjestelmät käyttävät useita välimuistitasoja, ja pienet ja nopeat välimuistit nojaavat suurempiin ja hitaampiin välimuistiin. Kun päämuistin ja nopeampien välimuistien välinen viiveero kasvoi, jotkin prosessorit alkoivat käyttää myös kolmetasoista välimuistia. Esimerkiksi vuonna 2003 Itanium II aloitti toimitukset 6 Mt:n tason 3 yhtenäisellä välimuistilla. IBM Power 4 -sarjassa on 256 megatavua piirin ulkopuolista tason 3 välimuistia, joka on jaettu useille prosessoreille.
Monitasoiset välimuistit toimivat yleensä tarkistamalla ensin tason 1 välimuistit; jos osuma tapahtuu, prosessori toimii suurella nopeudella. Jos pienempi välimuisti "epäonnistuu", suurempi välimuisti tarkistetaan ja niin edelleen, kunnes päämuistia on käytettävä.
Monitasoiset välimuistit esittelevät uuden päätöksentekomallin. Esimerkiksi joissakin prosessoreissa (kuten Intel Pentium 2 , 3 ja 4 sekä monissa RISC: issä ) L1-välimuistin tiedot voivat olla myös L2-välimuistissa. Näitä välimuistia kutsutaan osallisiksi. Muilla prosessoreilla (kuten AMD Athlonilla ) on ainutlaatuisia välimuistia, joissa tiedot taataan olevan korkeintaan L1- tai L2-välimuistissa.
Eksklusiivisten välimuistien etuna on, että ne tallentavat enemmän tietoa. Tämä etu kasvaa suurempien välimuistien myötä (Intel x86 -toteutukset eivät ole). Sisällyttävien välimuistien etuna on, että kun ulkoiset laitteet tai muut prosessorit moniprosessorijärjestelmässä haluavat poistaa välimuistirivin prosessorista, niiden on annettava prosessorin tarkistaa vain L2-välimuisti. Välimuistihierarkioissa, jotka eivät käytä inkluusiota, myös L1-välimuistit on tarkistettava. L1- ja L2-välimuistien assosiatiivisuuden välillä on korrelaatio: jos L2-välimuistissa ei ole vähintään yhtä monta tilaa kuin kaikilla L1:illä yhteensä, L1-välimuistien todellinen assosiatiivisuus on rajoitettu.
Toinen sisällyttävien välimuistien etu on, että suuremmat välimuistit voivat käyttää suurempia välimuistirivejä, mikä pienentää toissijaisten välimuistin otsikoiden kokoa. Jos toissijainen välimuisti on suuruusluokkaa suurempi kuin ensisijainen välimuisti ja välimuistin tiedot ovat suuruusluokkaa suuremmat kuin välimuistin tunnisteet, näitä tallennettuja tietotunnisteita voidaan verrata tietojen tallentamiseen tarvittavaan lisäalueeseen. L1 ja L2 välimuisti.
Kuten aiemmin mainittiin, suurilla tietokoneilla on joskus toinen välimuisti L2:n ja päämuistin välillä nimeltä L3-välimuisti. Tämä välimuisti on yleensä toteutettu CPU:sta erillisellä sirulla, ja kuten vuonna 2004 , sen kapasiteetti on 2 Mt - 256 Mt. Näiden välimuistien rakentaminen maksaa reilusti yli 1000 dollaria, ja niiden hyödyt riippuvat sovellusten pääsypoluista. Huippuluokan x86-työasemat ja -palvelimet ovat nyt saatavilla vaihtoehdolla L3-välimuistille.
Lopuksi muistihierarkian toisella puolella CPU- rekisteritiedostoa voidaan pitää järjestelmän pienimpänä, nopeimpana välimuistina, jonka erikoisominaisuuden kutsuu ohjelmisto - tyypillisesti kääntäjä, koska se varaa rekistereitä, joiden täytyy sisältää arvoja. haettu päämuistista.
Esimerkki: AMD K8 -arkkitehtuuri
Havainnollistaakseen sekä erikoistumista että välimuistien monitasoisuutta, tässä on AMD Athlon 64 :n välimuistihierarkia , jonka ydintoteutus tunnetaan K8-arkkitehtuurina .
K8:ssa on 4 erikoisvälimuistia: käskyvälimuisti, TLB - käskyvälimuisti, datavälimuisti ja TLB-tietovälimuisti. Jokainen näistä välimuistista on erikoistunut:
- Käskyvälimuisti ylläpitää 64 tavun rivikopioita muistista ja hakee 16 tavua jaksoa kohden. Jokainen tämän välimuistin tavu on tallennettu 10 bitiksi 8:n sijaan, ja ylimääräiset bitit merkitsevät ohjeiden rajat (tämä on esimerkki esikoodauksesta). Välimuistissa on vain pariteettisuojaus ECC :n sijaan , koska pariteetti on pienempi ja kaikki vioittuneet tiedot voidaan korvata tuoreella tiedolla muistista (jossa on aina päivitetty kopio ohjeista).
- Käsky TLB säilyttää kopion tiedoista sivutaulukossa (PTE). Jokaisen käskyn hakujakson virtuaalinen osoite muunnetaan tämän TLB:n kautta fyysiseksi osoitteeksi. Jokainen tieto on sekä 4 että 8 tavua muistissa. Jokainen TLB on jaettu kahteen osaan, joista toinen pitää PTE-kartoituksen 4 Kt ja toinen 4 Mt tai 2 Mt. Alajako mahdollistaa yksinkertaisen piirin täysin assosiatiiviseen vertailuun kussakin osiossa. Käyttöjärjestelmä kartoittaa virtuaalisen osoiteavaruuden eri osia eri PTE-kooilla.
- TLB-tiedoissa on kaksi eri kopiota, jotka sisältävät samat tiedot. Kaksi kopiota mahdollistavat kahden pääsyn tietoihin jokaisessa jaksossa virtuaalisten osoitteiden muuntamiseksi fyysisiksi osoitteiksi. Kuten käsky TLB, tämä TLB on jaettu kahteen tietotyyppiin.
- Tietovälimuisti ylläpitää 64 tavun rivien muistikopioita. Se on jaettu kahdeksaan pankkiin (kukin tallentaa 8 kt tietoa), ja se voi hakea kaksi 8-tavuista dataa jaksoa kohden, kunhan nämä tiedot ovat eri pankeissa. Tarroista on kaksi kopiota, koska jokainen 64-tavuinen rivi on hajallaan kaikissa 8 pankissa. Jokainen tarran kopio hallitsee yhtä kahdesta pääsystä sykliä kohti.
K8:ssa on myös monitasoinen välimuisti. On olemassa toisen tason käsky- ja data-TLB:itä, jotka tallentavat vain 4 kt:n PTE-kartoitukset. Sekä käsky- ja datavälimuistit että erilaiset TLB:t voidaan täyttää suurella yhtenäisellä tason 2 välimuistilla. Tämä välimuisti on yksinomaan sekä L1-data- että käskyvälimuisti, mikä tarkoittaa, että mikä tahansa 8-tavuinen rivi voi sijaita jossakin L1-käskyvälimuistiin, L1-tietovälimuistiin tai L2-välimuistiin. On kuitenkin mahdollista, että datavälimuistin rivillä on PTE, joka sijaitsee myös yhdessä TLB-välimuistista – käyttöjärjestelmä on vastuussa TLB:iden pitämisestä yhdenmukaisina lataamalla osia niistä, kun muistissa oleva sivutaulukko päivitetään.
K8 tallentaa tiedot, joita ei koskaan tallenneta muistiin – ennustetiedot. Näitä välimuistia ei näytetä edellisessä kaaviossa. Kuten tälle CPU-luokalle on tavallista, K8:ssa on melko monimutkainen haaraennuste , jossa on taulukoita, jotka auttavat ennustamaan, mitä polkuja käytetään, ja muita taulukoita, jotka ennustavat polku- ja hyppykohteita. Osa näistä tiedoista liittyy ohjeisiin sekä L1- että yhtenäistetyn L2-käskyvälimuistissa.
K8 käyttää mielenkiintoista mekanismia ennustetietojen tallentamiseen ohjeiden kanssa toissijaiseen välimuistiin. Toissijaisen välimuistin rivit on suojattu tahattomalta tietojen vioittumiselta (esim. alfahiukkasten osuma ECC :n tai pariteetin kautta riippuen siitä, onko nämä rivit poistettu data- vai käskyvälimuistista. pariteetti vie vähemmän bittejä kuin ECC, rivit käskyvälimuistista on muutama bitti jäljellä. Näitä bittejä käytetään ohjeisiin liittyvien polkuennusteiden laskemiseen. Lopputuloksena on, että polun ennustajalla on suuri taulukkohistoria, joten sen tarkkuus on parempi.
Muut hierarkiat
Muilla prosessoreilla on muun tyyppisiä ennustajia. (esim. DEC Alpha 21264:n varastosta kuormaan -ohitusennuste) ja monet muut erikoistuneet ennustajat voidaan helposti integroida tuleviin prosessoreihin.
Nämä ennustajat ovat välimuistia siinä mielessä, että ne tallentavat tietoja, joiden laskeminen on kallista. Jotkut ennustajien käsittelyssä käytetyt terminologiat ovat samoja kuin välimuistit (jota kutsutaan osumiksi polun ennustajassa), mutta ennustajia ei yleensä painoteta osana välimuistihierarkiaa.
K8 pitää käskyt ja välimuistitiedot yhtenäisinä laitteistossa, mikä tarkoittaa, että käskyn tallennus heti käskyn tallentamisen jälkeen muuttaa seuraavan käskyn. Muut prosessorit, kuten Alpha- ja MPS-perheen prosessorit, ovat ohjelmistopohjaisia, jotta käskyvälimuistit pysyvät yhdenmukaisina. Tallennustilojen näkymistä ohjevirrassa ei taata, ellei ohjelma kutsu käyttöjärjestelmävaihtoehtoa johdonmukaisuuden varmistamiseksi. Ajatuksena on säästää laitteiston monimutkaisuutta olettaen, että itsemuovautuva koodi on harvinaista.
Välimuistihierarkia laajenee, jos tarkastelemme ohjelmistoa ja laitteistoa. Prosessorin ytimessä olevaa rekisteritiedostoa voidaan pitää hyvin pienenä, nopeana välimuistina, jonka osumat, epäonnistumiset ja täytöt kääntäjä ennustaa etukäteen. (Katso erityisesti Silmukkapesän optimointi .) Rekisteritiedostoilla on joskus myös hierarkia: Cray-1 :ssä (noin 1976) oli 8 skalaarirekisteriä ja 8 osoiterekisteriä, jotka olivat yleisesti käyttökelpoisia, siinä oli myös 64 skalaarirekisteriä ja 64 "B"-tyyppistä osoitetta rekisterit. "B"-tyypin rekisterit voitiin ladata nopeammin kuin päämuistissa olevat, koska Cray-1:ssä ei ollut välimuistia.
Toteutus
Koska välimuistin lukeminen ovat melko yleisiä toimintoja, jotka kestävät enemmän kuin yhden syklin, toistuminen käskyn lataamisesta itse käskyyn on yleensä kriittisin polku hyvässä prosessorisuunnittelussa, joten tällä polulla olevat tiedot menetetään. niin vähän aikaa mahdollisimman. Tämän seurauksena L1-välimuisti on sirun latenssiherkin komponentti.
Yksinkertaisin välimuisti on käytännössä indeksoitu suoraan kartoitettu välimuisti. Virtuaalinen osoite lasketaan summaimella, merkittävin osa osoitteesta erotetaan ja käytetään indeksoimaan SRAM, joka palauttaa tallennetut tiedot. Data tasataan tavunsiirtimessä, ja sieltä se siirretään seuraavaan operaatioon. Tarroja ei tarvitse tarkistaa sisäisessä silmukassa – itse asiassa tarroja ei tarvitse edes lukea. Myöhemmin käsittelyvaiheessa, mutta ennen kuin lauseke todella ladataan, ladattujen tietojen tunniste on luettava ja tarkistettava virtuaaliosoitteella varmistaakseen, että välimuistissa on osuma. Jos tämä epäonnistuu, välimuisti päivitetään pyydetyllä rivillä ja liukuhihna käynnistetään uudelleen.
Assosiatiivinen välimuisti on paljon monimutkaisempi, koska jotkin tietoelementit on luettava, jotta voidaan määrittää, mikä välimuistipiste valitaan. Set-assosiatiivinen N-tie tason 1 välimuisti lukee yleensä kaikki mahdolliset N nimiötä ja N dataa rinnakkain, minkä jälkeen valitsee vastaavaan tarraan liittyvät tiedot. Tason 2 välimuistit säästävät joskus virtaa lukemalla ensin etiketin, jolloin vain yksi tieto luetaan SRAM:sta.
Oikealla oleva kaavio selventää eri osoitekenttien käyttöä. Kaavio näyttää SRAM-muistin, indeksoinnin ja multipleksoinnin virtuaalisesti tunnistetulle ja virtuaalisesti indeksoidulle 4 kilotavulle, 2-suuntaiselle set-assosiatiiviselle välimuistille, jossa on 64 B juovaa, 32 b leveä luku ja 32 b virtuaaliosoite.
Koska välimuisti on 4 kilotavua ja siinä on 64 B riviä, välimuistissa on vain 64 riviä, ja luemme kaksi kerrallaan SRAM-etiketistä, jossa on 32 riviä, joista jokaisessa on pari 21-bittistä otsikkoa. Vaikka mitä tahansa bittiä 31–6 virtuaaliosoitefunktiota voidaan käyttää nimikkeiden ja SRAM-tietojen indeksoimiseen, on helpompi käyttää vähiten merkitseviä bittejä.
Vastaavasti, koska välimuisti on 4 kt ja siinä on 4 B lukupolku ja se lukee kaksi tilaa jokaiselle osoitteelle, SRAM-data on 512 riviä 8 tavua leveä.
Nykyaikaisempi välimuisti voisi olla 16 kilotavua, 4-suuntainen joukkoliittyvä, virtuaalisesti indeksoitu, virtuaalisesti vihjattu ja fyysisesti merkitty, 32B riviä, 32b lukuja ja 36-bittisiä fyysisiä osoitteita. Lukupolkujen esiintyminen tämän tyyppisissä välimuistissa näyttää pitkälti yllä olevan polun kaltaisilta. Tunnisteiden sijasta luetaan vihjeitä ja niitä verrataan virtuaalisten osoitteiden osajoukkoon. Myöhemmin liukuhihnassa virtuaalinen osoite muunnetaan fyysiseksi osoitteeksi TLB:n toimesta ja fyysinen nimike luetaan (vain yksi, koska vhint kertoo, minkä tavan välimuistista lukea). Lopuksi fyysistä osoitetta verrataan tarran osoitteeseen sen määrittämiseksi, onko osuma tapahtunut.
Jotkut SPARC-toteutukset ovat parantaneet L1-välimuistinsa nopeutta muutamalla viiveellä romahtamalla SRAM-dekooderien virtuaaliosoitteen summaimen.
Muistiinpanot
- ^ How The Cache Memory Works , Hardware Secrets , 12. syyskuuta 2007. Haettu 29. maaliskuuta 2022 .
Aiheeseen liittyvät tuotteet
Muut projektit
Wikimedia Commons sisältää kuvia tai muita tiedostoja suorittimen välimuistissa
Ulkoiset linkit
- ( EN ) Assosiatiivisuuden arviointi suorittimen välimuistissa - Hill ja Smith - 1989 - Esittelee kapasiteetin, ristiriidat ja pakollisen luokituksen.
- ( EN ) Välimuistin suorituskyky SPEC CPU2000 -vertailuarvoille . - Hill ja Cantin - 2003 - Tätä viitepaperia on päivitetty useita kertoja. Siinä on perusteelliset ja selkeästi esitetyt simulaatiotulokset kohtuullisen laajalle joukolle vertailuarvoja ja välimuistiorganisaatioita.
- ( FI ) Muistihierarkia välimuistiin perustuvissa järjestelmissä ( PDF ) (arkistoitu alkuperäisestä 15. syyskuuta 2009) . , kirjoittanut Ruud van der Pas, 2002, Sun Microsystems, on mukava johdantoartikkeli suorittimen muistin välimuistiin.
- ( FI ) Cache Primer ( PDF ) (arkistoitu alkuperäisestä 25. heinäkuuta 2008) . Paul Genua, PE, 2004, Freescale Semiconductor, toinen johdantoartikkeli.


