Predpomnilnik se lahko uporablja za izboljšanje zmogljivosti dostopa do določenega vira. Če je za isti vir več takih predpomnilnikov, kot je prikazano na sliki, lahko to povzroči težave. Skladnost predpomnilnika ali koherenca predpomnilnika se nanaša na načine, kako zagotoviti, da imajo vsi predpomnilniki istega vira enake podatke in da so podatki v predpomnilnikih smiselni (imenovano integriteta podatkov). Skladnost predpomnilnika je poseben primer skladnosti pomnilnika in obravnava probleme, ki nastanejo, ko več kopij istega pomnilniškega bloka obstaja hkrati.
Zakaj pride do težav
Če ima več predpomnilnikov skupni pomnilniški vir, lahko pride do nekonsistentnosti: en predpomnilnik spremeni podatke, drugi pa ostanejo z zastarelo kopijo. To je zlasti pogosto v sistemih z več procesorji ali jedri, ki ima vsak svoje lokalne predpomnilnike. Če sprememba v enem predpomnilniku ni ustrezno posredovana drugim, se lahko pojavijo napake ali napačni izračuni.
Primer: predpomnilniki procesorjev
Pogost primer, kjer se pojavi težava, je predpomnilnik procesorjev v večprocesorskem sistemu. Kot je razvidno iz slike, če ima zgornji odjemalec kopijo pomnilniškega bloka iz prejšnjega branja in spodnji odjemalec ta pomnilniški blok spremeni, lahko zgornji odjemalec ostane z neveljavnim pomnilniškim predpomnilnikom, ne da bi za to vedel. Koherenca predpomnilnika je namenjena obvladovanju takšnih konfliktov in ohranjanju skladnosti med predpomnilnikom in glavnim pomnilnikom.
Osnovni pristopi za ohranjanje koherence
- Invalidate (neveljavni) — ko jedro zapiše blok, pošlje signal drugim predpomnilnikom, naj označijo svoje kopije kot neveljavne. Naslednji bralec bo moral pridobiti sveže podatke iz glavnega pomnilnika ali lastnika bloka.
- Update (posodobitev) — ob zapisu se sprememba razširi tudi v druge kopije, tako da ostanejo vsi sinhronizirani. To lahko poveča promet, če se veliko zapisov strogo propagira naprej.
Standardni protokoli koherence
V praksi se uporabljajo protokoli, ki definirajo stanja bloka v predpomnilniku in pravila za prehode med njimi. Najpogostejši so:
- MSI — osnovni tridestatni protokol: Modified, Shared, Invalid. Upravlja, kdaj je kopija spremenjena in kdo je lastnik.
- MESI — razširitev MSI z dodatnim E (Exclusive) stanjem, ki označuje, da je kopija edina in ni spremenjena — omogoča izogibanje nepotrebnim dostopom do glavnega pomnilnika.
- MOESI — nadaljnja razširitev z O (Owner), ki dovoli, da spremenjeni blok ostane v predpomnilniku kot "lastnik" in ga drugi bralci pridobijo neposredno od njega brez pisanja nazaj v glavni pomnilnik.
Mehanizmi izvajanja
- Snooping (prisluškovanje) — vsak predpomnilnik spremlja (snoops) komunikacijo na skupni vodilu/busu in reagira na relevantne ukaze (invalidate/update). Deluje dobro na manjših deljenih medijih z omejenim številom jedr.
- Directory-based — skalabilnejši pristop, kjer centralna ali porazdeljena podatkovna struktura (direktorij) sledi, kateri procesorji imajo kopije določenega bloka, in koordinira invalidate/updates. Primeren za velike sistemske konfiguracije in razpršene arhitekture.
Težave in posebni pojavi
- False sharing — ko različni procesi ali niti spreminjajo različne spremenljivke, ki pa se nahajajo v istih pomnilniških blokih, lahko sprožijo nepotrebne invalidate/updates, kar poslabša zmogljivost. Rešitev: poravnava podatkov, ločevanje spremenljivk ali padding.
- Razhajanja v časovnih vrstah — ko zapisi in branja prihajajo v različnih vrstah, je pomembno zagotoviti pravilna pravila za redosled; to se pogosto povezuje z modelom konsistence pomnilnika.
- Overhead prometa — obsežno posodabljanje ali pogoste invalidate operacije povečajo promet po interkonekcijah in lahko zmanjšajo korist predpomnilnika.
Koherenca vs. konsistentnost pomnilnika
Pomembno je razlikovati koherenco (garancija, da so različne kopije istega pomnilniškega naslova urejene in ustrezne sorazmerno z zapisi) od konsistentnosti pomnilnika (večji koncept, ki določa, kakšne vidne časovne in funkcionalne zagotovitve ima program glede vrstnega reda različnih naslovov). Tudi če je koherenca zagotovljena, lahko različni modeli konsistence (npr. sequential consistency, weak consistency) določajo različne vidne posledice v večnitnem programu.
Praktični vplivi in optimizacije
- Arhitekture pogosto uporabijo kombinacijo write-back predpomnilnikov in invalidate protokolov, da zmanjšajo promet v glavnem pomnilniku.
- Programski prijemi, kot so minimalizacija deljenih podatkov, uporaba lokalnih kopij, sinhronizacija z zaklepi ali barierami, lahko zmanjšajo število konfliktov in izboljšajo koherenco.
- Profiliranje in analiza false sharinga pomagata prepoznati ozka grla v večjedrnih aplikacijah.
Zaključek
Koherenca predpomnilnika je ključna lastnost sodobnih večjedrnih in distribuiranih sistemov, saj zagotavlja, da so podatki dosledni in pravilni, ko jih več enot istočasno bere ali zapisuje. Razumevanje protokolov, mehanizmov izvajanja in praktičnih posledic (kot je false sharing) je nujno za načrtovanje učinkovitih strojnih arhitektur in optimizacijo aplikacij za zmogljivost in pravilnost.

