Question

Qu'entend-on par utilisation d'une barrière de mémoire explicite?

Était-ce utile?

La solution

Pour des gains de performances, les processeurs modernes exécutent souvent des instructions erronées afin d'optimiser l'utilisation du silicium disponible (y compris les lectures / écritures en mémoire). Parce que le matériel applique l'intégrité des instructions, vous ne le remarquez jamais dans un seul thread d'exécution. Toutefois, pour plusieurs threads ou environnements dotés d'une mémoire volatile (E / S mappées en mémoire, par exemple), cela peut entraîner un comportement imprévisible.

Une barrière de mémoire / barrière est une classe d'instructions qui signifie que les lectures / écritures en mémoire se déroulent dans l'ordre que vous souhaitez. Par exemple, une "clôture complète" signifie que toutes les lectures / écritures avant la clôture sont validées avant celles après la clôture.

Remarque: les barrières de mémoire sont un concept matériel. Dans les langages de niveau supérieur, nous sommes habitués à traiter avec des mutex et des sémaphores - ceux-ci peuvent être implémentés en utilisant des barrières de mémoire de bas niveau et l'utilisation explicite de barrières de mémoire n'est pas nécessaire. L’utilisation de barrières de mémoire nécessite une étude minutieuse de l’architecture matérielle et est plus communément trouvée dans les pilotes de périphérique que le code de l’application.

La réorganisation du processeur diffère de l'optimisation du compilateur, même si les artefacts peuvent être similaires. Vous devez prendre des mesures distinctes pour empêcher le compilateur de réorganiser vos instructions si cela peut entraîner un comportement indésirable (par exemple, utilisation du mot clé volatile en C).

Autres conseils

Copier le ma réponse à une autre question, Quels sont quelques astuces qu'un processeur utilise pour optimiser le code? :

  

Le plus important serait la réorganisation des accès à la mémoire.

     

En l'absence de clôture de mémoire ou d'instructions de sérialisation, le processeur est libre de réorganiser les accès à la mémoire. Certaines architectures de processeurs imposent des restrictions quant au nombre de commandes qu'elles peuvent réorganiser. Alpha est connu pour être le plus faible (c’est-à-dire celui qui peut réorganiser le plus).

     

Vous trouverez un très bon traitement du sujet dans la documentation relative aux sources du noyau Linux, à l’adresse documentation / memory-barrières.txt .

     

La plupart du temps, il est préférable d'utiliser les primitives de verrouillage de votre compilateur ou de votre bibliothèque standard. ceux-ci sont bien testés, devraient avoir toutes les barrières de mémoire nécessaires en place et sont probablement assez optimisés (l'optimisation du verrouillage des primitives est délicate; même les experts peuvent parfois s'y tromper).

Selon mon expérience, il s'agit d'une barrière de mémoire , qui est une instruction (explicite ou implicite) pour synchroniser l'accès à la mémoire entre plusieurs threads.

Le problème provient de la combinaison de compilateurs agressifs modernes (ils ont une liberté incroyable pour réorganiser les instructions, mais ne connaissent généralement pas vos threads) et de processeurs multicœurs modernes.

Le " Le ' Le verrouillage à double vérification est une 'déclaration brisée " ;. Pour beaucoup, c'était le réveil qu'il y ait des dragons.

Des barrières de mémoire implicites sont généralement incluses dans les routines de synchronisation des threads de la plate-forme, qui en couvrent le cœur. Toutefois, pour une programmation sans verrouillage et la mise en œuvre de modèles de synchronisation personnalisés et légers, vous avez souvent besoin uniquement de la barrière, voire d'une barrière à sens unique.

Wikipedia sait tout…

  

Barrière de mémoire, également appelée membre   ou barrière de mémoire, est une classe de   instructions qui provoquent une centrale   unité de traitement (CPU) pour appliquer un   contrainte de commande sur la mémoire   opérations émises avant et après la   instruction de barrière.

     

Les processeurs utilisent des optimisations de performances   qui peut entraîner une panne   exécution, y compris la charge de mémoire et   opérations de magasin. Opération de la mémoire   réorganiser passe normalement inaperçu   dans un seul thread d'exécution,   mais provoque un comportement imprévisible   programmes simultanés et pilotes de périphériques   à moins que soigneusement contrôlé. L'exact   la nature d'une contrainte de commande est   dépendant du matériel, et défini par le   modèle de mémoire de l'architecture. Certains   les architectures fournissent plusieurs   barrières pour faire respecter différents   contraintes de commande.

     

Les barrières de mémoire sont généralement utilisées   lors de la mise en œuvre d'une machine de bas niveau   code qui fonctionne sur la mémoire partagée par   plusieurs appareils. Ce code comprend   primitives de synchronisation et   structures de données sans verrouillage sur   systèmes multiprocesseurs et dispositif   pilotes qui communiquent avec l'ordinateur   matériel.

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