Opérations atomiques sur les doubles et les vecteurs dans x86_64
Alors que C 11 std::atomic propose des opérations sans verrouillage sur la plupart des implémentations, les opérations vectorielles atomiques AVX ou SSE restent dépendantes du processeur et manquent de prise en charge au niveau de l'assembleur.
Opérations atomiques sur les doubles
- Les opérations de chargement et de stockage sont naturellement atomiques pour 8 octets, y compris les doubles.
- Les opérations de lecture-modification-écriture nécessitent une boucle de nouvelle tentative avec cmpxchg (ou TSX) car il n'y a pas d'instruction directe de destination mémoire.
- Cmpxchg16b est disponible pour les opérations RMW atomiques de 16 octets.
- Certains cas particuliers d'opérations flottantes IEEE peuvent être implémentés à l'aide d'entiers opérations (par exemple, valeur absolue, négation).
Atomique Opérations sur les vecteurs
- Il n'existe aucune prise en charge matérielle pour les opérations de chargement/stockage de vecteurs atomiques dans le système de cohérence de cache.
- Les chargements/stockages de vecteurs sur des tableaux alignés de doubles sont probables utilisation sûre sans risquer de déchirer la ligne de cache.
- Pour une charge/stockage/RMW atomique de 16 octets, cmpxchg16b peut être utilisé.
- La mise à jour atomique d'objets de 16 octets est possible, mais la lecture séparée des moitiés de 8 octets n'est pas garantie comme étant atomique.
Prise en charge du compilateur
- Prise en charge du compilateur
-
Les compilateurs ne génèrent pas toujours un assemblage efficace pour atomique
charger/stocker (par exemple, en utilisant des instructions mov directement vers/depuis les registres xmm).Les vecteurs atomiques (atomic<__m128d> ou atomique<__m256d>) ne sont pas implémentés efficacement, car ils nécessitent cmpxchg16b même en lecture seule ou des opérations en écriture seule.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!