Odpowiedzi:
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).
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.