Muistihierarkia

Tähän mennessä olemme viitanneet termillä muisti suorittimiin liitettyyn katoavaan (volatile) muistiin, joka on jaettu supertietokoneen solmussa olevien suoritinydinten kesken. Käytännössä suorittimissa on kuitenkin useita erilaisia muisteja, joiden ominaisuudet muodostavat hierarkian. Toisinaan myös muiden solmujen muisti, jota ei voi käyttää suoraan, lasketaan mukaan hierarkiaan.

Kun suoritinydin laskee 2,1 + 4,3, se hakee ensin kaksi numeroa keskusmuistista suoritinytimen rekistereihin. Tulos myös tallennetaan ensin rekisteriin, josta se sitten siirretään keskusmuistiin. Kuten olemme aiemmin todenneet, muistin käyttönopeus voi muodostaa suorituskyvyn pullonkaulan. Tämän helpottamiseksi nykyaikaisissa kuluttajalaitteiden ja supertietokoneiden suorittimissa on välimuisteja.

Välimuisti

Välimuisti on periaatteessa pieni määrä erittäin nopeaa välityömuistia suoritinytimen lähellä. Kun suoritinytimen on ladattava jotain keskusmuistista, se etsii sitä lähtökohtaisesti ensin välimuistista. Jos tiedot ovat välimuistissa, ne voidaan hakea sieltä rekisteriin nopeammin kuin keskusmuistista. Kun laskentatulos tallennetaan, se siirretään myös ensin rekisteristä välimuistiin ja kopioidaan keskusmuistiin vasta myöhemmin, kun välimuisti täyttyy.

Palataan esimerkkiin työntekijöistä toimistossa, jossa on kirjoitustaulu. Kirjoitustaulu on keskusmuisti, ja työntekijät tekevät laskutoimituksia työpöytiensä ääressä. Aina kun työntekijä lukee kirjoitustaulua tai kirjoittaa sille, hänen on poistuttava pöytänsä äärestä. Kuvitellaan nyt, että jokaisella työntekijällä on pieni muistikirja. Kun tietoja on luettava kirjoitustaululta, muistikirjaan lisätään kaikki tarvittavat tiedot, jotta työntekijä voi työskennellä työpöytänsä ääressä pidempään. Muistikirja (välimuisti) voi nopeuttaa muistin käyttöä huomattavasti erityisesti silloin, kun tehdään useita laskutoimituksia samoilla tiedoilla.



Tietojen kirjoittaminen

Välimuisti toimii erinomaisesti useiden työntekijöiden kesken, jos he ainoastaan lukevat tietoja. Valitettavasti todelliset ohjelmat myös kirjoittavat tietoja, mikä tarkoittaa esimerkissämme sitä, että työntekijät haluavat myös muuttaa kirjoitustaulun tietoja. Kun kaksi henkilöä käsittelee samoja tietoja samanaikaisesti, syntyy ongelma. Jos toinen työntekijä muuttaa muistikirjassaan olevia lukuja, muille työntekijöille on ilmoitettava siitä. Kompromissiratkaisu on ilmoittaa kaikille, kun muistikirjan tuloksia muokataan. Aina kun numeroa muutetaan, on esimerkiksi huudettava:

"Olen juuri muuttanut 231:nnen palkan merkintää. Jos sinulla on siitä kopio, sinun on pyydettävä uusi arvo minulta!"

Tämä voi toimia muutaman työntekijän kesken, mutta ongelmia syntyy, kun heitä on paljon. Kuvitellaan esimerkiksi 100 työntekijää. Kun lukua muutetaan, 99 muulle henkilölle on ilmoitettava siitä. Tämä johtaa ajan hukkaamiseen. Vielä pahempaa on, että työntekijöiden on jatkuvasti kuunneltava päivityksiä 99 muulta työntekijältä sen sijaan, että he voisivat keskittyä omiin laskelmiinsa.

Perusongelmana on, että muistin käyttö on niin hidasta, että tarvitaan pieniä ja nopeita välimuisteja, jotta tietoja voidaan hakea samaan tahtiin laskennan kanssa. Tästä aiheutuu kuitenkin tietojen kirjoittamiseen yleisrasite, joka kasvaa suoritinytimien määrän mukaan. Lopulta kaikki taas hidastuu.

Tietojen pitämistä yhdenmukaisina ja ajantasaisina kaikissa suoritinytimissä kutsutaan välimuistin yhtenäisyydeksi (cache coherency). Toimistoesimerkissä tämä tarkoittaa, että muistikirjassa on aina ajan tasalla olevat arvot tai ainakin tiedämme, milloin muistikirja on vanhentunut ja se on päivitettävä kirjoitustaulun mukaan. Välimuistin yhtenäisyyden varmistaminen on merkittävä este erittäin suurten moniydinsuorittimien luomisessa.


Laitteisto huolehtii tietojen siirtämisestä välimuisteihin ja niistä pois, eikä ohjelmoija voi ohjata tätä suoraan. Tietojen ja laskennan järjestäminen ohjelmakoodissa voi kuitenkin vaikuttaa siihen, miten tehokkaasti välimuistia voidaan käyttää. Kun esimerkiksi hiukkasia simuloidaan kolmessa ulottuvuudessa, hiukkasten koordinaatit voidaan tallentaa joko kolmeen N:n numeron listaan (kukin lista sisältää N:n hiukkasen x-, y- tai z-koordinaatit) tai N:ään kolmen numeron listaan (kukin lista sisältää yhden hiukkasen kolme koordinaattia). Välimuistin tehokkuus voi riippua siitä, miten koordinaatteja käytetään laskuissa. Esimerkiksi jos ensin tehdään laskuja vain x-koordinaateilla, voi tallennus kolmeen N:n numeron listaan olla tehokkaampaa.



Muistihierarkiapyramidi

Jotta muistin käyttönopeutta voidaan parantaa entisestään, useimmissa nykyaikaisissa suorittimissa käytetään useita välimuistitasoja. Rekisterit, eri välimuistit ja keskusmuisti muodostavat yhdessä muistihierarkiapyramidin.

Pyramidin muistitasoilla on seuraavat ominaisuudet:

  • Fyysinen sijainti: Mitä korkeammalla muistityyppi on pyramidissa, sitä lähempänä se on suoritinydintä.

  • Suorituskyky: Siirtonopeus (Mt/s) kasvaa siirryttäessä pyramidin yläosaa kohden.

  • Latenssi: Luku- ja kirjoituspyyntöjen latenssi tai hukka-aika lyhenee siirryttäessä ylöspäin hierarkiassa.

  • Kapasiteetti: Muistityyppiin mahtuvan tiedon määrä kasvaa siirryttäessä alareunaa kohden.

  • Tavukohtainen kustannus: Mitä korkeammalla muisti on pyramidissa, sitä kalliimpaa se on. Keskusmuisti on kalliimpaa kuin levy.

Muistityypit:

  • Rekisterit ovat nopein muistityyppi. Kaikki aritmeettiset toiminnot suoritetaan rekistereissä olevilla tiedoilla. Suorittimissa on yleiskäyttöisiä rekistereitä sekä rekistereitä tietyntyyppisille tiedoille ja toiminnoille. Fyysisesti rekisterit ovat osa suoritinydintä.

  • L1-, L2- ja L3-välimuistit ovat keskusmuistin ja rekisterien välisiä välimuisteja. L1-välimuisti on pienin ja nopein, kun taas L3 on suurin ja hitain. Kun suoritinydin hakee tietoa, se etsii sitä ensin L1-välimuistista, sitten L2-välimuistista ja lopuksi L3-välimuistista, ennen kuin se siirtyy tarvittaessa keskusmuistiin. Jokaisella ytimellä on usein oma L1- ja L2-välimuistinsa, mutta L3-välimuisti voi olla jaettu ytimien kesken. Esimerkiksi CSC:n Mahti-supertietokoneen AMD Rome -64-ytimisillä suorittimilla on seuraavat ominaisuudet:

    • L1-välimuisti: 32 KiB (+ 32 KiB käskyille), ytimen yksityinen
    • L2-välimuisti: 512 KiB, ytimen yksityinen
    • L3-välimuisti: 16 MiB, jaettu neljän ytimen kesken.



  • Keskusmuisti on solmussa oleva muisti, johon tallennetaan kaikki aktiivisten ohjelmien käskyt ja tiedot.

  • Etämuisti on toisen solmun keskusmuisti. Etämuistin käyttö edellyttää tiedonsiirtoa kytkentäverkon kautta.

  • Levyt voivat tallentaa tietoja ohjelman päättymisen tai tietokoneen sammuttamisen jälkeen toisin kuin kaikki muut tässä käsitellyt muistityypit. Levyn käyttäminen on hidasta, joten sitä käytetään yleensä vain ohjelman käynnistämisen (tietojen lataaminen) ja sulkemisen (tietojen tallentaminen) yhteydessä. Joskus ohjelman ajon aikana kirjoitetaan pieniä lokitietoja, ja joskus myös tarkistuspistetietoja, joiden avulla ohjelman suoritusta voidaan jatkaa odottamattomien virhetilanteiden jälkeen.


Sisältää "Supercomputing"-verkkokurssin materiaaleja (https://www.futurelearn.com/courses/supercomputing/), Edinburgh Supercomputing Center (EPCC), Creative Commons SA-BY -lisenssi