Cycles/coût du hit Cache L1 vs. S'enregistrer sur x86?

je me souviens avoir supposé qu'un hit de cache L1 est un cycle (c'est-à-dire identique au temps d'accès au Registre) dans ma classe d'architecture, mais est-ce vrai sur les processeurs x86 modernes?

combien de cycles un hit cache L1 prend-il? Comment se comparent à l'accès de registre?

22
demandé sur artless noise 2012-04-23 07:08:11

4 réponses

voici un grand article sur le sujet:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/1

pour répondre à votre question - oui, un hit cache a approximativement le même coût qu'un accès de registre. 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 à diverses caches et mémoire principale?

Core i7 Xeon 5500 Series Data Source Latency (approximate)
L1 CACHE hit, ~4 cycles
L2 CACHE hit, ~10 cycles
L3 CACHE hit, line unshared ~40 cycles
L3 CACHE hit, shared line in another core ~65 cycles
L3 CACHE hit, modified in another core ~75 cycles remote
L3 CACHE ~100-300 cycles
Local DRAM ~30 ns (~120 cycles)
Remote DRAM ~100 ns 

Spa:

ces chiffres représentent beaucoup CPU plus âgés et plus lents, mais les rapports tiennent essentiellement:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/2

Level                    Access Time  Typical Size  Technology    Managed By
-----                    -----------  ------------  ---------     -----------
Registers                1-3 ns       ?1 KB          Custom CMOS  Compiler
Level 1 Cache (on-chip)  2-8 ns       8 KB-128 KB    SRAM         Hardware
Level 2 Cache (off-chip) 5-12 ns      0.5 MB - 8 MB  SRAM         Hardware
Main Memory              10-60 ns     64 MB - 1 GB   DRAM         Operating System
Hard Disk                3M - 10M ns  20 - 100 GB    Magnetic     Operating System/User
32
répondu paulsm4 2017-05-23 12:34:32

pour plus de détails sur le comptage de cycles et l'exécution hors-ordre, voir Agner Fog's microarch pdf , et d'autres liens dans le x86 tag wiki .


la latence L1 d'Intel Haswell est de 4 cycles, ce qui est typique des processeurs x86 modernes. c'est-à-dire à quelle vitesse mov eax, [eax] peut fonctionner dans une boucle, avec un pointeur qui pointe vers lui-même. (Ou à une petite liste en boucle fermée).

La latence D'utilisation de charge

est supérieure de 1 cycle pour les vecteurs SSE/AVX dans les processeurs Intel.


la latence de stockage-rechargement est de 5 cycles, et n'est pas liée au Hit ou au miss de cache (c'est le transfert de stock, pas le cache L1).

comme harold l'a commenté, l'accès au Registre est 0 cycles. Ainsi, par exemple:

  • inc eax a 1 cycle de latence (juste l'ALU de l'opération)
  • inc dword [mem] a 6 la latence du cycle jusqu'à ce qu'une charge de dword [mem] soit prête. (ALU + magasin de transfert). par exemple, garder un compteur de boucle en mémoire limite une boucle à une itération par 6 cycles.
  • mov rax, [rsi] possède une latence de 4 cycles de rsi étant prêt à rax étant prêt sur un hit L1 (L1 charge-utiliser la latence.)

http://www.7-cpu.com/cpu/Haswell.html a une table de latence par cache (que je vais copier ici), et quelques autres nombres expérimentaux, dont L2-TLB hit latency (sur une miss L1DTLB).

Intel i7-4770 (Haswell), 3,4 GHz (Turbo Boost off), 22 nm. RAM: 32 Go (PC3-12800 cl11 cr2).

  • cache de données L1 = 32 ko, 64 B/line, 8-WAY.
  • L1 Instruction cache = 32 ko, 64 B/line, 8-WAY.
  • L2 cache = 256 Ko, 64 B / line, 8-WAY
  • cache L3 = 8 MO, 64 B/ligne

  • L1 Data Cache Latency = 4 cycles pour un accès simple via un pointeur ( mov rax, [rax] )

  • L1 Data Cache Latency = 5 cycles pour l'accès avec calcul d'adresse complexe ( mov rax, [rsi + rax*8] ).
  • L2 latence de Cache = 12 cycles
  • Cache L3 de Latence = 36 cycles
  • temps de latence RAM = 36 cycles + 57 ns

la page de référence de premier niveau est http://www.7-cpu.com/utils.html , mais n'explique toujours pas vraiment ce que les différentes tailles de test signifient, mais le code est disponible. Les résultats des tests incluent Skylake , qui est presque le même que Haswell dans ce test.

la réponse de @paulsm4 a une table pour un Nehalem Xeon multi-socket, y compris certains distant (other-socket) mémoire / L3 numéros.

4
répondu Peter Cordes 2017-05-23 12:17:58

si je me souviens bien, il est d'environ 1-2 cycles d'horloge, mais il s'agit d'une estimation et les nouvelles caches peuvent être plus rapides. C'est sorti d'un livre D'Architecture informatique que j'ai et c'est une information pour AMD donc Intel peut être légèrement différent mais je l'ai relié entre 5 et 15 cycles d'horloge qui semble être 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 :\

1
répondu Jesus Ramos 2012-04-23 03:15:28

en fait, le coût du hit cache L1 est presque le même que le coût de l'accès au registre. Il était surprenant pour moi, mais c'est vrai, au moins pour mon processeur (Athlon 64). Il y a quelque temps, j'ai écrit une application de test simple pour comparer l'efficacité de l'accès aux données partagées dans un système multiprocesseur. Le corps de l'application est une variable mémoire simple incrémentant pendant la période prédéfinie de temps. Pour faire une comparaison, j'ai d'abord comparé des variables non partagées. Et pendant que activité j'ai capturé le résultat, mais ensuite pendant le démontage de l'application j'ai trouvé que le compilateur a été trompé mes attentes et appliquer l'optimisation non désirée à mon code. Il suffit de mettre variable dans le registre CPU et de l'incrémenter itérativement dans le registre sans accès mémoire. Mais la vraie surprise a été réalisée après que j'ai forcé compliler à utiliser In-memory variable au lieu de register variable. Sur une application mise à jour, j'ai obtenu presque les mêmes résultats de benchmarking. La dégradation des performances était négligeble (~1-2%) et ressemble à liée à certains effets secondaires.

Comme résultat:

1) je pense que vous pouvez considérer le cache L1 comme un pool de registres de processeurs non gérés.

2) Il n'y a pas de sence pour appliquer l'optimisation brutale assambly en forçant le stockage de compilateur accédant fréquemment des données dans les registres de processeur. S'ils sont vraiment fréquemment consultés, ils vivront dans le cache L1, et en raison de cela aura le même coût d'accès que le processeur registre.

0
répondu ZarathustrA 2012-12-05 10:18:53