Supposons qu'il y a deux threads s'exécutant sur x86 CPU0 et CPU1 respectivement. Discussion en cours d'exécution sur CPU0 exécute les commandes suivantes:Est-ce que deux magasins CPU consécutifs sur x86 sont vidés dans le cache en maintenant l'ordre?
A=1
B=1
ligne de cache contenant un premier temps détenu par CPU1 et contenant B appartenant à CPU0.
J'ai deux questions:
Si je comprends bien, les deux magasins seront mis dans le tampon de stockage de CPU. Cependant, pour le premier magasin
A=1
, le cache de CPU1 doit être invalidé tandis que le second magasinB=1
peut être vidé immédiatement puisque CPU0 possède la ligne de cache le contenant. Je sais que le processeur x86 respecte les commandes des magasins. Est-ce que cela signifie queB=1
ne sera pas écrit dans le cache avantA=1
?Supposons en CPU1 les commandes suivantes sont exécutées:
alors que (B = 0);
print A
est-il suffisant pour ajouter que lfence entre les commandes et while
print
dans CPU1 sans ajouter sfence entre A=1
et B=1
à CPU0 pour obtenir 1 toujours imprimé sur x86?
while (B=0);
lfence
print A
Même si x86 le garantit, pourquoi prendre le risque? Pourquoi ne pas simplement utiliser les bonnes barrières? –
Zan, il peut être avantageux à plusieurs endroits si la CPU le garantit. Par exemple, les spinlocks sont implémentés sans utiliser de préfixe de verrouillage dans le noyau car ils peuvent se le permettre. Et la clôture n'est pas la solution à cette question sinon, il faut utiliser un verrou approprié. – Saurabh
La réponse à la ** première question - Oui **. La réponse à la ** 2-ème question - Oui, mais seulement en assembleur (pas en C/C++) **. Comme on l'a dit à juste titre, «LFENCE» n'est pas nécessaire ici sur x86 - il fournit automatiquement la cohérence. Notez que le processeur x86 ne peut pas réorganiser 'load' et toutes les instructions suivantes, mais C/C++ peut le réorganiser. Sur C++ vous utiliserez ** acquérir la consistance **: 'extern std :: atomique B;' 'while (B.load (std :: memory_order_acquire) == 0);' 'std :: cout << A;' http://fr.cppreference.com/w/cpp/atomic/memory_order –
Alex