Processor cache

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 7. september 2020; checks kræver 15 redigeringer .

En mikroprocessorcache  er en cache (super-sekundær hukommelse), der bruges af en computermikroprocessor til at reducere den gennemsnitlige adgangstid til computerhukommelsen . Det er et af de øverste niveauer af hukommelseshierarkiet [1] . Cachen bruger en lille, meget hurtig hukommelse (normalt af SRAM -typen ), der gemmer kopier af hyppigt tilgåede data fra hovedhukommelsen. Hvis de fleste af hukommelsesanmodningerne behandles af cachen, vil den gennemsnitlige hukommelsesadgangsforsinkelse nærme sig cachens latens.

Når en processor skal have adgang til hukommelsen for at læse eller skrive data, kontrollerer den først, om en kopi er tilgængelig i cachen. Hvis kontrollen lykkes, udfører processoren handlingen ved hjælp af cachen, hvilket er meget hurtigere end at bruge den langsommere hovedhukommelse. For mere om hukommelsesforsinkelse, se SDRAM - latens : tCAS, tRCD, tRP, tRAS.

Data mellem cache og hukommelse overføres i blokke med fast størrelse, også kaldet cache - linjer eller cache-blokke . 

De fleste moderne mikroprocessorer til computere og servere har mindst tre uafhængige caches: en instruktionscache til at fremskynde indlæsningen af ​​maskinkode , en datacache til at fremskynde læsning og skrivning af data og en oversættelsesassociativ buffer (TLB) for at fremskynde oversættelsen af virtuelle (logiske) adresser til fysiske, som for instruktioner såvel som for data. Datacachen implementeres ofte som en lagdelt cache (L1, L2, L3, L4).

Forøgelse af cachestørrelsen kan have en positiv effekt på ydeevnen af ​​næsten alle applikationer [2] , selvom effekten i nogle tilfælde er ubetydelig [3] . Arbejdet med cachehukommelsen er normalt gennemsigtigt for programmøren, men for dets effektive brug bruges der i nogle tilfælde specielle algoritmiske teknikker, der ændrer rækkefølgen af ​​omgåelse af data i RAM eller øger deres lokalitet (for eksempel med blokmatrixmultiplikation ) [4] .

Sådan virker det

Dette afsnit beskriver en typisk datacache og nogle typer instruktionscaches; Oversættelsesassocieringsbufferen (TLB) kan være mere kompleks, men instruktionscachen kan være enklere. Diagrammet til højre viser hoved- og cachehukommelse. Hver række er en gruppe af hukommelsesceller, der indeholder data organiseret i cache-linjer . Størrelsen af ​​hver cachelinje kan variere fra processor til processor, men for de fleste x86-processorer er den 64 bytes. Cachelinjestørrelsen er normalt større end den datastørrelse, der kan tilgås fra en enkelt maskininstruktion (typiske størrelser er fra 1 til 16 bytes). Hver gruppe af data i hukommelsen med en størrelse på 1 cachelinje har et serienummer. For hovedhukommelsen er dette nummer den hukommelsesadresse, hvor de mindst signifikante bits er kasseret. I cachen på hver cachelinje tildeles tagget desuden , som er adressen på de data, der er duplikeret i denne cachelinje i hovedhukommelsen.

Når processoren får adgang til hukommelsen, kontrollerer den først, om cachen gemmer de data, der anmodes om fra hukommelsen. For at gøre dette sammenlignes anmodningsadressen med værdierne for alle cache-tags, hvori disse data kan gemmes. Tilfældet af et match med tagget på en hvilken som helst cache-linje kaldes et cache-hit ( engelsk  cache-hit ), det modsatte tilfælde kaldes en cache-miss ( engelsk  cache-miss ). Et cache-hit giver processoren mulighed for straks at læse eller skrive data til cache-linjen med det matchede tag. Forholdet mellem antallet af cache-hits og det samlede antal hukommelsesanmodninger kaldes hit  rate , det er et mål for effektiviteten af ​​cachen for den valgte algoritme eller det valgte program.

I tilfælde af en miss tildeles en ny post i cachen, i hvilken tag adressen på den aktuelle anmodning er skrevet, og i selve cachelinjen - data fra hukommelsen efter læsning eller data, der skal skrives til hukommelsen. Læsning går glip af forsinket udførelse, fordi de kræver, at data anmodes i den langsommere hovedhukommelse. Skrivemisser forårsager muligvis ikke latency, da de data, der skrives, kan gemmes i cachen med det samme, og skrivning til hovedhukommelsen kan ske i baggrunden. Instruktionscaches fungerer stort set på samme måde som datacache-algoritmen ovenfor, men der foretages kun læseanmodninger om instruktioner. Instruktions- og datacacher kan adskilles for at øge ydeevnen (et princip brugt i Harvard-arkitekturen ) eller kombineres for at forenkle hardwareimplementering.

For at tilføje data til cachen efter en cache-miss, kan det være nødvendigt at smide de tidligere skrevne data ud .  For at vælge en cachelinje, der skal erstattes , bruges en heuristik kaldet erstatningspolitik . Algoritmens hovedproblem er at forudsige, hvilken række der højst sandsynligt ikke er nødvendig for efterfølgende operationer. Kvalitative forudsigelser er komplekse, og hardware-caches bruger simple regler såsom LRU . Markering af bestemte områder af hukommelsen som ikke-cachebare forbedrer ydeevnen ved at forhindre sjældent brugte data i at blive cachelagret . Mangler for sådan hukommelse skaber ikke kopier af dataene i cachen.   

Når du skriver data til cachen, skal der være et bestemt tidspunkt, hvor det bliver skrevet til hovedhukommelsen. Denne tid styres af skrivepolitikken .  For gennemskrivningscaches resulterer enhver skrivning til cachen i en øjeblikkelig skrivning til hukommelsen. En anden type caches, tilbageskrivning eng. tilbageskrivning (nogle gange også kaldet copy-back ), udsætter skrivningen til et senere tidspunkt. I sådanne caches overvåges tilstanden af ​​de cachelinjer, der endnu ikke er blevet skyllet ind i hukommelsen (markeret med den "beskidte" bit ) . dirty ). Skrivning til hukommelsen udføres, når en sådan linje er smidt ud af cachen. En cache-miss, der bruger en tilbageskrivningspolitik, kan således kræve to hukommelsesadgange, en til at nulstille den gamle rækkes tilstand og en til at læse de nye data.     

Der er også blandede politikker. Cachen  kan skrives igennem , men for at reducere antallet af transaktioner på bussen kan skrivninger midlertidigt lægges i kø og flettes med hinanden.

Data i hovedhukommelsen kan modificeres ikke kun af processoren, men også af perifere enheder, der bruger direkte hukommelsesadgang , eller af andre processorer i et multiprocessorsystem. Ændring af dataene får kopien i cachen til at blive forældet (den uaktuelle tilstand ). I en anden implementering, når en processor ændrer data i cachen, vil kopier af disse data i cachen hos andre processorer blive markeret som forældede. For at holde indholdet af flere caches ajour, bruges en særlig kohærensprotokol .

Strukturen af ​​cache-indgangen

Typisk cache-indtastningsstruktur

Datablok tag lidt relevans

Datablokken (cachelinjen) indeholder en direkte kopi af dataene fra hovedhukommelsen. Den friske bit betyder, at denne post indeholder en opdateret (seneste) kopi.

Adressestruktur

tag indeks partiskhed

Hukommelsesadressen er opdelt (fra høje bits til lave bits) i Tag, indeks og offset . Længden af ​​indeksfeltet er bits og svarer til rækken (linjen) i den cache, der bruges til at skrive. Offsetlængden er .

Associativitet

Associativitet er et kompromis. At tjekke flere poster kræver mere energi, chipareal og potentielt tid. Hvis der var 10 steder, hvor eviction-algoritmen kunne kortlægge en hukommelsesplacering, ville det kræve, at man kiggede på 10 cache-indgange, hvis man tjekkede for denne cache-placering. På den anden side er caches med høj associativitet udsat for færre fejl (se "konfliktende fejl" nedenfor), og processoren bruger mindre tid på at læse fra langsom hovedhukommelse. Der er en empirisk observation, at fordobling af associativiteten (fra direkte kortlægning til 2-kanal eller fra 2- til 4-kanal) har omtrent samme indflydelse på hitraten som fordobling af cachestørrelsen. Forøgelse af associativitet over 4 kanaler har ringe effekt på at reducere fejlfrekvensen og gøres normalt af andre årsager, såsom virtuelle adressekryds.

I rækkefølge for forværring (øgning af varigheden af ​​hitkontrollen) og forbedring (reducerer antallet af misses):

  1. direkte kortlagt cache - den  bedste hittid og følgelig den bedste mulighed for store caches;
  2. 2-kanals multi- associativ  cache 2-vejs sæt tilknyttet cache ;
  3. 2-vejs skæv associativ cache ( André Seznec  )
  4. 4-vejs sæt associativ cache ( eng.  4-vejs sæt associativ cache );
  5. fuldt associativ  cache fuldt associativ cache  - den bedste (laveste) procentdel af misses (miss rate) og den bedste mulighed for ekstremt høje omkostninger, når de mangler (miss straf).
Pseudo-associativ cache

Typer af misser

Gik glip af læsning fra instruktionscache. Giver normalt en meget lang forsinkelse, fordi processoren ikke kan fortsætte med at eksekvere programmet (i det mindste den aktuelle udførelsestråd) og skal inaktiv, mens den venter på, at instruktionen indlæses fra hukommelsen.

Gik glip af læsning fra datacachen. Giver normalt mindre latenstid, da instruktioner, der ikke afhænger af de anmodede data, kan fortsætte med at udføre, mens anmodningen behandles i hovedhukommelsen. Efter at have modtaget data fra hukommelsen, kan du fortsætte med at udføre afhængige instruktioner.

Data cache skrive miss. Giver normalt mindst latens, da skrivningen kan sættes i kø, og efterfølgende instruktioner er praktisk talt ubegrænsede i deres muligheder. Processoren kan fortsætte sit arbejde, undtagen i tilfælde af en skrivemiss med fuld kø.

Miss kategorier ( Three Cs )

  • Obligatoriske fejl - uheld forårsaget af den første omtale af den anmodede adresse. Størrelsen af ​​caches og deres associativitet påvirker ikke antallet af disse misser. Forudhentning, både software og hardware, kan hjælpe, og det samme kan øge størrelsen på cachelinjen (som en form for hardware-prefetching). Sådanne misser omtales nogle gange som "cold misses".
  • Kapacitetsmisser - fejl forårsaget udelukkende af den endelige størrelse af cachen, der forekommer uanset graden af ​​associativitet eller størrelsen af ​​cachelinjen. Et plot af sådanne fejl i forhold til cachestørrelse kan give et vist mål for den tidsmæssige lokalitet af et sæt hukommelsesanmodninger. Det er værd at bemærke, at der ikke er noget koncept for en fuld cache, en tom cache eller en næsten fuld cache, da processorcache har cachelinjer i en travl tilstand næsten hele tiden, og derfor næsten hver etablering af en ny linje vil kræve at rydde en allerede optaget.
  • Conflict misses - misser forårsaget af en konflikt. De kan undgås, hvis cachen ikke havde fjernet indtastningen tidligere. Kan yderligere opdeles i fejl forårsaget af mapping (en bestemt associativitetsværdi) og erstatningsmisser, der er forårsaget af en bestemt algoritme til at vælge poster, der skal erstattes.

Adresseoversættelse

De fleste processorer til generelle formål implementerer en form for virtuel hukommelse . Kort sagt, hvert program, der kører på en maskine, ser sit eget forenklede adresseområde, der kun indeholder det pågældende programs kode og data. Ethvert program bruger sit eget virtuelle adresserum, uanset dets placering i den fysiske hukommelse.

Tilstedeværelsen af ​​virtuel hukommelse kræver, at processoren oversætter de virtuelle (matematiske) adresser, der bruges af programmet, til fysiske adresser svarende til den reelle placering i RAM. Den del af processoren, der udfører denne konvertering, kaldes memory management unit (MMU). For at fremskynde oversættelser er en cache af nyligt brugte kortlægninger (korrespondancer af virtuelle og fysiske adresser) kaldet Translation Lookaside Buffer (TLB) blevet tilføjet til MMU.

Tre funktioner i adresseoversættelsesprocessen er vigtige for yderligere beskrivelse:

  • Forsinkelse: Den fysiske adresse modtages fra MMU'en først nogen tid senere, op til flere cyklusser, efter at den virtuelle adresse fra adressegeneratoren er leveret til MMU-indgangen.
  • Overlejringseffekt: Flere virtuelle adresser kan svare til én fysisk adresse. De fleste processorer garanterer, at alle skrivninger til en fysisk adresse vil blive foretaget i den rækkefølge, som programmet angiver. Denne egenskab kræver bekræftelse af, at kun én kopi af dataene fra den fysiske adresse i øjeblikket er i cachen.
  • Kortlægningsenhed: Virtuelt adresserum er pagineret - hukommelsesblokke af en fast størrelse, der starter ved adresser, der er multipla af deres størrelse. For eksempel kan 4 GB adresseplads opdeles i 1.048.576 4 KB-sider, som hver selvstændigt kan tilknyttes fysiske sider. Moderne processorer understøtter ofte flere sidestørrelser samtidigt, såsom 4 KB og 2 MB til x86-64, og nogle moderne AMD-processorer understøtter også 1 GB.

Det er også vigtigt at bemærke, at tidlige virtuelle hukommelsessystemer var meget langsomme, fordi de krævede, at sidetabellen (lagret i hoved-RAM) skulle kontrolleres, før der blev foretaget adgang til programhukommelsen. Uden brug af caching til kortlægninger reducerer sådanne systemer hastigheden af ​​at arbejde med hukommelse med omkring 2 gange. Derfor er brugen af ​​TLB meget vigtig, og nogle gange gik dens tilføjelse til processorer forud for fremkomsten af ​​konventionelle data- og instruktionscaches.

I forhold til virtuel adressering kan data- og instruktionscaches opdeles i 4 typer. Adresser i caches bruges til to forskellige formål: indeksering og tagging.

  • Fysisk indekseret, fysisk tagget (PIPT) - fysisk indekseret og fysisk tagget. Sådanne caches er enkle og undgår aliasing-problemer, men de er langsomme, fordi en anmodning om en fysisk adresse i TLB'en er påkrævet, før man får adgang til cachen. Denne anmodning kan forårsage en TLB-miss og et ekstra hit til hovedhukommelsen, før der tjekkes for data i cachen.
  • Virtuelt indekseret, virtuelt tagget (VIVT) - virtuelt indekseret og virtuelt tagget. Både tagging og indeksering bruger en virtuel adresse. På grund af dette er tjek for tilstedeværelsen af ​​data i cachen hurtigere uden at kræve et opkald til MMU. Der opstår imidlertid et overlapningsproblem, når flere virtuelle adresser knyttes til den samme fysiske adresse. I dette tilfælde vil dataene blive cachelagret to gange, hvilket i høj grad komplicerer opretholdelsen af ​​sammenhæng. Et andet problem er homonymer, situationer hvor den samme virtuelle adresse (for eksempel i forskellige processer) er kortlagt til forskellige fysiske adresser. Det bliver umuligt at skelne sådanne kortlægninger udelukkende ved det virtuelle indeks. Mulige løsninger: skylning af cachen, når der skiftes mellem opgaver (kontekstskift), kræver ikke-krydsning af procesadresserum, tagging af virtuelle adresser med et adresserums-id (ASID) eller brug af fysiske tags. Der er også et problem ved ændring af kortlægningen af ​​virtuelle adresser til fysiske, hvilket kræver nulstilling af de cachelinjer, som kortlægningen er ændret for.
  • Virtuelt indekseret, fysisk tagget (VIPT) - virtuelt indekseret og fysisk tagget. Indekset bruger en virtuel adresse, mens tagget bruger en fysisk adresse. Fordelen i forhold til den første type er lavere latency, da du kan slå cachelinjen op samtidig med TLB-adresseoversættelsen, men tag-sammenligningen forsinkes, indtil den fysiske adresse er opnået. Fordelen i forhold til den anden type er påvisningen af ​​homonymer, da tagget indeholder en fysisk adresse. Denne type kræver flere bits til tagget, fordi indeksbittene bruger en anden adresseringstype.
  • Fysisk indekserede, virtuelt taggede  - fysisk indekserede og virtuelt taggede caches betragtes som ubrugelige og marginale og er af rent akademisk interesse [5] .

Hastigheden af ​​disse handlinger (latency-indlæsning fra hukommelsen) er kritisk for processorens ydeevne, og derfor er de fleste moderne L1-cacher virtuelt indekserede, hvilket i det mindste tillader MMU'en at forespørge TLB'en samtidig med at anmode om data fra cachen.

Virtuel tagging og vhints-mekanismen

Men virtuel indeksering er ikke det bedste valg for andre niveauer af cache. Omkostningerne ved at detektere virtuelle adressekryds (aliasing) stiger med cachestørrelsen, og som et resultat bruger de fleste implementeringer af L2 og yderligere cacheniveauer fysisk adresseindeksering.

I temmelig lang tid brugte caches både fysiske og virtuelle adresser til tags, selvom virtuel tagging er meget sjældent i dag. Hvis TLB-anmodningen slutter før cache-anmodningen, vil den fysiske adresse være tilgængelig til sammenligning med tagget på det tidspunkt, det er nødvendigt, og der kræves derfor ingen virtuel tagging. Store caches er oftere tagget med fysiske adresser, og kun små, hurtige caches bruger virtuelle adresser til tags. I moderne processorer til generelle formål er virtuel tagging blevet erstattet af vhints-mekanismen, som er beskrevet nedenfor.

Virtuel indeksering og virtuelle adressekryds Problemet med homonymer og synonymer Sidefarvning

Hierarki af caches i moderne mikroprocessorer

De fleste moderne processorer indeholder flere interagerende caches.

Specialiserede caches

Superscalar CPU'er får adgang til hukommelse fra flere stadier af pipelinen : læsning af en instruktion (instruktionshentning), oversættelse af virtuelle adresser til fysiske, læsning af data (datahentning). Den oplagte løsning er at bruge forskellige fysiske caches til hver af disse sager, så der ikke er nogen strid om adgang til en af ​​de fysiske ressourcer fra forskellige stadier af pipelinen. At have en pipeline resulterer således typisk i mindst tre separate cache: en instruktionscache, en TLB -oversættelsescache og en datacache, hver specialiseret til en anden opgave.

Pipeline-processorer, der bruger separate caches til data og instruktioner (sådanne processorer er nu allestedsnærværende) kaldes Harvard-arkitekturprocessorer . Oprindeligt blev dette udtryk brugt om computere, hvor instruktioner og data er fuldstændig adskilt og gemt i forskellige hukommelsesenheder. En sådan fuldstændig adskillelse har dog ikke vist sig at være populær, og de fleste moderne computere har en enkelt hovedhukommelsesenhed, så de kan betragtes som von Neumann-arkitekturmaskiner .

Multi-level caches

Et af problemerne er det grundlæggende problem med at afbalancere cache-latens og hitrate. Større caches har en højere hitrate, men også en højere latenstid. For at lette spændingen mellem de to bruger de fleste computere flere niveauer af cache, når små og hurtige caches efterfølges af langsommere store caches (i øjeblikket op til 3 niveauer i cachehierarkiet).

I isolerede tilfælde implementeres 4 cache-niveauer [6] [7] .

Lagdelte caches fungerer normalt i rækkefølge fra mindre caches til større. Først kontrolleres den mindste og hurtigste cache på det første niveau (L1), i tilfælde af et hit fortsætter processoren med at arbejde med høj hastighed. Hvis den mindre cache mangler, tjekkes den næste lidt større og langsommere andet niveau (L2) cache, og så videre, indtil der er en anmodning til hoved-RAM.

Efterhånden som forsinkelsesforskellen mellem RAM og den hurtigste cache stiger, øger nogle processorer antallet af cache-niveauer (i nogle op til 3 niveauer på en chip). For eksempel havde Alpha 21164-processoren i 1995 en 96 kB on-chip L3-cache; IBM POWER4 i 2001 havde op til fire 32 MB L3-cacher [8] på separate matricer, delt af flere kerner; Itanium 2 i 2003 havde 6 MB L3-cache on-chip; Xeon MP-kode "Tulsa" i 2006 - 16 MB L3-cache på chip, delt af 2 kerner; Phenom II i 2008 - op til 6 MB universel L3-cache; Intel Core i7 i 2008 - 8 MB on-chip L3-cache, som er inklusive og deles mellem alle kerner. Nytten af ​​en L3-cache afhænger af arten af ​​programmets hukommelsesadgange.

Endelig er på den anden side af hukommelseshierarkiet selve mikroprocessorens registerfil , som kan betragtes som den mindste og hurtigste cache i systemet med specielle egenskaber (for eksempel statisk planlægning af compileren ved allokering af registre, når den allokerer data fra RAM til et register). Se loop-nest-optimering for detaljer . Registerfiler kan også være hierarkiske: Cray-1 (i 1976) havde 8 adresse "A" registre og 8 skalære "S" registre til generelle formål . Maskinen indeholdt også et sæt af 64 adresse "B" og 64 skalære "T" registre, som tog længere tid at få adgang til, men stadig betydeligt hurtigere end hoved-RAM. Disse registre blev introduceret på grund af manglen på en datacache i maskinen (selvom der var en instruktionscache i maskinen)

Eksklusivitet (eksklusivitet) og rummelighed

Multi-level caches kræver nye arkitektoniske løsninger.

For eksempel kan nogle processorer kræve, at alle data, der er gemt i L1-cachen, også gemmes i L2-cachen. Sådanne par af caches kaldes strengt inkluderende .  Andre processorer (for eksempel AMD Athlon) har muligvis ikke et sådant krav, så kaldes cacherne eksklusive (eksklusive)  - data kan enten være i L1 eller L2 cache, men kan aldrig være i begge på samme tid.

Indtil nu har andre processorer (såsom Pentium II, Pentium III og Pentium 4) ikke krævet, at dataene i cachen på første niveau også placeres i cachen på andet niveau, men de fortsætter med at gøre det. Der er ikke noget universelt accepteret navn for denne mellemliggende politik, selvom udtrykket hovedsageligt inkluderende ofte bruges . 

Fordelen ved eksklusive caches er, at de gemmer flere data. Denne fordel er større, når den eksklusive L1-cache er sammenlignelig i størrelse med L2-cachen, og mindre, når L2-cachen er mange gange større end L1-cachen. Når L1 misser, og L2 får adgang til et hit, udveksles hit-cache-linjen i L2 med linjen i L1.

Offer cache

Victim cache eller Victim buffer [9] ) (bogstaveligt talt Victim cache) er en lille specialiseret cache, der gemmer de cache-linjer, der for nylig blev fjernet fra den primære mikroprocessor-cache, da de blev udskiftet. Denne cache er placeret mellem hovedcachen og dens engelsk.  genopfyldningssti . Typisk er offercachen fuldt associativ og tjener til at reducere antallet af konfliktmisser. Mange almindeligt anvendte programmer kræver ikke fuld associativ kortlægning for alle forsøg på hukommelsesadgang. Statistisk vil kun en lille del af hukommelsesadgange kræve en høj grad af associativitet. Det er til sådanne anmodninger, at offercachen bruges, hvilket giver høj associativitet til sådanne sjældne anmodninger. Det blev foreslået af Norman Jouppi (DEC) i 1990 [10] . Størrelsen af ​​en sådan cache kan variere fra 4 til 16 cachelinjer [11] .

Spor cache

Et af de mest ekstreme tilfælde af cache-specialisering er sporingscachen , der bruges i Intel Pentium 4-processorer .  Sporingscachen er en mekanisme til at øge instruktionsbelastningsgennemløbet og til at reducere varmeafledning (i tilfælde af Pentium 4) ved at gemme afkodede instruktionsspor. Denne cache eliminerede således dekoderens arbejde ved genudførelse af nyligt udført kode.

En af de tidligste publikationer om sporingscaches var et papir fra 1996 af et team af forfattere ( Eric Rotenberg , Steve Bennett og Jim Smith ) med titlen "Trace Cache: a Low Latency Approach to High Bandwidth Instruction Fetching." (Trace Cache: A Low-Latency Approach for High Throughput Loading Instructions).

Sporingscachen gemmer afkodede instruktioner, enten efter de er blevet afkodet, eller efter at de er færdige med at udføre. Generelt tilføjes instruktioner til sporingscachen i grupper, der enten er grundlæggende blokke eller dynamiske spor. En dynamisk sporing (udførelsessti) består kun af instruktioner, hvis resultater var signifikante (bruges senere), og fjerner instruktioner, der er i ikke-eksekverende grene, desuden kan en dynamisk sporing være en forening af flere grundlæggende blokke. Denne funktion gør det muligt for instruktionsindlæseren i processoren at indlæse flere grundlæggende blokke på én gang uden at skulle bekymre sig om tilstedeværelsen af ​​forgreninger i udførelsestråden.

Sporingslinjer lagres i sporingscachen på adresser svarende til instruktionstælleren for den første maskininstruktion fra sporingen, hvortil et sæt af grenforudsigelsesfunktioner er blevet tilføjet. Denne adressering giver dig mulighed for at gemme forskellige udførelsesspor, der starter på den samme adresse, men repræsenterer forskellige situationer som et resultat af grenforudsigelse. På instruktionshentningsstadiet af instruktionspipelinen bruges både den aktuelle instruktionstæller (programtæller) og tilstanden af ​​grenprædiktoren til at kontrollere, om spor er i cachen. Hvis der opstår et hit, føres sporingslinjen direkte til pipelinen uden behov for at polle den normale (L2) cache eller hoved-RAM. Sporingscachen sender maskininstruktioner til input af pipelinen, indtil sporingslinjen løber ud, eller indtil der opstår en forudsigelsesfejl i pipelinen. I tilfælde af en miss begynder sporingscachen at bygge den næste sporingslinje ved at indlæse maskinkode fra cachen eller fra hukommelsen.

Lignende sporingscacher blev brugt i Pentium 4 til at gemme afkodede mikrooperationer og mikrokode, der implementerer komplekse x86-instruktioner. Smith, Rotenberg og Bennetts papir Se Citeseer for fuld tekst .

Implementeringer

Historie

I mikroprocessorteknologiens tidlige dage var hukommelsesadgang kun lidt langsommere end processorregisteradgang. Men siden 1980'erne [12] er ydelseskløften mellem processorer og hukommelse blevet større. Mikroprocessorer forbedredes hurtigere end hukommelsen, især med hensyn til frekvensen af ​​driften, og hukommelsen blev derfor flaskehalsen i at opnå fuld ydeevne fra systemet. Selvom det var teknisk muligt at have en hovedhukommelse lige så hurtig som CPU'en, blev der valgt en mere økonomisk vej: at bruge en overskydende mængde lavhastighedshukommelse, men indføre en lille, men hurtig cache i systemet for at mindske ydeevnegabet. Som et resultat fik vi en størrelsesorden større mængder hukommelse, til omtrent samme pris og med et lille tab i den samlede ydeevne.

At læse data fra cachen til moderne processorer tager normalt mere end én clock-cyklus. Udførelsestiden for programmer er følsom over for forsinkelser i læsning fra datacachen på første niveau. En stor indsats fra udviklere, såvel som kraften og området af krystallen, når de opretter en processor, er afsat til at accelerere driften af ​​caches.

Den enkleste cache er en praktisk talt indekseret direkte kortlagt cache. Den virtuelle adresse beregnes ved hjælp af en akkumulator, den tilsvarende del af adressen tildeles og bruges til at indeksere den SRAM, der returnerer de downloadede data. Dataene kan byte-justeres i en byte shifter og derefter overføres til den næste operation. Med denne læsning kræves ingen tag-kontrol, faktisk er det ikke nødvendigt at læse tagget. Senere i pipelinen, før læseinstruktionen afsluttes, skal tagget læses og sammenlignes med den virtuelle adresse for at verificere, at et cache-hit er fundet. Hvis der var en glip, ville en læsning fra hukommelsen eller en langsommere cache være påkrævet, med en yderligere opdatering af den pågældende cache og en genstart af pipelinen.

En associativ cache er mere kompleks, fordi en vis variation af tagget skal læses for at bestemme, hvilken del af cachen, der skal vælges. Den første niveau N-vejs sæt-associative cache læser typisk alle N mulige tags samtidigt og N data parallelt, sammenligner derefter taggene med adressen og vælger dataene forbundet med det matchede tag. Niveau 2 caches, for at spare strøm, læser nogle gange tags først, og læser først derefter ét dataelement fra SRAM-data.

Diagrammet til højre skal vise, hvordan de forskellige dele af adressen bruges. Bit 31 af adressen er den mest signifikante bit (mest signifikant), bit 0 er den mindst signifikante bit (mindst signifikant). Diagrammet viser to SRAM'er, indeksering og multipleksing for en 4 kB, 2-vejs sæt-associativ, virtuel indekseret og virtuel tagget cache med 64 byte blokke, 32 bit læse bredde og 32 bit virtuel adresse.

Fordi cachen er 4KB og linjer er 64 bytes, gemmer den 64 linjer, og vi kan tælle to gange fra SRAM-tagget, som indeholder 32 kolonner, der hver indeholder et par 21-bit tags. Selvom enhver virtuel adresseringsfunktion af bit 31 til 6 kan bruges til at indeksere tag- og SRAM-data, er de mindst signifikante bits de nemmeste at bruge. Fordi cachen er på 4 KB og har en fire-byte læsesti og to læsestier pr. adgang, er SRAM-data 512 rækker 8 bytes brede.

En mere moderne cache ville sandsynligvis være 16K, 4-vejs, sæt-associativ, virtuel indekseret, virtuelt ramt og fysisk tagget (tag), med 32-bit linjer, 32-bit læsebusbredde og 36-bit fysisk adressering. Gentagelsen af ​​læsestien for en sådan cache ligner meget dem, der er diskuteret ovenfor. Læses virtuelle hits i stedet for tags ? ( engelsk  vhits ), og igen matches undergruppen til den virtuelle adresse. Senere i pipelinen oversættes den virtuelle adresse til den fysiske adresse på TLB'en, og den fysiske tag læses (kun én, da det virtuelle hit leverer cachelæsestien). Til sidst sammenlignes den fysiske adresse med den fysiske tag for at afgøre, om der er fundet et hit.

Nogle SPARC-processorer havde L1-cacher accelereret af adskillige gate-forsinkelser ved  at bruge SRAM-dekodere i stedet for en virtuel adresseadder. Se en:Sumadresseret dekoder for detaljer .

I X86

Da x86- mikroprocessorer nåede frekvenser på 20 megahertz eller mere (startende med Intel 80386 ), blev der tilføjet en lille mængde hurtig cachehukommelse for at øge ydeevnen. Dette var nødvendigt på grund af det faktum, at den DRAM , der blev brugt som system-RAM, havde betydelige forsinkelser (op til 120 ns), og krævede cyklusser for at opdatere. Cachen var bygget op omkring den dyrere, men meget hurtigere SRAM , som på det tidspunkt havde 15-20ns latencies. Tidlige caches var eksterne i forhold til processoren og var ofte placeret på bundkortet som 8 eller 9 chips i DIP -pakker , arrangeret i sokler for at tillade cachen at vokse eller krympe. Nogle versioner af I386-processoren understøttede fra 16 til 64 KB ekstern cache [13] .

Med udgivelsen af ​​Intel 80486-processoren blev 8 kB cache integreret direkte på mikroprocessoren. Denne cache blev kaldt L1 (niveau et, eng.  niveau 1 ) for at skelne den fra den langsommere bundkort-cache kaldet L2 (andet niveau, eng.  niveau 2 ). Sidstnævnte var meget større, op til 256 kB.

I fremtiden blev sager om cache-adskillelse kun lavet på grundlag af marketingpolitiske overvejelser, for eksempel i Celeron -mikroprocessoren , bygget på Pentium II -kernen .

Pentium - mikroprocessoren bruger en separat cache, instruktioner og data [14] . Address Translation Buffer (TLB) oversætter en adresse i RAM til den tilsvarende adresse i cachen. Pentium-datacachen bruger tilbageskrivningsmetoden ,  som giver dig mulighed for at ændre dataene i cachen uden yderligere adgang til RAM (data skrives kun til RAM, når det fjernes fra cachen) og MESI-protokollen (Modified, Exclusive, Shared, Invalid) , som sikrer datakohærens i processorcaches og i RAM, når der arbejdes i et multiprocessorsystem.

Hver af de separate caches, data og instruktioner i Pentium MMX -mikroprocessoren er 16 kB i størrelse og indeholder to porte, en for hver udførelsespipeline. Datacachen har en adresseoversættelsesbuffer (TLB).

Den næste implementering af caches i x86 dukkede op i Pentium Pro , hvor cachen på andet niveau (kombineret for data og kommandoer, 256-512 kB i størrelse) er placeret i den samme pakke med processoren og cachen på første niveau, 8 kB i størrelse, adskilt for data og kommandoer og hævede dens frekvens til kernefrekvensen. Senere begyndte cachen på andet niveau at blive placeret på den samme chip som processoren.

Dual Independent Bus er en  ny cache-arkitektur, der bruger forskellige busser til at forbinde processorkernen til hoved-RAM. L1-cachen er dual-port, ikke-blokerende og understøtter én indlæsnings- og én skriveoperation pr. ur. Kører med processorens clockfrekvens. 64 bits overføres pr. cyklus.

I Pentium II -mikroprocessoren er cachen på første niveau blevet øget - 16 KB for data og 16 KB for instruktioner. Til cache på andet niveau bruges BSRAM, placeret på samme kort som processoren i SEC-patronen til installation i slot 1 .

Med den voksende popularitet af multi-core processorer begyndte tredje-niveau caches, kaldet L3, at blive tilføjet til chippen. Dette cacheniveau kan deles mellem flere kerner og muliggør effektiv kommunikation mellem kerner. Dens volumen er normalt større end den samlede cachestørrelse for alle kerner, der er tilsluttet den, og kan nå op på 16 MB.

Mainboard-cache forblev populær indtil Pentium MMX -æraen og gik ud af brug med introduktionen af ​​SDRAM og den voksende forskel mellem processorbusfrekvensen og processorkernefrekvensen: cachen på bundkortet blev kun lidt hurtigere end hoved-RAM.

Eksempel på cache (K8-processorkerne)

Skemaet for caches i AMD K8-mikroprocessorkernen er vist, som viser både specialiserede caches og deres multilevel karakter.

Kernen bruger fire forskellige specialiserede caches: instruktionscache, instruktions-TLB, data-TLB og data-cache:

  • Instruktionscachen består af 64-byte blokke, som er en kopi af hovedhukommelsen, og kan indlæse op til 16 bytes pr. ur. Hver byte i denne cache er gemt i 10 bits i stedet for 8, og instruktionsgrænser er markeret i de ekstra bits (dvs. cachen udfører delvis præ-dekodning). Kun paritet bruges til at kontrollere dataintegriteten, ikke ECC, da paritetsbitten fylder mindre, og i tilfælde af fejl kan beskadigede data opdateres med den korrekte version fra hukommelsen.
  • Instruktionen TLB indeholder kopier af sidetabelposterne. For hver anmodning om at læse kommandoer kræves oversættelse af matematiske adresser til fysiske. Oversættelsesposter er 4-byte og 8-byte, og TLB'en er opdelt i 2 dele, henholdsvis en til 4 kB-mappings og den anden til 2 og 4 MB-mappings (store sider). En sådan partition forenkler de fuldt associative søgeskemaer i hver af delene. OS'er og applikationer kan bruge forskellige størrelser tilknytninger til dele af det virtuelle adresserum.
  • Data-TLB er dobbelt, og begge buffere indeholder det samme sæt poster. Deres dualitet gør det muligt at udføre hver oversættelsescyklus for to dataanmodninger samtidigt. Ligesom instruktionen TLB er denne buffer opdelt mellem to slags poster.
  • Datacachen indeholder 64-byte kopier af hukommelsesbidder. Den er opdelt i 8 banker (banker), der hver indeholder 8 kilobyte data. Cachen tillader to anmodninger om 8-byte data hver cyklus, forudsat at anmodningerne behandles af forskellige banker. Tag-strukturerne i cachen er duplikeret, da hver 64-byte blok er fordelt over alle 8 banker. Hvis der laves 2 anmodninger i én cyklus, arbejder de med deres egen kopi af taginformationen.

Denne kerne bruger også multi-level cache: to-niveau instruktions- og data-TLB'er (kun registreringer af 4-KB mappings gemmes på andet niveau) og en andet-niveau cache (L2), samlet til at arbejde med både data og instruktion caches på 1. niveau, og for forskellige TLB'er. L2-cachen er eksklusiv for L1-data og L1-instruktioner, det vil sige, at hver cachelagret 8-byte-chunk kan være i enten L1-instruktioner eller L1-data eller L2. Den eneste undtagelse er de bytes, der udgør PTE-posterne, som kan være i TLB og i datacachen på samme tid under virtuel kortlægningsbehandling af OS. I et sådant tilfælde er operativsystemet ansvarligt for omgående at nulstille TLB'en efter opdatering af oversættelsesindtastningerne.

DEC Alpha

I DEC Alpha 21164-mikroprocessoren (udgivet i november 1995 ved 333 MHz) kan cachen på første niveau understøtte et antal (op til 21) ubehandlede fejl. Der er en  6-elements rå miss-adressefil (MAF ), hvor hvert element indeholder en adresse og et register, der skal indlæses på en miss (hvis miss-adresser hører til den samme cache-linje, behandles de som ét element i MAF).

Ud over separate gennemskrivnings-L1-cacher indeholder processorchippen en delvist associativ tilbageskrivnings-L2-cache og en L3-cache-controller, der fungerer i både synkrone og asynkrone tilstande.

March 1997 DEC Alpha 21164PC'en har en ekstern L2-cache; instruktionscache-størrelse øget til 16 KB.

DEC Alpha 21264-mikroprocessoren har ikke en cache på andet niveau (hvis controlleren ikke desto mindre er placeret på en chip), men cachen på første niveau øges til 128 kB (64 kB hver for henholdsvis instruktionscachen og datacachen) ).

PA-RISC

Hewlett-Packard PA-8000 til videnskabelig og teknisk databehandling indeholder en  adressegenbestillingsbuffer ( ARB ), der holder styr på alle indlæsnings-/lagringskommandoer, hvilket reducerer ventetiden for adressering af de eksterne data og instruktionscache, som i denne processor kan være oppe. til 4 MB. Selv effektiv kontrol af den eksterne cache ved hjælp af højhastighedskontrollinjer og forhåndshentning af data og kommandoer fra hovedhukommelsen til cachen kompenserede dog ikke for den lave hastighed og høje omkostninger.

Disse mangler blev elimineret i PA-8500, hvor det på grund af 0,25 mikron procesteknologien var muligt at tilføje 512 kB instruktionscache og 1 MB datacache til chippen.

PowerPC

Bygget på Harvard-arkitekturen PowerPC 620 indeholder to indbyggede caches, hver med en kapacitet på 32 kB, som har deres egne memory management units ( MMU ) og fungerer uafhængigt af hinanden .  Kommandoer og filialadresser cachelagres i BTAC-cachen ( Branch-Target Address Cache ) . 

Processorens businterface inkluderer en fuld implementering af L2-cache-understøttelse (op til 128 MB, kører ved processorfrekvensen eller to gange/fire gange mindre) og kræver ikke yderligere cyklusser for at kontrollere driften af ​​den eksterne cache. En kombination af pass-through og tilbageskrivning er implementeret, samt understøttelse af MESI-protokollen.

MIPS

L1-cachen, der bruges i RA-10000, har sine egne detaljer - hver kommando i cachen er udstyret med et ekstra fire-bit tag, som bruges til yderligere afkodning og klassificering af kommandoen.

Aktuel udvikling

Noter

  1. Korneev V. V., Kiselev A. V. 1.2.3 Strukturelle metoder til reduktion af hukommelsesadgangstid // Moderne mikroprocessorer. - M . : "Viden", 1998. - S. 75-76. - 240 sek. - 5000 eksemplarer.  - ISBN 5-98251-050-6 .
  2. Afhængighed af processorydelse af L2-cachestørrelse . Hentet 20. oktober 2011. Arkiveret fra originalen 22. oktober 2011.
  3. AMD Athlon II X4 eller Phenom II: Impact of L3 Cache on Performance . Dato for adgang: 12. januar 2015. Arkiveret fra originalen 15. juli 2014.
  4. Softwareudviklermanual til Intel 64 og IA-32 Architectures. Bind 1: Grundlæggende arkitektur. Ordrenummer 253665-021.
  5. Forstå cachelagring . Linux Journal. Hentet 2. maj 2010. Arkiveret fra originalen 27. april 2012.
  6. https://www.theregister.co.uk/2004/05/06/hp_mx2_itaniummodule/ Arkiveret 10. august 2017 på Wayback Machine "HP har pakket mx2 med 32MB L4-cache"
  7. https://www.theregister.co.uk/2010/07/23/ibm_z196_mainframe_processor/ Arkiveret 10. august 2017 på Wayback Machine "L4 cache-hukommelse, som de fleste servere ikke har. (IBM tilføjede noget L4-cache til sine EXA-chipsæt til Xeon-processorer fra Intel for et par år tilbage). Denne L4-cache er nødvendig af en nøgleårsag"
  8. IBM POWER4-processorgennemgang. Ixbtlabs Arkiveret 13. juli 2011 på Wayback Machine "En vigtig egenskab ved L3-cachen er evnen til at kombinere separate caches af POWER4-chips op til 4 (128 MBytes), hvilket tillader brug af adresseinterleaving for at fremskynde adgangen."
  9. En detaljeret undersøgelse af AMD64-arkitekturen Arkiveret 27. januar 2012 på Wayback Machine // ixbt.com , "The Cache Subsystem. Søgning og analyse af ændringer»
  10. NPJouppi. "Forbedring af direkte kortlagt cache-ydeevne ved at tilføje en lille fuldt associativ cache og præfetch-buffere." — 17th Annual International Symposium on Computer Architecture, 1990. Proceedings., DOI:10.1109/ISCA.1990.134547
  11. Victim Cache Simulator . Hentet 12. januar 2012. Arkiveret fra originalen 2. maj 2010.
  12. Processor-hukommelsens ydeevnegab (downlink) . acm.org. Hentet 8. november 2007. Arkiveret fra originalen 27. april 2012. 
  13. Guk M. 4. Hukommelsescaching // Pentium II, Pentium Pro og kun Pentium-processorer. - M . : Piter, 1999. - S. 126-143. — 288 s. - 7000 eksemplarer.  - ISBN 5-8046-0043-5 .
  14. Korneev V. V., Kiselev A. V. 2.2.1.2 Separate instruktions- og datacaches // Moderne mikroprocessorer. - M . : "Viden", 1998. - S. 75-76. - 240 sek. - 5000 eksemplarer.  - ISBN 5-98251-050-6 .

Se også

Links