Välimuisti on nopean käytön välipuskuri, joka sisältää tietoja, joita todennäköisimmin pyydetään. Välimuistissa olevien tietojen käyttö on nopeampaa kuin alkuperäisten tietojen hakeminen käyttömuistista (RAM) ja ulkoista muistia (kiintolevy tai solid-state-asema) nopeampi, mikä lyhentää keskimääräistä käyttöaikaa ja lisää tietokonejärjestelmän yleistä suorituskykyä.

Useilla keskusyksikkömalleilla (CPU) on oma välimuisti, jotta voidaan minimoida pääsy RAM-muistiin, joka on rekistereitä hitaampi. Välimuisti voi tarjota merkittäviä suorituskykyetuja, kun RAM-muistin kellonopeus on huomattavasti pienempi kuin suorittimen kellonopeus. Välimuistin kellonopeus ei yleensä ole paljon pienempi kuin suorittimen nopeus.

Välimuistin tasot

CPU-välimuisti on jaettu useisiin tasoihin. Nykyään yleiskäyttöisessä prosessorissa tasojen lukumäärä voi olla jopa 3. Tason N+1 välimuisti on tyypillisesti kooltaan suurempi ja hitaampi pääsynopeudeltaan ja tiedonsiirrolta kuin tason N välimuisti.

Nopein muisti on ensimmäisen tason välimuisti - L1-välimuisti. Itse asiassa se on olennainen osa prosessoria, koska se sijaitsee samassa sirussa ja on osa toiminnallisia lohkoja. Nykyaikaisissa prosessoreissa L1-välimuisti on yleensä jaettu kahteen välimuistiin, käskyvälimuistiin ja datavälimuistiin (Harvard-arkkitehtuuri). Useimmat prosessorit ilman L1-välimuistia eivät voi toimia. L1-välimuisti toimii prosessorin taajuudella, ja yleensä sitä voidaan käyttää joka kellojaksolla. Usein on mahdollista suorittaa useita luku-/kirjoitustoimintoja samanaikaisesti. Käyttöviive on yleensä 2–4 ydinkellojaksoa. Äänenvoimakkuus on yleensä pieni - enintään 384 kt.

Toiseksi nopein on L2-välimuisti - toisen tason välimuisti, joka sijaitsee yleensä sirulla, kuten L1. Vanhemmissa prosessoreissa joukko siruja emolevyllä. L2-välimuistin määrä 128 kt - 1-12 megatavua. Nykyaikaisissa moniytimisissä prosessoreissa toisen tason välimuisti, joka sijaitsee samalla sirulla, on erillinen muisti - kokonaisvälimuistin koolla nM MB, jokaisessa ytimessä on nM/nC MB, missä nC on prosessoriytimien lukumäärä. Tyypillisesti ydinsirun L2-välimuistin latenssi on 8 - 20 ydinkellojaksoa.

Kolmannen tason välimuisti on vähiten nopea, mutta se voi olla kooltaan erittäin vaikuttava - yli 24 Mt. L3-välimuisti on hitaampi kuin aiemmat välimuistit, mutta silti huomattavasti nopeampi kuin RAM. Moniprosessorijärjestelmissä se on yleisessä käytössä ja on tarkoitettu eri L2:n datan synkronointiin.

Joskus on myös 4. tason välimuisti, yleensä se sijaitsee erillisessä sirussa. Tason 4 välimuistin käyttö on perusteltua vain korkean suorituskyvyn palvelimille ja keskuskoneille.

Eri välimuistien (sekä yhden että usean prosessorin) välinen synkronointiongelma ratkaistaan ​​välimuistin koherenssilla. Tietojen vaihtamiseen eri tasoisten välimuistien tai, kuten sanotaan, välimuistiarkkitehtuurien välillä on kolme vaihtoehtoa: inclusive, eksklusiivinen ja ei-eksklusiivinen.

Kuinka tärkeä L3-välimuisti on AMD-prosessoreille?

Itse asiassa on järkevää varustaa moniytimiset prosessorit erillisellä muistilla, joka jaetaan kaikkien käytettävissä olevien ytimien kesken. Tässä roolissa nopea kolmannen tason (L3) välimuisti voi merkittävästi nopeuttaa useimmin pyydettyjen tietojen käyttöä. Tällöin ytimien, jos mahdollista, ei tarvitse käyttää hidasta päämuistia (RAM).

Ainakin teoriassa. Äskettäin AMD julkisti Athlon II X4 -prosessorin, joka on Phenom II X4 -malli ilman L3-välimuistia, mikä vihjaa, että se ei ole niin tarpeellinen. Päätimme verrata suoraan kahta prosessoria (L3-välimuistilla ja ilman) testataksemme, kuinka välimuisti vaikuttaa suorituskykyyn.

Klikkaa kuvaa suurentaaksesi.

Miten välimuisti toimii?

Ennen kuin sukeltaamme testeihin, on tärkeää ymmärtää joitakin perusasioita. Välimuistin toimintaperiaate on melko yksinkertainen. Välimuisti puskuroi tiedot mahdollisimman lähelle prosessorin prosessointiytimiä vähentääkseen prosessorin pyyntöjä kaukaisempaan ja hitaampaan muistiin. Nykyaikaisissa työpöytäalustoissa välimuistihierarkia sisältää jopa kolme tasoa, jotka edeltävät RAM-muistin käyttöä. Lisäksi toisen ja erityisesti kolmannen tason välimuistit eivät palvele vain datan puskurointia. Niiden tarkoitus on estää prosessoriväylän ylikuormitus, kun ytimien on vaihdettava tietoja.

Osumat ja epäonnistumiset

Välimuistiarkkitehtuurien tehokkuutta mitataan osumanopeudella. Tietopyynnöt, jotka välimuisti voi täyttää, katsotaan osumiksi. Jos tämä välimuisti ei sisällä tarvittavia tietoja, pyyntö välitetään edelleen muistiliukuhihnaa pitkin ja lasketaan ohitus. Tietenkin väliin jääminen lisää tiedon saamiseen kuluvaa aikaa. Tämän seurauksena "kuplia" (joutokäyntiä) ja viiveitä ilmaantuu laskentaputkeen. Osumat päinvastoin antavat sinun ylläpitää maksimaalista suorituskykyä.

Välimuistin syöttö, yksinoikeus, johdonmukaisuus

Korvauskäytännöt määräävät, kuinka välimuistissa vapautetaan tilaa uusille merkinnöille. Koska välimuistiin kirjoitetun tiedon täytyy lopulta ilmestyä päämuistiin, järjestelmät voivat tehdä sen samanaikaisesti välimuistiin kirjoittamisen kanssa (läpikirjoittaminen) tai ne voivat merkitä tietoalueet "likaiseksi" (takaisinkirjoitus) ja kirjoittaa muisti, kun se poistetaan välimuistista.

Useiden välimuistitasojen tiedot voidaan tallentaa yksinomaan, eli ilman redundanssia. Tällöin et löydä samoja tietorivejä kahdesta eri välimuistihierarkiassa. Tai välimuistit voivat toimia kattavasti, eli alemmat välimuistitasot sisältävät taatusti ylemmillä välimuistitasoilla (lähempänä prosessorin ydintä) olevia tietoja. AMD Phenom käyttää ainutlaatuista L3-välimuistia, kun taas Intel noudattaa kattavaa välimuististrategiaa. Koherenssiprotokollat ​​varmistavat tietojen eheyden ja tuoreuden eri ytimillä, välimuistitasoilla ja jopa prosessoreissa.

Välimuistin koko

Suurempaan välimuistiin mahtuu enemmän tietoa, mutta se lisää viivettä. Lisäksi suuri välimuisti kuluttaa huomattavan määrän prosessoritransistoreita, joten on tärkeää löytää tasapaino transistorin budjetin, suutinkoon, virrankulutuksen ja suorituskyvyn/viiveen välillä.

Assosiatiivisuus

RAM:n merkinnät voidaan yhdistää suoraan välimuistiin, toisin sanoen RAM-muistin tietojen kopiolle on vain yksi välimuistipaikka tai ne voivat olla n-suuntaisia ​​assosiatiivisia, eli välimuistissa on n mahdollista paikkaa, joissa tämä tietoja voidaan tallentaa. Korkeammat assosiatiivisuusasteet (jopa täysin assosiatiiviset välimuistit) tarjoavat suuremman välimuistin joustavuuden, koska välimuistissa olevia tietoja ei tarvitse kirjoittaa uudelleen. Toisin sanoen korkea n-aste assosiatiivisuus takaa suuremman osumasuhteen, mutta se lisää myös latenssia, koska kaikkien näiden assosiaatioiden tarkistaminen osuman varalta vie enemmän aikaa. Tyypillisesti korkein assosiaatioaste on kohtuullinen viimeiselle välimuistitasolle, koska siellä on käytettävissä maksimikapasiteetti, ja tiedon etsiminen tämän välimuistin ulkopuolelta johtaa siihen, että prosessori käyttää hidasta RAM-muistia.

Tässä muutamia esimerkkejä: Core i5 ja i7 käyttävät 32 kilotavua L1-välimuistia 8-suuntaisella assosiatiivisuudella tiedoille ja 32 kilotavua L1-välimuistia 4-suuntaisella assosiatiivisuudella ohjeille. On ymmärrettävää, että Intel haluaa, että ohjeet ovat saatavilla nopeammin ja L1-tietovälimuistilla on suurin osumaprosentti. Intel-suorittimien L2-välimuistissa on 8-suuntainen assosiatiivisuus, ja Intelin L3-välimuisti on vielä älykkäämpi, koska se toteuttaa 16-suuntaisen assosiatiivisuuden maksimoidakseen osumia.

AMD noudattaa kuitenkin erilaista strategiaa Phenom II X4 -prosessorien kanssa, jotka käyttävät kaksisuuntaista assosiatiivista L1-välimuistia latenssin vähentämiseksi. Mahdollisten puutteiden kompensoimiseksi välimuistin kapasiteetti kaksinkertaistettiin: 64 KB datalle ja 64 KB ohjeille. L2-välimuistissa on 8-suuntainen assosiatiivisuus, kuten Intel-suunnittelussa, mutta AMD:n L3-välimuisti toimii 48-suuntaisella assosiatiivisuudella. Mutta päätöstä valita yksi välimuistiarkkitehtuuri toisen sijasta ei voida arvioida ottamatta huomioon koko CPU-arkkitehtuuria. On aivan luonnollista, että testituloksilla on käytännön merkitystä, ja tavoitteemme oli juuri tämän monimutkaisen monitasoisen välimuistirakenteen käytännön testaus.

Jokaisella nykyaikaisella prosessorilla on oma välimuisti, joka tallentaa suorittimen ohjeet ja tiedot, jotka ovat käyttövalmiita lähes välittömästi. Tätä tasoa kutsutaan yleisesti tason 1 tai L1 välimuistiksi, ja se otettiin ensimmäisen kerran käyttöön 486DX-suorittimissa. Äskettäin AMD-prosessoreista on tullut vakiona 64 kilotavua L1-välimuistia ydintä kohti (tiedoille ja ohjeille), ja Intel-prosessorit käyttävät 32 kilotavua L1-välimuistia ydintä kohti (myös tiedoille ja ohjeille).

L1-välimuisti ilmestyi ensin 486DX-prosessoreihin, minkä jälkeen siitä tuli kaikkien nykyaikaisten prosessorien olennainen ominaisuus.

Toisen tason välimuisti (L2) ilmestyi kaikkiin prosessoreihin Pentium III:n julkaisun jälkeen, vaikka sen ensimmäiset toteutukset pakkauksessa olivat Pentium Pro -suorittimessa (mutta ei sirussa). Nykyaikaiset prosessorit on varustettu jopa 6 megatavulla on-chip L2-välimuistia. Yleensä tämä tilavuus jaetaan esimerkiksi Intel Core 2 Duo -prosessorin kahden ytimen kesken. Tyypilliset L2-kokoonpanot tarjoavat 512 kt tai 1 megatavua välimuistia ydintä kohden. Prosessorit, joissa on pienempi L2-välimuisti, ovat yleensä alhaisemmalla hintatasolla. Alla on kaavio L2-välimuistin varhaisista toteutuksista.

Pentium Prossa oli L2-välimuisti prosessorin pakkauksessa. Seuraavissa Pentium III:n ja Athlonin sukupolvissa L2-välimuisti toteutettiin erillisillä SRAM-siruilla, mikä oli tuolloin hyvin yleistä (1998, 1999).

Myöhempi ilmoitus jopa 180 nm:n prosessiteknologiasta antoi valmistajille mahdollisuuden integroida L2-välimuisti prosessorin suuttimeen.


Ensimmäiset kaksiytimiset prosessorit käyttivät yksinkertaisesti olemassa olevia malleja, jotka sisälsivät kaksi suulaketta per pakkaus. AMD esitteli kaksiytimisprosessorin monoliittisella sirulla, lisäsi muistiohjaimen ja kytkimen, ja Intel yksinkertaisesti kokosi kaksi yksiytimistä sirua yhteen pakkaukseen ensimmäistä kaksiytimistä prosessoria varten.


Ensimmäistä kertaa L2-välimuisti alettiin jakaa kahden Core 2 Duo -prosessorien laskentaytimen välillä. AMD meni pidemmälle ja loi ensimmäisen neliytimisensä Phenomin tyhjästä, ja Intel käytti jälleen paria meistiä, tällä kertaa kahta kaksiytimistä Core 2 -suulaketta, ensimmäisessä neliytimisessä prosessorissaan kustannusten alentamiseksi.

Kolmannen tason välimuisti on ollut olemassa Alpha 21165 -prosessorin (96 kt, prosessorit esiteltiin vuonna 1995) tai IBM Power 4:n (256 kt, 2001) alkuajoista lähtien. Kuitenkin x86-pohjaisissa arkkitehtuureissa L3-välimuisti ilmestyi ensin Intel Itanium 2-, Pentium 4 Extreme- (Gallatin, molemmat prosessorit vuonna 2003) ja Xeon MP (2006) -malleissa.

Varhaiset toteutukset tarjosivat vain toisen tason välimuistihierarkiassa, vaikka nykyaikaiset arkkitehtuurit käyttävät L3-välimuistia suurena jaettuna puskurina ytimien välistä tiedonsiirtoa varten moniytimisissä prosessoreissa. Tätä korostaa korkea assosiatiivisuuden n-aste. On parempi etsiä tietoja hieman pidempään välimuistista kuin päätyä tilanteeseen, jossa useat ytimet käyttävät erittäin hidasta pääsyä RAM-muistiin. AMD esitteli ensimmäisen kerran L3-välimuistin pöytäkoneen prosessorissa jo mainitulla Phenom-linjalla. 65 nm:n Phenom X4 sisälsi 2 Mt jaettua L3-välimuistia, ja nykyaikaisessa 45 nm:n Phenom II X4:ssä on jo 6 Mt jaettua L3-välimuistia. Intel Core i7- ja i5-prosessorit käyttävät 8 Mt L3-välimuistia.

Nykyaikaisissa neliytimisissä prosessoreissa on omat L1- ja L2-välimuistit jokaiselle ytimelle sekä suuri L3-välimuisti, joka on jaettu kaikkien ytimien kesken. Jaettu L3-välimuisti mahdollistaa myös tietojen vaihdon, jota ytimet voivat työskennellä rinnakkain.


Kuinka tärkeä L3-välimuisti on AMD-prosessoreille?

Itse asiassa on järkevää varustaa moniytimiset prosessorit erillisellä muistilla, joka jaetaan kaikkien käytettävissä olevien ytimien kesken. Tässä roolissa nopea kolmannen tason (L3) välimuisti voi merkittävästi nopeuttaa useimmin pyydettyjen tietojen käyttöä. Tällöin ytimien, jos mahdollista, ei tarvitse käyttää hidasta päämuistia (RAM).

Ainakin teoriassa. AMD julkisti äskettäin Athlon II X4 -prosessorin, joka on malli Phenom II X4:stä ilman L3-välimuistia, vihjaten, että se ei ole niin tarpeellinen. Päätimme verrata suoraan kahta prosessoria (L3-välimuistilla ja ilman) testataksemme, kuinka välimuisti vaikuttaa suorituskykyyn.

Miten välimuisti toimii?

Ennen kuin sukeltaamme testeihin, on tärkeää ymmärtää joitakin perusasioita. Välimuistin toimintaperiaate on melko yksinkertainen. Välimuisti puskuroi tiedot mahdollisimman lähelle prosessorin prosessointiytimiä vähentääkseen prosessorin pyyntöjä kaukaisempaan ja hitaampaan muistiin. Nykyaikaisissa työpöytäalustoissa välimuistihierarkia sisältää jopa kolme tasoa, jotka edeltävät RAM-muistin käyttöä. Lisäksi toisen ja erityisesti kolmannen tason välimuistit eivät palvele vain datan puskurointia. Niiden tarkoitus on estää prosessoriväylän ylikuormitus, kun ytimien on vaihdettava tietoja.

Osumat ja epäonnistumiset

Välimuistiarkkitehtuurien tehokkuutta mitataan osumanopeudella. Tietopyynnöt, jotka välimuisti voi täyttää, katsotaan osumiksi. Jos tämä välimuisti ei sisällä tarvittavia tietoja, pyyntö välitetään edelleen muistiliukuhihnaa pitkin ja lasketaan ohitus. Tietenkin väliin jääminen lisää tiedon saamiseen kuluvaa aikaa. Tämän seurauksena "kuplia" (joutokäyntiä) ja viiveitä ilmaantuu laskentaputkeen. Osumat päinvastoin antavat sinun ylläpitää maksimaalista suorituskykyä.

Välimuistin syöttö, yksinoikeus, johdonmukaisuus

Korvauskäytännöt määräävät, kuinka välimuistissa vapautetaan tilaa uusille merkinnöille. Koska välimuistiin kirjoitetun tiedon täytyy lopulta ilmestyä päämuistiin, järjestelmät voivat tehdä sen samanaikaisesti välimuistiin kirjoittamisen kanssa (läpikirjoittaminen) tai ne voivat merkitä tietoalueet "likaiseksi" (takaisinkirjoitus) ja kirjoittaa muisti, kun se poistetaan välimuistista.

Useiden välimuistitasojen tiedot voidaan tallentaa yksinomaan, eli ilman redundanssia. Tällöin et löydä samoja tietorivejä kahdesta eri välimuistihierarkiassa. Tai välimuistit voivat toimia kattavasti, eli alemmat välimuistitasot sisältävät taatusti ylemmillä välimuistitasoilla (lähempänä prosessorin ydintä) olevia tietoja. AMD Phenom käyttää ainutlaatuista L3-välimuistia, kun taas Intel noudattaa kattavaa välimuististrategiaa. Koherenssiprotokollat ​​varmistavat tietojen eheyden ja tuoreuden eri ytimillä, välimuistitasoilla ja jopa prosessoreissa.

Välimuistin koko

Suurempaan välimuistiin mahtuu enemmän tietoa, mutta se lisää viivettä. Lisäksi suuri välimuisti kuluttaa huomattavan määrän prosessoritransistoreita, joten on tärkeää löytää tasapaino transistorin budjetin, suutinkoon, virrankulutuksen ja suorituskyvyn/viiveen välillä.

Assosiatiivisuus

RAM:n merkinnät voidaan yhdistää suoraan välimuistiin, toisin sanoen RAM-muistin tietojen kopiolle on vain yksi välimuistipaikka tai ne voivat olla n-suuntaisia ​​assosiatiivisia, eli välimuistissa on n mahdollista paikkaa, joissa tämä tietoja voidaan tallentaa. Korkeammat assosiatiivisuusasteet (jopa täysin assosiatiiviset välimuistit) tarjoavat suuremman välimuistin joustavuuden, koska välimuistissa olevia tietoja ei tarvitse kirjoittaa uudelleen. Toisin sanoen korkea n-aste assosiatiivisuus takaa suuremman osumasuhteen, mutta se lisää myös latenssia, koska kaikkien näiden assosiaatioiden tarkistaminen osuman varalta vie enemmän aikaa. Tyypillisesti korkein assosiaatioaste on kohtuullinen viimeiselle välimuistitasolle, koska siellä on käytettävissä maksimikapasiteetti, ja tiedon etsiminen tämän välimuistin ulkopuolelta johtaa siihen, että prosessori käyttää hidasta RAM-muistia.

Tässä muutamia esimerkkejä: Core i5 ja i7 käyttävät 32 kilotavua L1-välimuistia 8-suuntaisella assosiatiivisuudella tiedoille ja 32 kilotavua L1-välimuistia 4-suuntaisella assosiatiivisuudella ohjeille. On ymmärrettävää, että Intel haluaa, että ohjeet ovat saatavilla nopeammin ja L1-tietovälimuistilla on suurin osumaprosentti. Intel-suorittimien L2-välimuistissa on 8-suuntainen assosiatiivisuus, ja Intelin L3-välimuisti on vielä älykkäämpi, koska se toteuttaa 16-suuntaisen assosiatiivisuuden maksimoidakseen osumia.

AMD noudattaa kuitenkin erilaista strategiaa Phenom II X4 -prosessorien kanssa, jotka käyttävät kaksisuuntaista assosiatiivista L1-välimuistia latenssin vähentämiseksi. Mahdollisten puutteiden kompensoimiseksi välimuistin kapasiteetti kaksinkertaistettiin: 64 KB datalle ja 64 KB ohjeille. L2-välimuistissa on 8-suuntainen assosiatiivisuus, kuten Intel-suunnittelussa, mutta AMD:n L3-välimuisti toimii 48-suuntaisella assosiatiivisuudella. Mutta päätöstä valita yksi välimuistiarkkitehtuuri toisen sijasta ei voida arvioida ottamatta huomioon koko CPU-arkkitehtuuria. On aivan luonnollista, että testituloksilla on käytännön merkitystä, ja tavoitteemme oli juuri tämän monimutkaisen monitasoisen välimuistirakenteen käytännön testaus.

Melkein kaikki kehittäjät tietävät, että prosessorin välimuisti on pieni mutta nopea muisti, joka tallentaa tietoja äskettäin vierailluilta muistialueilta - määritelmä on lyhyt ja melko tarkka. Välimuistimekanismeja koskevien tylsyjen yksityiskohtien tunteminen on kuitenkin välttämätöntä koodin suorituskykyyn vaikuttavien tekijöiden ymmärtämiseksi.

Tässä artikkelissa tarkastellaan useita esimerkkejä, jotka kuvaavat välimuistien eri ominaisuuksia ja niiden vaikutusta suorituskykyyn. Esimerkit ovat C#:n kielellä, kielen ja alustan valinta ei vaikuta suuresti suoritusarviointiin ja lopullisiin johtopäätöksiin. Luonnollisesti, jos valitset kohtuullisissa rajoissa kielen, jossa arvon lukeminen taulukosta vastaa hajautustaulukkoon pääsyä, et saa tulkittavia tuloksia. Kääntäjän huomautukset ovat kursiivilla.

Habracut - - -

Esimerkki 1: Muistin käyttö ja suorituskyky

Kuinka paljon nopeampi luulet toisen syklin olevan kuin ensimmäinen?
int arr = uusi int;

// ensin
for (int i = 0; i< arr.Length; i++) arr[i] *= 3;

// sekunti
for (int i = 0; i< arr.Length; i += 16) arr[i] *= 3;


Ensimmäinen silmukka kertoo kaikki taulukon arvot kolmella, toinen silmukka kertoo vain joka kuudestoista arvo. Toinen sykli päättyy vasta 6% toimii ensimmäinen sykli, mutta nykyaikaisissa koneissa molemmat syklit suoritetaan suunnilleen samassa ajassa: 80 ms Ja 78 ms vastaavasti (koneellani).

Ratkaisu on yksinkertainen - muistin käyttö. Näiden silmukoiden nopeus määräytyy ensisijaisesti muistialijärjestelmän nopeuden mukaan, ei kokonaislukujen kertolaskunopeuden mukaan. Kuten seuraavassa esimerkissä näemme, RAM-käyttöjen määrä on sama sekä ensimmäisessä että toisessa tapauksessa.

Esimerkki 2: Välimuistirivien vaikutus

Kaivataan syvemmälle ja kokeillaan muita askelarvoja, ei vain 1 ja 16:
for (int i = 0; i< arr.Length; i += K /* шаг */ ) arr[i] *= 3;

Tässä ovat tämän silmukan kulkuajat eri askelarvoille K:

Huomaa, että askelarvoilla 1-16 toiminta-aika pysyy käytännössä ennallaan. Mutta arvoilla, jotka ovat suurempia kuin 16, käyntiaika lyhenee noin puolella joka kerta, kun askel kaksinkertaistuu. Tämä ei tarkoita, että silmukka jotenkin taianomaisesti alkaisi toimia nopeammin, vaan iteraatioiden määrä myös pienenee. Avainkohta on sama toiminta-aika askelarvoilla 1-16.

Syynä tähän on se, että nykyaikaiset prosessorit eivät käytä muistia tavu kerrallaan, vaan pieniä lohkoja, joita kutsutaan välimuistiriveiksi. Tyypillisesti merkkijonon koko on 64 tavua. Kun luet minkä tahansa arvon muistista, välimuistiin tulee vähintään yksi välimuistirivi. Myöhemmin pääsy mihin tahansa arvoon tältä riviltä on erittäin nopeaa.

Koska 16 int-arvoa vievät 64 tavua, silmukat, joiden vaiheet ovat 1–16, pääsevät samaan määrään välimuistirivejä tai tarkemmin sanottuna kaikkia taulukon välimuistirivejä. Vaiheessa 32 pääsy tapahtuu joka toiselle riville, vaiheessa 64, joka neljännelle.

Tämän ymmärtäminen on erittäin tärkeää joidenkin optimointitekniikoiden kannalta. Sen käyttökertojen määrä riippuu tietojen sijainnista muistissa. Esimerkiksi kohdistamattomat tiedot voivat vaatia kaksi pääsyä päämuistiin yhden sijasta. Kuten yllä havaitsimme, toimintanopeus on kaksi kertaa pienempi.

Esimerkki 3: Tasojen 1 ja 2 välimuistikoot (L1 ja L2)

Nykyaikaisissa prosessoreissa on tyypillisesti kaksi tai kolme tasoa välimuistia, joita yleensä kutsutaan nimellä L1, L2 ja L3. Eri tasojen välimuistien koon selvittämiseksi voit käyttää CoreInfo-apuohjelmaa tai Windows API -toimintoa GetLogicalProcessorInfo. Molemmat menetelmät tarjoavat myös tietoa välimuistin rivin koosta kullekin tasolle.

Koneeni CoreInfo raportoi 32 kilotavua L1-tietovälimuistia, 32 kilotavua L1-käskyvälimuistia ja 4 megatavua L2-tietovälimuistia. Jokaisella ytimellä on omat henkilökohtaiset L1-välimuistinsa, L2-välimuistit jaetaan jokaisen ydinparin kesken:

Looginen prosessori välimuistikarttaan: *--- Tietovälimuisti 0, taso 1, 32 kt, Assoc 8, LineSize 64 *--- käskyvälimuisti 0, taso 1, 32 kt, Assoc 8, LineSize 64 -*-- tietovälimuisti 1, Taso 1, 32 kt, Assoc 8, LineSize 64 --*-- Ohjevälimuisti 1, taso 1, 32 kt, Assoc 8, LineSize 64 **-- Unified Cache 0, Level 2, 4 Mt, Assoc 16, LineS 64 --*- Tietovälimuisti 2, taso 1, 32 kt, Assoc 8, LineSize 64 --*- käskyvälimuisti 2, taso 1, 32 kt, Assoc 8, LineSize 64 ---* tietovälimuisti 3, taso 1, 32 kt, Assoc 8, LineSize 64 ---* käskyvälimuisti 3, taso 1, 32 kt, Assoc 8, LineSize 64 --** yhdistetty välimuisti 1, taso 2, 4 megatavua, Assoc 16, LineSize 64
Tarkastetaan nämä tiedot kokeellisesti. Tätä varten käymme taulukon läpi ja lisäämme joka 16. arvoa - helppo tapa muuttaa kunkin välimuistirivin tietoja. Kun saavutamme lopun, palaamme alkuun. Tarkastellaan eri taulukoiden koot; meidän pitäisi nähdä suorituskyvyn lasku, kun taulukko ei enää mahdu eritasoisiin välimuistiin.

Koodi on:

int askeleet = 64 * 1024 * 1024; // iteraatioiden määrä
int pituusMod = arr.Length - 1; // taulukon koko -- kahden potenssi

for (int i = 0; i< steps; i++)
{
// x & pituusMod = x % arr.Length, koska kahden potenssit
arr[(i * 16) & pituusMod]++;
}


Testitulokset:

Koneeni suorituskyky on laskenut huomattavasti 32 kt ja 4 megatavun jälkeen - nämä ovat L1- ja L2-välimuistien koot.

Esimerkki 4: Ohjeiden rinnakkaisuus

Katsotaan nyt jotain muuta. Kumpi näistä kahdesta silmukasta mielestäsi suoritetaan nopeammin?
int vaiheet = 256 * 1024 * 1024;
int a = uusi int ;

// ensin
for (int i = 0; i< steps; i++) { a++; a++; }

// sekunti
for (int i = 0; i< steps; i++) { a++; a++; }


Osoittautuu, että toinen silmukka toimii melkein kaksi kertaa nopeammin, ainakin kaikilla testaamillani koneilla. Miksi? Koska silmukoiden sisällä olevilla komennoilla on erilaiset datariippuvuudet. Ensimmäisillä komennoilla on seuraava riippuvuusketju:

Toisessa jaksossa riippuvuudet ovat:

Nykyaikaisten prosessorien toiminnalliset osat pystyvät suorittamaan tietyn määrän tiettyjä toimintoja samanaikaisesti, yleensä ei kovin suurta määrää. Esimerkiksi rinnakkainen pääsy L1-välimuistin tietoihin kahdessa osoitteessa on mahdollista, ja myös kahden yksinkertaisen aritmeettisen käskyn samanaikainen suorittaminen on mahdollista. Ensimmäisellä jaksolla prosessori ei voi käyttää näitä ominaisuuksia, mutta voi toisessa.

Esimerkki 5: Välimuistin assosiaatio

Yksi keskeisistä kysymyksistä, johon on vastattava välimuistia suunniteltaessa, on, voidaanko tietystä muistialueesta tallentaa tietoja mihin tahansa välimuistin soluun vai vain joihinkin niistä. Kolme mahdollista ratkaisua:
  1. Suora kartoitusvälimuisti,Jokaisen RAM-muistin välimuistirivin tiedot tallennetaan vain yhteen ennalta määritettyyn välimuistipaikkaan. Yksinkertaisin tapa laskea kartoitus on: rivi_indeksi_muistissa % välimuistin_solujen_määrä. Kaksi samaan soluun yhdistettyä riviä ei voi olla välimuistissa samanaikaisesti.
  2. N-merkinnän osittainen assosiatiivinen välimuisti, jokainen rivi voidaan tallentaa N:ään eri välimuistipaikkaan. Esimerkiksi 16 merkinnän välimuistissa rivi voidaan tallentaa yhteen 16 solusta, jotka muodostavat ryhmän. Tyypillisesti rivit, joilla on yhtä vähiten merkitseviä indeksibittejä, jakavat yhden ryhmän.
  3. Täysin assosiatiivinen välimuisti, mikä tahansa rivi voidaan tallentaa mihin tahansa välimuistiin. Ratkaisu vastaa toiminnaltaan hash-taulukkoa.
Suoraan kartoitetut välimuistit ovat alttiita kiistalle, esimerkiksi kun kaksi riviä kilpailee samasta solusta, vuorotellen häätää toisiaan välimuistista, tehokkuus on erittäin alhainen. Toisaalta täysin assosiatiiviset välimuistit, vaikka ne eivät sisällä tätä haittaa, ovat erittäin monimutkaisia ​​ja kalliita toteuttaa. Osittain assosiatiiviset välimuistit ovat tyypillinen kompromissi toteutuksen monimutkaisuuden ja tehokkuuden välillä.

Esimerkiksi minun koneessani 4 Mt:n L2-välimuisti on 16-merkinnän osittainen assosiatiivinen välimuisti. Koko RAM on jaettu rivijoukkoon niiden indeksien vähiten merkitsevien bittien mukaan, jokaisen sarjan rivit kilpailevat yhdestä 16 L2-välimuistisolun ryhmästä.

Koska L2-välimuistissa on 65 536 solua (4 * 2 20 / 64) ja jokainen ryhmä koostuu 16 solusta, meillä on yhteensä 4 096 ryhmää. Siten riviindeksin alemmat 12 bittiä määräävät, mihin ryhmään tämä rivi kuuluu (2 12 = 4 096). Tämän seurauksena rivit, joiden osoitteet ovat 262 144 (4 096 * 64) kerrannaisia, jakavat saman 16 solun ryhmän ja kilpailevat tilasta siinä.

Jotta assosiatiivisuuden vaikutukset tulisivat voimaan, meidän on käytettävä jatkuvasti useita rivejä samasta ryhmästä, esimerkiksi käyttämällä seuraavaa koodia:

julkinen staattinen pitkä PäivitäEveryKthByte(tavu arr, int K)
{
const int rep = 1024 * 1024; // iteraatioiden määrä

Sekuntikello sw = Sekuntikello.AloitaUusi();

int p = 0;
for (int i = 0; i< rep; i++)
{
arr[p]++;

P + = K; jos (p >= arr.Pituus) p = 0;
}

Sw.Stop();
return sw.ElapsedMilliseconds;
}


Menetelmä kasvattaa taulukon jokaista K:nnettä elementtiä. Kun saavutamme lopun, aloitamme alusta. Melko suuren iteraatiomäärän (2 20) jälkeen lopetamme. Tein ajoja eri matriikoille ja K-askelarvoille. Tulokset (sininen - pitkä käyttöaika, valkoinen - lyhyt):

Siniset alueet vastaavat niitä tapauksia, joissa välimuisti ei pysty mukautumaan jatkuvan datan muutoksilla kaikki tarvittavat tiedot kerralla. Kirkkaan sininen väri tarkoittaa noin 80 ms toiminta-aikaa, lähes valkoinen - 10 ms.

Käsitellään sinisiä alueita:

  1. Miksi pystysuorat viivat näkyvät? Pystyviivat vastaavat askelarvoja, joilla päästään liian montaa riviä (yli 16) yhdestä ryhmästä. Näille arvoille koneeni 16-merkinnän välimuisti ei voi majoittaa kaikkia tarvittavia tietoja.

    Jotkut huonon askeleen arvoista ovat kahden potenssit: 256 ja 512. Harkitse esimerkiksi askelta 512 ja 8 megatavua. Tässä vaiheessa taulukossa on 32 osiota (8 * 2 20 / 262 144), jotka kilpailevat keskenään soluista 512 välimuistiryhmässä (262 144 / 512). Osioita on 32, mutta välimuistissa on vain 16 solua jokaiselle ryhmälle, joten tilaa ei ole tarpeeksi kaikille.

    Muut askelarvot, jotka eivät ole kahden potenssit, ovat yksinkertaisesti epäonnisia, mikä aiheuttaa suuren määrän osumia samoihin välimuistiryhmiin ja johtaa myös pystysuorien sinisten viivojen ilmestymiseen kuvassa. Tässä vaiheessa lukuteorian ystävät kehotetaan ajattelemaan.

  2. Miksi pystyviivat katkeavat 4 Mt:n rajalla? Kun taulukon koko on 4 Mt tai vähemmän, 16-merkinnän välimuisti käyttäytyy täysin assosiatiivisena välimuistina, eli siihen mahtuu kaikki taulukon tiedot ilman ristiriitoja. Yhdestä välimuistiryhmästä taistelee korkeintaan 16 aluetta (262 144 * 16 = 4 * 2 20 = 4 Mt).
  3. Miksi vasemmassa yläkulmassa on iso sininen kolmio? Koska pienellä askeleella ja suurella taulukolla välimuisti ei mahdu kaikkia tarvittavia tietoja. Välimuistin assosiatiivisuusaste on tässä toissijainen; rajoitus liittyy L2-välimuistin kokoon.

    Esimerkiksi taulukon koolla 16 Mt ja askeleella 128, käytämme joka 128. tavua, mikä muuttaa joka toista taulukon välimuistiriviä. Joka toisen rivin tallentamiseen välimuistiin tarvitset 8 Mt välimuistia, mutta koneellani on vain 4 Mt.

    Vaikka välimuisti olisi täysin assosiatiivinen, se ei sallisi 8 Mt:n tiedon tallentamista siihen. Huomaa, että jo käsitellyssä esimerkissä askeleella 512 ja taulukon koolla 8 MB tarvitsemme vain 1 MB välimuistia kaiken tarvittavan tiedon tallentamiseen, mutta tämä on mahdotonta välimuistin riittämättömän assosiatiivisuuden vuoksi.

  4. Miksi kolmion vasen puoli voimistuu vähitellen? Suurin intensiteetti esiintyy 64 tavun askelarvolla, joka on yhtä suuri kuin välimuistirivin koko. Kuten näimme ensimmäisessä ja toisessa esimerkissä, peräkkäinen pääsy samalle riville ei maksa melkein mitään. Oletetaan, että 16 tavun askeleella meillä on neljä muistin käyttöä yhden hinnalla.

    Koska iteraatioiden määrä on sama testissämme mille tahansa askelarvolle, halvempi askel johtaa lyhyempään ajoaikaan.

Havaitut vaikutukset säilyvät suurilla parametriarvoilla:

Välimuistin assosiatiivisuus on mielenkiintoinen asia, joka voi ilmetä tietyissä olosuhteissa. Toisin kuin muut tässä artikkelissa käsitellyt ongelmat, se ei ole niin vakava. Se ei todellakaan vaadi jatkuvaa huomiota ohjelmia kirjoitettaessa.

Esimerkki 6: Väärä välimuistin osiointi

Moniytimisissä koneissa saatat kohdata toisen ongelman - välimuistin koherenssin. Prosessoriytimillä on osittain tai kokonaan erilliset välimuistit. Koneeni L1-välimuistit ovat erillisiä (kuten tavallista), ja jokaisella ydinparilla on myös kaksi L2-välimuistia. Yksityiskohdat voivat vaihdella, mutta yleensä nykyaikaisissa moniytimisissä prosessoreissa on monitasoiset hierarkkiset välimuistit. Lisäksi nopeimmat, mutta myös pienimmät välimuistit kuuluvat yksittäisille ytimille.

Kun yksi ydin muuttaa välimuistissaan olevaa arvoa, muut ytimet eivät voi enää käyttää vanhaa arvoa. Muiden ytimien välimuistien arvot on päivitettävä. Lisäksi se on päivitettävä koko välimuistirivi, koska välimuistit käyttävät dataa rivitasolla.

Osoitetaan tämä ongelma seuraavalla koodilla:

yksityinen staattinen int s_counter = uusi int ;

yksityinen void UpdateCounter(int position)
{
for (int j = 0; j< 100000000; j++)
{
s_laskuri = s_laskuri + 3;
}
}


Jos neliytimisessä koneessani kutsun tätä menetelmää parametreilla 0, 1, 2, 3 samanaikaisesti neljästä säikeestä, niin ajoaika on 4,3 sekuntia. Mutta jos kutsun menetelmää parametreilla 16, 32, 48, 64, ajoaika on vain 0,28 sekuntia.

Miksi? Ensimmäisessä tapauksessa kaikki neljä säikeiden kulloinkin käsittelemää arvoa päätyvät todennäköisesti yhdelle välimuistiriville. Joka kerta kun yksi ydin lisää arvoa, se merkitsee välimuistisolut, jotka sisältävät kyseisen arvon muissa ytimissä, virheellisiksi. Tämän toimenpiteen jälkeen kaikkien muiden ytimien on tallennettava rivi uudelleen välimuistiin. Tämä tekee välimuistimekanismista käyttökelvottoman, mikä tappaa suorituskyvyn.

Esimerkki 7: Laitteiston monimutkaisuus

Vielä nytkin, kun välimuistin toiminnan periaatteet eivät ole sinulle salaisuus, laitteisto tarjoaa sinulle silti yllätyksiä. Prosessorit eroavat toisistaan ​​optimointimenetelmien, heuristiikan ja muiden toteutuksen hienouksien suhteen.

Joidenkin prosessorien L1-välimuisti voi käyttää kahta solua rinnakkain, jos ne kuuluvat eri ryhmiin, mutta jos ne kuuluvat samaan ryhmään, vain peräkkäin. Sikäli kuin tiedän, jotkut voivat jopa käyttää saman solun eri osia rinnakkain.

Prosessorit voivat yllättää sinut älykkäillä optimoinnilla. Esimerkiksi edellisen esimerkin koodi väärästä välimuistin jakamisesta ei toimi kotitietokoneellani tarkoitetulla tavalla - yksinkertaisimmissa tapauksissa prosessori voi optimoida työn ja vähentää negatiivisia vaikutuksia. Jos muutat koodia hieman, kaikki loksahtaa paikoilleen.

Tässä on toinen esimerkki oudoista laitteiston omituisista ominaisuuksista:

yksityinen staattinen int A, B, C, D, E, F, G;

yksityinen staattinen tyhjyys Oudot()
{
for (int i = 0; i< 200000000; i++)
{
<какой-то код>
}
}


Jos sen sijaan<какой-то код>Korvaa kolme eri vaihtoehtoa, saat seuraavat tulokset:

Kenttien A, B, C, D lisääminen kestää kauemmin kuin kenttien A, C, E, G kasvattaminen. Vielä kummallisempaa on, että kenttien A ja C lisääminen kestää kauemmin kuin kenttien A, C Ja E, G. En tiedä tarkalleen, mistä tämä johtuu, mutta ehkä ne liittyvät muistipankkeihin ( kyllä, kyllä, tavallisilla kolmen litran säästömuistipankeilla, eikä niin kuin luulit). Jos sinulla on ajatuksia tästä asiasta, kerro kommenteissa.

Koneellani yllä olevaa ei havaita, mutta joskus on epätavallisen huonoja tuloksia - todennäköisimmin tehtävien ajoitus tekee omat "säätönsä".

Tästä esimerkistä opittava opetus on, että laitteiston käyttäytymistä on hyvin vaikea ennustaa täysin. Joo, Voi ennustaa paljon, mutta sinun on jatkuvasti vahvistettava ennustuksesi mittausten ja testauksen avulla.

Johtopäätös

Toivon, että kaikki edellä käsitelty on auttanut sinua ymmärtämään prosessorin välimuistien suunnittelua. Nyt voit hyödyntää tätä tietämystä käytännössä optimoidaksesi koodisi.

Useimpien nykyaikaisten pöytätietokoneiden siruissa on neljä ydintä, mutta sirujen valmistajat ovat jo ilmoittaneet suunnitelmistaan ​​siirtyä kuuteen ytimiseen, ja 16-ytimiset prosessorit eivät ole vieläkään harvinaisia ​​huippuluokan palvelimissa.

Mitä enemmän ytimiä on, sitä suurempi ongelma on jakaa muistia kaikkien ytimien välillä samalla kun ne toimivat yhdessä. Ydinten määrän kasvaessa on entistä hyödyllisempää minimoida ytimien hallintaan menetetty aika datan käsittelyssä - koska tiedonvaihdon nopeus on jäljessä prosessorin ja muistin tietojenkäsittelyn nopeudesta. Voit käyttää fyysisesti jonkun muun nopeaa välimuistia tai omaa hidasta välimuistia, mutta säästää tiedonsiirtoaikaa. Tehtävää vaikeuttaa se, että ohjelmien pyytämä muistimäärä ei selvästi vastaa kunkin tyypin välimuistin määrää.

Fyysisesti vain hyvin rajallinen määrä muistia voidaan sijoittaa mahdollisimman lähelle prosessoria - prosessorin L1-välimuistia, jonka määrä on erittäin merkityksetön. Daniel Sanchez, Po-An Tsai ja Nathan Beckmann, Massachusetts Institute of Technologyn tietojenkäsittelytieteen ja tekoälylaboratorion tutkijat, opettivat tietokoneen konfiguroimaan erilaisia ​​muistityyppejä joustavaa ohjelmahierarkiaa varten reaaliajassa. Uusi järjestelmä, nimeltään Jenga, analysoi volyymitarpeita ja ohjelmien muistiin pääsyn tiheyttä ja jakaa uudelleen kunkin kolmen tyyppisen prosessorin välimuistin tehon yhdistelminä, jotka lisäävät tehokkuutta ja säästävät energiaa.


Aluksi tutkijat testasivat suorituskyvyn kasvua yhdistettäessä staattista ja dynaamista muistia työskennellessään yhden ytimen prosessorin ohjelmien parissa ja saivat ensisijaisen hierarkian - milloin on parempi käyttää kumpaa yhdistelmää. 2 muistityypistä tai yhdestä. Arvioitiin kaksi parametria: signaalin viive (latenssi) ja energiankulutus kunkin ohjelman toiminnan aikana. Noin 40 % ohjelmista alkoi toimia huonommin yhdistelmällä muistityyppejä, loput - paremmin. Kun tutkijat rakensivat Jenga-järjestelmänsä, mitkä ohjelmat "tykkäävät" sekavasta suorituskyvystä ja mitkä muistin koosta.

He testasivat virtuaalisesti 4 tyyppistä ohjelmaa virtuaalisessa tietokoneessa, jossa oli 36 ydintä. Testatut ohjelmat:

  • omnet - Objective Modular Network Testbed, C-simulaatiokirjasto ja verkon simulointityökalujen alusta (sininen kuvassa)
  • mcf - Meta Content Framework (punainen väri)
  • astar - virtuaalitodellisuuden näyttöohjelmisto (vihreä)
  • bzip2 - arkistointilaite (violetti väri)


Kuvassa näkyy missä ja miten kunkin ohjelman tiedot on käsitelty. Kirjaimet osoittavat, missä kukin sovellus toimii (yksi per kvadrantti), värit osoittavat, missä sen tiedot sijaitsevat, ja varjostus ilmaisee virtuaalisen hierarkian toisen tason, kun se on olemassa.

Välimuistin tasot

CPU-välimuisti on jaettu useisiin tasoihin. Yleisprosessoreille - jopa 3. Nopein muisti on ensimmäisen tason välimuisti - L1-välimuisti, koska se sijaitsee samassa sirussa kuin prosessori. Koostuu käskyvälimuistista ja datavälimuistista. Jotkut prosessorit ilman L1-välimuistia eivät voi toimia. L1-välimuisti toimii prosessorin taajuudella ja sitä voidaan käyttää joka kellojakso. Usein on mahdollista suorittaa useita luku-/kirjoitustoimintoja samanaikaisesti. Äänenvoimakkuus on yleensä pieni - enintään 128 kt.

Toisen tason välimuisti, L2, on vuorovaikutuksessa L1-välimuistin kanssa. Se on toiseksi nopein. Se sijaitsee yleensä joko sirulla, kuten L1, tai ytimen välittömässä läheisyydessä, kuten prosessorin kasetissa. Vanhemmissa prosessoreissa joukko siruja emolevyllä. L2-välimuistin määrä 128 kt - 12 megatavua. Nykyaikaisissa moniytimisissä prosessoreissa samassa sirussa sijaitseva toisen tason välimuisti on erillinen muisti - välimuistin kokonaiskoko on 8 Mt, jokainen ydin vastaa 2 Mt. Tyypillisesti ydinsirun L2-välimuistin latenssi on 8 - 20 ydinkellojaksoa. Tehtävissä, joihin liittyy lukuisia pääsyä rajoitetulle muistialueelle, esimerkiksi DBMS, sen täysi käyttö lisää tuottavuutta kymmenkertaiseksi.

L3-välimuisti on yleensä vielä suurempi, vaikkakin hieman hitaampi kuin L2-välimuisti (johtuen siitä, että L2-L3-väylä on kapeampi kuin L1-L2-väylä). L3 sijaitsee yleensä erillään CPU-ytimestä, mutta voi olla suuri - yli 32 MB. L3-välimuisti on hitaampi kuin aiemmat välimuistit, mutta silti nopeampi kuin RAM. Moniprosessorijärjestelmissä se on yleisessä käytössä. Kolmannen tason välimuistin käyttö on perusteltua hyvin kapealla alueella, ja se ei välttämättä vain lisää suorituskykyä, vaan päinvastoin johtaa järjestelmän suorituskyvyn yleiseen heikkenemiseen.

Toisen ja kolmannen tason välimuistin poistaminen käytöstä on hyödyllisintä matemaattisissa ongelmissa, kun tiedon määrä on pienempi kuin välimuistin koko. Tässä tapauksessa voit ladata kaikki tiedot L1-välimuistiin kerralla ja käsitellä ne.


Jenga määrittää ajoittain uudelleen virtuaaliset hierarkiat käyttöjärjestelmätasolla tiedonvaihdon minimoimiseksi ottaen huomioon resurssirajoitukset ja sovellusten käyttäytymisen. Jokainen uudelleenkonfigurointi koostuu neljästä vaiheesta.

Jenga ei jaa tietoja vain sen mukaan, mitä ohjelmia lähetetään - niille, jotka rakastavat suurta yksinopeuksista muistia tai niitä, jotka rakastavat sekavälimuistin nopeutta, vaan myös riippuen muistisolujen fyysisestä läheisyydestä käsiteltävään dataan. Riippumatta siitä, minkä tyyppistä välimuistia ohjelma vaatii oletuksena tai hierarkian mukaan. Tärkeintä on minimoida signaalin viive ja energiankulutus. Riippuen kuinka monesta muistityypistä ohjelma "tykkää", Jenga mallintaa kunkin virtuaalihierarkian latenssia yhdellä tai kahdella tasolla. Kaksitasoiset hierarkiat muodostavat pinnan, yksitasoiset hierarkiat muodostavat käyrän. Jenga heijastaa sitten minimiviiveen VL1:n mittoihin, jolloin tuloksena on kaksi käyrää. Lopuksi Jenga käyttää näitä käyriä parhaan hierarkian (eli VL1-koon) valitsemiseen.

Jengan käytöllä on ollut huomattava vaikutus. Virtuaalinen 36-ytiminen siru alkoi toimia 30 prosenttia nopeammin ja käytti 85 prosenttia vähemmän energiaa. Tietenkin toistaiseksi Jenga on vain simulaatio toimivasta tietokoneesta ja kestää jonkin aikaa ennen kuin näet todellisia esimerkkejä tästä välimuistista ja jopa ennen kuin siruvalmistajat ottavat sen käyttöön, jos he pitävät tekniikasta.

Perinteisen 36 ydinkoneen kokoonpano

  • Prosessorit. 36 ydintä, x86-64 ISA, 2,4 GHz, Silvermontin kaltainen OOO: 8B-leveä
    ifetch; 2-tasoinen bpred 512 × 10-bittisellä BHSR:llä + 1024 × 2-bittisellä PHT:lla, 2-suuntainen dekoodaus/annos/uudelleennimeä/toteutus, 32-merkinnän IQ ja ROB, 10-merkinnän LQ, 16-merkinnän SQ; 371 pJ/ohje, 163 mW/ydin staattinen teho
  • L1-välimuistit. 32 kt, 8-suuntainen joukkoliittyvä, jaettu data- ja käskyvälimuisti,
    3-jakson latenssi; 15/33 pJ per osuma/virhe
  • Prefetchers-palvelu. 16 merkinnän streamin esihakijat mallinnettu ja validoitu vastaan
    Nehalem
  • L2-välimuistit. 128 kilotavua yksityinen ydintä kohti, 8-suuntainen joukkoliittyvä, mukaan lukien, 6-jakson latenssi; 46/93 pJ per osuma/virhe
  • Yhtenäinen tila. 16-suuntaiset, 6-jaksoiset latenssihakemistopankit Jengalle; välimuistissa olevat L3-hakemistot muille
  • Globaali NoC. 6 × 6 mesh, 128-bittiset flitit ja linkit, X-Y-reititys, 2-vaiheiset liukuhihnareitittimet, 1-jaksoiset linkit; 63/71 pJ per reititin/linkki flit traversal, 12/4mW reititin/linkki staattinen teho
  • Staattinen muisti estää SRAM-muistin. 18 Mt, yksi 512 kt:n pankki ruutua kohden, 4-suuntainen 52-ehdokas zcache, 9-jaksoinen pankkiviive, Vantage-osiointi; 240/500 pJ per osuma/virhe, 28 mW/pankki staattinen teho
  • Monikerroksinen pinottu DRAM. 1152 Mt, yksi 128 Mt:n varasto 4 ruutua kohti, seos MAP-I DDR3-3200:lla (1600 MHz), 128-bittinen väylä, 16 riviä, 8 pankkia/sijoitus, 2 kt rivipuskuri; 4,4/6,2 nJ osumaa/virhettä kohden, 88 mW/holvin staattinen teho
  • Päämuisti. 4 DDR3-1600 kanavaa, 64-bittinen väylä, 2 riviä/kanava, 8 pankkia/sijoitus, 8 kt rivipuskuri; 20 nJ/käyttö, 4W staattinen teho
  • DRAM-ajoitukset. tCAS=8, tRCD=8, tRTP=4, tRAS=24, tRP=8, tRRD=4, tWTR=4, tWR=8, tFAW=18 (kaikki ajoitukset tCK:ssa; pinotulla DRAM:lla on puolet tCK:sta päämuistina )