MESI i Intel Core 2 Duo Sammanfattning Denna rapport beskriver en processor (Intel Core 2 Duo) vars cache coherence protokoll är MESI. Rapporten beskriver hur processorn är uppbyggd, hur många kärnor den har och hur de kommunicerar med minnet, och hur den håller sina cacher konsistenta med MESI protokollet. MESI beskrivs, hur dess tillstånd förändras när processorn försöker läsa eller skriva till och från cache och hur buss snooping fungerar och hur det ändrar tillstånden i cacherna. Inledning För att minska tiden som en processor spenderar i primärminnet och hämtar data, vilket tar mycket tid, så använder processorn cacheminnen. I cacheminnet sparas kopior av data som användes senast av processorn, detta för att processorn ska kunna komma åt data snabbt i framtiden, man antar att om man har använt data för en stund sedan så ska man kanske snart använda den igen. Man kan ändra på data som är lagrat i cacheminnet och om man ändrar på data i cacheminnet så ändrar man till slut denna datan i primärminnet, men detta sker inte alltid direkt utan ofta så ligger datan ändrad i cacheminnet ett tag innan det skrivs tillbaka till primärminnet. Nu för tiden har utvecklingen av processorer börjat gå mot processorer som använder sig av multicore system. Där de då har flera kärnor där varje kärna består av en liten processor som utför beräkningar, skrivningar osv, medan allt styrs av den stora processorn. Varje kärna har sitt eget lokala cacheminne. När man använder sig av fler än ett cacheminne, vilket blir vanligare ju längre utvecklingen av multiprocessorer kommer, då behöver man protokoll som har hand om kontrollen av minnet. Man måste kontrollera hur minnet blir uppdaterat och hur cacheminnena kontrollerar och vet om en minnesrad är användbar eller inte, för att förhindra in konsistenta cacheskrivningar. Cache coherence är vad som händer när två eller flera lokala cacheminnen använder sig av samma primärminne. Om man t.ex. har två cacheminnen och det ena minnet får uppdaterad data, då kan det andra cacheminnet vara kvar med en ogiltig cache med data utan att veta om att datan är ogiltig, sedan när processorn kallar på den ogiltiga cache raden så får den tag på fel data. För att undvika att detta inträffar så används cache coherence protokoll för att hålla koll om någon data har blivit ändrad, och sedan uppdatera alla cacheminnena där denna data finns lagrad. I denna rapport beskrivs en processor (Intel Core 2 Duo) vars cacheminnen använder sig av ett specifikt protokoll (MESI protokollet) som används i cacheminnen för att hålla data som är lagrad i dem konsistent. Detta kallas också för cache coherence protokoll.
Slutledning Under de senaste åren inom utvecklingen av processorer så har utvecklingen gått mot processorer med flera kärnor. När en processor har fler än en kärna så kan den utföra fler än en process eller beräkning parallellt. Detta gör att det går mycket snabbare att exekvera program och att man kan ha flera program igång parallellt. Intel Core 2 Duo var en processor som tillverkades av Intel från år 2006 till år 2011. Den hade en max klockfrekvens från 1.06 GHz till 3.33 GHz beroende på vilken version som man köpte. Den var den andra i Intels Intel Core serie och användes både till bärbara och stationära datorer. Processorn hade två kärnor den hade instruktions set x86 och x86-64. Vilket gjorde att den kunde användas med operativsystem som var upp till 64 bitar för den hade register som var 64 bitar i storlek. I processorn Intel Core 2 Duo som använde sig av ett multicore system med två kärnor alltså med två små processorer som arbetar parallellt och sköter alla beräkningar, läsningar och skrivningar till och från minnet, medan själva processorn styr de två små processorerna. I ett multicore system så kommunicerar de olika kärnorna via laddningar och lagringar till och från det delade minnet. Dessa sker på den delade minnesbussen som går till det delade minnet. Figur 1Intel core 2 duo inre process Som man kan se i figur 1 så har de två kärnorna ett delat minne, en delad minnes buss där alla läsningar och skrivningar till cacheminnena sker och vars ett lokalt cacheminne. För att hålla de separata cacheminnena konsistenta, alltså för att alla cacheminnen har uppdaterad data och inte gammal överskriven data, så måste de använda sig av ett cache coherence protokoll. Cache coherence protokoll är ett protokoll som sköter det så att kärnornas lokala cacheminnen hålls konsistenta, vilket betyder att det gör så att cacherna vet om de håller data som inte längre är aktuell.
Det finns många olika cache coherence protokoll men i denna processor så används MESI protokollet. MESI är ett av de vanligaste cache coherence protokollen. Det utvecklades i USA på universitet i Illinois och kallas därför ibland för Illinois protokollet. Cache coherence händer på chipet, det är en hårdvarulösning. MESI står för de olika tillstånden som protokollet har: M- Modified E- Exclusive S- Shared I- Invalid Om tillståndet är Modified så finns den data man söker i cacheminnet som man är i nuvarande och det har blivit modifierat, datan har ändrats från datan som finns lagrat i det delade minnet, men en read kan fortfarande hända från det nuvarande cacheminnet, men man kan inte utföra en read från det icke modifierade delade minnet. När write-back händer, alltså när datan från cacheminnet skrivs tillbaka till det delade minnet, så ändras tillståndet till Exclusive. Om tillståndet är Exclusive så finns den data som man söker i det nuvarande cacheminnet och den har inte blivit modifierad. Så den är identisk med data som finns lagrad i det delade minnet. Tillståndet kan ändras till Shared närsomhelst. Den kan också ändras till Modified tillståndet när en write händer till cache. Om tillståndet är Shared så kan datan från cache raden användas av de andra cache minnena eftersom datan är ren den har inte blivit modifierad och den matchar datan som finns i det delade minnet. Om en skrivning sker till någon av cacherna så kan tillståndet ändras till Invalid. Om tillståndet är Invalid så sker ingen read eller write från cache utan datan måste hämtas från det delade minnet för datan finns inte längre eller har aldrig funnits i cachen. Det finns olika anledningar för att tillståndet i cachen ska ändras. Tillståndet ändras som en funktion av minnes access händelser, alltså när processorn försöker få tillgång till cachen, för att skriva till cachen eller för att läsa från cachen. Den andra anledningen för att tillståndet på cache raden ändras är aktivitet i bussen som kopplar de olika processorerna till det delade minnet. För att en cache ska få reda på snabbt om en eller flera av deras cache rader blir Invalid så håller varje cache koll på bussen som kopplar de olika processorerna med det delade minnet. Varje cache vet vilka cache rader som de har och de vet deras adresser så de har koll på bussen, och om de märker att en av deras adresser rör sig i bussen så kan de anta att den datan snart kan bli Invalid och då ändrar den tillstånd på den cache raden. Detta kallas för snooping. Cacherna kan se om en write operation händer i någon av de andra cacherna eftersom när en write händer så sänds det ut ett meddelande på minnesbussen som har adressen till den data som det händer på, adressen som pekar någonstans i det delade minnet. Om en cache ser i bussen att en adress som den har cachat får en write operation utförd på sig så ändrar den cache raden med adressen i till tillståndet Invalid, för den antar att den data om den hade cachat är nu inaktuell och kan inte längre bli läst ur cachen.
Figur 2MESI tillstånds diagram I figur 2 så står de olika beteckningarna för: PrRd = Processor Read - Read request från processor, PrWr = Processor Write - Write request från processorn, BusRd = Bus - Read request från mines bussen utan avsikt att modifiera. The 'S' betyder att den delade signalen BusRdX = Bus Read Exclusive - Read request från minnesbussen med avsikt att modifiera. I figur 2 så kan man se hur de olika tillstånden ska förändras när read och write funktioner händer i processorn. Man kan också se hur de förändras när caherna läser från minnesbussen och tolkar resultatet. MESI är inte ett perfekt protokoll, den har problem när den försöker utföra en write operation till en invalid cache rad. Det blir en lång fördröjning när cache raden hämtas från det delade minnet, för att sedan kunna skriva till den raden när den har hämtats. För att dra ner på denna fördröjning så har processorn buffrar som gör att när raden har hämtats så skrivs det till den direkt i minnesbuffren istället för att vänta till den kommit hela vägen till cachen som den ska till och sen göra en write request så write requesten behöver inte vänta. Men det kan hända andra problem när den använder sig av bufferten, den måste skanna bufferten varje gång den vill göra ett write request för att se om raden som den ska skriva till finns och väntar i bufferten. Det kan också bli att det blir invalid på grund av att de andra kärnorna inte får reda på att en rad blivit ändrad tills det skrivits till cachen.
Referenser Intel core 2 duo information: http://ark.intel.com/products/30781/intel-core2-duo-processor- E4500-2M-Cache-2_20-GHz-800-MHz-FSB (Hämtad 2015-12-06) Figur 2: MESI stat diagram address: https://upload.wikimedia.org/wikipedia/commons/c/c1/diagrama_mesi.gif (Hämtad 2015-12-03) Papamarcos, M, & Patel, J 1984, 'A low-overhead coherence solution for multiprocessors with private cache memories', ACM SIGARCH Computer Architecture News, 12, 3, p. 348, Publisher Provided Full Text Searching File, EBSCOhost, viewed 6 December 2015. 'Why On-Chip Cache Coherence Is Here to Stay' 2012, Communications Of The ACM, 55, 7, pp. 78-89, Business Source Complete, EBSCOhost, viewed 6 December 2015.