Procesory

Spójności danych w pamięci podręcznej

W tym miejscu warto wspomnieć, że zastosowanie dla każdego z rdzeni - jak ma to miejsce w wypadku procesorów AMD i Intel - własnej pamięci podręcznej pierwszego i drugiego poziomu (cache L1 i L2) z jednej strony znacznie przyspiesza działanie procesorów (pamięć cache jest kilka razy szybsza niż pamięć DDR3), a z drugiej bardzo komplikuje architekturę systemu komputerowego jako całości. System może bowiem znaleźć się w sytuacji, że poszczególne rdzenie będą widziały inne dane pod tym samym fizycznym adresem – jest to tak zwany stan niespójny pamięci.

Jak wiadomo, dane z pamięci RAM – pamięć cache L3, znajdującą się w wielu modelach wielordzeniowych procesorów - należy potraktować tak samo jak pamięć RAM, gdyż zawiera ona nie tylko dokładną kopię danych pobranych z pamięci RAM, ale również, tak jak RAM, jest ona wspólna dla wszystkich rdzeni – przenoszone są do pamięci cache L2 po to, aby w znaczący sposób przyspieszyć pracę procesora.

Każdy z rdzeni ma do dyspozycji swoją własną kopię fragmentu pamięci RAM, na której może dokonywać różnych operacji. Nie można więc dopuścić do sytuacji, w której rdzenie zaczną jednocześnie lub w niewielkim odstępie czasu przetwarzać dane znajdujące się pod tym samym fizycznym adresem. Innymi słowy, w pamięci cache każdego z rdzeni pod danym fizycznym adresem zawsze musi znajdować się aktualna (wszędzie taka sama) kopia danych.

Aby to osiągnąć wykorzystuje się realizowany sprzętowo protokół spójności (ang. coherency protocol). Jego zadaniem jest utrzymanie spójności danych we wszystkich pamięciach podręcznych w systemie komputerowym, z pamięcią współdzieloną (ang. shared memory). Co ważne, protokół utrzymuje koherentność danych pamięci zgodnie z przyjętym przez projektantów wielordzeniowego procesora konkretnym modelem spójności.

W większość procesorów SMP wykorzystuje się tzw. sekwencyjny model spójności. Fizycznie realizowany jest on w ten sposób, że każdy rdzeń cały czas śledzi magistralę danych i akcje podejmowane przez inne procesory (tzw. bus snooping). Dzięki temu może on wykryć fakt współdzielenia wiersza pamięci podręcznej. Zapis do współdzielonego wiersza pamięci powoduje wysłanie innym rdzeniom sygnału unieważniającego ten wiersz w ich pamięciach cache. Gdy jeden z rdzeni usiłuje wczytać zmodyfikowany przez inny rdzeń, a jeszcze nie zapisany do współdzielonej pamięci głównej wiersz (tzw. dirty row), wówczas ten drugi rdzeń przejmuje kontrolę nad magistralą danych i przesyła do pamięci poprawne dane.

protokół MESI
Działanie protokołu spójności pamięci cache – tu protokół MESI

Niestety, zapis danych, które są jednocześnie współdzielone przez inne rdzenie jest nawet kilkadziesiąt razy wolniejszy od zapisu danych niewspółdzielonych. Spowolnienie to jest związane z koniecznością podjęcia szeregu akcji utrzymujących spójność pamięci podręcznych wszystkich rdzeni procesora i ten fakt w największym stopniu ogranicza możliwość rozwoju wielordzeniowej architektury SMP (im więcej rdzeni, tym większe problemy ze spójnością) i sprawia, że całkowita wydajność procesora wielordzeniowego nie jest sumą wydajności poszczególnych rdzeni.