Maison >développement back-end >C++ >Quand devriez-vous utiliser _mm_sfence, _mm_lfence ou _mm_mfence ?

Quand devriez-vous utiliser _mm_sfence, _mm_lfence ou _mm_mfence ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-18 00:05:02454parcourir

When Should You Use _mm_sfence, _mm_lfence, or _mm_mfence?

Décider quand utiliser _mm_sfence, _mm_lfence ou _mm_mfence

Lors de l'utilisation de code multithread, il est nécessaire de contrôler efficacement l'ordre de la mémoire. Alors que les processeurs x86 disposent d'un modèle de mémoire fortement ordonné, C et C adhèrent à un modèle plus souple. Cela peut prêter à confusion quant à l'utilisation appropriée des intrinsèques _mm_sfence, _mm_lfence et _mm_mfence.

Comprendre l'ordre de la mémoire

Pour la sémantique d'acquisition/libération, empêchant la réorganisation au moment de la compilation à lui seul suffit, comme le souligne le concept de barrières au compilateur. Cela garantit le bon ordre des opérations dans la machine abstraite, sans entraver les performances avec des instructions asm inutiles. Des options telles que GNU C/C asm("" ::: "memory") agissent efficacement comme des barrières au compilateur, atteignant cet objectif tout en minimisant l'impact sur les performances.

Alternativement, C 11 std::atomic offre une solution transparente avec shared_var.store(tmp, std::memory_order_release), assurant une visibilité globale des modifications. _mm_mfence a une valeur potentielle si vous implémentez votre propre version de C11/C 11 std::atomic, en utilisant mfence pour établir une cohérence séquentielle et empêcher les chargements ultérieurs de récupérer des valeurs avant que les magasins précédents ne soient accessibles globalement.

Examiner les rôles de chacun Intrinsèque

_mm_sfence :

  • Idéal pour les magasins NT, nécessitant une clôture avant de placer un drapeau sur lequel s'appuient d'autres fils.
  • Assure la synchronisation de libération/acquisition lors de l'utilisation de magasins NT, qui sont faiblement ordonnés contrairement aux magasins.

_mm_lfence :

  • Rarement utilisé comme barrière de chargement, car les charges ne sont que faiblement ordonnées lorsqu'elles impliquent la mémoire WC (Write-Combining) régions.
  • Peut être utilisé pour contrôler le flux d'exécution sur certains processeurs, empêchant ainsi les instructions ultérieures de s'exécuter jusqu'à ce que lfence ait terminé.

_mm_mfence :

  • Potentiellement utile pour implémenter votre propre version de std::atomic, en tirant parti de mfence pour une cohérence séquentielle.
  • Remarque : mfence peut être plus lent que le RMW atomique verrouillé opérations.

Notes de mise en garde concernant les performances

Il est important de reconnaître que les clôtures n'accélèrent pas la visibilité des magasins. Ils reportent simplement les opérations dans le thread actuel jusqu'à ce que les opérations précédentes soient terminées.

Conclusion

Pour les cas d'utilisation générale, C 11 std::atomic ou C11 stdatomic offrent des fonctionnalités robustes. et des solutions conviviales pour contrôler l'ordre de la mémoire. Dans les scénarios impliquant des magasins NT ou des implémentations personnalisées de std::atomic, _mm_sfence et _mm_mfence peuvent s'avérer utiles, mais un examen attentif de leur impact sur les performances est crucial.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn