Maison >développement back-end >C++ >Quand devriez-vous utiliser _mm_sfence, _mm_lfence ou _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 :
_mm_lfence :
_mm_mfence :
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!