Cycles/coût pour la L1 Cache hit vs Inscrire sur x86?
Je me souviens en supposant que la L1 cache est de 1 cycle (c'est à dire identique à enregistrer le temps d'accès) dans ma classe architecture, mais est-ce réellement vrai sur les processeurs x86 modernes?
Combien de cycles a un cache L1 frappé prendre? Comment se comparent à l'accès de registre?
- Il varie en fonction du processeur, mais je ne sais pas du tout où il est tout à fait aussi rapide qu'un registre -- autour de 1 à 5 horloges plus lent est assez typique.
- Je ne sais pas du tout les architectures où L1 a un seul cycle de latence. Aussi, je ne sais pas du tout les architectures x86 où l'accès de registre mesurable de latence en lui-même (un temps de latence peut être perçue en raison d'autres facteurs).
- Voir 7-cpu.com/cpu/Haswell.html: certains par-cache et par-TLB latence chiffres et certains expérimentale numéros. Voir aussi Agner de la Brume microarch pdf, et d'autres liens dans le x86 balise wiki. Haswell L1 de charge-utilisation de latence est de 4 cycles, ce qui est typique de moderne les Processeurs x86. Magasin de recharge temps de latence est de 5 cycles, et sans rapport avec cache frappé ou manquer (c'est le magasin d'expédition, pas de cache). Comme harold dit, l'accès de registre est 0 cycles (par exemple
inc eax
a 1 cycle de latence,inc [mem]
a 6 cycle de latence (ALU + magasin de transfert).
Vous devez vous connecter pour publier un commentaire.
Voici un excellent article sur le sujet:
http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/1
Pour répondre à votre question, oui, un cache hit a environ le même coût qu'un registre d'accès. Et bien sûr, un cache miss est assez coûteux 😉
PS:
Les détails varient, mais ce lien a quelques bonnes estimations:
Coût approximatif pour accéder à différents caches et mémoire principale?
PPS:
Ces chiffres représentent beaucoup plus âgés, plus lent Processeurs, mais les ratios fondamentalement tenir:
http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/2
Pas.
Seul cycle de latence de cache utilisé pour être une chose simple dans l'ordre des pipelines à de faibles vitesses d'horloge (de sorte que chaque cycle a été plus nanosecondes), surtout avec la plus simple des caches (plus petit, pas comme associatifs, et avec une petite TLB pour les caches qui n'étaient pas purement pratiquement abordé.) par exemple, le classique 5 étages de pipeline RISC comme MIPS je suppose 1 cycle pour l'accès à la mémoire sur un cache, avec l'adresse de calcul de l'EX et l'accès à la mémoire en MEM, avant le WB de la scène.
Moderne de haute performance Cpu diviser le pipeline en plusieurs étapes, permettant à chaque cycle plus courts. Cela permet à des instructions simples comme
add
/or
/and
de courir très vite, encore 1 cycle de latence mais à haute vitesse de l'horloge.Pour plus de détails sur le cycle de comptage et de l'exécution, voir Agner de la Brume microarch pdf, et d'autres liens dans la x86 balise wiki.
Intel Haswell L1 de charge-utilisation de latence est de 4 cycles pour le pointeur de la chasse à l'innovation, ce qui est typique de moderne les Processeurs x86. c'est à dire à quelle vitesse
mov eax, [eax]
pouvez exécuter dans une boucle, avec un pointeur qui pointe vers lui-même. (Pour une liste chaînée qui frappe dans le cache, facile à microbench avec une boucle fermée). Voir aussi Est-il de la peine, lorsqu'base+décalage est dans une page différente de celle de la base? Que le 4-cycle de latence cas spécial ne s'applique que si le pointeur est directement à partir d'une autre charge, sinon c'est 5 cycles.Charge l'utilisation de latence est de 1 cycle supérieur de SSE/AVX vecteurs dans les Processeurs Intel.
Magasin de recharge temps de latence est de 5 cycles, et n'est pas liée à cache frappé ou manquer (c'est le magasin d'expédition, de la lecture à partir du tampon de stockage pour stocker des données qui n'ont pas encore engagé à L1d cache).
Que harold a commenté, l'accès de registre est 0 cycles. Ainsi, par exemple:
inc eax
a 1 cycle de latence (juste l'ALU opération)add dword [mem], 1
a 6 cycle de latence jusqu'à une charge dedword [mem]
sera prêt. (ALU + magasin de transfert). par exemple, en gardant un compteur de boucle dans les limites de la mémoire d'une boucle à une itération par 6 cycles.mov rax, [rsi]
a 4 cycle de latence dersi
être prêt àrax
être prêt sur la L1 hit (L1 charge-utilisation de la latence.)http://www.7-cpu.com/cpu/Haswell.html a une table de latence par cache (je vais copier ici), et quelques autres expérimentale numéros, y compris L2-TLB frappé le temps de latence (sur un L1DTLB miss).
De niveau supérieur à l'indice de référence page est http://www.7-cpu.com/utils.html, mais ne peut toujours pas vraiment expliquer ce que le test différentes tailles de dire, mais le code est disponible. Les résultats du test comprennent Skylake, qui est à peu près le même que Haswell dans ce test.
@paulsm4 réponse a une table pour un multi-socket Xeon Nehalem, dont certains à distance (autres-socket) mémoire /L3 numéros.
Si je me souviens bien, c'est environ 1 à 2 cycles d'horloge, mais ceci est une estimation et les nouveaux caches peut être plus rapide. C'est une Architecture d'Ordinateur livre que j'ai et c'est une information pour les processeurs AMD, donc Intel peut être légèrement différent, mais je serait lié entre 5 et 15 cycles d'horloge qui semble une bonne estimation pour moi.
EDIT: Oups L2 est de 10 cycles avec l'ÉTIQUETTE d'accès, L1 prend 1 à deux cycles, de mon erreur :\
mov eax, [eax]
, avec un pointeur qui pointe vers lui-même.) Voir le top du 7-cpu.com/cpu/Haswell.html pour certains numéros.En fait le coût de la L1 cache hit est presque le même que le coût de l'accès de registre. Il était surprenant pour moi, mais c'est vrai, au moins pour mon processeur (Athlon 64). Il y a quelques temps j'ai écrit un test simple application de comparer l'efficacité des accès aux données partagées dans un système multiprocesseur. Le corps de la demande est une simple mémoire de l'incrémentation de la variable au cours de la période prédéfinie. Pour faire un comapison, je comparés non-variable partagée au premier abord. Et au cours de cette activité, j'ai capturé le résultat, mais ensuite, lors de l'application du démontage j'ai constaté que le compilateur a été trompé à mes attentes et à appliquer indésirables optimisation de mon code. Il vient de mettre la variable dans le PROCESSEUR inscrire et incrémenter iterativetly dans le registre sans accès à la mémoire. Mais la véritable surprise a été réalisée après que j'ai la force de compliler à utiliser en mémoire de la variable au lieu de s'inscrire variable. Sur la mise à jour de l'application j'ai réalisé presque les mêmes résultats de l'analyse comparative. La dégradation de la Performance était vraiment negligeble (~1-2%) et ressemble liés à des effets secondaires.
Comme résultat:
1) je pense que vous pouvez envisager de L1 cache comme un non géré processeur registres de la piscine.
2) Il n'y a aucun sence d'appliquer brutal assambly optimisation en forçant compilateur magasin fréquemment accès aux données dans les registres du processeur. Si ils sont vraiment souvent accessibles, ils vivent dans le cache L1, et de ce fait aura le même coût d'accès que le processeur le registre.
inc [mem]
a 6c de la latence sur les processeurs Intel Haswell, et similaire sur la DMLA.inc eax
a 1 cycle de latence sur tous les Processeurs x86. C'est magasin de transfert de latence, pas de L1 latence. L1 charge-utiliser le temps de latence est plus comme 4 cycles. Voir Agner de la Brume microarch pdf, et d'autres liens sur le x86 balise wiki.