Réponses:
Il y a en fait plusieurs raisons.
D'abord et probablement avant tout, les données qui sont stockées dans le cache d'instructions sont généralement quelque peu différentes de celles qui sont stockées dans le cache de données - avec les instructions elles-mêmes, il y a des annotations pour des choses comme où commence l'instruction suivante, pour aider les décodeurs. Certains processeurs (par exemple, Netburst, certains SPARC) utilisent un "cache de trace", qui stocke le résultat du décodage d'une instruction plutôt que de stocker l'instruction d'origine dans sa forme codée.
Deuxièmement, cela simplifie un peu les circuits - le cache de données doit traiter les lectures et les écritures, mais le cache d'instructions ne traite que les lectures. (Cela explique en partie pourquoi le code auto-modifiant est si cher - au lieu de remplacer directement les données dans le cache d'instructions, l'écriture passe par le cache de données dans le cache L2, puis la ligne dans le cache d'instructions est invalidée et re - chargé de L2).
Troisièmement, cela augmente la bande passante: la plupart des processeurs modernes peuvent lire simultanément les données du cache d'instructions et du cache de données. La plupart ont également des files d'attente à "l'entrée" du cache, de sorte qu'ils peuvent réellement faire deux lectures et une écriture dans un cycle donné.
Quatrièmement, il peut économiser de l'énergie. Alors que vous devez maintenir l'alimentation des cellules de mémoire elles-mêmes pour maintenir leur contenu, certains processeurs peuvent / font éteindre certains des circuits associés (décodeurs et autres) lorsqu'ils ne sont pas utilisés. Avec des caches séparés, ils peuvent alimenter ces circuits séparément pour les instructions et les données, augmentant les chances qu'un circuit reste non alimenté pendant un cycle donné (je ne suis pas sûr que des processeurs x86 le fassent - AFAIK, c'est plus un ARM chose).
Tout comme l'immobilier, l'utilisation du cache est motivée par trois choses: l'emplacement, l'emplacement, l'emplacement. L'intérêt d'avoir un cache est que la plupart des programmes présentent des schémas de localisation: s'ils accèdent à l'octet 1111111, alors l'octet suivant auquel ils accéderont est probablement 1111110 ou 1111112, et pas tant l'octet 9999999. Cependant, la plupart des programmes présenteront très différents modèles de localisation pour leurs instructions et leurs données. Cela signifie qu'il est peu probable que les instructions et les données puissent partager efficacement le cache. Parce que les instructions et les données ne sont pas nécessairement proches les unes des autres en mémoire. Un accès aux données suspendrait les instructions du cache, et les instructions de chargement suspendraient les données du cache.