Qu'est-ce que Barrière mémoire ?
Instruction garantissant que les opérations mémoire antérieures à la barrière deviennent visibles aux autres cœurs avant les opérations postérieures. Aussi appelée fence, par exemple fence en RISC-V.
Nom japonais: メモリバリア
« Barrière mémoire » apparaît dans 2 questions d'entraînement réparties sur 1 thèmes, dont Multicœur et synchronisation.
Domaine: Multicœur et synchronisation
L'exemple du tampon d'écriture
Supposons que le cœur 0 exécute x = 1 puis r1 = y, tandis que le cœur 1 exécute y = 1 puis r2 = x, avec x et y valant 0 au départ. Sous cohérence séquentielle, une écriture a lieu en premier, donc au moins un chargement doit renvoyer 1. Sur les processeurs réels, y compris x86, chaque écriture peut attendre dans le tampon d'écriture de son cœur pendant que le chargement suivant lit l'ancienne valeur dans le cache ; r1 et r2 peuvent donc valoir 0 tous les deux. Placer une barrière complète entre l'écriture et le chargement dans chaque thread force l'écriture à devenir visible avant l'exécution du chargement, ce qui exclut ce résultat.
Les instructions de barrière des ISA réelles
RISC-V fournit fence, dont les opérandes indiquent quels accès antérieurs doivent être ordonnés avant quels accès ultérieurs : fence rw, rw ordonne ainsi toutes les lectures et écritures ; ses instructions atomiques et load-reserved/store-conditional portent des bits acquire et release. Arm dispose de dmb (data memory barrier) pour l'ordonnancement, de dsb lorsqu'il faut attendre l'achèvement, et d'instructions load-acquire et store-release. Sur x86, dont l'ordre total des écritures (TSO) préserve déjà la plupart des ordres, mfence ou une instruction verrouillée n'est nécessaire que pour ordonner une écriture avant un chargement ultérieur. Les barrières ne sont pas gratuites, car elles peuvent bloquer le cœur jusqu'à ce que les écritures en attente soient vidées.
Questions fréquentes
Quelle est la différence entre une barrière mémoire et une fence ?
C'est le même concept sous deux noms. Les deux désignent une instruction qui maintient les opérations mémoire qui la précèdent ordonnées avant celles qui la suivent, du point de vue des autres cœurs ; RISC-V appelle son instruction fence, et Arm appelle les siennes des barrières.
x86 a-t-il besoin de barrières mémoire ?
Moins souvent que les architectures faiblement ordonnées, car l'ordre total des écritures de x86 maintient la plupart des chargements et écritures dans l'ordre du programme. Une barrière comme mfence, ou une instruction verrouillée, reste nécessaire lorsqu'une écriture doit devenir visible avant un chargement ultérieur vers une adresse différente.
Quelle est la différence entre une barrière de compilation et une barrière mémoire ?
Une barrière de compilation empêche seulement le compilateur de déplacer des accès mémoire de part et d'autre et ne génère aucune instruction machine. Une barrière mémoire est une instruction matérielle qui contraint l'ordre dans lequel le processeur rend les accès visibles aux autres cœurs.