web-dev-qa-db-fra.com

pourquoi faut-il séparer icache et dcache

Quelqu'un peut-il expliquer qu’il nous est avantageux d’avoir un cache d’instructions et un cache d’informations distincts. Les pointeurs indiquant un bon lien expliquant ce point seront également appréciés.

20
Venom

La raison principale est: la performance. Une autre raison est la consommation d'énergie.

Séparer dCache et iCache permet d'extraire des instructions et des données en parallèle.

Les instructions et les données ont des modèles d'accès différents.

Les écritures dans iCache sont rares. Les concepteurs de CPU optimisent l'architecture iCache et la CPU en partant du principe que les modifications de code sont rares. Par exemple, le Guide d'optimisation du logiciel AMD pour les processeurs 10h et 12h indique que:

Le prédécodage commence lorsque le cache d'instructions L1 est rempli. Les informations de prédécodage sont générées et stockées à côté du cache d'instructions.

Le processeur Intel Nehalem dispose d'un tampon de bouclage et, en plus, le processeur Sandy Bridge dispose d'un cache µop La microarchitecture d'Intel, d'AMD et de VIA CPU . Notez que ce sont des fonctionnalités liées au code, et n'ont pas de contrepartie directe par rapport aux données. Ils favorisent les performances et, puisque Intel "interdit" aux concepteurs de CPU d’introduire des fonctionnalités entraînant une augmentation excessive de la consommation électrique, ils devraient également bénéficier à la consommation totale.

La plupart des processeurs disposent d'un réseau de transmission de données (magasin pour le transfert de charge). Il n'y a pas de "magasin pour charger le transfert" en relation avec le code, simplement parce que le code est modifié beaucoup moins fréquemment que les données.

Le code présente des modèles différents de ceux des données.

Cela dit, la plupart des processeurs de nos jours ont un cache unifié N2 qui contient à la fois du code et des données. La raison en est qu’avoir des caches L2I et L2D séparés consommerait inutilement le budget du transistor tout en ne permettant pas d’obtenir des gains de performance mesurables.

(Il est certain que la raison d'avoir iCache et dCache séparés n'est pas complexité réduite, car si la raison était moins complexe, il n'y aurait pas de pipeline dans les conceptions actuelles de CPU. Un CPU avec pipeline est plus complexe. qu'un processeur sans traitement en pipeline. Nous voulons une complexité accrue. Le fait est que: la conception suivante du processeur est (généralement) plus complexe que la conception précédente.)

19
user811773

Cela dépend des unités fonctionnelles de la CPU qui accèdent principalement à ce cache. Etant donné que l'ALU et la FPU accèdent au cache de données auquel le décodeur et le programmateur accèdent au cache d'instruction, et que souvent le traitement en pipeline permet au processeur d'instruction et à l'unité d'exécution de fonctionner simultanément, l'utilisation d'un cache unique provoquerait un conflit entre ces deux composants. En les séparant, nous perdons un peu de flexibilité et obtenons la possibilité pour ces deux composants principaux du processeur d'extraire simultanément des données de la mémoire cache.

5
Dan

Une des raisons est la complexité réduite: vous pouvez implémenter un cache partagé capable d'extraire plusieurs lignes à la fois, ou simplement de manière asynchrone (voir Hit-Under-Miss), mais cela rend le contrôleur de cache beaucoup plus compliqué.

Une autre raison est la stabilité de l'exécution: si vous avez une quantité connue d'icache et de cache, la mise en cache des données ne peut priver le système de cache d'instructions, ce qui peut se produire dans un cache partagé simpliste.

Et comme Dan l'a dit, les séparer facilite le pipeline, sans ajouter à la complexité du contrôleur.

2
rsaxvc

Comme les étages MEM et FETCH du processeur peuvent accéder simultanément au cache L1 (supposé combiné), il peut exister un conflit quant à la priorité à donner (peut devenir un goulot d'étranglement de performances). Une façon de résoudre ce problème consiste à créer un cache L1 avec deux ports de lecture. Mais augmenter le nombre de ports augmente la surface de cache de manière quadratique et par conséquent la consommation d’énergie. 

De plus, si la mémoire cache N1 est la mémoire combinée, il est probable que certains blocs de données remplacent des blocs contenant des instructions importantes et sur le point d’être consultées. Ces expulsions et l’absence de mémoire cache peuvent nuire à la performance globale.

De plus, la plupart du temps, le processeur extrait les instructions de manière séquentielle (quelques exceptions comme les cibles prises, les sauts, etc.), ce qui donne au cache d'instructions plus de localité spatiale et donc un bon taux de réussite. En outre, comme mentionné dans d'autres réponses, il n'y a pratiquement aucune écriture dans ICache (code à modification automatique tel que les compilateurs JIT). Vous pouvez ainsi optimiser les conceptions icache et dcache distinctes en tenant compte de leurs modèles d'accès et d'autres composants tels que les files d'attente de chargement/stockage, les mémoires tampon d'écriture, etc.

1
user1669844

Il existe généralement 2 types d'architectures: 1. l'architecture de von Neuman et 2. l'architecture de Harward. L'architecture harward utilise 2 mémoires distinctes. vous pouvez en savoir plus à ce sujet sur cette page http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3839.html

0
programer