Question

Supposons qu'il y ait deux threads fonctionnant respectivement sur x86 CPU0 et CPU1. Le thread s'exécutant sur CPU0 exécute les commandes suivantes:

A=1
B=1

Ligne de cache contenant A appartenant initialement à CPU1 et celle contenant B appartenant à CPU0.

J'ai deux questions:

  1. Si je comprends bien, les deux magasins seront placés dans la mémoire tampon du processeur. Cependant, pour le premier magasin A=1, le cache de CPU1 doit être invalidé tandis que le second magasin B=1 peut être vidé immédiatement puisque CPU0 possède la ligne de cache qui le contient. Je sais que le processeur x86 respecte les commandes des magasins. Cela signifie-t-il que B=1 ne sera pas écrit dans le cache avant A=1?

  2. Supposons que dans CPU1 les commandes suivantes soient exécutées:

while (B= 0);
imprimer A

Suffit-il d'ajouter seulement lfence entre les commandes while et print dans CPU1 sans ajouter de sfence entre A=1 et B=1 dans CPU0 pour obtenir 1 toujours imprimé sur x86?

while (B=0);
lfence
print A
Était-ce utile?

La solution

Dans x86, les écritures par un seul processeur sont observées dans le même ordre par tous les processeurs.Pas besoin de clôturer dans votre exemple, ni dans aucun programme normal sur x86.Votre programme:

while(B==0);  // wait for B == 1 to become globally observable
print A;      // now, A will always be 1 here

Ce qui se passe exactement dans le cache est spécifique au modèle.Toutes sortes de trucs et de comportements spéculatifs peuvent se produire dans le cache, mais le comportement observable suit toujours les règles.

Consultez la section 8.2.2 du Guide de programmation du système Intel Volume 3.pour plus de détails sur l'ordre de la mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top