Dlaczego istnieją osobne pamięci podręczne L1 dla danych i instrukcji?

23

Właśnie przejrzałem niektóre slajdy i zauważyłem, że pamięć podręczna L1 (przynajmniej na procesorach Intel) rozróżnia pamięć podręczną danych i instrukcji, chciałbym wiedzieć, dlaczego tak jest ..

Nils
źródło

Odpowiedzi:

28

Jest tak naprawdę kilka powodów.

Po pierwsze i prawdopodobnie przede wszystkim dane przechowywane w pamięci podręcznej instrukcji są na ogół nieco inne niż dane przechowywane w pamięci podręcznej danych - wraz z samymi instrukcjami znajdują się adnotacje dotyczące np. Miejsca, w którym zaczyna się kolejna instrukcja, aby pomóc dekoderom. Niektóre procesory (np. Netburst, niektóre SPARC) używają „pamięci podręcznej śledzenia”, która przechowuje wynik dekodowania instrukcji zamiast przechowywać oryginalną instrukcję w jej zakodowanej formie.

Po drugie, nieco upraszcza obwody - pamięć podręczna danych musi radzić sobie z odczytami i zapisami, ale pamięć podręczna instrukcji dotyczy tylko odczytów. (Jest to częściowo spowodowane tym, że samodomodujący kod jest tak drogi - zamiast bezpośredniego nadpisywania danych w pamięci podręcznej instrukcji, zapis przechodzi przez pamięć podręczną do pamięci podręcznej L2, a następnie wiersz w pamięci podręcznej instrukcji jest unieważniany i ponownie - ładowany z L2).

Po trzecie, zwiększa przepustowość: większość nowoczesnych procesorów może jednocześnie odczytywać dane z pamięci podręcznej instrukcji i pamięci podręcznej danych. Większość ma także kolejki przy „wejściu” do pamięci podręcznej, dzięki czemu mogą faktycznie wykonać dwa odczyty i jeden w dowolnym cyklu.

Po czwarte, może oszczędzać energię. Podczas gdy musisz utrzymać zasilanie samych komórek pamięci, aby zachować ich zawartość, niektóre procesory mogą / powodują wyłączenie niektórych powiązanych obwodów (dekoderów itp.), Gdy nie są używane. Dzięki oddzielnym pamięciom podręcznym mogą zasilać te obwody osobno dla instrukcji i danych, zwiększając szanse, że obwód pozostanie bez zasilania podczas dowolnego cyklu (nie jestem pewien, czy robią to procesory x86 - AFAIK, to raczej ARM rzecz).

Jerry Coffin
źródło
3
Należy również wspomnieć, że kod i dane mogą wykazywać różne wzorce dostępu; na przykład instrukcje sumowania wszystkich elementów w tablicy wykazują lokalizację czasową (te same instrukcje są często używane (jeśli robisz to przez pętlę)), a dane w tablicy wykazują lokalizację przestrzenną (następne dane są używane).
gablin
1
@gablin: chociaż prawda, te różnice we wzorcach często sprzyjają zunifikowanej pamięci podręcznej. W ciasnej pętli, jak wspomniałeś, większość pamięci podręcznej instrukcji siedzi bezczynnie. Ujednolicona pamięć podręczna zasadniczo podwoiłaby rozmiar pamięci podręcznej danych na czas trwania pętli.
Jerry Coffin,
Nie bardzo, bo jest więcej kodu po tej małej pętli i to również może pracować z tablicy. To charakteryzuje bardzo dużo kodu (np. Obsługa ciągu). W rzeczywistości pierwsze pamięci podręczne w procesorach były ujednoliconymi pamięciami podręcznymi - znajdowały się między głównym interfejsem pamięci procesora a zewnętrzną magistralą, co było prostym miejscem do ich umieszczenia - ale teraz używamy partycjonowanej pamięci podręcznej, ponieważ jest szybsza w praktyce .
Donal Fellows
@Donal Fellows: Tak, naprawdę. Doskonale zdaję sobie sprawę z tego, jak wczesne buforowanie zostało wykonane i dlaczego zmieniono je na podzieloną pamięć podręczną.
Jerry Coffin
5

Podobnie jak w przypadku nieruchomości, użycie pamięci podręcznej zależy od trzech rzeczy: lokalizacji, lokalizacji, lokalizacji. Chodzi o to, że większość programów wykazuje wzorce lokalizacji: jeśli uzyskają dostęp do bajtu 1111111, to następny bajt, do którego uzyskają dostęp, to prawdopodobnie 1111110 lub 1111112, a nie tyle bajtu 9999999. Jednak większość programów będzie się bardzo różnić wzorce lokalizacji dla ich instrukcji i ich danych. Oznacza to, że jest mało prawdopodobne, aby instrukcje i dane mogły efektywnie współdzielić pamięć podręczną. Ponieważ instrukcje i dane niekoniecznie znajdują się blisko siebie w pamięci. Dostęp do danych spowodowałby podbicie instrukcji z pamięci podręcznej, a instrukcje ładowania podniosłyby dane z pamięci podręcznej.

Charles E. Grant
źródło