Architektury paralelních počítačů II. Sekvenční konzistence paměti Implementace synchronizačních událostí Ing. Miloš Bečvář s použitím slajdů Prof. Ing. Pavla Tvrdíka, CSc.
Osnova přednášky Opakování definice paměťové koherence Model sekvenční konzistence paměti Typy synchronizačních událostí Způsoby implementace zámků Atomické instrukce RMW Instrukční pár LL & SC Implementace bariéry
Problém koherence skrytých pamětí - přesněji Definice: Řekneme že multiprocesorový paměťový systém je koherentní jestliže výsledek jakéhokoli provádění programu je takový, že pro každé paměťové místo je možné sestavit myšlené sériové pořadí čtení a zápisů k tomuto paměťovému místu a platí 1. Paměťové operace k danému paměťovému místu pro každý proces jsou provedeny v pořadí, ve kterém byly spuštěny tímto procesem. 2. Hodnoty vracené každou operací čtení jsou hodnotami naposledy provedené operace zápis do daného paměťového místa vzhledem k sériovému pořadí.
Stačí koherence k rozumnému chování sdilené paměti? Proměnná f indikuje, že proměnná x byla změněna. Očekáváme, že print(x) vytiskne 1. Paměťová koherence ovšem nijak nespecifikuje v jakém pořadí jednotlivé procesy P1 a P2 spouštějí své paměťové operace (read, write) a nijak nespecifikuje v jakém pořadí uvidí P2 zápisy do x a f. Koherence pouze zajistí, že P2 se nakonec dozví nové hodnoty x a f, ale nijak nespecifikuje v jakém pořadí tyto nové hodnoty obdrží. Proto ani na počítači s koherentním paměťovým systémem není vyloučeno, že P2 vytiskne starou hodnotu x (tj. 0).
Co by se mohlo stát i při koherentní paměti? P1 na procesoru 1 P2 na procesoru 2 WRITE (X, 1) L1: READ R1, (F) WRITE (F,1) BEQZ R1, L1 READ R2, (X) print R2 Na procesoru s prováděním instrukcí mimo programové pořadí může být provedeno READ R2, (X) dříve než skončí READ R1, (F) a skok je vyhodnocen: 1. P2 spustí READ R1, (F) a nenajde F v cache, vydá požadavek na čtení z paměti, ale nejprve musí získat sběrnici. 2. P2 využije času a spustí spekulativně READ R2, (X) za předpovězeným skokem BEQZ. Hodnota X=0 je nalezena v cache a je předána do R2. 3. Procesor P1 získá sběrnici a provede BusWr(X,1), hodnota X je v cache u procesoru 1 zneplatněna v souladu s koherenčním protokolem. 4. Procesor P1 získá sběrnici a provede BusWr(F,1). 5. Procesor P2 získá sběrnici a provede BusRd(F). Do R1 získá novou hodnotu F=1 což potvrdí, že předpověď BEQZ byla správná a spekulace úspěšná. 6. P2 vytiskne starou hodnotu X uloženou do R2.
Model sekvenční konzistence
Implementace Sekvenční Konzistence (SC) Konzistence oproti koherenci specifikuje v jakém pořadí jednotlivé procesy spouštějí své paměťové operace (či v jak se toto pořadí jeví ostatním procesorům) Dále specifikuje, že všechny paměťové operace lze sestavit do myšleného sekvenčního pořadí. Koherence požaduje možnost sestavení myšleného sekvenčního pořadí pouze vůči jednotlivým paměťovým místům (nikoli mezi přístupy do různých paměťových míst). Je možné implementovat cache koherenční počítač s jiným než sekvenčním konzistenčním modelem.
Postačující podmínky pro zajištění SC
SC vs optimalizace výkonu Zajištění SC není jen problém HW neboť programátor očekává zachování programového po adí popsaného ve zdrojovém programu ve vyšším programovacím jazyce. Prakticky všechny vyšší p.j. mají definován slabší model konzistence a programátor musí striktnější podmínky na paměťové operace vynutit např. použitím deklarace proměnné jako volatile. Různé procesory implementují buď sekvenční konzistenci nebo některý ze slabších konzistenčních modelů.
Sběrnicově založené SMP a koherence a konzistence Sběrnice zajišťuje serializaci paměťových operací, propagaci výsledků a za určitých podmínek i atomicitu paměťových operací (záleží na protokolu sb.). Myšlené pořadí operací požadované v definicích koherence a konzistence je pořadím těchto operací na sběrnici.
WTWNA a problém koherence a konzistence Tento důkaz ještě obsahuje skrytý předpoklad, že Read a Write jsou jednotlivými procesory spouštěny v programovém pořadí a procesor čeká na dokončení Write!
Dijkstra, 1965
Zámek pomocí Test & Set simulace na MESI Lock (a L ) UnLock (a L ) P3 unlocked a L P 1 P 2 P 3 P 4 a L :? I a L :? I a L : 0 M a L :? I P3: BusUpgrd a L : 1
Zámek pomocí Test & Set simulace na MESI Lock (a L ) UnLock (a L ) P1 is trying to lock a L P 1 P 2 P 3 P 4 a L : 0 S a L :? I a L : 0 S a L :? I P1: BusRd a L : 0
Zámek pomocí Test & Set simulace na MESI Lock (a L ) UnLock (a L ) P1 is trying to lock a L,, it succeeds P 1 P 2 P 3 P 4 a L : 1 M a L :? I a L : 0 I a L :? I P1: BusUpgrd a L : 0
Zámek pomocí Test & Set simulace na MESI Lock (a L ) UnLock (a L ) P2 is trying to lock a L, P 1 P 2 P 3 P 4 a L : 1 S a L : 1 S a L : 0 I a L :? I P2: BusRd a L : 1
Zámek pomocí Test & Set simulace na MESI Lock (a L ) UnLock (a L ) P2 is trying to lock a L, unsuccessfully P 1 P 2 P 3 P 4 a L : 1 I a L : 1 M a L : 0 I a L :? I P2: BusUpgrd a L : 1
Zámek pomocí Test & Set simulace na MESI Lock (a L ) UnLock (a L ) P4 is trying to lock a L, P 1 P 2 P 3 P 4 a L : 1 I a L : 1 S a L : 0 I a L : 1 S P4: BusRd a L : 1
Zámek pomocí Test & Set simulace na MESI Lock (a L ) UnLock (a L ) P4 is trying to lock a L, P 1 P 2 P 3 P 4 a L : 1 I a L : 1 I a L : 0 I a L : 1 M P4: BusUpgrd a L : 1
Zámek pomocí LL & SC simulace na MESI Lock (a L ) UnLock (a L ) P3 unlocked a L P 1 P 2 P 3 P 4 a L :? I a L :? I a L : 0 M a L :? I P3: BusUpgrd a L : 1
Zámek pomocí LL & SC simulace na MESI Lock (a L ) UnLock (a L ) P1 executes LL P 1 P 2 P 3 P 4 a L : 0 S a L :? I a L : 0 S a L :? I P1: BusRd a L : 0
Zámek pomocí LL & SC simulace na MESI Lock (a L ) UnLock (a L ) P2 executes LL P 1 P 2 P 3 P 4 a L : 0 S a L : 0 S a L : 0 S a L :? I P2: BusRd a L : 0
Zámek pomocí LL & SC simulace na MESI Lock (a L ) UnLock (a L ) P1 executes SC (P2 will cancel attempt to execute SC) P 1 P 2 P 3 P 4 a L : 1 M a L : 0 I a L : 0 I a L :? I P1: BusUpgrd a L : 0
Zámek pomocí LL & SC simulace na MESI Lock (a L ) UnLock (a L ) P4 executes LL P 1 P 2 P 3 P 4 a L : 1 S a L : 0 I a L : 0 I a L : 1 S P4: BusRd a L : 1
Zámek pomocí LL & SC simulace na MESI Lock (a L ) UnLock (a L ) P2 executes LL, now P2 and P4 loops internally till the a L is unlocked P 1 P 2 P 3 P 4 a L : 1 S a L : 1 S a L : 0 I a L : 1 S P2: BusRd a L : 1
Závěr Pro synchronizaci v paralelních počítačích se sdílenou pamětí je vhodné definovat sekven n konzistentní pam ový systém. Synchronizační operace jsou vzájemné vylou ení, dvoubodová synchronizace a synchroniza ní bariéra. Základem implementace synchronizačních operací jsou atomické RMW primitivy. V ISA procesorů se vyskytují RMW instrukce T&S, SWAP, F&I, C&S Novější procesory podporují tvorbu RMW primitiv pomocí instrukcí LL a SC, které umožňují efektivní implementaci synchronizačních operací v systémech se skrytými paměťmi