Multicœur et synchronisation
Découvrez le protocole MESI, les modèles de cohérence mémoire, les instructions atomiques comme CAS et LL/SC, les verrous et barrières mémoire, le faux partage et les data races avec des QCM.
Multicœur et synchronisation : points clés
Dans un CPU multicœur, plusieurs cœurs d'une même puce partagent la même mémoire tout en disposant chacun de leurs propres caches. Des protocoles de cohérence comme MESI gèrent l'état des lignes de cache afin qu'aucun cœur ne continue d'utiliser des données périmées après qu'un autre cœur les a écrites.
Au-delà, il faut comprendre les modèles de cohérence mémoire, qui définissent l'ordre dans lequel les écritures deviennent visibles pour les autres cœurs, les instructions atomiques qui permettent de mettre à jour des valeurs en toute sécurité, ainsi que les verrous et les barrières mémoire. Ce thème couvre aussi des pièges comme le faux partage (false sharing) et les data races, qui rendent lents ou erronés des programmes en apparence corrects.
Toutes les questions sur Multicœur et synchronisation (50)
- Deux cœurs possèdent chacun dans leur cache une copie de la variable x. Après une écriture de x par le cœur 0, quel problème peut survenir lors de la lecture de x par le cœur 1 en l’absence de mécanisme de cohérence de cache ?
- Quelle combinaison correspond aux quatre états du protocole de cohérence de cache MESI ?
- Dans le protocole MESI, que signifie l’état Modified (M) d’une ligne de cache ?
- Dans le protocole MESI, que se passe-t-il lorsqu’un cœur écrit dans une ligne en état Exclusive (E) ?
- Dans un protocole de cohérence par invalidation, que se passe-t-il lorsqu’un cœur écrit dans une ligne en état Shared (S) ?
- Dans le protocole MESI, quel est le comportement habituel lorsque le cœur 1 veut lire une ligne que le cœur 0 détient à l’état Modified (M) ?
- Quelle description de la cohérence de cache par espionnage (snooping) est correcte ?
- Pourquoi utilise-t-on, dans les systèmes à grand nombre de cœurs, la cohérence par répertoire plutôt que l’espionnage ?
- Les protocoles de cohérence se divisent en protocoles par invalidation et par mise à jour. Quelle est la raison la plus appropriée pour laquelle la plupart des CPU adoptent l’invalidation ?
- Quelle description du faux partage (false sharing), qui survient dans les programmes multithreads, est correcte ?
- Un faux partage se produit dans un tableau de compteurs par thread déclaré « long cnt[8]; ». Quelle est la mesure la plus appropriée ?
- Quelle description de la course aux données (data race) est correcte ?
- Si le code ci-dessus est exécuté simultanément par deux threads, la valeur finale de counter peut être inférieure à 200000. Pour quelle raison ?
- Quelle description d’une instruction atomique (instruction indivisible) est correcte ?
- Quel est le fonctionnement de l’instruction atomique CAS (compare-and-swap) ?
- Le code ci-dessus double la variable partagée counter au moyen de CAS(&p, valeur attendue, nouvelle valeur). Dans quel cas le CAS échoue-t-il et la boucle recommence-t-elle ?
- Avec une paire d’instructions comme LR/SC (load-reserved/store-conditional) de RISC-V, dans quel cas le SC (store-conditional) échoue-t-il ?
- Quelle description du problème ABA, qui affecte les structures de données sans verrou utilisant CAS, est correcte ?
- Quel est le fonctionnement d’une instruction fetch-and-add, comme amoadd.w de RISC-V ou lock xadd de x86 ?
- Quelle description du verrou à attente active (spinlock) est correcte ?
- Dans quelle situation le spinlock est-il le moins adapté ?
- Dans un spinlock, pourquoi attendre la libération par des lectures ordinaires et n’utiliser l’instruction atomique que lorsque le verrou semble libre (test-and-test-and-set), plutôt que de tenter directement la modification par instruction atomique ?
- Quelle comparaison entre mutex (verrou à attente en sommeil) et spinlock est correcte ?
- Quel est un exemple d’interblocage (deadlock) ?
- Dans un programme utilisant plusieurs verrous, quelle est la méthode la plus courante pour éviter l’interblocage ?
- Que définit un modèle de cohérence mémoire (memory consistency model) ?
- Quelle description de la cohérence séquentielle (sequential consistency) est correcte ?
- Les deux threads ci-dessus s’exécutent simultanément sur des cœurs différents (sans réordonnancement par le compilateur). Quel résultat est impossible en cohérence séquentielle mais possible sur un CPU réel comme x86 ?
- Quelle est la caractéristique du modèle de cohérence mémoire de x86 (TSO, Total Store Order) ?
- Quelle affirmation sur les modèles de cohérence mémoire faibles comme ceux d’ARM ou de RISC-V (RVWMO) est correcte ?
- Quel est le rôle d’une instruction de barrière mémoire (fence) ?
- Dans le code ci-dessus, le thread 1 prépare data puis le signale via flag, et le thread 2 lit data après avoir vu flag. Sur un CPU à modèle de cohérence faible, que faut-il pour que le thread 2 lise de façon certaine 42 ?
- Quelle affirmation sur les opérations mémoire à sémantique d’acquisition (acquire) et de libération (release) est correcte ?
- En C, pourquoi ajouter seulement volatile à une variable drapeau échangée entre threads est-il insuffisant comme synchronisation ?
- Pourquoi _Atomic de C11 et std::atomic de C++11 permettent-ils de spécifier un ordre mémoire ?
- Quelle comparaison entre le « verrouillage à gros grain », qui protège toute une grande structure de données par un seul verrou, et le « verrouillage à grain fin », qui protège chaque partie par un verrou distinct, est correcte ?
- Quelle propriété caractérise un algorithme sans verrou (lock-free) ?
- Quelle description de la section critique est correcte ?
- Quelle description de la synchronisation par barrière utilisée dans les programmes parallèles est correcte ?
- Si 64 cœurs mettent à jour en continu et simultanément un compteur partagé unique par instruction atomique, l’ajout de cœurs n’accélère pas le traitement. Quelle en est la raison principale ?
- Quelle description d’un système NUMA (accès mémoire non uniforme) est correcte ?
- Avec la politique de premier contact (first touch) couramment utilisée sur les systèmes NUMA sous Linux (la page est placée dans la mémoire du nœud où s’exécute le thread qui y écrit en premier), à quoi faut-il prendre garde ?
- Parmi les causes suivantes expliquant que les performances d’un programme parallèle progressent moins que prévu avec l’ajout de cœurs, laquelle ne s’applique pas ?
- Pour répartir les itérations d’une boucle entre plusieurs threads, quelle répartition convient lorsque la charge de calcul varie fortement d’une itération à l’autre ?
- Pour calculer avec plusieurs threads la somme de tous les éléments d’un tableau, quelle méthode convient du point de vue des performances ?
- Quelle est la caractéristique d’un verrou lecteurs-rédacteurs (reader-writer lock) ?
- Quelle est l’utilisation la plus appropriée d’un sémaphore à compteur ?
- Quelle est la différence entre cohérence de cache et modèle de cohérence mémoire ?
- Quel est le principe de la mémoire transactionnelle matérielle ?
- Lors d’une attente « jusqu’à ce que la file ne soit plus vide » avec une variable de condition, pourquoi revérifier la condition après le réveil avec une instruction while plutôt qu’avec une instruction if ?
Comparatifs sur ce thème
Autres thèmes de Systèmes informatiques
- Arithmétique des ordinateurs IEEE 754, virgule fixe, erreur d'arrondi
- ISA et assembleur RISC-V, modes d'adressage, conventions d'appel
- Compilateurs Analyse syntaxique, SSA, optimisation, registres
- Éditeurs de liens, chargeurs et exécutables ELF, symboles, relocalisation, liaison dynamique
- Système d'exploitation et matériel Interruptions, appels système, défauts de page
- Hiérarchie mémoire Cache, remplacement, trois types de défauts
- Programmation GPU Warps, mémoire partagée, coalescence, occupation
- Pile matérielle et logicielle de l'IA Inférence/entraînement, quantification, roofline
- Systèmes embarqués et firmware GPIO, UART/SPI/I2C, RTOS
- HDL et vérification Verilog, latches, machines à états, testbenches
- Interfaces d'E/S et bus PCIe, USB, SerDes, CXL
- Analyse des performances Loi d'Amdahl, CPI, goulots d'étranglement
- Sécurité matérielle Canaux auxiliaires, secure boot, TEE, PUF
- Gestion de l'énergie DVFS, power gating, états de veille