Hemsida » hur » När är en CPU-cache spolad tillbaka till huvudminne?

    När är en CPU-cache spolad tillbaka till huvudminne?

    Om du precis 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-post svar på en nyfiken läsarens fråga.

    Dagens Question & Answer-session 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 samma del av minnet samtidigt? Om det är möjligt, vad kommer värdet av huvudminnet att vara om både Core1 och Core2 har redigerat sina värden i cacheminnet?

    När är en CPU-cache spolad tillbaka till huvudminnet?

    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 huvudminnet 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 skickar 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öljt av svaret från sleske:

    Ja, med samma cache i samma cache kan samma minnesområde hända och det är faktiskt ett problem som uppstår mycket i praktiken. Det finns olika lösningar, till exempel:

    • De två cacherna kan kommunicera för att se till att de inte håller med varandra
    • Du kan ha någon form av handledare som övervakar alla cacher och uppdaterar dem i enlighet därmed
    • Varje processor övervakar de minnesområden som den har cachat, och när den upptäcker en skriv, slänger den bort 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 sista svar från Kimberly W:

    För att svara på frågan i ditt 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. Det block som tidigare ockuperade utrymmet tas bort och dess värde skrivs tillbaka till huvudminnet.

    Det andra protokollet är genomskrivning. I så fall är cacheblocket när som helst skrivet på nivå n, motsvarande block på nivå n + 1 är uppdaterad. Det är liknande i koncept att fylla i en blankett med kolpapper under vad 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 återkopplingsschemat 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)