Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Кэштік үйлесімділік протоколы, MSI протоколының кеңейтілуі ретінде Эксклюзивтік күйін қамтиды. MESI протоколы – деректерді жарамсыз етуге негізделген кэштік үйлесімділік протоколы және кері жазу кэштерін қолдайтын ең көп таралған протоколдардың бірі. Ол сондай-ақ Иллинойс протоколы деп аталады, себебі ол Иллинойс университетінің Урбана-Шампейн қаласындағы бөлімшесінде әзірленген. Кері жазу кэштері, тікелей жазу кэштерінде босқа кететін маңызды өткізу қабілетін үнемдеуге мүмкіндік береді. Кері жазу кэштерінде деректер негізгі жадтан өзгеше екенін көрсететін, әрқашан «ластанған» күйі болады. Иллинойс протоколы, егер блок басқа кэште болса, кэштен кэшке деректерді ауыстыруды талап етеді. Бұл протокол MSI протоколымен салыстырғанда негізгі жадқа жасалатын транзакциялар санын азайтады. Бұл өнімділіктің айтарлықтай жақсаруын көрсетеді.
Cache coherence protocol, includes an Exclusive state as an extension of the MSI protocol. The MESI protocol is an Invalidate based cache coherence protocol, and is one of the most common protocols that support write back caches. It is also known as the Illinois protocol due to its development at the University of Illinois at Urbana Champaign. Write back caches can save considerable bandwidth generally wasted on a write through cache. There is always a dirty state present in write back caches that indicates that the data in the cache is different from that in the main memory. The Illinois Protocol requires a cache to cache transfer on a miss if the block resides in another cache. This protocol reduces the number of main memory transactions with respect to the MSI protocol. This marks a significant improvement in performance.
Меншікті дайын
Меншікті оқу (RFO) – кэш сәйкестігі протоколдарындағы оқу және жарамсыз ету хабарламасын біріктіретін операция. Бұл операцияны MESI протоколының ортақ (S) немесе жарамсыз (I) күйіндегі кэш жолына жазуға тырысатын процессор іске қосады. Операция қалған барлық кэштерді осы жолдың күйін I күйіне өзгертуге мәжбүр етеді. Меншікке оқу транзакциясы – бұл жад адресіне жазу мақсатымен жасалатын оқу операциясы. Сондықтан бұл операция эксклюзивті болып табылады. Ол деректерді кэшке әкеледі және осы жад жолын сақтайтын басқа процессорлардың кэштерін жарамсыз етеді. Жоғарыдағы кестелерде бұл "BusRdX" деп белгіленген.
A Read For Ownership (RFO) is an operation in cache coherency protocols that combines a read and an invalidate broadcast. The operation is issued by a processor trying to write into a cache line that is in the shared (S) or invalid (I) states of the MESI protocol. The operation causes all other caches to set the state of such a line to I. A read for ownership transaction is a read operation with intent to write to that memory address. Therefore, this operation is exclusive. It brings data to the cache and invalidates all other processor caches that hold this memory line. This is termed "BusRdX" in tables above.
Есте сақтау кедергілері
MESI протоколының қарапайым, тікелей іске асырылуы екі ерекше өнімділік мәселесін көрсетеді. Біріншіден, жарамсыз кэш жолына жазу кезінде, осы жол басқа процессорлардан алынып келгенше ұзақ кешігу пайда болады. Екіншіден, кэш жолдарын жарамсыз күйге көшіру көп уақытты қажет етеді. Бұл кешігулерді азайту үшін процессорлар сақтау буферлерін және жарамсыздық кезектерін қолданады.
MESI in its naive, straightforward implementation exhibits two particular performance issues. First, when writing to an invalid cache line, there is a long delay while the line is fetched from other CPUs. Second, moving cache lines to the invalid state is time consuming. To mitigate these delays, CPUs implement store buffers and invalidate queues.
Сақтау буфері
Жарамсыз кэш жолына жазу кезінде сақтау буфері пайдаланылады. Жазу әдетте осылай орындалатындықтан, процессор оқуға қатысты жарамсыздық туралы хабарлама жібереді (сол кезде аталған кэш жолы және сол жад адресін сақтайтын басқа процессорлардың барлық кэш жолдары жарамсыз деп белгіленеді), содан кейін жазу сақтау буферіне жіберіледі, ол кэш жолы кэшке келгенде орындалады. Сақтау буферінің тікелей салдары – процессор жазуды қабылдағанда, ол дереу кэшке жазылмайды. Сондықтан, процессорға кэш жолын оқу қажет болғанда, ол алдымен өз сақтау буферін сол жолдың бар-жоғын тексеру үшін қарастырады, себебі бұл жол сол процессормен бұрын жазылған, бірақ әлі кэшке жазылмаған болуы мүмкін (алдыңғы жазу әлі де сақтау буферінде күтіп тұр). Процессор өзінің бұрынғы жазуларын өз буферінен оқи алады, бірақ басқа процессорлар осы жазуларды кэшке жіберілгенге дейін көре алмайды. Процессор басқа процессорлардың сақтау буферін қарастыра алмайды.
A store buffer is used when writing to an invalid cache line. As the write will proceed anyway, the CPU issues a read invalid message (hence the cache line in question and all other CPUs' cache lines that store that memory address are invalidated) and then pushes the write into the store buffer, to be executed when the cache line finally arrives in the cache. A direct consequence of the store buffer's existence is that when a CPU commits a write, that write is not immediately written in the cache. Therefore, whenever a CPU needs to read a cache line, it first scans its own store buffer for the existence of the same line, as there is a possibility that the same line was written by the same CPU before but hasn't yet been written in the cache (the preceding write is still waiting in the store buffer). Note that while a CPU can read its own previous writes in its store buffer, other CPUs cannot see those writes until they are flushed to the cache a CPU cannot scan the store buffer of other CPUs.
Кезекті жарамсыз ету
Асылу хабарламаларына қатысты, процессорлар жарамсыздық кезегін қолданады, осы арқылы келіп түсетін жарамсыздық сұраныстары дереу расталады, бірақ бірден орындалмайды. Оның орнына, жарамсыздық хабарламалары жай ғана жарамсыздық кезегіне енгізіледі және олардың өңделуі мүмкіндігінше жылдам (бірақ міндетті түрде бірден емес) жүзеге асырылады. Соның салдарынан, процессор өзінің кэшіндегі кэш жолының жарамсыз екендігін білмей қалуы мүмкін, себебі жарамсыздық кезегінде қабылданған, бірақ әлі қолданылмаған жарамсыздықтар болады. Естеріңізге сала кетейік, сақтау буферінен өзгеше, процессор жарамсыздық кезегін қарап шыға алмайды, өйткені процессор мен жарамсыздық кезегі физикалық тұрғыдан кэштің қарама-қарсы жақтарында орналасқан. Осының нәтижесінде, жад кедергілері қажет болады. Сақтау кедергісі сақтау буферін тазартады, барлық жазбалар осы процессордың кэшіне қолданылғанын қамтамасыз етеді. Оқу кедергісі жарамсыздық кезегін тазартады, осылайша басқа процессорлардың барлық жазбалары кедергі жасап отырған процессорға көрінеді. Бұдан бөлек, жад басқару бірліктері сақтау буферін қарап шығармайды, бұл осыған ұқсас мәселелерге әкеп соғады. Бұл эффект тіпті бір ядролы процессорларда да байқалады.
With regard to invalidation messages, CPUs implement invalidate queues, whereby incoming invalidate requests are instantly acknowledged but not immediately acted upon. Instead, invalidation messages simply enter an invalidation queue and their processing occurs as soon as possible (but not necessarily instantly). Consequently, a CPU can be oblivious to the fact that a cache line in its cache is actually invalid, as the invalidation queue contains invalidations that have been received but haven't yet been applied. Note that, unlike the store buffer, the CPU can't scan the invalidation queue, as that CPU and the invalidation queue are physically located on opposite sides of the cache. As a result, memory barriers are required. A store barrier will flush the store buffer, ensuring all writes have been applied to that CPU's cache. A read barrier will flush the invalidation queue, thus ensuring that all writes by other CPUs become visible to the flushing CPU. Furthermore, memory management units do not scan the store buffer, causing similar problems. This effect is visible even in single threaded processors.
МЭСИ-нің МСИ-ге қарағанда артықшылықтары
MESI мен MSI арасындағы ең басты айырмашылық – MESI протоколындағы қосымша "ексклюзивті" күй. Бұл қосымша күй көптеген артықшылықтары болғандықтан енгізілді. Процессор басқа процессорларда жоқ блокты оқып, содан кейін оған жазу қажет болғанда, MSI протоколында екі шина транзакциясы орындалады. Біріншіден, блокты оқу үшін BusRdX сұранысы жіберіледі, содан кейін блокқа жазу алдында BusUpgr сұранысы жіберіледі. Бұл жағдайда BusRdX сұранысы тиімсіз, себебі басқа кэштерде осы блок жоқ, бірақ бір кэштің мұны білуге мүмкіндігі жоқ. Сондықтан MESI протоколы осы шектеуді "Эксклюзивті" күйін қосу арқылы жояды, бұл шина сұранысын үнемдеуге мүмкіндік береді. Бұл тізбектей жұмыс істейтін бағдарламаларда үлкен маңызға ие. Тек бір процессор деректермен жұмыс істейтін болғандықтан, барлық сұраныстар эксклюзивті болады. MSI бұл жағдайда қосымша шина хабарламаларының салдарынан нашар жұмыс істейді. Тіпті деректерді аздап бөлісетін, жоғары параллельді бағдарламаларда да MESI протоколы әлдеқайда жылдам. "Эксклюзивті" күйін қосу да қосымша шығыс тудырмайды, өйткені 3 және 4 күйлерді де 2 битпен көрсетуге болады.
The most striking difference between MESI and MSI is the extra "exclusive" state present in the MESI protocol. This extra state was added as it has many advantages. When a processor needs to read a block that none of the other processors have and then write to it, two bus transactions will take place in the case of MSI. First, a BusRdX request is issued to read the block followed by a BusUpgr request before writing to the block. The BusRdX request in this scenario is useless as none of the other caches have the same block, but there is no way for one cache to know about this. Thus, MESI protocol overcomes this limitation by adding an Exclusive state, which results in saving a bus request. This makes a huge difference when a sequential application is running. As only one processor works on a piece of data, all the accesses will be exclusive. MSI performs much worse in this case due to the extra bus messages. Even in the case of a highly parallel application with minimal sharing of data, MESI is far faster. Adding the Exclusive state also comes at no cost as 3 states and 4 states are both representable with 2 bits.
MESI-дің кемшілігі
Егер белгілі бір блокқа әртүрлі кэштер үздіксіз оқу және жазу операцияларын жүргізсе, деректер әрқашан шинаға жіберуі керек. Осылайша, негізгі жад әрбір жіберуде оны тазалап, таза күйде қалады. Бірақ бұл міндетті талап емес, тек MESI протоколын пайдаланудан туындайтын қосымша жүктеме. Бұл мәселені MOESI протоколы шешіп берді. S (Ортақ күй) жағдайында бірнеше бақылаушылар бірдей деректермен FlushOpt жауабын қайтара алады (жоғарыдағы мысалға қараңыз). MESIF протоколындағы F күйі осы қайталануды жояды.
In case continuous read and write operations are performed by various caches on a particular block, the data has to be flushed to the bus every time. Thus, the main memory will pull this on every flush and remain in a clean state. But this is not a requirement and is just an additional overhead caused by using MESI. This challenge was overcome by the MOESI protocol. In case of S (Shared State), multiple snoopers may response with FlushOpt with the same data (see the example above). The F state in MESIF addresses this redundancy.