Hvis du lige er begyndt at lære, hvordan multi-core CPU'er, cache, cache-sammenhæng og hukommelse fungerer, kan det virke lidt forvirrende i starten. Med dette i tankerne har dagens SuperUser Q&A-indlæg svar på en nysgerrig læsers spørgsmål.
Dagens spørgsmål og svar-session kommer til os med tilladelse fra SuperUser - en underinddeling af Stack Exchange, en community-driven gruppe af Q&A websteder.
Spørgsmålet
SuperUser-læser CarmeloS vil vide, hvornår en CPU's cache skylles tilbage til hovedhukommelsen:
Hvis jeg har en CPU med to kerner, og hver kerne har sin egen L1-cache, er det så muligt, at Core1 og Core2 begge cache den samme del af hukommelsen på samme tid? Hvis det er muligt, hvad vil værdien af hovedhukommelsen være, hvis både Core1 og Core2 har redigeret deres værdier i cache?
Hvornår skylles en CPU's cache tilbage til hovedhukommelsen?
Svaret
SuperUser-bidragsydere David Schwartz, sleske og Kimberly W har svaret til os. Først op, David Schwartz:
Hvis jeg har en CPU med to kerner, og hver kerne har sin egen L1-cache, er det så muligt, at Core1 og Core2 begge cache den samme del af hukommelsen på samme tid?
Ja, ydeevne ville være forfærdeligt, hvis dette ikke var tilfældet. Overvej to tråde, der kører den samme kode. Du vil have den kode i begge L1-cacher.
Hvis det er muligt, hvad vil værdien af hovedhukommelsen være, hvis både Core1 og Core2 har redigeret deres værdier i cache?
Den gamle værdi vil være i hovedhukommelsen, hvilket ikke betyder noget, da ingen af kernerne læser den. Før en ændret værdi skubbes ud fra cachen, skal den skrives til hukommelsen. Typisk er en variant af MESI-protokol anvendes. I den traditionelle implementering af MESI, hvis en værdi ændres i en cache, kan den slet ikke være til stede i nogen anden cache på det samme niveau.
Efterfulgt af svaret fra sleske:
Ja, hvis der er to cache-cache, kan den samme hukommelsesregion ske og er faktisk et problem, der forekommer meget i praksis. Der er forskellige løsninger, for eksempel:
- De to cacher kan kommunikere for at sikre, at de ikke er uenige
- Du kan have en slags supervisor, der overvåger alle cacher og opdaterer dem i overensstemmelse hermed
- Hver processor overvåger de hukommelsesområder, som den har cachelagret, og når den registrerer en skrivning, kaster den sin (nu ugyldige) cache ud
Problemet kaldes cache-sammenhæng og Wikipedia-artikel om emnet har en god oversigt over problemet og mulige løsninger.
Og vores endelige svar fra Kimberly W:
For at besvare spørgsmålet i dit indlægs titel afhænger det af, hvad cacheprotokollen er. Hvis det er tilbagekobling, skylles cachen kun tilbage til hovedhukommelsen, når cache-controlleren ikke har andet valg end at placere en ny cache-blok i allerede optaget rum. Blokken, der tidligere besatte rummet, fjernes, og dens værdi skrives tilbage til hovedhukommelsen.
Den anden protokol er gennemskrivning. I så fald når som helst cache-blokken skrives på niveau n , den tilsvarende blok på niveau n + 1 er opdateret. Det ligner i konceptet at udfylde en formular med carbonpapir nedenunder; hvad du end skriver, kopieres på nedenstående ark. Dette er langsommere, fordi det naturligvis involverer flere skrivefunktioner, men værdierne mellem cacher er mere ensartede. I tilbagekoblingsskemaet vil kun cache på højeste niveau have den mest opdaterede værdi for en bestemt hukommelsesblok.
Har du noget at tilføje til forklaringen? Lyd fra i kommentarerne. Vil du læse flere svar fra andre teknisk kyndige Stack Exchange-brugere? Tjek den fulde diskussionstråd her .
Billedkredit: Lemsipmatt (Flickr)