20Aug
Om du just börjat lära dig hur flera kärnprocessorer, cachning, cache-koherens och minne fungerar, kan det verka lite förvirrande först. Med det i åtanke har dagens SuperUser Q & A-inlägg svar på en nyfiken läsarens fråga.
Dagens fråga &Svarssession kommer till oss med tillstånd av SuperUser-en indelning av Stack Exchange, en community-driven gruppering av Q & A-webbplatser.
Frågan
SuperUser-läsare CarmeloS vill veta när en CPU-cache spolas tillbaka till huvudminne:
Om jag har en CPU med två kärnor och varje kärna har sin egen L1-cache, är det möjligt att Core1 och Core2 båda cachar sammadel av minnet samtidigt? Om det är möjligt, vad kommer värdet av huvudminne att vara om både Core1 och Core2 har redigerat sina värden i cacheminnet?
När är en CPU-cache spolad tillbaka till huvudminne?
Svaret
SuperUser-bidragsgivarna David Schwartz, Sleske och Kimberly W har svaret för oss. Först upp, David Schwartz:
Om jag har en CPU med två kärnor och varje kärna har sin egen L1-cache, är det möjligt att Core1 och Core2 båda cachar samma del av minnet samtidigt?
Ja, prestanda skulle vara hemskt om det inte var fallet. Tänk på två trådar som kör samma kod. Du vill ha den koden i båda L1-cacherna.
Om det är möjligt, vad kommer värdet av huvudminne att vara om både Core1 och Core2 har redigerat sina värden i cacheminnet?
Det gamla värdet kommer att vara i huvudminnet, vilket inte spelar någon roll eftersom ingen kärna kommer att läsa den. Innan du matar ut ett modifierat värde från cacheminnet måste det skrivas till minnet. Vanligtvis används en viss variant av MESI-protokollet. Vid det traditionella genomförandet av MESI, om ett värde har ändrats i en cache, kan det inte alls vara närvarande i någon annan cache på samma nivå.
Följd av svaret från sleske:
Ja, med två caches cache kan samma minnesregion hända och är egentligen ett problem som händer mycket i praktiken. Det finns olika lösningar, till exempel:
- De två cacherna kan kommunicera för att de inte håller med om
- Du kan ha någon form av övervakare som övervakar alla cacher och uppdaterar dem följaktligen
- Varje processor övervakar de minnesområden som den har cachat ochNär det upptäcker en skriv, slänger den sin( nu ogiltiga) cache
Problemet kallas cachekoherens och Wikipedia-artikeln om ämnet har en fin översikt över problemet och möjliga lösningar.
Och vårt slutliga svar från Kimberly W:
För att svara på frågan i din inläggets titel beror det på vad cacheprotokollet är. Om det är återkoppling spolas cacheminnet bara tillbaka till huvudminnet när cachecontrollern inte har något annat val än att lägga ett nytt cacheblock i redan upptaget utrymme. Blocket som tidigare rymde utrymmet tas bort och värdet skrivs tillbaka till huvudminnet.
Det andra protokollet är genomskrivning. I det fallet, när cacheblocket är skrivet på nivå n uppdateras motsvarande block på nivå n + 1 .Det är liknande i koncept att fylla i en blankett med kolpapper undervad du skriver överst kopieras på arket nedan. Detta är långsammare eftersom det uppenbarligen innebär fler skrivoperationer, men värdena mellan cacher är mer konsekventa. I återskrivningssystemet skulle endast cachen med högsta nivå ha det mest aktuella värdet för ett visst minnesblock.
Har du något att lägga till förklaringen? Ljud av i kommentarerna. Vill du läsa mer svar från andra tech-savvy Stack Exchange-användare? Kolla in hela diskussionsgängan här.
Bildkrediter: Lemsipmatt( Flickr)