6

En réponse à la question this, il semble que LOCK CMPXCHG sur x86 provoque réellement une barrière complète. Vraisemblablement, c'est ce que Unsafe.compareAndSwapInt() génère également sous le capot. J'ai du mal à comprendre pourquoi: avec le protocole MESI, après avoir mis à jour la ligne de cache, la CPU pouvait-elle simplement invalider cette ligne de cache sur d'autres cœurs, plutôt que drainer TOUS les tampons de stockage/chargement du cœur qui effectuait le CAS? Semble plutôt inutile pour moi ...Comparer et échanger sur x86 - pourquoi est-ce une barrière complète?

+0

Avec une barrière complète, vous videriez tous vos changements de prédiction manqués, au lieu d'une seule ligne de cache, donc ce ne serait pas pire avec la barrière complète? Mais évidemment je manque sth ici :) – Bober02

+0

[Comparer-et-swap] (https://fr.wikipedia.org/wiki/Compare-and-swap) sur Wikipédia couvre cela, * Il compare le contenu d'un emplacement de mémoire à une valeur donnée et, seulement s'ils sont identiques, modifie le contenu de cet emplacement de mémoire à une nouvelle valeur donnée. Ceci est fait comme une seule opération atomique. L'atomicité garantit que la nouvelle valeur est calculée sur la base d'informations à jour; si la valeur avait été mise à jour par un autre thread entre-temps, l'écriture échouerait. * Sans une barrière complète, elle pourrait être interrompue (ou mise à jour) et cela pourrait invalider l'atomicité. –

Répondre

1

Votre réponse pour autant que je peux voir est dans les commentaires - Mises à jour MESI caches, pas Store/Load buffers. Mais le verrou LOCK CMPXCHG dit: locked operations serialize all outstanding load and store operation - c'est pourquoi il doit drainer le tampon de stockage/chargement de ce CPU (et pas d'autres comme détaillé here). Donc le CPU actuel doit effectuer l'opération atomique sur la valeur la plus récente - qui pourrait résider dans les tampons de stockage/chargement, c'est pourquoi une clôture est nécessaire pour drainer cela.

+0

Je vous reçois! nous avons besoin de synchroniser ravinement, nous échangeons la ligne de cache, cool! Encore une chose - O la barrière de mémoire complète fait en sorte que les tampons de mémoire d'autres processeurs soient vidés? Ou seulement celui sur lequel le fil fonctionne? En d'autres termes, j'avais l'impression que les changements en attente d'autres CPU sont dans le tampon de chargement de mon CPU, ainsi la barrière de mem vide juste ceux – Bober02

+0

@ Bober02 J'ai effectivement mis à jour la réponse pour rendre un peu plus clair - selon mon arrangement. – Eugene