Quand devriez-vous utiliser _mm_sfence, _mm_lfence et _mm_mfence ?
La programmation multithread introduit des complexités liées à la concurrence, nécessitant des mécanismes pour conserver les données intégrité et synchronisation. La bibliothèque intrinsèque d'Intel fournit plusieurs fonctions, notamment _mm_sfence, _mm_lfence et _mm_mfence, pour contrôler l'ordre de la mémoire dans les architectures x86.
L'ordre de la mémoire dans x86
Les processeurs x86 ont une forte modèle de mémoire ordonné, mais C et C en ont des plus faibles. Par conséquent, des précautions supplémentaires sont nécessaires pour garantir un bon ordre de la mémoire et éviter la corruption des données ou les conditions de concurrence critique.
_mm_sfence
_mm_sfence est principalement utilisé après les magasins non temporels (NT). (_mm_stream_*) pour empêcher la réorganisation spéculative. Les magasins NT sont faiblement ordonnés, ce qui signifie qu'ils peuvent sembler se produire dans le désordre par rapport aux autres opérations de mémoire. _mm_sfence crée une barrière qui garantit que les opérations de mémoire ultérieures deviennent globalement visibles une fois les magasins NT enregistrés en mémoire.
_mm_lfence
_mm_lfence est rarement utilisé comme barrière de chargement. Il n'est pertinent que lors du chargement à partir de régions de mémoire Write-Combining (WC), telles que la RAM vidéo. _mm_lfence peut empêcher l'exécution des instructions suivantes jusqu'à ce qu'elles soient retirées, ce qui peut être utile pour le microbenchmarking.
_mm_mfence
_mm_mfence fournit une cohérence séquentielle, garantissant que les charges suivantes ne peuvent lire les valeurs qu'après les magasins précédents deviennent visibles globalement. Cela peut être utile si vous implémentez votre version personnalisée de std::atomic ou si vous devez contrôler explicitement l'ordre de la mémoire pour des opérations qui autrement seraient spéculatives.
Résumé
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!