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] .
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 .
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 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):
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ø.
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:
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.
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.
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 SidefarvningDe fleste moderne processorer indeholder flere interagerende caches.
Specialiserede cachesSuperscalar 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 cachesEt 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)
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 cacheVictim 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 cacheEt 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 .
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 .
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:
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.
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) ).
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.
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.
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.
processorteknologier | Digitale|||||||||
---|---|---|---|---|---|---|---|---|---|
Arkitektur | |||||||||
Instruktionssæt arkitektur | |||||||||
maskinord | |||||||||
Parallelisme |
| ||||||||
Implementeringer | |||||||||
Komponenter | |||||||||
Strømstyring |