1 / 37

Protokol MESI

Protokol MESI. Manuál pro začátečníky. rev 1.1. Štěpán Rezek, 2007. Co to je?. Protokol MESI (někdy nazýván Illinois protocol ) je protokol široce používaný pro zajištění paměťové koherence . Poprvé se objevil u procesorů Intel Pentium. Stavy MESI.

susan
Download Presentation

Protokol MESI

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Protokol MESI Manuál pro začátečníky rev 1.1 Štěpán Rezek, 2007

  2. Co to je? • Protokol MESI (někdy nazýván Illinois protocol) je protokol široce používaný pro zajištění paměťové koherence. Poprvé se objevil u procesorů Intel Pentium.

  3. Stavy MESI Tzn. v jakém stavu mohou být kopie proměnných v lokálním bloku M – modified E – exclusive S – shared I – invalid

  4. Stav M • Blok cache je přítomen pouze v lokální cache • Kopie byla změněna, tzn. hodnota je jiná než hodnota v hlavní paměti • Cache musí tento blok zapsat do hlavní paměti dříve, než kterákoliv jiná cache přečte (v tuto chvíli již neplatnou) hodnotu z hlavní paměti

  5. Stav E • Blok je přítomen pouze v lokální cache, ale je clean (čistý) – jeho hodnota je stejná, jako hodnota v hlavní paměti

  6. Stav S • Blok je platný a může být sdílen jinou cache

  7. Stav I • Blok v cache je neplatný

  8. Cache může vrátit hodnotu, když je blok ve stavu M, E nebo S. • Pokud je ve stavu I, musí nejdříve získat platnou hodnotu proměnné, aby uspokojila čtení. Poté se může přepnout do stavu S nebo E.

  9. Takže to shrňme:

  10. Transakce (události) na sběrnici • BusRd: Po lokálním Read miss, použit S/S – signalizuje, jestli existují sdílené kopie • BusRdX: po lokálním Write miss, žádost o nový blok + zneplatnění • BusUpgr: po lokálním Write hit nad blokem se stavem S (zneplatnění) Odpověď na čtení (BusRd nebo BusRdX): • MemSup: hlavní paměť dodává požadovaný blok do cache • CacheFlush: zdrojem dat je cache, kde je blok ve stavu.Data jsou vypláchnuta na sběrnici a uložena do hl. paměti i předána žádající cache.

  11. S/S signál • Pokud by neexistoval, máme protokol MSI -> neodlišitelnost stavu E od S • => Kontrolery všech cache provádí snooping (číhají) na BusRd • Implementováno jako kus drátu, realizující log. funkci OR -> není to sběrnice

  12. PrRd PrWr/— M BusRdX/Flush PrWr/- BusRd/Flush PrWr/BusUpgr E BusRd/ MemSup BusRdX/Flush PrRd/— PrWr/BusRdX S BusRdX/MemSup PrRd/ PrRd/— BusRd (S) BusRd/ MemSup BusRdX/MemSup BusUpgr/- PrRd/ BusRd(S) Přechod vyvolaný právě aktivním procesorem I Přechod vyvolaný Okolním světem Jak spolu souvisí stavy bloků a operace na sběrnici? procesor zapisuje + na sběrnici půjde operace BusRdX procesor čte + na sběrnici půjde operace BusRd, na S/ S je hodnota 0 (S)

  13. P0 P1 Pn Systém používající MESI: Stav, v němž je blok cache Blok (kopie hodnoty z hlavní paměti) Procesor n Hlavní paměť S/S - sdílený signál, log. OR Nutný kvůli stavu E Cache (skrytá paměť) Datová sběrnice

  14. P1 P2 Na začátku jsou všechny bloky ve stavu Invalid P0 ? ? I I ? I 5 E BusRd 5 Procesor 0 chce číst hodnotu • > Čtení z hlavní paměti (MemSup), stav Exclusive Read Miss, ostatní procesory neoznamují po S/S, že mají kopii (stav sběrnice = S, tedy log. 0)

  15. P1 P0 P2 S ? E ? I 5 S I 5 BusRd 5 Procesor 2 chce číst hodnotu Čímž se u obou nastaví stav Shared, a P2 načte hodnotu z hlavní paměti (MemSup) Operaci BusRd zachytí kontroler cache 0… …a nastaví S=1 na S/S

  16. P0 P1 P2 PrWr(9) ? 5 I S I 5 M S 9 BusUpgr(x) 5 Procesor 2 chce zapsat hodnotu 9… … bingo! Už mám platnou hodnotu v cache. Kontroler nejprve musí zneplatnit kopie v ostatních cache… …a potom teprve uvede blok do stavu M

  17. P0 P1 P2 ? S 9 9 I I M S 5 CacheFlush(9) BusRd 9 5 Procesor 0 chce číst hodnotu. Problém – blok je Invalid. -> Na sběrnici se vyšle operace BusRd Ten je zachycen kontrolerem cache 2 -> vyšle S=1 na S/S … a zároveň CacheFlush, s hodnotou 9

  18. P0 P1 P2 PrWr(11) ? 9 11 9 I S S 9 M E I I BusRdX BusRdX 9 Procesor 1 chce zapsat hodnotu, která není v cache Kontroler cache vyšle operaci BusRdX, kterou zneplatní ostatní kopie bloku a vezme hodnotu z hlavní paměti Tato hodnota je vrácena zpátky – stav Exclusive a následně změněna procesorem na zapsanou –stav Modified

  19. Poznámka • Existuje ještě vylepšení protokolu MESI, nazvané MOESI • Ten je využíván např. u procesorů AMD64 • Owned -> blok v tomto stavu drží nejčerstvější správnou kopii hodnoty z hlavní paměti. Narozdíl od stavu Shared, hodnota v hlavní paměti může být neplatná. • Pouze jeden procesor může mít blok ve stavu O, všechny ostatní musí mít bloky ve stavu S.

  20. Nastal čas na přestávku a přípravu čaje…

  21. Transakce na sběrnici, ještě jednou • BusRd: Po lokálním Read miss, použit S/S – signalizuje, jestli existují sdílené kopie • BusRdX: po lokálním Write miss, žádost o nový blok + zneplatnění • BusUpgr: po lokálním Write hit nad blokem se stavem S (zneplatnění) Reakce na čtení (BusRd nebo BusRdX): • MemSup: hlavní paměť dodává požadovaný blok do cache • CacheFlush: zdrojem dat je cache, kde je blok ve stavu.Data jsou vypláchnuta na sběrnici a uložena do hl. paměti i předána žádající cache.

  22. Kritické sekce & MESI • Implementuje se pomocí sdílené proměnné Lock - zámek • Postup: • Zamkni zámek • Něco vykonej • Odemkni zámek Toto musí být atomické

  23. Několik atomických metod • Test & Set • Swap • Fetch & Increment • Compare & Swap

  24. Test & Set Musí celá proběhnout atomicky, tzn. v průběhu Read,Modify,Write nesmí ostatní procesy/ory přistoupit do místa v paměti, které je modifikováno Definice Pseudo ASM: Load r, zamek Store zamek, #1 Ret Pseudo C++: int TestAndSet(boolean&zamek) { booleanpredchoziStav = zamek; zamek = true; returnpredchoziStav; } Použití intzamek = false; voidKritickaSekce() { while(TestAndSet(zamek) == true); // kod kriticke sekce zamek = false; } Z: TestAndSetr, zamek Bnzr,Z ; kod kriticke sekce Ret Opuštění kritické sekce = nastavení zámku na false (0)

  25. Load r, zámek Store zámek, #1 Bnz r, Z Load r, zámek Store zámek, #1 Bnz r, Z;projde Load r, zámek Store zámek, #1 Bnz r, Z Load r, zámek Store zámek, #1 Bnz r, Z Test & Set + MESI: P0 P1 P2 P3 1 0 zámek= zámek= zámek= zámek= ? E M 1 ? 0 I ? I I I ? BusRd 0 zámek= Procesor 2 chce vstoupit do kritické sekce Žádná jiná cache nesdílí zámek -> na sběrnici zůstává S=0 Procesor nyní zamyká zámek... C2 neposílá BusUpgr, protože je v M… … a nyní P2 může nerušeně vykonávat kód v kritické sekci.

  26. Store zámek, #0 P0 P1 P2 P3 0 zámek= zámek= zámek= zámek= ? 1 0 ? I I M I ? BusUpgr 0 zámek= a cache pošle BusUpgr. Nakonec P2 kritickou sekci opustí….

  27. Load r, zámek Store zámek, #1 Bnz r, Z P0 P1 P2 P3 1 0 zámek= zámek= zámek= zámek= ? S M 1 S I 0 ? I I M I 0 ? CacheFlush(0) BusUpgr BusRd 0 zámek= Nyní chce P0 uzamknout zámek Procesor P0 chce vstoupit do kritické sekce a Cache0 pošle BusRd. To zachytí Cache2 a nastaví S=1 , načež pošle CacheFlush(0) . => Změna stavu Cache0 na M a poslání BusUpgr

  28. Load r, zámek Store zámek, #1 Bnz r, Z P0 P1 P2 P3 1 1 zámek= zámek= zámek= zámek= ? S I 1 M S 1 0 ? I M I I CacheFlush(1) BusUpgr BusRd 0 1 zámek= Cache0 zjistí, že někdo chce číst zámek, a tak pošle na S/S jedničku a zároveň CacheFlush(1) na sběrnici. Teď chce P1 uzamknout zámek. Test ovšem neprojde, jelikož r=1 => zpátky na Začátek Procesor 1 tedy načte hodnotu r=1. P1 poté uloží do cache jedničku a pošle BusUpgr.

  29. Load r, zámek Store zámek, #1 Bnz r, Z P0 P1 P2 P3 zámek= zámek= zámek= zámek= 1 S I 0 M 1 ? M I I I S 1 1 zámek= Procesor 3 chce taky vstoupit do kritické sekce. Na sběrnici se objeví BusRead od Cache3, následně Cache1 Nastaví S/S na 1 a pošle CacheFlush. Výsledná hodnota r=1. Nakonec P3 nastaví svůj blok na jedničku a dopadne stejně, jako P1 v minulém slidu -> znovu na začátek. P0 je zabarikádován v kritické sekci 

  30. Co dál? • Protokol MESI se také dá použít, mimo jiné, i s jinými technikami přístupu do kritických sekcí, např. LLSC (Load Linked & Store Conditional), nicméně princip je v základu stejný.

  31. To je vše, mnoho štěstí při zkoušce! I když, no, pro jistotu, ještě chvilku zůstaňte….

  32. Příklad V systému je 5 procesorů v SMP na sběrnici s protokolem MESI. Určete, které transakce a kolikrát se objeví na sběrnici, když: • každý procesor se snaží 1x dostat do CS • každý zbývající procesor se jednou zkusí dostat do CS, která je zamčená. • na začátku mají všechny bloky stav I

  33. Ugh… P0 P1 P2 P3 P4 zámek= zámek= zámek= zámek= zámek= ? ? I ? I ? I I I ? 0 zámek=

  34. Simulace, jak by to mohlo vypadat: Read Write Read Write Read Write Read Write Read Write P0 P1 P2 P3 P4 zámek= zámek= zámek= zámek= zámek= 1 ? S S I ? I ? I ? I E I I I S M M ? 0 1 M S 1 P0 se zamkne v CS, ostatní se budou neúspěšně pokoušet o totéž 1 0 Zbytek už je asi zřejmý… zámek=

  35. Tak to už je skutečně vše

  36. Odkazy • https://www.cs.tcd.ie/Jeremy.Jones/vivio/caches/MESI.htm • Vynikající simulátor protokolu MESI (WIN only) • http://cs.felk.cvut.cz/~brabect1/X36APS/pdf/aps_cv12.pdf • WTWNA - Manuál pro začátečníky • http://service.felk.cvut.cz/courses/X36APS/ • Manuál pro pokročilé 

  37. Formality • Dílo uvolňuji pod licencí Creative Commons Attribution 2.5 License • Zříkám se jakékoli odpovědnosti za škody způsobené tímto textem (třeba 4 u zkoušky… ) • A za správnost tohoto textu (chyby ale samozřejmě rád opravím) • Drobné nepřesnosti upravil Ing. Miloš Bečvář

More Related