2010-02-06 7 views
6

Lorsque mon programme exécute une opération de chargement avec acquisition de la sémantique/opération de stockage avec une sémantique de libération ou une clôture complète, elle invalide le cache de la CPU.
Ma question est la suivante: quelle partie du cache est réellement invalidée? seule la ligne de cache qui contenait la variable que j'ai utilisée acquiert/libère? ou peut-être le cache entier est-il invalidé? (L1 + L2 + L3 .. et ainsi de suite?). Y a-t-il une différence dans ce sujet quand j'utilise une sémantique d'acquisition/libération, ou quand j'utilise une clôture complète?Invalidation de la mémoire cache du processeur

+0

Qu'est-ce que vous utilisez pour invalider le cache CPU (Assembler, appel OS?) Et aussi quel type d'architecture/cpu s'applique-t-il? –

+0

@Johannes Rudolph, Disons que le code actuel est écrit en C# (volatiles, Interlocked opérations, MemoryBarriers), mais finalement il est traduit en l'opcode assembleur approprié. Dans ma situation personnelle, je travaille avec une machine SMP avec chipset Intel (Xeon, en particulier). Mais j'aimerais savoir comment se déroule ce processus d'invalidation dans un spectre plus "général" (AMD/Intel, SMP/NUMA etc.) –

Répondre

2

Lorsque vous effectuez une charge sans clôtures ou mutex, la valeur chargée pourrait potentiellement venir de partout, à savoir , caches, registres (au moyen d'optimisations de compilateur), ou RAM ... mais à partir de votre question, vous le saviez déjà.

Dans la plupart des implémentations de mutex, lorsque vous acquérez un mutex, une clôture est toujours appliquée, explicitement (par exemple, mfence, barrière, etc.) ou implicitement (par exemple, verrouiller le bus sur x86). Cela provoque l'invalidation des lignes de cache de tous les caches du chemin.

Notez que le cache entier n'est pas invalidé, juste les lignes de cache respectives pour l'emplacement de mémoire. Cela inclut également les lignes pour le mutex (qui est généralement implémenté en tant que valeur dans la mémoire).

Bien sûr, il existe des détails spécifiques à l'architecture, mais c'est ainsi que cela fonctionne en général. Notez également que ce n'est pas la seule raison pour invalider les caches, car il peut y avoir des opérations sur une CPU qui nécessiteraient l'invalidation de caches sur une autre. Faire une recherche google pour "protocoles de cohérence de cache" vous fournira beaucoup d'informations sur ce sujet.

Questions connexes