Kešatmiņas var izmantot, lai uzlabotu piekļuves veiktspēju pie bieži lietotiem atmiņas resursiem. Ja vienam un tam pašam resursam ir vairāki kešatmiņu kopijas (piemēram, katram procesoram savs kešs), tas var radīt problēmas ar datu patiesumu un sinhronizāciju. Kešatmiņas koherence (vai kešatmiņas saskaņotība) attiecas uz mehānismiem, kas nodrošina, ka visos sistēmā esošajos kešos un kopējā atmiņā esošie dati par konkrētu atmiņas bloku ir saderīgi un loģiski pareizi — tas nozīmē, ka dati kešatmiņā saglabā savu datu integritāti un atspoguļo veiktās izmaiņas paredzamā veidā. Kešatmiņas saskaņotība ir specifisks plašākās atmiņas saskaņotības (memory consistency) problēmas gadījums.
Problemas parādās, ja vairāki keši satur to pašu atmiņas bloku un kāds no kešiem šo bloku modificē. Piemēram, daudzprocesoru sistēmā katram procesoram var būt lokāla kešatmiņa — ja augšējais klients pirms tam nolasa bloku un glabā to savā kešā, bet apakšējais klients to vēlāk maina, augšējais klients var palikt ar novecojušu (invalidu) keškopiju, par to nezinot. Šādas situācijas noved pie nekonsekvencēm un kļūdām, ja netiek pielietoti atbilstoši koherences mehānismi. Kešatmiņas saskaņotības mērķis ir pārvaldīt šos konfliktus un saglabāt konsekvenci starp kešiem un kopējo atmiņu.
Galvenie risinājumu veidi
- Snooping (autonoma uzraudzība) — visi keši uzrauga sistēmas datu bušu vai signālu vietu, lai noteiktu, kad kāds cits kešs lasa vai raksta attiecīgo atmiņas bloku. Kad tiek veikta rakstīšana, tiek nosūtīta invalīda vai atjaunināšanas ziņa citiem kešiem. Snooping ir ātrs un vienkāršs mazākiem daudzprocesoru dizainiem, kas izmanto kopēju bušu infrastruktūru.
- Direktorija protokoli — tiek izmantota centralizēta vai sadalīta direktorija, kas uztur informāciju par to, kuri keši satur konkrētu atmiņas bloku. Kad procesos tiek pieprasīta rakstīšana vai lasīšana, direktorija nosaka, kuras keškopijas jāinvalidē vai jāatjaunina. Šī pieeja mērogojas labāk lielām sistēmām, kur snooping kļūst neefektīvs.
- Rakstīšanas politikas — write-through (rakstīšana caur kešu uz galveno atmiņu) pret write-back (rakstīšana vispirms kešā, atjaunināšana galvenajā atmiņā vēlāk). Write-through vieglāk nodrošina koherenci, bet var palielināt atmiņas trafiku; write-back samazina trafiku, taču prasa spēcīgākus koherences mehānismus.
- Protokoli stāvokļu vadībai — piemēram, MSI, MESI, MOESI un citas variācijas, kas definē atmiņas bloka stāvokļus (Modified, Exclusive, Shared, Invalid u.c.) un pārejas noteikumus, kas nodrošina pareizu uzvedību lasīšanas/rakstīšanas situācijās.
Bieži sastopamas problēmas un izaicinājumi
- False sharing — divi procesori izmanto dažādus mainīgos, kas nejauši atrodas vienā atmiņas blokā. Viens procesors bieži pārraksta bloku, kas liek invalidēt otru kešu, izraisot lieku sastrēgumu un veiktspējas kritumu.
- Skalējamība — snooping protokoli labi darbojas mazākās sistēmās ar kopēju bušu, bet liela mezglu skaita gadījumā trafiks un sacīkšu nosacījumi var kļūt par šķērsli. Direktoriju pieejas bieži ir nepieciešamas mērogojumiem.
- Atmiņas modeļu atšķirība — koherence nodrošina lokālu bloku saskaņotību, bet neatrisina visu programmētāja vēlamo atmiņas uzvedību (piem., secību starp operācijām). Tādēļ papildus koherences mehānismiem ir svarīgas atmiņas konsistences (memory consistency) modeli un sinhronizācijas APIs (barjeras, slēdži, atomiskās operācijas).
Kā to risina praktiski (piemēri)
- Procesors A lasa bloku X — tas tiek saglabāts A kešā (stāvoklis: Shared vai Exclusive).
- Procesors B vēlāk raksta bloku X — tiek nosūtīta invalīda (invalidate) vai atjaunināšanas (update) ziņa. Ja tiek izmantots invalīdācijas modelis, A kešā X kļūst par Invalid un A nākamajā piekļuvē piesaka bloku no galvenās atmiņas vai no B.
- Ar direktoriju protokolu B pieprasa rakstīšanas atļauju no direktorijas, direktorija informē un pieprasa citiem kešiem invalidēt bloku, pēc tam B iegūst ekskluzīvu atļauju rakstīt.
Veiktspējas un projektēšanas apsvērumi
- Izvēle starp write-through un write-back ietekmē trafiku un sarežģītību.
- No aparatūras viedokļa svarīgas ir kešu bloku izmērs (granularitāte), mehanismi, kas samazina false sharing, un efektīva direktoriju vai snooping īstenošana.
- Programmatūras optimizācijas — piemēram, datu izkārtojuma maiņa, lai samazinātu false sharing, un pareiza sinhronizācija (locks, atomikās operācijas, barjeras) — var būt izšķirošas, lai panāktu labu kopējo veiktspēju.
Ieteikumi izstrādātājiem un arhitektiem
- Analizējiet lietošanas raksturu un izvēlieties piemērotu koherences risinājumu: snooping mazākām sistēmām, direktorija lielākām.
- Domājiet par kešu bloku lielumu un datu izkārtojumu, lai mazinātu false sharing.
- Izmantojiet modernus protokolus (piem., MESI/MOESI) un aparatūras atbalstu atomiskajām operācijām un barjerām, lai vienkāršotu programmatūras loģiku.
- Testējiet un profilēšanas laikā meklējiet kešu invalīdu/atjauninājumu pārmērību — tas bieži norāda uz optimizējamu datu sadalījumu vai sinhronizācijas problēmu.
Kopumā kešatmiņas koherence ir būtisks jautājums daudzprocesoru un dalītās atmiņas sistēmās. Pareizi izvēlēti un īstenoti koherences mehānismi nodrošina sistēmas pareizu darbību un var ievērojami ietekmēt veiktspēju. Lai sasniegtu optimālu rezultātu, nepieciešama gan aparatūras, gan programmatūras sadarbība, kā arī uzmanīga datu un sinhronizācijas struktūru plānošana.
Var rasties problēmas, ja ir daudz kopīga atmiņas resursa kešatmiņas, jo datiem kešatmiņā var vairs nebūt jēgas vai arī vienā kešatmiņā var nebūt tādu pašu datu kā pārējos. Bieži sastopams gadījums, kad rodas problēma, ir procesoru kešatmiņa daudzprocesoru sistēmā. Kā redzams attēlā, ja augšējam klientam ir atmiņas bloka kopija no iepriekšējās nolasīšanas un apakšējais klients maina šo atmiņas bloku, augšējais klients var palikt ar nederīgu atmiņas kešatmiņu, par to nezinot. Kešatmiņas saskaņotība ir paredzēta, lai pārvaldītu šādus konfliktus un saglabātu konsekvenci starp kešatmiņu un atmiņu.

