Kiedy pamięć podręczna procesora przepłukana jest z powrotem do pamięci głównej?
Jeśli dopiero zaczynasz się uczyć, jak działają wielordzeniowe procesory, pamięć podręczna, spójność pamięci podręcznej i pamięć, na początku może się wydawać nieco mylące. Mając to na uwadze, dzisiejszy post pytań i odpowiedzi dla SuperUser zawiera odpowiedzi na ciekawe pytanie czytelnika.
Dzisiejsza sesja pytań i odpowiedzi przychodzi do nas dzięki uprzejmości SuperUser - poddziału Stack Exchange, opartego na społecznościach grupowania witryn z pytaniami i odpowiedziami.
Pytanie
Czytnik SuperUser CarmeloS chce wiedzieć, kiedy pamięć podręczna procesora jest przepuszczana z powrotem do pamięci głównej:
Jeśli mam procesor z dwoma rdzeniami i każdy rdzeń ma własną pamięć podręczną L1, to czy Core1 i Core2 mogą jednocześnie buforować tę samą część pamięci? Jeśli to możliwe, jaka będzie wartość pamięci głównej, jeśli zarówno Core1, jak i Core2 edytują swoje wartości w pamięci podręcznej?
Kiedy pamięć podręczna procesora jest spłukiwana z powrotem do pamięci głównej?
Odpowiedź
Współautorzy SuperUser David Schwartz, sleske i Kimberly W mają dla nas odpowiedź. Po pierwsze, David Schwartz:
Jeśli mam procesor z dwoma rdzeniami i każdy rdzeń ma własną pamięć podręczną L1, to możliwe, że Core1 i Core2 jednocześnie buforują tę samą część pamięci w tym samym czasie?
Tak, wydajność byłaby straszna, gdyby tak nie było. Rozważ dwa wątki z tym samym kodem. Chcesz tego kodu w obu pamięciach podręcznych L1.
Jeśli to możliwe, jaka będzie wartość pamięci głównej, jeśli zarówno Core1, jak i Core2 edytują swoje wartości w pamięci podręcznej?
Stara wartość będzie w pamięci głównej, co nie ma znaczenia, ponieważ żaden rdzeń jej nie odczyta. Przed wyrzuceniem zmodyfikowanej wartości z pamięci podręcznej, musi ona zostać zapisana w pamięci. Zazwyczaj używany jest pewien wariant protokołu MESI. W tradycyjnej implementacji MESI, jeśli wartość jest modyfikowana w jednej pamięci podręcznej, nie może być w ogóle w jakiejkolwiek innej pamięci podręcznej na tym samym poziomie.
Poniżej znajduje się odpowiedź od sleske:
Tak, mając dwie pamięci podręczne pamięci podręcznej, ten sam obszar pamięci może się zdarzyć i jest to faktycznie problem, który często występuje w praktyce. Istnieją różne rozwiązania, na przykład:
- Dwie pamięci podręczne mogą się komunikować, aby się upewnić, że się nie zgadzają
- Możesz mieć jakiegoś nadzorcę, który monitoruje wszystkie pamięci podręczne i odpowiednio je aktualizuje
- Każdy procesor monitoruje obszary pamięci, które ma w pamięci podręcznej, a po wykryciu zapisu wyrzuca swoją (obecnie nieważną) pamięć podręczną
Problem ten nazywa się koherencją pamięci podręcznej, a artykuł w Wikipedii na ten temat zawiera ładny przegląd problemu i możliwych rozwiązań.
I nasza ostateczna odpowiedź od Kimberly W:
Aby odpowiedzieć na pytanie w tytule wpisu, zależy to od protokołu buforowania. Jeśli jest to zapis zwrotny, pamięć podręczna zostanie opróżniona z powrotem do pamięci głównej, gdy kontroler pamięci podręcznej nie będzie miał innego wyboru niż wstawić nowy blok pamięci podręcznej w już zajętym miejscu. Blok, który poprzednio zajmował miejsce, jest usuwany, a jego wartość jest zapisywana z powrotem do pamięci głównej.
Drugi protokół to zapis. W takim przypadku w dowolnym momencie blok pamięci podręcznej jest zapisywany na poziomie n, odpowiedni blok na poziomie n + 1 jest zaktualizowane. Podobna koncepcja polega na wypełnianiu formy papierem węglowym pod spodem; cokolwiek napiszesz na górze, jest kopiowane na arkuszu poniżej. Jest to wolniejsze, ponieważ w oczywisty sposób wiąże się z większą liczbą operacji zapisu, ale wartości między pamięciami podręcznymi są bardziej spójne. W schemacie zapisu tylko pamięć podręczna najwyższego poziomu miałaby najbardziej aktualną wartość dla określonego bloku pamięci.
Czy masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych użytkowników Stack Exchange, którzy znają się na technologii? Sprawdź cały wątek dyskusji tutaj.
Zdjęcie: Lemsipmatt (Flickr)