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

Était-ce utile?

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.

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