Õppetund
Teooria — Vahemälu lokaalsus: miks lugemisjärjekord loeb
Vahemälu on väike ja kiire mälu, mis hoiab põhimälu andmete koopiaid vahemäluridades. Iga rida mahutab ühe joondatud L-baidise ploki. Kui loetava aadressi plokk on juba vahemälus, on lugemise tulemus tabamus. Muidu on tulemuseks möödalask ja vahemällu laaditakse kogu plokk. S reaga otsevastendusega vahemälus saab aadressi a sisaldav plokk paikneda ainult real ⌊a / L⌋ mod S. Kui tsükkel loeb naaberaadresse järjest, saab ta igast laaditud plokist teha mitu lugemist. Seda nimetatakse ruumiliseks lokaalsuseks.
Mida iga sümbol tähendab
L- vahemälurea suurus baitides: siin 16, enamikul laua- ja serveriarvutite protsessoritel 64
S- vahemäluridade arv: siin 8
- Eeldab
- Eeldame algul tühja otsevastendusega vahemälu, 4-baidiseid int-tüüpi täisarve ja ridade kaupa mällu paigutatud maatriksit, nagu teeb C. Fortran paigutab maatriksi mällu veergude kaupa ja seal on kiirem teine lugemisjärjekord. Loendame ainult maatriksi lugemisi. Tegelikud esimese taseme andmevahemälud on suuremad ja hulgassotsiatiivsed, tavaliselt 8-kordselt assotsiatiivsed: plokk võib paikneda oma hulga mis tahes 8 real. See kõrvaldab enamiku siin nähtavatest konfliktidest, kuid ei lahenda ruumipuudust. Riistvaralist eellaadimist, mis toob järgmise ploki vahemällu juba enne selle küsimist, siin ei arvestata.
Ülesanne täielikult lahendatud
-
Kui palju mälu liiklust põhjustab ebasoodne lugemisjärjekord? 4 sammu
Vajuta 8 × 8 veergude kaupa ja selgita, miks on tabamusi 0. Seejärel võta 1024 × 1024 maatriks 4-baidiseid int-tüüpi täisarve ning otsevastendusega 32 KiB vahemälu, mille read on 64-baidised. Mitu baiti tuuakse mälust, kui liita maatriksi elemendid kokku ridade kaupa? Aga veergude kaupa? Kas iga rea lõppu ühe vahemälurea jagu täidist aitaks?
-
Siinses näites võtab maatriksi rida 8 × 4 = 32 baiti ehk kaks vahemälurida. Seega algab rida i vahemälureal 2i mod 8 ja veerg 0 kasutab ainult vahemäluridu 0, 2, 4 ja 6. a[4][0] võtab üle rea, kus paiknes a[0][0]. Kui tsükkel jõuab elemendini a[0][1], on selle plokk juba eemaldatud: 64 lugemise kohta 0 tabamust. Ridade kaupa lugedes annab iga 16-baidine plokk ühe möödalasu. Plokke on 16, seega tabamusi 48 ja nende osakaal 1 − 4/16 = 75%.
-
Suures vahemälus on 32 768 / 64 = 512 rida. Ridade kaupa lugedes mahutab iga 64-baidine vahemälurida 16 täisarvu ja ainult esimene lugemine annab möödalasu. Möödalaske on 1 048 576 / 16 = 65 536, tabamuste osakaal 1 − 4/64 = 93,75% ning mälust tuuakse 65 536 × 64 = 4 194 304 baiti. Kogu maatriks loetakse mälust täpselt ühe korra.
-
Veergude kaupa lugedes võtab maatriksi rida 4 096 baiti ehk 64 vahemälurida. Rida i algab vahemälureal 64i mod 512 ja iga veerg kasutab 512 vahemälureast ainult 8. a[8][0] tõrjub välja a[0][0] ploki. See on ammu eemaldatud, kui tsükkel jõuab elemendini a[0][1]. Kõik 1 048 576 lugemist annavad möödalasu: mälust tuuakse 67 108 864 baiti ehk 16 korda rohkem.
-
Kui lisada iga rea lõppu 16 täisarvu, võtab rida 4 160 baiti ehk 65 vahemälurida. Arvud 65 ja 512 on ühistegurita, seega jaotub veerg nüüd kõigi 512 vahemälurea vahel. Tabamusi siiski ei tule. Üks veerg kasutab 1 024 plokki, kuid vahemälu mahutab 512. Iga plokk on eemaldatud enne, kui järgmine veerg seda vajab.
Vastus
Ridade kaupa 4 MiB, veergude kaupa 64 MiB. Täidis jaotab veeru plokid kogu vahemälu peale, kuid tabamusi ei teki. Konfliktid saavad lahendatud, ent selle maatriksi iga veeru plokid vajavad rohkem ruumi, kui kogu vahemälus on.
-
Õpitee
Kuidas arvuti programmi täidab
Allikad (1)
- The first insight's measured case, the line size in the definition, and the 8-way first-level caches in `assumes`: Ulrich Drepper, "What Every Programmer Should Know About Memory," Red Hat, Inc., version 1.0, 21 November 2007. §3.2 (p. 15), §3.3.1 (pp. 17–18), §6.2.1 (pp. 49–50).