Pokud se právě začínáte učit, jak fungují vícejádrové procesory, ukládání do mezipaměti, koherence mezipaměti a paměť, může se to na první pohled zdát trochu matoucí. S ohledem na to má dnešní příspěvek SuperUser Q&A odpovědi na otázku zvědavého čtenáře.
Dnešní relace Otázky a odpovědi k nám přichází s laskavým svolením SuperUser - členění Stack Exchange, komunitního seskupení webů otázek a odpovědí.
Otázka
Čtečka SuperUser CarmeloS chce vědět, kdy je mezipaměť procesoru vyprázdněna zpět do hlavní paměti:
Pokud mám procesor se dvěma jádry a každé jádro má vlastní mezipaměť L1, je možné, že Core1 a Core2 ukládají stejnou část paměti najednou? Pokud je to možné, jaká bude hodnota hlavní paměti, pokud Core1 i Core2 upravily své hodnoty v mezipaměti?
Kdy je mezipaměť procesoru vyprázdněna zpět do hlavní paměti?
Odpověď
Odpověď na nás mají přispěvatelé SuperUser David Schwartz, sleske a Kimberly W. Nejprve, David Schwartz:
Pokud mám procesor se dvěma jádry a každé jádro má vlastní mezipaměť L1, je možné, že Core1 a Core2 ukládají stejnou část paměti najednou?
Ano, výkon by byl hrozný, kdyby tomu tak nebylo. Zvažte dvě vlákna se stejným kódem. Tento kód chcete v obou mezipaměti L1.
Pokud je to možné, jaká bude hodnota hlavní paměti, pokud Core1 i Core2 upravily své hodnoty v mezipaměti?
Stará hodnota bude v hlavní paměti, což nebude vadit, protože ji nebude číst ani jedno jádro. Před vysunutím upravené hodnoty z mezipaměti musí být zapsána do paměti. Typicky, některá varianta Protokol MESI se používá. V tradiční implementaci MESI, pokud je hodnota změněna v jedné mezipaměti, nemůže být vůbec přítomna v jakékoli jiné mezipaměti na stejné úrovni.
Následuje odpověď od sleske:
Ano, může se stát, že dvě mezipaměti budou mít stejnou oblast paměti, což je ve skutečnosti problém, který se v praxi často vyskytuje. Existují různá řešení, například:
- Dvě mezipaměti mohou komunikovat, aby se ujistily, že nesouhlasí
- Můžete mít nějakého supervizora, který sleduje všechny mezipaměti a podle toho je aktualizuje
- Každý procesor sleduje oblasti paměti, které má v mezipaměti, a když zjistí zápis, vyhodí svou (nyní neplatnou) mezipaměť
Problém se nazývá soudržnost mezipaměti a Článek na Wikipedii na toto téma má pěkný přehled o problému a možných řešeních.
A naše konečná odpověď od Kimberly W:
Chcete-li odpovědět na otázku v názvu příspěvku, záleží na tom, jaký je protokol ukládání do mezipaměti. Pokud se jedná o zpětný zápis, bude mezipaměť vyprázdněna zpět do hlavní paměti, pouze když řadič mezipaměti nemá jinou možnost, než vložit nový blok mezipaměti do již obsazeného prostoru. Blok, který dříve obsadil prostor, je odstraněn a jeho hodnota je zapsána zpět do hlavní paměti.
Druhý protokol je write-through. V takovém případě je blok mezipaměti kdykoli zapsán na úrovni n , odpovídající blok na úrovni n + 1 je aktualizován. Koncept je podobný konceptu jako vyplňování formuláře uhlíkovým papírem pod ním; vše, co napíšete nahoře, se zkopíruje na list níže. To je pomalejší, protože to samozřejmě zahrnuje více operací zápisu, ale hodnoty mezi mezipaměti jsou konzistentnější. Ve schématu zpětného zápisu by pouze nejvyšší úroveň mezipaměti měla nejaktuálnější hodnotu pro konkrétní blok paměti.
Máte co dodat k vysvětlení? Zvuk v komentářích. Chcete si přečíst více odpovědí od ostatních technicky zdatných uživatelů Stack Exchange? Podívejte se na celé diskusní vlákno zde .
Kredit obrázku: Lemsipmatt (Flickr)