Kešatmiņa ir ātras piekļuves starpposma buferis, kas satur informāciju, kas, visticamāk, tiks pieprasīta. Piekļuve datiem kešatmiņā ir ātrāka nekā sākotnējo datu izgūšana no operatīvās atmiņas (RAM) un ātrāka nekā ārējā atmiņa (cietais disks vai cietvielu diskdzinis), tādējādi samazinot vidējo piekļuves laiku un palielinot datora sistēmas kopējo veiktspēju.

Vairākiem centrālā procesora bloku (CPU) modeļiem ir sava kešatmiņa, lai samazinātu piekļuvi brīvpiekļuves atmiņai (RAM), kas ir lēnāka nekā reģistri. Kešatmiņa var nodrošināt ievērojamas veiktspējas priekšrocības, ja RAM pulksteņa ātrums ir ievērojami mazāks par CPU takts ātrumu. Kešatmiņas pulksteņa ātrums parasti nav daudz mazāks par CPU ātrumu.

Kešatmiņas līmeņi

CPU kešatmiņa ir sadalīta vairākos līmeņos. Mūsdienās universālā procesorā līmeņu skaits var sasniegt 3. N+1 līmeņa kešatmiņai parasti ir lielāks izmērs un lēnāks piekļuves ātrums un datu pārsūtīšana nekā N līmeņa kešatmiņa.

Ātrākā atmiņa ir pirmā līmeņa kešatmiņa - L1-kešatmiņa. Faktiski tā ir procesora neatņemama sastāvdaļa, jo tā atrodas tajā pašā mikroshēmā un ir daļa no funkcionālajiem blokiem. Mūsdienu procesoros L1 kešatmiņa parasti ir sadalīta divās kešatmiņās, instrukciju kešatmiņā un datu kešatmiņā (Hārvardas arhitektūra). Lielākā daļa procesoru bez L1 kešatmiņas nevar darboties. L1 kešatmiņa darbojas procesora frekvencē, un parasti tai var piekļūt katrā pulksteņa ciklā. Bieži vien ir iespējams vienlaikus veikt vairākas lasīšanas/rakstīšanas darbības. Piekļuves latentums parasti ir 2–4 kodola pulksteņa cikli. Skaļums parasti ir mazs - ne vairāk kā 384 KB.

Otra ātrākā ir L2-kešatmiņa - otrā līmeņa kešatmiņa, kas parasti atrodas mikroshēmā, piemēram, L1. Vecākos procesoros mikroshēmu komplekts uz mātesplates. L2 kešatmiņas apjoms no 128 KB līdz 1–12 MB. Mūsdienu daudzkodolu procesoros otrā līmeņa kešatmiņa, kas atrodas tajā pašā mikroshēmā, ir atsevišķa atmiņa - ar kopējo kešatmiņas lielumu nM MB, katram kodolam ir nM/nC MB, kur nC ir procesora kodolu skaits. Parasti galvenās mikroshēmā esošās L2 kešatmiņas latentums ir no 8 līdz 20 kodola pulksteņa cikliem.

Trešā līmeņa kešatmiņa ir vismazāk ātra, taču tā var būt ļoti iespaidīga izmēra - vairāk nekā 24 MB. L3 kešatmiņa ir lēnāka nekā iepriekšējās kešatmiņas, taču joprojām ir ievērojami ātrāka nekā RAM. Daudzprocesoru sistēmās tas ir plaši izplatīts un paredzēts dažādu L2 datu sinhronizēšanai.

Dažreiz ir arī 4. līmeņa kešatmiņa, parasti tā atrodas atsevišķā mikroshēmā. 4. līmeņa kešatmiņas izmantošana ir attaisnojama tikai augstas veiktspējas serveriem un lieldatoriem.

Sinhronizācijas problēma starp dažādām kešatmiņām (gan viena, gan vairākiem procesoriem) tiek atrisināta ar kešatmiņas saskaņotību. Ir trīs iespējas informācijas apmaiņai starp dažāda līmeņa kešatmiņām jeb, kā saka, kešatmiņas arhitektūrām: iekļaujoša, ekskluzīva un neekskluzīva.

Cik svarīga ir L3 kešatmiņa AMD procesoriem?

Patiešām, ir lietderīgi aprīkot daudzkodolu procesorus ar speciālu atmiņu, ko koplietos visi pieejamie kodoli. Šajā lomā ātra trešā līmeņa (L3) kešatmiņa var ievērojami paātrināt piekļuvi datiem, kas tiek pieprasīti visbiežāk. Tad kodoliem, ja iespējams, nebūs jāpiekļūst lēnai galvenajai atmiņai (RAM).

Vismaz teorētiski. Nesen AMD paziņoja par Athlon II X4 procesoru, kas ir Phenom II X4 modelis bez L3 kešatmiņas, norādot, ka tas nav tik nepieciešams. Mēs nolēmām tieši salīdzināt divus procesorus (ar un bez L3 kešatmiņas), lai pārbaudītu, kā kešatmiņa ietekmē veiktspēju.

Noklikšķiniet uz attēla, lai to palielinātu.

Kā darbojas kešatmiņa?

Pirms iedziļināmies testos, ir svarīgi saprast dažus pamatus. Kešatmiņas darbības princips ir diezgan vienkāršs. Kešatmiņa buferē datus pēc iespējas tuvāk procesora apstrādes kodoliem, lai samazinātu CPU pieprasījumus uz attālāku un lēnāku atmiņu. Mūsdienu galddatoru platformās kešatmiņas hierarhija ietver pat trīs līmeņus, kas ir pirms piekļuves RAM. Turklāt otrā un jo īpaši trešā līmeņa kešatmiņas kalpo ne tikai datu buferēšanai. To mērķis ir novērst procesora kopnes pārslodzi, kad kodoliem ir jāapmainās ar informāciju.

Sitieni un garām

Kešatmiņas arhitektūras efektivitāti mēra pēc trāpījumu skaita. Datu pieprasījumi, kurus var apmierināt kešatmiņa, tiek uzskatīti par trāpījumiem. Ja šajā kešatmiņā nav nepieciešamo datu, pieprasījums tiek nodots tālāk pa atmiņas konveijeru un tiek skaitīts garām. Protams, neveiksmes dēļ informācijas iegūšanai nepieciešams vairāk laika. Rezultātā skaitļošanas konveijerā parādās “burbuļi” (dīkstāves) un aizkaves. Gluži pretēji, trāpījumi ļauj saglabāt maksimālu veiktspēju.

Kešatmiņas ievade, ekskluzivitāte, saskaņotība

Aizstāšanas politikas nosaka, kā kešatmiņā tiek atbrīvota vieta jauniem ierakstiem. Tā kā kešatmiņā ierakstītajiem datiem galu galā ir jāparādās galvenajā atmiņā, sistēmas to var darīt vienlaikus ar ierakstīšanu kešatmiņā (pārrakstīšana) vai var atzīmēt datu apgabalus kā "netīrus" (atrakstīties) un rakstīt uz atmiņa, kad tā tiek izlikta no kešatmiņas.

Datus vairākos kešatmiņas līmeņos var uzglabāt tikai, tas ir, bez dublēšanas. Tad jūs neatradīsit vienas un tās pašas datu līnijas divās dažādās kešatmiņas hierarhijās. Vai arī kešatmiņas var darboties visaptveroši, tas ir, zemākajos kešatmiņas līmeņos tiek garantēti dati, kas atrodas augšējos kešatmiņas līmeņos (tuvāk procesora kodolam). AMD Phenom izmanto ekskluzīvu L3 kešatmiņu, savukārt Intel ievēro iekļaujošu kešatmiņas stratēģiju. Saskaņotības protokoli nodrošina datu integritāti un svaigumu dažādos kodolos, kešatmiņas līmeņos un pat procesoros.

Kešatmiņas lielums

Lielāka kešatmiņa var saturēt vairāk datu, taču tai ir tendence palielināt latentumu. Turklāt liela kešatmiņa patērē ievērojamu skaitu procesora tranzistoru, tāpēc ir svarīgi atrast līdzsvaru starp tranzistora budžetu, formas izmēru, enerģijas patēriņu un veiktspēju/latenci.

Asociativitāte

RAM ierakstus var tieši kartēt ar kešatmiņu, tas ir, datu kopijai no RAM ir tikai viena kešatmiņas pozīcija, vai arī tie var būt n-virzienu asociatīvi, tas ir, kešatmiņā ir n iespējamās vietas, kur tas notiek. dati var tikt saglabāti. Augstākas asociatīvās pakāpes (līdz pilnībā asociatīvajām kešatmiņām) nodrošina lielāku kešatmiņas elastību, jo esošie dati kešatmiņā nav jāpārraksta. Citiem vārdiem sakot, augsta n pakāpes asociativitāte garantē augstāku trāpījumu līmeni, taču tas arī palielina latentumu, jo ir nepieciešams vairāk laika, lai pārbaudītu visas šīs asociācijas, vai nav trāpījuma. Parasti visaugstākā asociācijas pakāpe ir saprātīga pēdējam kešatmiņas līmenim, jo ​​tajā ir pieejama maksimālā jauda, ​​un, meklējot datus ārpus šīs kešatmiņas, procesors piekļūst lēnai RAM.

Šeit ir daži piemēri: Core i5 un i7 izmanto 32 KB L1 kešatmiņas ar 8 virzienu asociativitāti datiem un 32 KB L1 kešatmiņu ar 4 virzienu asociatīvo instrukcijām. Ir saprotams, ka Intel vēlas, lai instrukcijas būtu pieejamas ātrāk un L1 datu kešatmiņai būtu maksimālais trāpījumu līmenis. Intel procesoru L2 kešatmiņai ir 8 virzienu asociativitāte, un Intel L3 kešatmiņa ir vēl viedāka, jo tā ievieš 16 virzienu asociativitāti, lai palielinātu trāpījumus.

Tomēr AMD izmanto citu stratēģiju ar Phenom II X4 procesoriem, kas izmanto divvirzienu asociatīvo L1 kešatmiņu, lai samazinātu latentumu. Lai kompensētu iespējamos izlaidumus, kešatmiņas ietilpība tika dubultota: 64 KB datiem un 64 KB instrukcijām. L2 kešatmiņai ir 8 virzienu asociativitāte, piemēram, Intel dizains, bet AMD L3 kešatmiņa darbojas ar 48 virzienu asociativitāti. Taču lēmumu izvēlēties vienu kešatmiņas arhitektūru, nevis citu, nevar novērtēt, neņemot vērā visu CPU arhitektūru. Ir pilnīgi dabiski, ka testa rezultātiem ir praktiska nozīme, un mūsu mērķis bija tieši visas šīs sarežģītās daudzlīmeņu kešatmiņas struktūras praktiska pārbaude.

Katram mūsdienu procesoram ir īpaša kešatmiņa, kurā tiek glabātas procesora instrukcijas un dati, kas ir gatavi lietošanai gandrīz acumirklī. Šo līmeni parasti dēvē par 1. vai L1 līmeņa kešatmiņu, un tas pirmo reizi tika ieviests 486DX procesoros. Nesen AMD procesori ir kļuvuši par standartu ar 64 KB L1 kešatmiņu vienam kodolam (datiem un instrukcijām), un Intel procesori izmanto 32 KB L1 kešatmiņu uz vienu kodolu (arī datiem un instrukcijām).

L1 kešatmiņa pirmo reizi parādījās 486DX procesoros, pēc tam tā kļuva par visu mūsdienu CPU neatņemamu iezīmi.

Otrā līmeņa kešatmiņa (L2) parādījās visos procesoros pēc Pentium III izlaišanas, lai gan pirmās tās ieviešanas uz iepakojuma bija Pentium Pro procesorā (bet ne mikroshēmā). Mūsdienu procesori ir aprīkoti ar līdz pat 6 MB mikroshēmas L2 kešatmiņu. Parasti šis apjoms tiek sadalīts starp diviem kodoliem, piemēram, Intel Core 2 Duo procesorā. Tipiskas L2 konfigurācijas nodrošina 512 KB vai 1 MB kešatmiņas katram kodolam. Procesori ar mazāku L2 kešatmiņu mēdz būt zemākā cenu līmenī. Tālāk ir parādīta agrīnās L2 kešatmiņas ieviešanas diagramma.

Pentium Pro procesora iepakojumā bija L2 kešatmiņa. Nākamajās Pentium III un Athlon paaudzēs L2 kešatmiņa tika ieviesta, izmantojot atsevišķas SRAM mikroshēmas, kas tajā laikā (1998, 1999) bija ļoti izplatīta.

Sekojošais paziņojums par procesa tehnoloģiju līdz 180 nm ļāva ražotājiem beidzot integrēt L2 kešatmiņu procesora uzgali.


Pirmie divkodolu procesori vienkārši izmantoja esošos dizainus, kas ietvēra divas formas katrā iepakojumā. AMD ieviesa divkodolu procesoru monolītā mikroshēmā, pievienoja atmiņas kontrolieri un slēdzi, un Intel vienkārši savāca divas viena kodola mikroshēmas vienā iepakojumā savam pirmajam divkodolu procesoram.


Pirmo reizi L2 kešatmiņu sāka koplietot starp diviem skaitļošanas kodoliem Core 2 Duo procesoros. AMD gāja tālāk un izveidoja savu pirmo četrkodolu Phenom no nulles, un Intel atkal izmantoja pāris presformas, šoreiz divas divkodolu Core 2, lai samazinātu izmaksas, savam pirmajam četrkodolu procesoram.

Trešā līmeņa kešatmiņa pastāv kopš Alpha 21165 procesora (96 KB, procesori ieviesti 1995. gadā) vai IBM Power 4 (256 KB, 2001. gadā) pirmsākumiem. Tomēr arhitektūrās, kuru pamatā ir x86, L3 kešatmiņa pirmo reizi parādījās ar Intel Itanium 2, Pentium 4 Extreme (Gallatin, abi procesori 2003. gadā) un Xeon MP (2006) modeļiem.

Agrīnās ieviešanas vienkārši nodrošināja citu kešatmiņas hierarhijas līmeni, lai gan mūsdienu arhitektūrā L3 kešatmiņa tiek izmantota kā liels, kopīgs buferis datu pārsūtīšanai starp kodoliem daudzkodolu procesoros. To uzsver augstā asociativitātes n-pakāpe. Labāk ir meklēt datus nedaudz ilgāk kešatmiņā, nevis nonākt situācijā, kad vairāki kodoli izmanto ļoti lēnu piekļuvi galvenajai RAM. AMD pirmo reizi ieviesa L3 kešatmiņu galddatora procesorā ar jau minēto Phenom līniju. 65 nm Phenom X4 saturēja 2 MB koplietotās L3 kešatmiņas, un modernajam 45 nm Phenom II X4 jau ir 6 MB koplietotās L3 kešatmiņas. Intel Core i7 un i5 procesori izmanto 8 MB L3 kešatmiņas.

Mūsdienu četrkodolu procesoros katram kodolam ir paredzēta L1 un L2 kešatmiņa, kā arī liela L3 kešatmiņa, ko koplieto visi kodoli. Koplietotā L3 kešatmiņa ļauj arī apmainīties ar datiem, ar kuriem kodoli var strādāt paralēli.


Cik svarīga ir L3 kešatmiņa AMD procesoriem?

Patiešām, ir lietderīgi aprīkot daudzkodolu procesorus ar speciālu atmiņu, ko koplietos visi pieejamie kodoli. Šajā lomā ātra trešā līmeņa (L3) kešatmiņa var ievērojami paātrināt piekļuvi datiem, kas tiek pieprasīti visbiežāk. Tad kodoliem, ja iespējams, nebūs jāpiekļūst lēnai galvenajai atmiņai (RAM).

Vismaz teorētiski. AMD nesen paziņoja par Athlon II X4 procesoru, kas ir Phenom II X4 modelis bez L3 kešatmiņas, norādot, ka tas nav tik nepieciešams. Mēs nolēmām tieši salīdzināt divus procesorus (ar un bez L3 kešatmiņas), lai pārbaudītu, kā kešatmiņa ietekmē veiktspēju.

Kā darbojas kešatmiņa?

Pirms iedziļināmies testos, ir svarīgi saprast dažus pamatus. Kešatmiņas darbības princips ir diezgan vienkāršs. Kešatmiņa buferē datus pēc iespējas tuvāk procesora apstrādes kodoliem, lai samazinātu CPU pieprasījumus uz attālāku un lēnāku atmiņu. Mūsdienu galddatoru platformās kešatmiņas hierarhija ietver pat trīs līmeņus, kas ir pirms piekļuves RAM. Turklāt otrā un jo īpaši trešā līmeņa kešatmiņas kalpo ne tikai datu buferēšanai. To mērķis ir novērst procesora kopnes pārslodzi, kad kodoliem ir jāapmainās ar informāciju.

Sitieni un garām

Kešatmiņas arhitektūras efektivitāti mēra pēc trāpījumu skaita. Datu pieprasījumi, kurus var apmierināt kešatmiņa, tiek uzskatīti par trāpījumiem. Ja šajā kešatmiņā nav nepieciešamo datu, pieprasījums tiek nodots tālāk pa atmiņas konveijeru un tiek skaitīts garām. Protams, neveiksmes dēļ informācijas iegūšanai nepieciešams vairāk laika. Rezultātā skaitļošanas konveijerā parādās “burbuļi” (dīkstāves) un aizkaves. Gluži pretēji, trāpījumi ļauj saglabāt maksimālu veiktspēju.

Kešatmiņas ievade, ekskluzivitāte, saskaņotība

Aizstāšanas politikas nosaka, kā kešatmiņā tiek atbrīvota vieta jauniem ierakstiem. Tā kā kešatmiņā ierakstītajiem datiem galu galā ir jāparādās galvenajā atmiņā, sistēmas to var darīt vienlaikus ar ierakstīšanu kešatmiņā (pārrakstīšana) vai var atzīmēt datu apgabalus kā "netīrus" (atrakstīties) un rakstīt uz atmiņa, kad tā tiek izlikta no kešatmiņas.

Datus vairākos kešatmiņas līmeņos var uzglabāt tikai, tas ir, bez dublēšanas. Tad jūs neatradīsit vienas un tās pašas datu līnijas divās dažādās kešatmiņas hierarhijās. Vai arī kešatmiņas var darboties visaptveroši, tas ir, zemākajos kešatmiņas līmeņos tiek garantēti dati, kas atrodas augšējos kešatmiņas līmeņos (tuvāk procesora kodolam). AMD Phenom izmanto ekskluzīvu L3 kešatmiņu, savukārt Intel ievēro iekļaujošu kešatmiņas stratēģiju. Saskaņotības protokoli nodrošina datu integritāti un svaigumu dažādos kodolos, kešatmiņas līmeņos un pat procesoros.

Kešatmiņas lielums

Lielāka kešatmiņa var saturēt vairāk datu, taču tai ir tendence palielināt latentumu. Turklāt liela kešatmiņa patērē ievērojamu skaitu procesora tranzistoru, tāpēc ir svarīgi atrast līdzsvaru starp tranzistora budžetu, formas izmēru, enerģijas patēriņu un veiktspēju/latenci.

Asociativitāte

RAM ierakstus var tieši kartēt ar kešatmiņu, tas ir, datu kopijai no RAM ir tikai viena kešatmiņas pozīcija, vai arī tie var būt n-virzienu asociatīvi, tas ir, kešatmiņā ir n iespējamās vietas, kur tas notiek. dati var tikt saglabāti. Augstākas asociatīvās pakāpes (līdz pilnībā asociatīvajām kešatmiņām) nodrošina lielāku kešatmiņas elastību, jo esošie dati kešatmiņā nav jāpārraksta. Citiem vārdiem sakot, augsta n pakāpes asociativitāte garantē augstāku trāpījumu līmeni, taču tas arī palielina latentumu, jo ir nepieciešams vairāk laika, lai pārbaudītu visas šīs asociācijas, vai nav trāpījuma. Parasti visaugstākā asociācijas pakāpe ir saprātīga pēdējam kešatmiņas līmenim, jo ​​tajā ir pieejama maksimālā jauda, ​​un, meklējot datus ārpus šīs kešatmiņas, procesors piekļūst lēnai RAM.

Šeit ir daži piemēri: Core i5 un i7 izmanto 32 KB L1 kešatmiņas ar 8 virzienu asociativitāti datiem un 32 KB L1 kešatmiņu ar 4 virzienu asociatīvo instrukcijām. Ir saprotams, ka Intel vēlas, lai instrukcijas būtu pieejamas ātrāk un L1 datu kešatmiņai būtu maksimālais trāpījumu līmenis. Intel procesoru L2 kešatmiņai ir 8 virzienu asociativitāte, un Intel L3 kešatmiņa ir vēl viedāka, jo tā ievieš 16 virzienu asociativitāti, lai palielinātu trāpījumus.

Tomēr AMD izmanto citu stratēģiju ar Phenom II X4 procesoriem, kas izmanto divvirzienu asociatīvo L1 kešatmiņu, lai samazinātu latentumu. Lai kompensētu iespējamos izlaidumus, kešatmiņas ietilpība tika dubultota: 64 KB datiem un 64 KB instrukcijām. L2 kešatmiņai ir 8 virzienu asociativitāte, piemēram, Intel dizains, bet AMD L3 kešatmiņa darbojas ar 48 virzienu asociativitāti. Taču lēmumu izvēlēties vienu kešatmiņas arhitektūru, nevis citu, nevar novērtēt, neņemot vērā visu CPU arhitektūru. Ir pilnīgi dabiski, ka testa rezultātiem ir praktiska nozīme, un mūsu mērķis bija tieši visas šīs sarežģītās daudzlīmeņu kešatmiņas struktūras praktiska pārbaude.

Gandrīz visi izstrādātāji zina, ka procesora kešatmiņa ir maza, bet ātra atmiņa, kas glabā datus no nesen apmeklētajām atmiņas zonām – definīcija ir īsa un diezgan precīza. Tomēr, lai saprastu faktorus, kas ietekmē koda veiktspēju, ir jāzina garlaicīgas detaļas par kešatmiņas mehānismiem.

Šajā rakstā mēs apskatīsim vairākus piemērus, kas ilustrē dažādas kešatmiņas funkcijas un to ietekmi uz veiktspēju. Piemēri būs C# valodā, valodas un platformas izvēle būtiski neietekmē veiktspējas novērtējumu un gala secinājumus. Protams, saprātīgās robežās, ja izvēlaties valodu, kurā vērtības nolasīšana no masīva ir līdzvērtīga piekļuvei hash tabulai, jūs nesaņemsit nekādus interpretējamus rezultātus. Tulkotāja piezīmes ir slīprakstā.

Habracut - - -

1. piemērs: piekļuve atmiņai un veiktspēja

Cik daudz ātrāks, jūsuprāt, ir otrais cikls nekā pirmais?
int arr = jauns int;

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

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


Pirmā cilpa reizina visas masīva vērtības ar 3, otrā cilpa reizina tikai katru sešpadsmito vērtību. Otrais cikls tikai pabeigts 6% strādā pirmais cikls, bet uz modernām mašīnām abi cikli tiek izpildīti aptuveni vienādā laikā: 80 ms Un 78 ms attiecīgi (manā mašīnā).

Risinājums ir vienkāršs – piekļuve atmiņai. Šo cilpu ātrumu galvenokārt nosaka atmiņas apakšsistēmas ātrums, nevis veselu skaitļu reizināšanas ātrums. Kā mēs redzēsim nākamajā piemērā, piekļuves skaits RAM ir vienāds gan pirmajā, gan otrajā gadījumā.

2. piemērs: Kešatmiņas rindu ietekme

Padziļināsimies un izmēģināsim citas soļu vērtības, nevis tikai 1 un 16:
for (int i = 0; i< arr.Length; i += K /* шаг */ ) arr[i] *= 3;

Šeit ir norādīti šīs cilpas darbības laiki dažādām soļu vērtībām K:

Lūdzu, ņemiet vērā, ka ar soļu vērtībām no 1 līdz 16 darbības laiks praktiski nemainās. Bet, ja vērtības ir lielākas par 16, darbības laiks samazinās par aptuveni pusi katru reizi, kad mēs dubultojam soli. Tas nenozīmē, ka cilpa kaut kā maģiski sāk darboties ātrāk, vienkārši samazinās arī atkārtojumu skaits. Galvenais punkts ir vienāds darbības laiks ar soļu vērtībām no 1 līdz 16.

Iemesls tam ir tas, ka mūsdienu procesori nepiekļūst atmiņai pa vienam baitam, bet gan mazos blokos, ko sauc par kešatmiņas līnijām. Parasti virknes izmērs ir 64 baiti. Nolasot jebkuru vērtību no atmiņas, vismaz viena kešatmiņas rinda nonāk kešatmiņā. Sekojoša piekļuve jebkurai vērtībai no šīs rindas ir ļoti ātra.

Tā kā 16 int vērtības aizņem 64 baitus, cilpas ar soļiem no 1 līdz 16 piekļūst tādam pašam kešatmiņas rindiņu skaitam vai, precīzāk, visām masīva kešatmiņas rindām. 32. darbībā piekļuve tiek nodrošināta katrai otrajai rindai, 64. darbībā — katrai ceturtajai rindai.

Dažiem optimizācijas paņēmieniem tas ir ļoti svarīgi. Piekļuves reižu skaits ir atkarīgs no datu atrašanās vietas atmiņā. Piemēram, nesaskaņotiem datiem var būt nepieciešamas divas piekļuves galvenajai atmiņai, nevis vienai. Kā mēs noskaidrojām iepriekš, darbības ātrums būs divas reizes mazāks.

3. piemērs: 1. un 2. līmeņa kešatmiņas izmēri (L1 un L2)

Mūsdienu procesoriem parasti ir divi vai trīs kešatmiņas līmeņi, ko parasti sauc par L1, L2 un L3. Lai uzzinātu kešatmiņu izmērus dažādos līmeņos, varat izmantot utilītu CoreInfo vai Windows API funkciju GetLogicalProcessorInfo. Abas metodes sniedz arī informāciju par kešatmiņas rindas lielumu katram līmenim.

Manā datorā CoreInfo ziņo par 32 KB L1 datu kešatmiņu, 32 KB L1 instrukciju kešatmiņu un 4 MB L2 datu kešatmiņu. Katram kodolam ir sava personīgā L1 kešatmiņa, L2 kešatmiņas koplieto katrs kodolu pāris:

Loģiskā procesora kešatmiņas karte: *--- Datu kešatmiņa 0, 1. līmenis, 32 KB, Assoc 8, LineSize 64 *--- Instrukciju kešatmiņa 0, 1. līmenis, 32 KB, Assoc 8, LineSize 64 --*-- Datu kešatmiņa 1, 1. līmenis, 32 KB, Assoc 8, LineSize 64 -*-- Instrukciju kešatmiņa 1, 1. līmenis, 32 KB, Assoc 8, LineSize 64 **- Unified Cache 0, Level 2, 4 MB, Assoc 16, LineS 64 --*- 2. datu kešatmiņa, 1. līmenis, 32 KB, Assoc 8, LineSize 64 --*- Instrukciju kešatmiņa 2, 1. līmenis, 32 KB, Assoc. 8, LineSize 64 ---* Datu kešatmiņa 3, 1. līmenis, 32 KB, Assoc 8, LineSize 64 ---* Instrukciju kešatmiņa 3, 1. līmenis, 32 KB, Assoc 8, LineSize 64 --** Unified Cache 1, Level 2, 4 MB, Assoc 16, LineSize 64
Pārbaudīsim šo informāciju eksperimentāli. Lai to izdarītu, iesim cauri mūsu masīvam, palielinot katru 16. vērtību – vienkāršs veids, kā mainīt datus katrā kešatmiņas rindā. Kad mēs sasniedzam beigas, mēs atgriežamies sākumā. Pārbaudīsim dažādus masīvu izmērus; mums vajadzētu redzēt veiktspējas kritumu, kad masīvs vairs neietilpst dažāda līmeņa kešatmiņās.

Kods ir:

int soļi = 64 * 1024 * 1024; // iterāciju skaits
int garumsMod = arr.Length - 1; // masīva lielums -- divu jauda

for (int i = 0; i< steps; i++)
{
// x & garumsMod = x % arr.Length, jo divu pakāpju
arr[(i * 16) & garumsMod]++;
}


Testa rezultāti:

Manā datorā ir manāms veiktspējas kritums pēc 32 KB un 4 MB — tādi ir L1 un L2 kešatmiņas izmēri.

4. piemērs: Instrukciju paralēlisms

Tagad apskatīsim kaut ko citu. Kura no šīm divām cilpām, jūsuprāt, tiks izpildīta ātrāk?
int soļi = 256 * 1024 * 1024;
int a = jauns int ;

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

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


Izrādās, ka otrā cilpa darbojas gandrīz divreiz ātrāk, vismaz visās manis pārbaudītajās mašīnās. Kāpēc? Tā kā komandām cilpu iekšpusē ir dažādas datu atkarības. Pirmajām komandām ir šāda atkarību ķēde:

Otrajā ciklā atkarības ir:

Mūsdienu procesoru funkcionālās daļas spēj vienlaikus veikt noteiktu skaitu noteiktu darbību, parasti ne pārāk lielu skaitu. Piemēram, ir iespējama paralēla piekļuve datiem no L1 kešatmiņas divās adresēs, kā arī iespējama divu vienkāršu aritmētisko instrukciju vienlaicīga izpilde. Pirmajā ciklā procesors nevar izmantot šīs iespējas, bet otrajā var.

5. piemērs. Kešatmiņas saistība

Viens no galvenajiem jautājumiem, uz kuru jāatbild, veidojot kešatmiņu, ir tas, vai datus no noteikta atmiņas reģiona var glabāt jebkurā kešatmiņas šūnā vai tikai dažās no tām. Trīs iespējamie risinājumi:
  1. Tiešā kartēšanas kešatmiņa,Katras kešatmiņas rindas dati RAM tiek glabāti tikai vienā, iepriekš noteiktā kešatmiņas vietā. Vienkāršākais kartēšanas aprēķināšanas veids ir: row_index_in_memory % kešatmiņas_šūnu_skaits. Kešatmiņā vienlaikus nevar atrasties divas līnijas, kas kartētas vienā šūnā.
  2. N-ierakstu daļēja asociatīvā kešatmiņa, katru rindiņu var saglabāt N dažādās kešatmiņas vietās. Piemēram, 16 ierakstu kešatmiņā rinda var tikt saglabāta vienā no 16 šūnām, kas veido grupu. Parasti rindas ar vienādiem vismazāk nozīmīgiem indeksu bitiem ir kopīga viena grupa.
  3. Pilnībā asociatīva kešatmiņa, jebkuru rindiņu var saglabāt jebkurā kešatmiņas vietā. Risinājums pēc savas uzvedības ir līdzvērtīgs hash tabulai.
Tieši kartētās kešatmiņas ir pakļautas strīdiem, piemēram, kad divas rindas sacenšas par vienu un to pašu šūnu, pārmaiņus izspiež viena otru no kešatmiņas, efektivitāte ir ļoti zema. No otras puses, pilnībā asociatīvās kešatmiņas, lai arī bez šī trūkuma, ir ļoti sarežģītas un dārgas to ieviešanai. Daļēji asociatīvas kešatmiņas ir tipisks kompromiss starp ieviešanas sarežģītību un efektivitāti.

Piemēram, manā datorā 4 MB L2 kešatmiņa ir 16 ierakstu daļēja asociatīvā kešatmiņa. Visa operatīvā atmiņa ir sadalīta līniju kopās atbilstoši to indeksu vismazāk nozīmīgajiem bitiem, līnijas no katras kopas sacenšas par vienu 16 L2 kešatmiņas šūnu grupu.

Tā kā L2 kešatmiņā ir 65 536 šūnas (4 * 2 20 / 64) un katra grupa sastāv no 16 šūnām, mums kopā ir 4096 grupas. Tādējādi rindas indeksa apakšējie 12 biti nosaka, kurai grupai šī rinda pieder (2 12 = 4 096). Rezultātā rindas ar adresēm, kas ir 262 144 (4096 * 64) reizinātas, koplieto vienu un to pašu 16 šūnu grupu un sacenšas par vietu tajā.

Lai asociatīvās sekas stātos spēkā, mums pastāvīgi jāpiekļūst lielam skaitam vienas grupas rindu, piemēram, izmantojot šādu kodu:

publisks statisks garš UpdateEveryKthByte(baitu arr, int K)
{
const int rep = 1024 * 1024; // iterāciju skaits

Hronometrs sw = Hronometrs.StartNew();

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

P += K; if (p >= arr.Length) p = 0;
}

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


Metode palielina katru K-to masīva elementu. Kad sasniedzam beigas, sākam no jauna. Pēc diezgan liela iterāciju skaita (2 20), mēs apstājamies. Es veicu skrējienus dažādiem masīvu izmēriem un K soļu vērtībām. Rezultāti (zils - ilgs darbības laiks, balts - īss):

Zilie apgabali atbilst tiem gadījumiem, kad, pastāvīgi mainoties datiem, kešatmiņa nespēj pielāgoties visus nepieciešamos datus vienlaikus. Spilgti zila krāsa norāda darbības laiku aptuveni 80 ms, gandrīz balta - 10 ms.

Tiksim galā ar zilajiem apgabaliem:

  1. Kāpēc parādās vertikālas līnijas? Vertikālās līnijas atbilst soļu vērtībām, kurās tiek piekļūts pārāk daudzām rindām (vairāk nekā 16) no vienas grupas. Šīm vērtībām mana datora 16 ierakstu kešatmiņa nevar uzņemt visus nepieciešamos datus.

    Dažas no sliktā soļa vērtībām ir divas pakāpes: 256 un 512. Piemēram, apsveriet soli 512 un 8 MB masīvu. Ar šo soli masīvā ir 32 sadaļas (8 * 2 20 / 262 144), kas konkurē savā starpā par šūnām 512 kešatmiņas grupās (262 144 / 512). Ir 32 sadaļas, bet katrai grupai kešatmiņā ir tikai 16 šūnas, tāpēc visiem nepietiek vietas.

    Citas soļu vērtības, kas nav divu pakāpju lielumi, ir vienkārši neveiksmīgas, kas izraisa lielu skaitu trāpījumu vienām un tām pašām kešatmiņas grupām, kā arī noved pie vertikālu zilu līniju parādīšanās attēlā. Šajā brīdī skaitļu teorijas cienītāji tiek aicināti domāt.

  2. Kāpēc vertikālās līnijas pārtrūkst pie 4 MB robežas? Ja masīva lielums ir 4 MB vai mazāks, 16 ierakstu kešatmiņa darbojas kā pilnībā asociatīva kešatmiņa, tas ir, tā var bez konfliktiem uzņemt visus masīvā esošos datus. Par vienu kešatmiņu grupu cīnās ne vairāk kā 16 apgabali (262 144 * 16 = 4 * 2 20 = 4 MB).
  3. Kāpēc augšējā kreisajā stūrī ir liels zils trīsstūris? Tā kā ar mazu soli un lielu masīvu kešatmiņa nespēj ievietot visus nepieciešamos datus. Kešatmiņas asociativitātes pakāpei šeit ir sekundāra nozīme; ierobežojums ir saistīts ar L2 kešatmiņas lielumu.

    Piemēram, ja masīva izmērs ir 16 MB un solis ir 128, mēs piekļūstam katram 128. baitam, tādējādi modificējot katru otro masīva kešatmiņas rindiņu. Lai saglabātu katru otro rindiņu kešatmiņā, jums ir nepieciešams 8 MB kešatmiņas, bet manā datorā man ir tikai 4 MB.

    Pat ja kešatmiņa būtu pilnībā asociatīva, tā neļautu tajā saglabāt 8 MB datu. Ņemiet vērā, ka jau apspriestajā piemērā ar soli 512 un masīva lielumu 8 MB mums ir nepieciešams tikai 1 MB kešatmiņas, lai saglabātu visus nepieciešamos datus, taču tas nav iespējams nepietiekamas kešatmiņas asociativitātes dēļ.

  4. Kāpēc trijstūra kreisā puse pakāpeniski palielinās? Maksimālā intensitāte notiek pie soļa vērtības 64 baiti, kas ir vienāda ar kešatmiņas līnijas lielumu. Kā redzējām pirmajā un otrajā piemērā, secīga piekļuve tai pašai rindai praktiski nemaksā neko. Pieņemsim, ka ar 16 baitu soli mums ir četras atmiņas piekļuves par vienu cenu.

    Tā kā iterāciju skaits mūsu testā jebkurai soļa vērtībai ir vienāds, lētāka darbība nodrošina mazāku darbības laiku.

Atklātie efekti saglabājas pie lielām parametru vērtībām:

Kešatmiņas asociativitāte ir interesanta lieta, kas var izpausties noteiktos apstākļos. Atšķirībā no citām šajā rakstā apskatītajām problēmām, tas nav tik nopietni. Tas noteikti nav kaut kas tāds, kam būtu nepieciešama pastāvīga uzmanība, rakstot programmas.

6. piemērs: viltus kešatmiņas sadalīšana

Daudzkodolu iekārtās var rasties cita problēma - kešatmiņas saskaņotība. Procesora kodoliem ir daļēji vai pilnīgi atsevišķas kešatmiņas. Manā datorā L1 kešatmiņas ir atsevišķas (kā parasti), un katram kodolu pārim ir arī divas L2 kešatmiņas. Detaļas var atšķirties, taču kopumā mūsdienu daudzkodolu procesoriem ir daudzlīmeņu hierarhiskas kešatmiņas. Turklāt ātrākās, bet arī mazākās kešatmiņas pieder atsevišķiem kodoliem.

Kad viens kodols maina vērtību savā kešatmiņā, citi kodoli vairs nevar izmantot veco vērtību. Vērtība citu kodolu kešatmiņās ir jāatjaunina. Turklāt tas ir jāatjaunina visa kešatmiņas līnija, jo kešatmiņas darbojas ar datiem rindas līmenī.

Parādīsim šo problēmu ar šādu kodu:

privāts statisks int s_skaitītājs = jauns int ;

privāts tukšums Atjaunināšanas skaitītājs(intra pozīcija)
{
for (int j = 0; j< 100000000; j++)
{
s_skaitītājs = s_skaitītājs + 3;
}
}


Ja savā četrkodolu mašīnā es šo metodi izsaucu ar parametriem 0, 1, 2, 3 vienlaicīgi no četriem pavedieniem, tad darbības laiks būs 4,3 sekundes. Bet ja es izsaucu metodi ar parametriem 16, 32, 48, 64, tad darbības laiks būs tikai 0,28 sekundes.

Kāpēc? Pirmajā gadījumā visas četras vērtības, kuras jebkurā brīdī apstrādā pavedieni, visticamāk, nonāks vienā kešatmiņas rindā. Katru reizi, kad viens kodols palielina vērtību, tas atzīmē kešatmiņas šūnas, kas satur šo vērtību citos kodolos, kā nederīgas. Pēc šīs darbības visiem pārējiem kodoliem rinda būs jāglabā vēlreiz kešatmiņā. Tas padara kešatmiņas mehānismu nedarbojamu, samazinot veiktspēju.

7. piemērs. Aparatūras sarežģītība

Pat tagad, kad kešatmiņas darbības principi jums nav noslēpums, aparatūra joprojām sagādās jums pārsteigumus. Procesori atšķiras viens no otra ar optimizācijas metodēm, heiristiku un citiem ieviešanas smalkumiem.

Dažu procesoru L1 kešatmiņa var piekļūt divām šūnām paralēli, ja tās pieder pie dažādām grupām, bet, ja tās pieder vienai grupai, tad tikai secīgi. Cik es zinu, daži pat var piekļūt vienas un tās pašas šūnas dažādiem ceturkšņiem paralēli.

Procesori var jūs pārsteigt ar gudru optimizāciju. Piemēram, kods no iepriekšējā piemēra par viltus kešatmiņas koplietošanu manā mājas datorā nedarbojas kā paredzēts – vienkāršākajos gadījumos procesors var optimizēt darbu un samazināt negatīvās sekas. Ja nedaudz modificējat kodu, viss nostāsies savās vietās.

Šeit ir vēl viens dīvainu aparatūras dīvainību piemērs:

privātā statiskā int A, B, C, D, E, F, G;

privāts statisks tukšums Dīvainības()
{
for (int i = 0; i< 200000000; i++)
{
<какой-то код>
}
}


Ja tā vietā<какой-то код>Aizstājot trīs dažādas opcijas, varat iegūt šādus rezultātus:

Lauku A, B, C, D palielināšana prasa ilgāku laiku nekā lauku A, C, E, G palielināšana. Vēl dīvaināk ir tas, ka lauku A un C palielināšana aizņem ilgāku laiku nekā lauku A, C palielināšana. Un E, G. Es precīzi nezinu, kādi ir tā iemesli, bet varbūt tie ir saistīti ar atmiņu bankām ( jā, jā, ar parastām trīs litru krājatmiņu bankām, nevis tā, kā tu domāji). Ja jums ir kādas domas par šo jautājumu, lūdzu, izsakiet to komentāros.

Manā mašīnā iepriekšminētais netiek ievērots, tomēr dažreiz ir neparasti slikti rezultāti - visticamāk, uzdevumu plānotājs veic savus “regulējumus”.

Šī piemēra mācība ir tāda, ka ir ļoti grūti pilnībā paredzēt aparatūras darbību. Jā, Var prognozēt daudz, taču jums pastāvīgi jāapstiprina prognozes, veicot mērījumus un testēšanu.

Secinājums

Es ceru, ka viss iepriekš apspriestais ir palīdzējis jums izprast procesora kešatmiņas dizainu. Tagad varat izmantot šīs zināšanas praksē, lai optimizētu savu kodu.

Lielākajā daļā mūsdienu galddatoru mikroshēmām ir četri kodoli, taču mikroshēmu ražotāji jau ir paziņojuši par plāniem pāriet uz sešiem kodoliem, un 16 kodolu procesori joprojām nav nekas neparasts augstākās klases serveriem.

Jo vairāk kodolu ir, jo lielāka ir atmiņas sadales problēma starp visiem kodoliem, vienlaikus strādājot kopā. Pieaugot kodolu skaitam, arvien izdevīgāk ir samazināt kodolu pārvaldīšanai zaudēto laiku, apstrādājot datus - jo datu apmaiņas ātrums atpaliek no procesora ātruma un datu apstrādes ātruma atmiņā. Varat fiziski piekļūt kāda cita ātrai kešatmiņai vai arī savai lēnajai kešatmiņai, taču ietaupot datu pārsūtīšanas laiku. Uzdevumu sarežģī fakts, ka programmu pieprasītais atmiņas apjoms nepārprotami neatbilst katra veida kešatmiņas apjomam.

Fiziski pēc iespējas tuvāk procesoram var novietot tikai ļoti ierobežotu atmiņas apjomu – procesora L1 kešatmiņu, kuras apjoms ir ārkārtīgi niecīgs. Daniels Sančess, Po-An Tsai un Neitans Bekmans, pētnieki no Masačūsetsas Tehnoloģiju institūta Datorzinātnes un mākslīgā intelekta laboratorijas, mācīja datoram konfigurēt dažādus atmiņas veidus elastīgai programmu hierarhijai reāllaikā. Jaunā sistēma, ko sauc par Jenga, analizē apjoma vajadzības un programmu piekļuves biežumu atmiņai un pārdala katra no 3 procesora kešatmiņas veidiem jaudu kombinācijās, kas nodrošina lielāku efektivitāti un enerģijas ietaupījumu.


Sākumā pētnieki pārbaudīja veiktspējas pieaugumu, apvienojot statisko un dinamisko atmiņu, strādājot pie viena kodola procesora programmām, un ieguva primāro hierarhiju - kad labāk ir izmantot kādu kombināciju. No 2 atmiņas veidiem vai no viena. Tika novērtēti divi parametri: signāla aizkave (latence) un enerģijas patēriņš katras programmas darbības laikā. Aptuveni 40% programmu sāka strādāt sliktāk ar dažādu atmiņas veidu kombināciju, pārējās - labāk. Ierakstījuši, kurām programmām patīk jaukta veiktspēja un kurām patīk atmiņas lielums, pētnieki izveidoja savu Jenga sistēmu.

Viņi virtuālā datorā ar 36 kodoliem virtuāli pārbaudīja 4 veidu programmas. Pārbaudītās programmas:

  • omnet — Objective Modular Network Testbed, C simulācijas bibliotēka un tīkla simulācijas rīku platforma (attēlā zilā krāsā)
  • mcf — meta satura ietvars (sarkanā krāsā)
  • astar — virtuālās realitātes displeja programmatūra (zaļa)
  • bzip2 — arhivētājs (purpursarkanā krāsā)


Attēlā redzams, kur un kā tika apstrādāti katras programmas dati. Burti norāda, kur katra lietojumprogramma darbojas (viena katrā kvadrantā), krāsas norāda, kur atrodas tās dati, un ēnojums norāda virtuālās hierarhijas otro līmeni, ja tāds ir.

Kešatmiņas līmeņi

CPU kešatmiņa ir sadalīta vairākos līmeņos. Universālajiem procesoriem - līdz 3. Ātrākā atmiņa ir pirmā līmeņa kešatmiņa - L1-kešatmiņa, jo tā atrodas tajā pašā mikroshēmā, kur procesors. Sastāv no instrukciju kešatmiņas un datu kešatmiņas. Daži procesori bez L1 kešatmiņas nevar darboties. L1 kešatmiņa darbojas procesora frekvencē, un tai var piekļūt katrā pulksteņa ciklā. Bieži vien ir iespējams vienlaikus veikt vairākas lasīšanas/rakstīšanas darbības. Skaļums parasti ir mazs - ne vairāk kā 128 KB.

Otrā līmeņa kešatmiņa, L2, mijiedarbojas ar L1 kešatmiņu. Tas ir otrs ātrākais. Tas parasti atrodas vai nu mikroshēmā, piemēram, L1, vai tiešā tuvumā kodolam, piemēram, procesora kasetnē. Vecākos procesoros mikroshēmu komplekts uz mātesplates. L2 kešatmiņas apjoms no 128 KB līdz 12 MB. Mūsdienu daudzkodolu procesoros otrā līmeņa kešatmiņa, kas atrodas tajā pašā mikroshēmā, ir atsevišķa atmiņa - ar kopējo kešatmiņas lielumu 8 MB, katrs kodols veido 2 MB. Parasti galvenās mikroshēmā esošās L2 kešatmiņas latentums ir no 8 līdz 20 kodola pulksteņa cikliem. Uzdevumos, kas saistīti ar daudzām pieejām ierobežotam atmiņas apgabalam, piemēram, DBVS, tās pilnīga izmantošana desmitkārtīgi palielina produktivitāti.

L3 kešatmiņa parasti ir pat lielāka, lai gan nedaudz lēnāka nekā L2 kešatmiņa (sakarā ar to, ka kopne starp L2 un L3 ir šaurāka nekā kopne starp L1 un L2). L3 parasti atrodas atsevišķi no CPU kodola, taču var būt liels – virs 32 MB. L3 kešatmiņa ir lēnāka nekā iepriekšējās kešatmiņas, taču joprojām ir ātrāka nekā RAM. Daudzprocesoru sistēmās tas tiek plaši izmantots. Trešā līmeņa kešatmiņas izmantošana ir attaisnojama ļoti šaurā uzdevumu diapazonā un var ne tikai nepalielināt veiktspēju, bet, gluži pretēji, izraisīt vispārēju sistēmas veiktspējas samazināšanos.

Otrā un trešā līmeņa kešatmiņas atspējošana ir visnoderīgākā matemātisku problēmu gadījumā, ja datu apjoms ir mazāks par kešatmiņas lielumu. Šādā gadījumā visus datus varat ielādēt L1 kešatmiņā uzreiz un pēc tam tos apstrādāt.


Jenga periodiski pārkonfigurē virtuālās hierarhijas OS līmenī, lai samazinātu datu apmaiņu, ņemot vērā resursu ierobežojumus un lietojumprogrammu uzvedību. Katra pārkonfigurācija sastāv no četrām darbībām.

Jenga izplata datus ne tikai atkarībā no tā, kuras programmas tiek nosūtītas — tām, kurām patīk liela viena ātruma atmiņa, vai tām, kurām patīk jauktas kešatmiņas ātrums, bet arī atkarībā no atmiņas šūnu fiziskā tuvuma apstrādājamajiem datiem. Neatkarīgi no tā, kāda veida kešatmiņa programmai nepieciešama pēc noklusējuma vai pēc hierarhijas. Galvenais ir samazināt signāla aizkavēšanos un enerģijas patēriņu. Atkarībā no tā, cik atmiņas veidu programmai "patīk", Jenga modelē katras virtuālās hierarhijas latentumu ar vienu vai diviem līmeņiem. Divu līmeņu hierarhijas veido virsmu, viena līmeņa hierarhijas veido līkni. Pēc tam Jenga projicē minimālo aizkavi VL1 izmēros, iegūstot divas līknes. Visbeidzot, Jenga izmanto šīs līknes, lai izvēlētos labāko hierarhiju (t.i., VL1 izmēru).

Jenga lietošana ir devusi ievērojamu efektu. Virtuālā 36 kodolu mikroshēma sāka strādāt par 30 procentiem ātrāk un patērēja par 85 procentiem mazāk enerģijas. Protams, pagaidām Jenga ir tikai strādājoša datora simulācija, un paies kāds laiks, līdz redzēsit reālus šīs kešatmiņas piemērus un pat pirms mikroshēmu ražotāji to pieņems, ja viņiem patīk šī tehnoloģija.

Parastās 36 kodolmašīnas konfigurācija

  • Procesori. 36 kodoli, x86-64 ISA, 2,4 GHz, Silvermont līdzīgs OOO: 8 B platums
    ifetch; 2 līmeņu bpred ar 512 × 10 bitu BHSR + 1024 × 2 bitu PHT, 2 virzienu dekodēšana/izdošana/pārdēvēšana/iesniegšana, 32 ierakstu IQ un ROB, 10 ierakstu LQ, 16 ierakstu SQ; 371 pJ/instrukcija, 163 mW/dzīslas statiskā jauda
  • L1 kešatmiņas. 32 KB, 8 virzienu kopu asociatīva, sadalīta datu un instrukciju kešatmiņa,
    3-ciklu latentums; 15/33 pJ par vienu sitienu/netrāpījumu
  • Prefetchers pakalpojums. 16 ierakstu straumes iepriekšējie ielādētāji, kas modelēti un pārbaudīti pret
    Nehalem
  • L2 kešatmiņas. 128 KB privāts katram kodolam, 8 virzienu kopu asociatīvs, ieskaitot, 6 ciklu latentums; 46/93 pJ par vienu sitienu/netrāpījumu
  • Sakarīgs režīms. 16 virzienu, 6 ciklu latentuma direktoriju bankas Jenga; kešatmiņas L3 direktoriji citiem
  • Globālais NoC. 6 × 6 tīkls, 128 bitu flīti un saites, X-Y maršrutēšana, 2 ciklu konveijera maršrutētāji, 1 cikla saites; 63/71 pJ vienam maršrutētājam/saites šķērsošana, 12/4mW maršrutētāja/saites statiskā jauda
  • Statiskā atmiņa bloķē SRAM. 18 MB, viena 512 KB banka katrā elementā, 4 virzienu 52 kandidātu zcache, 9 ciklu bankas latentums, Vantage nodalījums; 240/500 pJ uz vienu trāpījumu/izlaidumu, 28 mW/bankas statiskā jauda
  • Daudzslāņu stacked DRAM. 1152 MB, viena 128 MB glabātuve uz 4 flīzēm, sakausējums ar MAP-I DDR3-3200 (1600 MHz), 128 bitu kopne, 16 rindas, 8 bankas/rangs, 2 KB rindu buferis; 4,4/6,2 nJ uz vienu trāpījumu/neatbilstību, 88 mW/velves statiskā jauda
  • Galvenā atmiņa. 4 DDR3-1600 kanāli, 64 bitu kopne, 2 rindas/kanāls, 8 bankas/rangs, 8 KB rindu buferis; 20 nJ/pieeja, 4W statiskā jauda
  • DRAM laiki. tCAS=8, tRCD=8, tRTP=4, tRAS=24, tRP=8, tRRD=4, tWTR=4, tWR=8, tFAW=18 (visi laiki tCK; stacked DRAM ir puse no tCK kā galvenā atmiņa )