Jeśli dopiero zaczynasz się uczyć, jak działają wielordzeniowe procesory, buforowanie, spójność pamięci podręcznej i pamięć, na początku może się to wydawać nieco zagmatwane. Mając to na uwadze, dzisiejszy post z pytaniami i odpowiedziami dla SuperUser zawiera odpowiedzi na pytanie zaciekawionego czytelnika.
Dzisiejsza sesja pytań i odpowiedzi jest dostępna dzięki uprzejmości SuperUser - części Stack Exchange, grupy witryn internetowych z pytaniami i odpowiedziami.
Pytanie
Czytnik SuperUser CarmeloS chce wiedzieć, kiedy pamięć podręczna procesora jest przenoszona z powrotem do pamięci głównej:
Jeśli mam procesor z dwoma rdzeniami, a każdy rdzeń ma własną pamięć podręczną L1, czy jest możliwe, że zarówno Core1, jak i Core2 buforują tę samą część pamięci w tym samym czasie? Jeśli to możliwe, jaka będzie wartość pamięci głównej, jeśli zarówno Core1, jak i Core2 wyedytowały swoje wartości w pamięci podręcznej?
Kiedy pamięć podręczna procesora jest przenoszona z powrotem do pamięci głównej?
Odpowiedź
Dostawcy SuperUser David Schwartz, sleske i Kimberly W mają dla nas odpowiedź. Najpierw David Schwartz:
Jeśli mam procesor z dwoma rdzeniami, a każdy rdzeń ma własną pamięć podręczną L1, czy jest możliwe, że zarówno Core1, jak i Core2 buforują tę samą część pamięci w tym samym czasie?
Tak, wydajność byłaby okropna, gdyby tak nie było. Rozważ dwa wątki z tym samym kodem. Chcesz, aby ten kod znajdował się 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 wyedytowały swoje wartości w pamięci podręcznej?
Stara wartość będzie w pamięci głównej, co nie będzie miało znaczenia, ponieważ żaden rdzeń jej nie odczyta. Przed wyrzuceniem zmodyfikowanej wartości z pamięci podręcznej należy ją zapisać w pamięci. Zwykle niektóre warianty Protokół MESI Jest używane. W tradycyjnej implementacji MESI, jeśli wartość jest modyfikowana w jednej pamięci podręcznej, nie może być w ogóle obecna w żadnej innej pamięci podręcznej na tym samym poziomie.
Następnie odpowiedź od sleske:
Tak, posiadanie dwóch pamięci podręcznych buforujących ten sam region pamięci może się zdarzyć i jest to 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 upewnić się, że się nie zgadzają
- Możesz mieć swego rodzaju nadzorcę, który monitoruje wszystkie pamięci podręczne i odpowiednio je aktualizuje
- Każdy procesor monitoruje obszary pamięci, które zapisał w pamięci podręcznej, a gdy wykryje zapis, wyrzuca swoją (teraz nieprawidłową) pamięć podręczną
Problem nazywa się spójnością pamięci podręcznej, a plik Artykuł w Wikipedii na ten temat zawiera ładny przegląd problemu i możliwych rozwiązań.
I nasza ostateczna odpowiedź od Kimberly W:
Odpowiedź na pytanie w tytule Twojego posta zależy od tego, jaki jest protokół buforowania. Jeśli jest to zapis z powrotem, pamięć podręczna zostanie opróżniona z powrotem do pamięci głównej tylko wtedy, gdy kontroler pamięci podręcznej nie ma innego wyjścia, jak tylko umieścić nowy blok pamięci podręcznej w już zajętym miejscu. Blok, który wcześniej zajmował miejsce, jest usuwany, a jego wartość jest ponownie zapisywana w pamięci głównej.
Drugi protokół to protokół umożliwiający zapis. W takim przypadku za każdym razem, gdy blok pamięci podręcznej jest zapisywany na poziomie n , odpowiedni blok na poziomie n + 1 jest zaktualizowane. Koncepcja jest podobna do wypełniania formularza z kalką pod spodem; cokolwiek napiszesz na górze, jest kopiowane na arkusz poniżej. Jest to wolniejsze, ponieważ oczywiście wymaga więcej operacji zapisu, ale wartości między pamięcią podręczną są bardziej spójne. W schemacie zapisu zwrotnego tylko pamięć podręczna najwyższego poziomu miałaby najbardziej aktualną wartość dla określonego bloku pamięci.
Masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych zaawansowanych technicznie użytkowników Stack Exchange? Sprawdź cały wątek dyskusji tutaj .
Źródło zdjęcia: Lemsipmatt (Flickr)