Processorns cache

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 7 september 2020; kontroller kräver 15 redigeringar .

En mikroprocessorcache  är en cache (supersekundärt minne) som används av en datormikroprocessor för att minska den genomsnittliga åtkomsttiden till datorminnet . Det är en av de övre nivåerna i minneshierarkin [1] . Cachen använder ett litet, mycket snabbt minne (vanligtvis av SRAM -typ ) som lagrar kopior av data som ofta används från huvudminnet. Om de flesta av minnesförfrågningarna behandlas av cachen, kommer den genomsnittliga minnesåtkomstfördröjningen att närma sig cachefördröjningen.

När en processor behöver komma åt minne för att läsa eller skriva data, kontrollerar den först om en kopia finns tillgänglig i cachen. Om kontrollen lyckas utför processorn operationen med hjälp av cachen, vilket är mycket snabbare än att använda det långsammare huvudminnet. För mer om minneslatens, se SDRAM - latens : tCAS, tRCD, tRP, tRAS.

Data mellan cache och minne överförs i block med fast storlek, även kallade cache - linjer eller cache-block . 

De flesta moderna mikroprocessorer för datorer och servrar har minst tre oberoende cacher: en instruktionscache för att påskynda laddningen av maskinkod , en datacache för att snabba upp läsning och skrivning av data, och en översättningsassociativ buffert (TLB) för att påskynda översättningen av virtuella (logiska) adresser till fysiska, som för instruktioner såväl som för data. Datacachen implementeras ofta som en lagercache (L1, L2, L3, L4).

Att öka cachestorleken kan ha en positiv effekt på prestandan för nästan alla applikationer [2] , även om effekten i vissa fall är försumbar [3] . Arbetet med cacheminnet är vanligtvis transparent för programmeraren, men för dess effektiva användning används i vissa fall speciella algoritmiska tekniker som ändrar ordningen för att kringgå data i RAM eller ökar deras lokalitet (till exempel med blockmatrismultiplikation ) [4] .

Hur det fungerar

Det här avsnittet beskriver en typisk datacache och vissa typer av instruktionscacher; översättningsassocieringsbufferten (TLB) kan vara mer komplex, men instruktionscachen kan vara enklare. Diagrammet till höger visar huvud- och cacheminne. Varje rad är en grupp minnesceller som innehåller data organiserade i cache-rader . Storleken på varje cache-linje kan variera från processor till processor, men för de flesta x86-processorer är den 64 byte. Cacheminnets storlek är vanligtvis större än datastorleken som kan nås från en enskild maskininstruktion (typiska storlekar är från 1 till 16 byte). Varje grupp av data i minnet med en storlek på 1 cache-rad har ett serienummer. För huvudminnet är detta nummer minnesadressen med de minst signifikanta bitarna som kasseras. I cachen för varje cache-rad tilldelas taggen dessutom , vilket är adressen till data som dupliceras i denna cache-rad i huvudminnet.

När processorn får åtkomst till minnet kontrollerar den först om cachen lagrar data som begärts från minnet. För att göra detta jämförs förfrågningsadressen med värdena för alla cache-taggar där denna data kan lagras. Fallet med en matchning med taggen för valfri cache-rad kallas en cacheträff ( engelsk  cachehit ), det motsatta fallet kallas cachemiss ( engelsk  cachemiss ). En cacheträff tillåter processorn att omedelbart läsa eller skriva data till cacheraden med den matchade taggen. Förhållandet mellan antalet cacheträffar och det totala antalet minnesförfrågningar kallas träfffrekvensen  , det är ett mått på effektiviteten av cachen för den valda algoritmen eller programmet.

I händelse av en miss tilldelas en ny post i cachen, i taggen för vilken adressen för den aktuella begäran skrivs, och i själva cacheraden - data från minnet efter att ha läst det eller data som ska skrivas till minnet. Läs missar fördröjning av exekvering eftersom de kräver att data begärs i det långsammare huvudminnet. Skrivmissar kanske inte orsakar latens, eftersom data som skrivs kan lagras omedelbart i cachen och att skriva dem till huvudminnet kan göras i bakgrunden. Instruktionscache fungerar på ungefär samma sätt som datacachealgoritmen ovan, men endast läsbegäranden görs för instruktioner. Instruktions- och datacachar kan separeras för att öka prestandan (en princip som används i Harvard-arkitekturen ) eller kombineras för att förenkla hårdvaruimplementeringen.

För att lägga till data till cachen efter en cachemiss kan det vara nödvändigt att avhysa tidigare skrivna data .  För att välja en cache-rad som ska ersättas används en heuristik som kallas ersättningspolicy . Algoritmens huvudproblem är att förutsäga vilken rad som sannolikt inte behövs för efterföljande operationer. Kvalitativa förutsägelser är komplexa och hårdvarucacher använder enkla regler som LRU . Att markera vissa minnesområden som icke-cache-bara förbättrar prestandan genom att förhindra att sällan använda data cachelagras . Missar för sådant minne skapar inte kopior av data i cachen.   

När du skriver data till cachen måste det finnas en viss tidpunkt när det kommer att skrivas till huvudminnet. Den här tiden styrs av skrivpolicyn .  För genomskrivningscacher resulterar all skrivning till cachen i en omedelbar skrivning till minnet. En annan typ av cacher, återskrivning eng. återskrivning (ibland även kallad återkopiering ), skjuter upp skrivningen till ett senare tillfälle. I sådana cacher övervakas tillståndet för cache-raderna som ännu inte har spolas in i minnet (markerade med "smutsiga" biten ) . dirty ). Skrivning till minnet utförs när en sådan rad vräkts från cachen. Således kan en cachemiss som använder en återskrivningspolicy kräva två minnesåtkomster, en för att återställa tillståndet för den gamla raden och en för att läsa den nya datan.     

Det finns också blandade policyer. Cachen  kan skrivas igenom , men för att minska antalet transaktioner på bussen kan skrivningar tillfälligt köas och slås samman med varandra.

Data i huvudminnet kan modifieras inte bara av processorn utan också av kringutrustning som använder direkt minnesåtkomst eller av andra processorer i ett multiprocessorsystem. Att ändra data gör att kopian i cachen blir föråldrad (det inaktuella tillståndet ). I en annan implementering, när en processor modifierar data i cachen, kommer kopior av dessa data i cachen hos andra processorer att markeras som inaktuella. För att hålla innehållet i flera cachar uppdaterat används ett speciellt koherensprotokoll .

Strukturen för cache-posten

Typisk cache-poststruktur

Datablock märka lite relevans

Datablocket (cache-raden) innehåller en direkt kopia av data från huvudminnet. Den färska biten betyder att denna post innehåller en uppdaterad (senaste) kopia.

Adressstruktur

märka index partiskhet

Minnesadressen är uppdelad (från höga bitar till låga bitar) i Tag, index och offset . Längden på indexfältet är bitar och motsvarar raden (raden) i cachen som används för att skriva. Offsetlängden är .

Associativitet

Associativitet är en kompromiss. Att kontrollera fler poster kräver mer energi, chiparea och eventuellt tid. Om det fanns 10 platser där eviction-algoritmen kunde kartlägga en minnesplats, skulle det krävas att man tittade på 10 cache-poster för att leta efter den cacheplatsen. Å andra sidan är cacher med hög associativitet föremål för färre missar (se "konfliktmissar" nedan) och processorn lägger mindre tid på att läsa från långsamt huvudminne. Det finns en empirisk observation att fördubbling av associativiteten (från direkt mappning till 2-kanal eller från 2- till 4-kanal) har ungefär samma inverkan på träffhastigheten som en fördubbling av cachestorleken. Att öka associativiteten över 4 kanaler har liten effekt på att minska missfrekvensen och görs vanligtvis av andra skäl, såsom virtuella adresskorsningar.

I ordningsföljd för försämring (ökning av träffkontrollens varaktighet) och förbättring (minska antalet missar):

  1. direkt mappad cache - den  bästa träfftiden och följaktligen det bästa alternativet för stora cacher;
  2. 2-kanals multiassociativ  cache 2-vägs set tillhörande cache ;
  3. 2-vägs skev associativ cache ( André Seznec  )
  4. 4-way set associative cache ( eng.  4-way set associative cache );
  5. helt associativ  cache fullständigt associativ cache  - den bästa (lägsta) procentandelen missar (missfrekvens) och det bästa alternativet för extremt höga kostnader när det saknas (missstraff).
Pseudoassociativ cache

Typer av missar

Missade att läsa från instruktionscache. Ger vanligtvis en mycket lång fördröjning, eftersom processorn inte kan fortsätta exekvera programmet (åtminstone den aktuella exekveringstråden) och måste vila medan den väntar på att instruktionen ska laddas från minnet.

Missade att läsa från datacachen. Ger vanligtvis mindre latens, eftersom instruktioner som inte beror på den begärda datan kan fortsätta att exekvera medan begäran bearbetas i huvudminnet. Efter att ha tagit emot data från minnet kan du fortsätta att utföra beroende instruktioner.

Datacache skriv miss. Ger vanligtvis minst latens, eftersom skrivningen kan ställas i kö och efterföljande instruktioner är praktiskt taget obegränsade i sina möjligheter. Processorn kan fortsätta sitt arbete, förutom fallet med en skrivmiss med full kö.

Miss kategorier ( Tre Cs )

  • Obligatoriska missar - missar orsakade av första omnämnandet av den begärda adressen. Storleken på cacher och deras associativitet påverkar inte antalet missar. Förhämtning, både mjukvara och hårdvara, kan hjälpa, liksom att öka cache-radens storlek (som en form av hårdvaruförhämtning). Sådana missar kallas ibland för "kallmissar".
  • Kapacitetsmissar - missar som enbart orsakas av cachens ändliga storlek, som inträffar oavsett graden av associativitet eller storleken på cacheraden. En plot av sådana missar kontra cachestorlek kan ge ett visst mått på den tidsmässiga lokaliteten för en uppsättning minnesbegäranden. Det är värt att notera att det inte finns något koncept med en full cache, en tom cache eller en nästan full cache, eftersom processorcache har cache-linjer i ett upptaget tillstånd nästan hela tiden, och därför nästan varje etablering av en ny linje kommer att kräva att du rensar en redan upptagen.
  • Konfliktmissar – missar orsakade av en konflikt. De kan undvikas om cachen inte hade vräkt posten tidigare. Kan ytterligare delas in i missar orsakade av mappning (ett särskilt associativitetsvärde) och ersättningsmissar som orsakas av en viss algoritm för att välja poster som ska ersättas.

Adressöversättning

De flesta generella processorer implementerar någon form av virtuellt minne . Kort sagt, varje program som körs på en maskin ser sitt eget förenklade adressutrymme som endast innehåller programmets kod och data. Alla program använder sitt eget virtuella adressutrymme, oavsett var det befinner sig i det fysiska minnet.

Närvaron av virtuellt minne kräver att processorn översätter de virtuella (matematiska) adresserna som används av programmet till fysiska adresser som motsvarar den verkliga platsen i RAM. Den del av processorn som gör denna omvandling kallas minneshanteringsenheten (MMU). För att påskynda översättningar har en cache med nyligen använda mappningar (överensstämmelser av virtuella och fysiska adresser) som kallas Translation Lookaside Buffer (TLB) lagts till i MMU.

Tre funktioner i adressöversättningsprocessen är viktiga för ytterligare beskrivning:

  • Fördröjning: Den fysiska adressen kommer att tas emot från MMU först någon tid senare, upp till flera cykler, efter att den virtuella adressen från adressgeneratorn matats till MMU-ingången.
  • Överlagringseffekt: Flera virtuella adresser kan motsvara en fysisk adress. De flesta processorer garanterar att alla skrivningar till en fysisk adress kommer att göras i den ordning som anges av programmet. Den här egenskapen kräver verifiering av att endast en kopia av data från den fysiska adressen för närvarande finns i cachen.
  • Mappningsenhet: Virtuellt adressutrymme är paginerat - minnesblock av en fast storlek som börjar på adresser som är multiplar av deras storlek. Till exempel kan 4 GB adressutrymme delas upp i 1 048 576 sidor på 4 KB, som var och en oberoende kan mappas till fysiska sidor. Moderna processorer stöder ofta flera sidstorlekar samtidigt, till exempel 4 KB och 2 MB för x86-64, och vissa moderna AMD-processorer stöder även 1 GB.

Det är också viktigt att notera att tidiga virtuella minnessystem var mycket långsamma eftersom de krävde att sidtabellen (lagrad i huvud-RAM) skulle kontrolleras innan någon åtkomst till programminnet gjordes. Utan användning av cachning för mappningar minskar sådana system hastigheten för att arbeta med minne med cirka 2 gånger. Därför är användningen av TLB mycket viktig och ibland föregick dess tillägg till processorer uppkomsten av konventionella data- och instruktionscacher.

I relation till virtuell adressering kan data- och instruktionscacher delas in i 4 typer. Adresser i cacher används för två olika syften: indexering och taggning.

  • Fysiskt indexerad, fysiskt taggad (PIPT) - fysiskt indexerad och fysiskt taggad. Sådana cachar är enkla och undviker aliasproblem, men de är långsamma eftersom en begäran om en fysisk adress i TLB krävs innan man får åtkomst till cachen. Denna begäran kan orsaka en TLB-miss och en extra träff till huvudminnet innan data kontrolleras i cachen.
  • Virtually indexed, virtually tagged (VIVT) - virtuellt indexerad och virtuellt taggad. Både taggning och indexering använder en virtuell adress. På grund av detta går kontrollerna för förekomst av data i cachen snabbare, utan att det krävs ett anrop till MMU. Ett överlappningsproblem uppstår dock när flera virtuella adresser mappas till samma fysiska adress. I detta fall kommer data att cachelagras två gånger, vilket avsevärt komplicerar upprätthållandet av koherens. Ett annat problem är homonymer, situationer där samma virtuella adress (till exempel i olika processer) mappas till olika fysiska adresser. Det blir omöjligt att särskilja sådana mappningar enbart med det virtuella indexet. Möjliga lösningar: tömning av cachen när du växlar mellan uppgifter (kontextväxling), kräver att processadressutrymmen inte skärs, taggar virtuella adresser med ett adressutrymmes-ID (ASID) eller använder fysiska taggar. Det finns också ett problem när man ändrar mappningen av virtuella adresser till fysiska, vilket kräver återställning av cache-raderna för vilka mappningen har ändrats.
  • Virtuellt indexerad, fysiskt taggad (VIPT) - virtuellt indexerad och fysiskt taggad. Indexet använder en virtuell adress, medan taggen använder en fysisk adress. Fördelen gentemot den första typen är lägre latens, eftersom du kan slå upp cache-raden samtidigt som TLB-adressöversättningen, men taggjämförelsen fördröjs tills den fysiska adressen erhålls. Fördelen jämfört med den andra typen är upptäckten av homonymer, eftersom taggen innehåller en fysisk adress. Denna typ kräver fler bitar för taggen eftersom indexbitarna använder en annan adresseringstyp.
  • Fysiskt indexerade, virtuellt taggade  - fysiskt indexerade och virtuellt taggade cacher anses vara värdelösa och marginella och är av rent akademiskt intresse [5] .

Hastigheten på dessa åtgärder (latensladdning från minnet) är avgörande för processorns prestanda, och därför är de flesta moderna L1-cachar praktiskt taget indexerade, vilket åtminstone tillåter MMU:n att fråga TLB:n samtidigt som den begär data från cachen.

Virtuell taggning och vhints-mekanismen

Men virtuell indexering är inte det bästa valet för andra nivåer av cache. Kostnaden för att upptäcka virtuella adresskorsningar (aliasing) ökar med cachestorleken och som ett resultat använder de flesta implementeringar av L2 och ytterligare cachenivåer fysisk adressindexering.

Under ganska lång tid använde cacher både fysiska och virtuella adresser för taggar, även om virtuell taggning är mycket sällsynt idag. Om TLB-begäran slutar före cachebegäran kommer den fysiska adressen att vara tillgänglig för jämförelse med taggen när den behövs, och därför krävs ingen virtuell taggning. Stora cacher taggas oftare med fysiska adresser, och endast små, snabba cacher använder virtuella adresser för taggar. I moderna generella processorer har virtuell taggning ersatts av vhints-mekanismen, som beskrivs nedan.

Virtuell indexering och virtuella adresskorsningar Problemet med homonymer och synonymer Sidfärgning

Hierarki av cacher i moderna mikroprocessorer

De flesta moderna processorer innehåller flera interagerande cacher.

Specialiserade cacher

Superskalära processorer kommer åt minnet från flera steg i pipelinen : läser en instruktion (instruktionshämtning), översätter virtuella adresser till fysiska, läser data (datahämtning). Den uppenbara lösningen är att använda olika fysiska cacher för vart och ett av dessa fall så att det inte finns något argument för tillgång till en av de fysiska resurserna från olika stadier av pipelinen. Att ha en pipeline resulterar sålunda i minst tre separata cache: en instruktionscache, en TLB- översättningscache och en datacache, var och en specialiserad för en annan uppgift.

Pipeline-processorer som använder separata cachar för data och instruktioner (sådana processorer finns nu överallt) kallas Harvard-arkitekturprocessorer . Ursprungligen användes denna term för datorer där instruktioner och data är helt separerade och lagrade i olika minnesenheter. En sådan fullständig separation har dock inte visat sig populär, och de flesta moderna datorer har en enda huvudminne, så kan betraktas som von Neumann-arkitekturmaskiner .

Flernivåcacher

Ett av problemen är det grundläggande problemet med att balansera cachefördröjning och träffhastighet. Större cachar har en högre träfffrekvens men också en högre latens. För att lätta på spänningen mellan de två använder de flesta datorer flera nivåer av cache när små och snabba cacher följs av långsammare stora cacher (för närvarande upp till 3 nivåer i cachehierarkin).

I enstaka fall implementeras 4 cachenivåer [6] [7] .

Layered cacher fungerar vanligtvis i sekvens från mindre cacher till större. Först kontrolleras den minsta och snabbaste cachen på den första nivån (L1), vid en träff fortsätter processorn att arbeta med hög hastighet. Om den mindre cachen missar, kontrolleras nästa lite större och långsammare andranivå (L2) cache, och så vidare, tills det finns en begäran till huvud-RAM.

När fördröjningsskillnaden mellan RAM och den snabbaste cachen ökar, ökar vissa processorer antalet cachenivåer (i vissa upp till 3 nivåer på ett chip). Till exempel hade Alpha 21164-processorn 1995 en 96 kB on-chip L3-cache; IBM POWER4 2001 hade upp till fyra 32 MB L3-cacher [8] på separata stansar, delade av flera kärnor; Itanium 2 2003 hade 6 MB L3-cache på chipet; Xeon MP-kod "Tulsa" 2006 - 16 MB L3-cache på chip, delad av 2 kärnor; Phenom II 2008 - upp till 6 MB universell L3-cache; Intel Core i7 2008 - 8 MB on-chip L3-cache, som är inklusive och delas mellan alla kärnor. Användbarheten av en L3-cache beror på typen av programmets minnesåtkomster.

Slutligen, på andra sidan av minneshierarkin finns registerfilen för själva mikroprocessorn, som kan betraktas som den minsta och snabbaste cachen i systemet med speciella egenskaper (till exempel statisk schemaläggning av kompilatorn vid allokering av register när den allokerar data från RAM till ett register). Se optimering av loopnest för detaljer . Registerfiler kan också vara hierarkiska: Cray-1 (1976) hade 8 adress "A"-register och 8 allmänna skalära "S"-register . Maskinen innehöll också en uppsättning av 64 adress "B" och 64 skalära "T" register, som tog längre tid att komma åt, men fortfarande betydligt snabbare än huvudminnet. Dessa register introducerades på grund av bristen på datacache i maskinen (även om det fanns en instruktionscache i maskinen)

Exklusivitet (exklusivitet) och inkluderande

Flernivåcacher kräver nya arkitektoniska lösningar.

Till exempel kan vissa processorer kräva att all data som lagras i L1-cachen också lagras i L2-cachen. Sådana par av cacher kallas strikt inkluderande .  Andra processorer (till exempel AMD Athlon) kanske inte har ett sådant krav, då kallas cacherna exklusiva (exklusiva)  - data kan vara antingen i L1- eller L2-cache, men kan aldrig finnas i båda samtidigt.

Hittills har andra processorer (som Pentium II, Pentium III och Pentium 4) inte kräver att data i den första nivåns cache också placeras i den andra nivåns cache, men de fortsätter att göra det. Det finns inget allmänt accepterat namn för denna mellanliggande policy, även om termen huvudsakligen inkluderande ofta används . 

Fördelen med exklusiva cacher är att de lagrar mer data. Denna fördel är större när den exklusiva L1-cachen är jämförbar i storlek med L2-cachen, och mindre när L2-cachen är många gånger större än L1-cachen. När L1 missar och L2 kommer åt på en träff, byts träffcacheraden i L2 ut mot raden i L1.

Offercache

Victim cache eller Victim buffer [9] ) (bokstavligen Victim cache) är en liten specialiserad cache som lagrar de cache-rader som nyligen togs bort från huvudmikroprocessorns cache när de byttes ut. Denna cache ligger mellan huvudcachen och dess engelska.  påfyllningsbana . Normalt är offercachen helt associativ och tjänar till att minska antalet konfliktmissar. Många vanliga program kräver inte fullständig associativ mappning för alla minnesåtkomstförsök. Statistiskt sett kommer endast en liten del av minnesåtkomsterna att kräva en hög grad av associativitet. Det är för sådana förfrågningar som offercachen används, vilket ger hög associativitet för sådana sällsynta förfrågningar. Det föreslogs av Norman Jouppi (DEC) 1990 [10] . Storleken på en sådan cache kan variera från 4 till 16 cache-rader [11] .

Spåra cache

Ett av de mest extrema fallen av cachespecialisering är spårningscachen som används i Intel Pentium 4-processorer .  Spårningscachen är en mekanism för att öka instruktionsbelastningsgenomströmningen och för att minska värmeavledning (i fallet med Pentium 4) genom att lagra avkodade instruktionsspår. Således eliminerade denna cache avkodarens arbete när den nyligen exekverade koden återexekverades.

En av de tidigaste publikationerna om spårningscacher var en artikel från 1996 av ett team av författare ( Eric Rotenberg , Steve Bennett och Jim Smith ) med titeln "Trace Cache: a Low Latency Approach to High Bandwidth Instruction Fetching." (Trace Cache: A Low-Latency Approach for High Throughput Loading Instructions).

Spårningscachen lagrar avkodade instruktioner antingen efter att de har avkodats eller efter att de har avslutat exekveringen. I allmänhet läggs instruktioner till spårningscachen i grupper som antingen är grundläggande block eller dynamiska spår. En dynamisk spårning (exekveringsväg) består endast av instruktioner vars resultat var signifikanta (används senare), och tar bort instruktioner som finns i icke-exekverande grenar, dessutom kan en dynamisk spårning vara en förening av flera grundläggande block. Denna funktion gör det möjligt för instruktionsladdaren i processorn att ladda flera grundläggande block samtidigt utan att behöva oroa sig för närvaron av grenar i exekveringstråden.

Spårningslinjer lagras i spårcacheminnet vid adresser som motsvarar instruktionsräknaren för den första maskininstruktionen från spårningen, till vilken en uppsättning grenprediktionsegenskaper har lagts till. Denna adressering låter dig lagra olika exekveringsspår som börjar på samma adress men representerar olika situationer som ett resultat av grenprediktion. Vid instruktionshämtningsstadiet av instruktionspipelinen används både den aktuella instruktionsräknaren (programräknaren) och tillståndet för förgreningsprediktorn för att kontrollera om spår finns i cachen. Om en träff inträffar matas spårningslinjen direkt till pipelinen utan att behöva polla den normala (L2) cachen eller huvud-RAM. Spårningscachen matar maskininstruktioner till pipelinens ingång tills spårningslinjen tar slut, eller tills ett prediktionsfel uppstår i pipelinen. I händelse av en miss börjar spårningscachen bygga nästa spårningsrad genom att ladda maskinkod från cachen eller från minnet.

Liknande spårcacher användes i Pentium 4 för att lagra avkodade mikrooperationer och mikrokod som implementerar komplexa x86-instruktioner. Smith, Rotenberg och Bennetts papper Se Citeseer för fulltext .

Implementeringar

Historik

Under mikroprocessorteknologins tidiga dagar var minnesåtkomsten bara något långsammare än åtkomsten till processorregister. Men sedan 1980 -talet [12] har prestandagapet mellan processorer och minne ökat. Mikroprocessorer förbättrades snabbare än minnet, särskilt när det gäller frekvensen av drift, så minnet blev flaskhalsen för att uppnå full prestanda från systemet. Även om det var tekniskt möjligt att ha ett huvudminne lika snabbt som CPU:n valdes en mer ekonomisk väg: att använda en överflödig mängd låghastighetsminne, men införa en liten men snabb cache i systemet för att mildra prestandagapet. Som ett resultat fick vi en storleksordning större mängder minne, för ungefär samma pris och med en liten förlust i total prestanda.

Att läsa data från cachen för moderna processorer tar vanligtvis mer än en klockcykel. Exekveringstiden för program är känslig för förseningar i läsningen från datacachen på första nivån. En hel del ansträngningar från utvecklare, såväl som kraften och området för kristallen när du skapar en processor, ägnas åt att påskynda driften av cacher.

Den enklaste cachen är en praktiskt taget indexerad direktmappad cache. Den virtuella adressen beräknas med hjälp av en ackumulator, motsvarande del av adressen allokeras och används för att indexera SRAM som kommer att returnera den nedladdade datan. Data kan byte-justeras i en byte shifter och sedan skickas till nästa operation. Med denna läsning krävs ingen taggkontroll, i själva verket finns det inget behov av att ens läsa taggen. Senare i pipelinen, innan läsinstruktionen avslutas, måste taggen läsas och jämföras med den virtuella adressen för att verifiera att en cacheträff har inträffat. Om det inträffade en miss skulle en läsning från minnet eller en långsammare cache krävas, med en ytterligare uppdatering av cachen i fråga och en omstart av pipeline.

En associativ cache är mer komplex eftersom någon variant av taggen måste läsas för att avgöra vilken del av cachen som ska väljas. Den första nivån N-vägs uppsättningsassociativa cachen läser typiskt alla N möjliga taggar samtidigt och N data parallellt, jämför sedan taggarna med adressen och väljer data som är associerade med den matchade taggen. Nivå 2-cacher, för att spara ström, läser ibland taggar först, och läser först sedan ett dataelement från SRAM-data.

Diagrammet till höger ska visa hur de olika delarna av adressen används. Bit 31 i adressen är den mest signifikanta biten (mest signifikant), bit 0 är den minst signifikanta biten (minst signifikant). Diagrammet visar två SRAM, indexering och multiplexering för en 4 kB, 2-vägs set-associativ, virtuell indexerad och virtuell taggad cache med 64 byte block, 32 bitars läsbredd och 32 bitars virtuell adress.

Eftersom cachen är 4KB och raderna är 64 byte lagrar den 64 rader och vi kan räkna två gånger från SRAM-taggen, som innehåller 32 kolumner, som var och en innehåller ett par 21-bitars taggar. Även om vilken virtuell adresseringsfunktion som helst av bitarna 31 till 6 kan användas för att indexera taggen och SRAM-data, är de minst signifikanta bitarna de enklaste att använda. Dessutom, eftersom cachen är 4 KB och har en läsväg på fyra byte och två läsvägar per åtkomst, är SRAM-data 512 rader 8 byte breda.

En mer modern cache skulle förmodligen vara 16K, 4-vägs, set-associativ, virtuellt indexerad, virtuellt träffad och fysiskt taggad (tagg), med 32-bitars linjer, 32-bitars läsbussbredd och 36-bitars fysisk adressering. Återkommande läsvägar för en sådan cache liknar de som diskuterats ovan. Läss virtuella träffar istället för taggar ? ( engelska  vhits ), och återigen matchas delmängden till den virtuella adressen. Senare, i pipelinen, översätts den virtuella adressen till den fysiska adressen för TLB:n, och den fysiska taggen läses (endast en, eftersom den virtuella träffen tillhandahåller cache-läsvägen). Slutligen jämförs den fysiska adressen med den fysiska taggen för att avgöra om en träff har inträffat.

Vissa SPARC-processorer hade L1-cacher som accelererades av flera grindfördröjningar genom  att använda SRAM-avkodare istället för en virtuell adressadderare. Se en:Sumadresserad dekoder för detaljer .

I X86

När x86- mikroprocessorer nådde frekvenser på 20 megahertz eller mer (från och med Intel 80386 ) lades en liten mängd snabbcacheminne till för att öka prestandan. Detta var nödvändigt på grund av det faktum att DRAM som användes som system-RAM hade betydande förseningar (upp till 120 ns), och krävde cykler för att uppdatera. Cachen byggdes kring den dyrare men mycket snabbare SRAM , som vid den tiden hade 15-20ns latenser. Tidiga cacher var externa till processorn och var ofta placerade på moderkortet som 8 eller 9 chips i DIP- paket , arrangerade i socklar för att tillåta cachen att växa eller krympa. Vissa versioner av I386-processorn stödde från 16 till 64 KB extern cache [13] .

Med lanseringen av Intel 80486-processorn integrerades 8 kB cache direkt på mikroprocessorn. Denna cache kallades L1 (nivå ett, eng.  nivå 1 ) för att skilja den från den långsammare moderkortscachen kallad L2 (andra nivå, eng.  nivå 2 ). De senare var mycket större, upp till 256 kB.

I framtiden gjordes fall av cache-separation endast på grundval av marknadsföringspolitiska överväganden, till exempel i Celeron- mikroprocessorn , byggd på Pentium II- kärnan .

Pentium- mikroprocessorn använder en separat cache, instruktioner och data [14] . Adressöversättningsbufferten (TLB) översätter en adress i RAM till motsvarande adress i cachen. Pentium-datacachen använder återskrivningsmetoden ,  som gör att du kan modifiera data i cachen utan ytterligare åtkomst till RAM (data skrivs till RAM endast när det tas bort från cachen) och MESI-protokollet (Modified, Exclusive, Shared, Invalid) , som säkerställer datakoherens i processorcacher och i RAM när man arbetar i ett multiprocessorsystem.

Var och en av de separata cacharna, data och instruktioner för Pentium MMX- mikroprocessorn är 16 kB i storlek och innehåller två portar, en för varje exekveringspipeline. Datacachen har en adressöversättningsbuffert (TLB).

Nästa implementering av cacher i x86 dök upp i Pentium Pro , där cachen på andra nivån (kombinerad för data och kommandon, 256-512 kB i storlek) placeras i samma paket med processorn och cachen på första nivån, 8 kB i storlek, separat för data och kommandon, och höjde dess frekvens till kärnfrekvensen. Senare började den andra nivåns cache placeras på samma chip som processorn.

Dual Independent Bus är en  ny cachearkitektur som använder olika bussar för att ansluta processorkärnan till huvudminnet. L1-cachen är dubbelportad, icke-blockerande och stöder en laddnings- och en skrivoperation per klocka. Körs med processorns klockfrekvens. 64 bitar överförs per cykel.

I Pentium II -mikroprocessorn har cachen på första nivån utökats - 16 KB för data och 16 KB för instruktioner. För den andra nivåns cache används BSRAM, placerad på samma kort som processorn i SEC-kassetten för installation i Slot 1 .

Med den växande populariteten för flerkärniga processorer började tredje nivås cacher, kallade L3, läggas till chippet. Denna cachenivå kan delas mellan flera kärnor och möjliggör effektiv kommunikation mellan kärnor. Dess volym är vanligtvis större än den totala cachestorleken för alla kärnor som är anslutna till den och kan nå 16 MB.

Moderkortets cache förblev populär fram till Pentium MMX -eran och försvann i och med introduktionen av SDRAM och den växande skillnaden mellan processorbussfrekvensen och processorkärnfrekvensen: cachen på moderkortet blev bara något snabbare än huvudminnet.

Exempel på cache (K8-processorkärna)

Schemat för cacher för AMD K8-mikroprocessorkärnan visas, vilket visar både specialiserade cacher och deras flernivåkaraktär.

Kärnan använder fyra olika specialiserade cacher: instruktionscache, instruktions-TLB, data-TLB och datacache:

  • Instruktionscachen består av 64-byte block, som är en kopia av huvudminnet, och kan ladda upp till 16 byte per klocka. Varje byte i denna cache lagras i 10 bitar istället för 8, och instruktionsgränser är markerade i de extra bitarna (dvs cachen gör partiell föravkodning). Endast paritet används för att kontrollera dataintegriteten, inte ECC, eftersom paritetsbiten tar mindre plats, och i händelse av ett fel kan korrupta data uppdateras med rätt version från minnet.
  • Instruktionen TLB innehåller kopior av sidtabellsposterna. För varje begäran att läsa kommandon krävs översättning av matematiska adresser till fysiska. Översättningsposter är 4-byte och 8-byte, och TLB är uppdelad i 2 delar, respektive en för 4 kB-mappningar och den andra för 2 och 4 MB-mappningar (stora sidor). En sådan partition förenklar de helt associativa sökscheman i var och en av delarna. OS och applikationer kan använda mappningar av olika storlek för delar av det virtuella adressutrymmet.
  • Data-TLB är dubbel och båda buffertarna innehåller samma uppsättning poster. Deras dualitet gör det möjligt att utföra varje översättningscykel för två dataförfrågningar samtidigt. Precis som instruktionen TLB är denna buffert uppdelad mellan två typer av poster.
  • Datacachen innehåller 64-byte kopior av minnesbitar. Den är uppdelad i 8 banker (banker), som var och en innehåller 8 kilobyte data. Cachen tillåter två förfrågningar om 8-byte data varje cykel, förutsatt att förfrågningarna behandlas av olika banker. Taggstrukturerna i cachen är duplicerade, eftersom varje 64-byte block är fördelat över alla 8 banker. Om 2 förfrågningar görs i en cykel arbetar de med sin egen kopia av tagginformationen.

Denna kärna använder också flernivåcache: tvånivåers instruktions- och data-TLB:er (endast poster av 4-KB-mappningar lagras på den andra nivån), och en andranivåcache (L2), förenad för att fungera med både data och instruktioner cacher på den första nivån och för olika TLB:er. L2-cachen är exklusiv för L1-data och L1-instruktioner, det vill säga varje cachad 8-byte-bit kan vara antingen i L1-instruktioner eller L1-data eller L2. Det enda undantaget är byten som utgör PTE-posterna, som kan finnas i TLB och i datacchen samtidigt under virtuell kartläggning av operativsystemet. I ett sådant fall är operativsystemet ansvarigt för att omedelbart återställa TLB efter uppdatering av översättningsposterna.

DEC Alpha

I mikroprocessorn DEC Alpha 21164 (släpptes i november 1995 vid 333 MHz) kan cachen på första nivån stödja ett antal (upp till 21) obehandlade missar. Det finns en  rå missadressfil med sex element (MAF ), varje element innehåller en adress och ett register för att laddas på en miss (om missadresser tillhör samma cache-rad behandlas de som ett element i MAF).

Förutom separata genomskrivnings-L1-cacher innehåller processorchippet en delvis associativ återskrivnings-L2-cache och en L3-cachekontroller som fungerar i både synkrona och asynkrona lägen.

Mars 1997 DEC Alpha 21164PC har en extern L2-cache; storleken på instruktionscachen ökat till 16 KB.

DEC Alpha 21264-mikroprocessorn har inte en andra nivås cache (vars styrenhet ändå är placerad på ett chip), men den första nivåns cache ökas till 128 kB (64 kB vardera för instruktionscache respektive datacache) ).

PA-RISC

Hewlett-Packard PA-8000 för vetenskapliga och tekniska beräkningar innehåller en  adressomställningsbuffert ( ARB ) som håller reda på alla load/store-kommandon, vilket minskar fördröjningen för att adressera extern data och instruktionscache, som i denna processor kan vara uppe. till 4 MB. Men inte ens effektiv kontroll av den externa cachen med hjälp av höghastighetskontrolllinjer och förhämtning av data och kommandon från huvudminnet till cachen kompenserade inte för den låga hastigheten och höga kostnaden.

Dessa brister eliminerades i PA-8500, där det, tack vare 0,25 mikron processteknik, var möjligt att lägga till 512 kB instruktionscache och 1 MB datacache till chipet.

PowerPC

Byggd på Harvard-arkitekturen PowerPC 620 innehåller två inbyggda cacher, var och en med en kapacitet på 32 kB, som har sina egna minneshanteringsenheter ( MMU ) och fungerar oberoende av varandra .  Kommandon och filialadresser cachelagras i BTAC-cachen ( Branch-Target Address Cache ) . 

Processorns bussgränssnitt inkluderar en fullständig implementering av L2-cache-stöd (upp till 128 MB, körs på processorfrekvensen eller två gånger/fyra gånger mindre) och kräver inga ytterligare cykler för att styra driften av den externa cachen. En kombination av pass-through och återskrivning implementeras, samt stöd för MESI-protokollet.

MIPS

L1-cachen som används i RA-10000 har sina egna detaljer - varje kommando i cachen är utrustat med ytterligare en fyra-bitars tagg, som används för att ytterligare avkoda och klassificera kommandot.

Aktuell utveckling

Anteckningar

  1. Korneev V. V., Kiselev A. V. 1.2.3 Strukturella metoder för att reducera minnesåtkomsttid // Moderna mikroprocessorer. - M . : "Kunskap", 1998. - S. 75-76. — 240 s. - 5000 exemplar.  - ISBN 5-98251-050-6 .
  2. Beroende av processorprestanda på L2-cachestorlek . Hämtad 20 oktober 2011. Arkiverad från originalet 22 oktober 2011.
  3. AMD Athlon II X4 eller Phenom II: Effekten av L3-cache på prestanda . Tillträdesdatum: 12 januari 2015. Arkiverad från originalet 15 juli 2014.
  4. Intel 64 and IA-32 Architectures Software Developer's Manual. Volym 1: Grundläggande arkitektur. Beställningsnummer 253665-021.
  5. Förstå cachelagring . Linux Journal. Hämtad 2 maj 2010. Arkiverad från originalet 27 april 2012.
  6. https://www.theregister.co.uk/2004/05/06/hp_mx2_itaniummodule/ Arkiverad 10 augusti 2017 på Wayback Machine "HP har packat mx2 med 32MB L4-cache"
  7. https://www.theregister.co.uk/2010/07/23/ibm_z196_mainframe_processor/ Arkiverad 10 augusti 2017 på Wayback Machine "L4-cacheminne, som de flesta servrar inte har. (IBM lade till lite L4-cache till sina EXA-kretsuppsättningar för Xeon-processorer från Intel för några år sedan). Denna L4-cache är nödvändig av en viktig anledning"
  8. Granskning av IBM POWER4-processor. Ixbtlabs Arkiverad 13 juli 2011 på Wayback Machine "En viktig egenskap hos L3-cachen är förmågan att kombinera separata cacher av POWER4-chips upp till 4 (128 MByte) vilket gör det möjligt att använda adressinterleaving för att påskynda åtkomsten."
  9. En detaljerad studie av AMD64-arkitekturen Arkiverad 27 januari 2012 på Wayback Machine // ixbt.com , "The Cache Subsystem. Sökning och analys av förändringar»
  10. NPJouppi. "Förbättrar direktmappad cacheprestanda genom tillägg av en liten helt associativ cache och förhämtningsbuffertar." — 17th Annual International Symposium on Computer Architecture, 1990. Proceedings., DOI:10.1109/ISCA.1990.134547
  11. Victim Cache Simulator . Hämtad 12 januari 2012. Arkiverad från originalet 2 maj 2010.
  12. Prestandagapet mellan processor och minne (nedlänk) . acm.org. Hämtad 8 november 2007. Arkiverad från originalet 27 april 2012. 
  13. Guk M. 4. Minnescache // Pentium II, Pentium Pro och bara Pentium-processorer. - M . : Piter, 1999. - S. 126-143. — 288 sid. - 7000 exemplar.  - ISBN 5-8046-0043-5 .
  14. Korneev V. V., Kiselev A. V. 2.2.1.2 Separata instruktions- och datacacher // Moderna mikroprocessorer. - M . : "Kunskap", 1998. - S. 75-76. — 240 s. - 5000 exemplar.  - ISBN 5-98251-050-6 .

Se även

Länkar