Avons-nous besoin de mfence lors de l'utilisation de xchg
-
14-11-2019 - |
Question
J'ai un ensemble et un test xchg
verrouillage d'assemblage basé. Ma question est :
Avons-nous besoin d'utiliser des clôtures de mémoire (mfence
, sfence
ou lfence
) lors de l'utilisation xchg
instruction ?
Éditer :
Plateforme 64 bits: avec Intel Nehalem
La solution
Comme dit dans les autres réponses, le préfixe de verrouillage est implicite, ici, il n'y a donc pas de problème au niveau de l'assembleur. Le problème peut poser au niveau C (ou C ++) lorsque vous l'utilisez comme assembleur en ligne. Ici, vous devez vous assurer que le compilateur ne réorganise pas les instructions en ce qui concerne votre xchg
. Si vous utilisez GCC (ou cousins), vous feriez généralement quelque chose comme:
__asm__ __volatile__("xchgl %1, %0"
: "=r"(ret)
: "m"(*point), "0"(ret)
: "memory");
qui déclare l'instruction comme volatile et Ajoutez le clobber "mémoire".
Autres conseils
Selon le chapitre 8 Verrouillage de bus, de la Manuel du développeur des logiciels Intel 64 et IA-32 Architectures, Volume 3A
Le modèle d'ordonnance de mémoire empêche les charges et les magasins d'être réorganisés avec des instructions verrouillées qui s'exécutent plus tôt ou plus tard.
Alors le verrouillé XCHG
L'instruction agit comme une barrière de mémoire et aucune barrière supplémentaire n'est nécessaire.
Non. xchg
est garanti de se compiler en quelque chose, qui assurera la cohérence au niveau matériel.
L'instruction XCHG a un préfixe de verrouillage implicite selon les manuels Intel.