82 votes

La différence entre la mémoire asm, asm volatile et clobbering

Lors de la mise en œuvre sans verrouillage des structures de données et de synchronisation de code, il est souvent nécessaire de supprimer les optimisations du compilateur. Normalement, les gens le faire à l'aide de asm volatile avec memory dans le tabasser liste, mais vous voyez parfois juste asm volatile ou juste un simple asm casser la mémoire.

Quel est l'impact de ces différentes affirmations sur la génération de code (en particulier dans GCC, car il est peu probable pour être portable)?

Juste pour la référence, ce sont les variations intéressantes:

asm ("");   // presumably this has no effect on code generation
asm volatile ("");
asm ("" ::: "memory");
asm volatile ("" ::: "memory");

69voto

Matthew Slattery Points 21628

Voir la "prolongation de l'Asm" à la page du CCG de la documentation.

Vous pouvez empêcher un asm instructions de suppression en écrivant le mot-clé volatile après l' asm. [...] L' volatile mot-clé indique que l'instruction a d'importants effets secondaires. GCC ne supprimera pas un volatile asm si elle est accessible.

et

Un asm instruction, sans aucune sortie opérandes soient traités de façon identique à un volatile asm enseignement.

Aucun de vos exemples ont opérandes de sortie spécifié, alors l' asm et asm volatile formes se comportent de façon identique: ils créent un point dans le code qui ne peut pas être supprimé (sauf s'il est prouvé à être inaccessible).

Ce n'est pas tout à fait la même chose que de ne rien faire. Voir cette question pour un exemple d'un mannequin asm qui change de génération de code - dans cet exemple, le code qui fait le tour d'une boucle de 1000 fois devient vectorisées dans le code qui calcule 16 itérations de la boucle à la fois; mais la présence d'un asm à l'intérieur de la boucle inhibe l'optimisation (l' asm doit être atteint 1000 fois).

L' "memory" tabasser fait GCC supposer que la mémoire peut être arbitrairement lus ou écrits par l' asm bloc, va empêcher le compilateur de la réorganisation des charges ou des magasins à travers elle:

Ce sera la cause de GCC pour ne pas garder en mémoire les valeurs mises en cache dans les registres à travers l'instruction assembleur et de ne pas optimiser les magasins ou les charges pour que la mémoire.

(Cela n'empêche pas qu'un CPU, de la réorganisation des charges et de magasins à l'égard d'un autre CPU, si vous avez besoin d'une réelle barrière de mémoire d'instructions pour cela.)

13voto

Kevin Ballard Points 88866

asm ("") ne fait rien (ou au moins, elle n'est pas censé faire quoi que ce soit.

asm volatile ("") aussi ne fait rien.

asm ("" ::: "memory") est un simple compilateur clôture.

asm volatile ("" ::: "memory") Autant que je sache, est le même que le précédent. L' volatile mot-clé indique au compilateur qu'il n'est pas permis de déplacer ce bloc d'assemblage. Par exemple, il peut être retirée d'une boucle si le compilateur décide que les valeurs d'entrée sont les mêmes dans chaque invocation. Je ne suis pas vraiment sûr dans quelles conditions le compilateur va décider qu'il comprenne assez de l'assemblée, à essayer d'optimiser son placement, mais l' volatile mot-clé supprime entièrement. Cela dit, je serais très surpris si le compilateur a tenté de déplacer un asm déclaration qui n'avait pas déclaré d'entrées ou de sorties.

Incidemment, volatile aussi empêche le compilateur de la suppression de l'expression si elle décide que les valeurs de sortie sont inutilisés. Cela ne peut se faire que si il y a des valeurs de sortie, donc ça ne s'applique pas à l' asm ("" ::: "memory").

3voto

James Points 5526

Juste pour être complet sur la réponse de Kevin Ballard, Visual Studio 2010 propose à _ReadBarrier (), _WriteBarrier () et _ReadWriteBarrier () de faire de même (VS2010 ne permet pas l'assemblage en ligne pour les applications 64 bits).

Celles-ci ne génèrent aucune instruction mais affectent le comportement du compilateur. Un bel exemple est ici

MemoryBarrier () génère lock or DWORD PTR [rsp], 0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X