Multicœur et synchronisation

Quelle description du faux partage (false sharing), qui survient dans les programmes multithreads, est correcte ?

  1. ADes threads différents modifient des variables différentes, mais comme celles-ci se trouvent dans la même ligne de cache, la ligne fait des allers-retours entre les cœurs et ralentit l’exécution
  2. BDeux threads modifient la même variable sans synchronisation et la valeur est corrompue
  3. CLes threads s’attendent mutuellement pour leurs verrous et se bloquent
Afficher la réponse et l'explication

Réponse : A. Des threads différents modifient des variables différentes, mais comme celles-ci se trouvent dans la même ligne de cache, la ligne fait des allers-retours entre les cœurs et ralentit l’exécution

La cohérence est gérée par ligne de cache (généralement 64 octets). Même si le cœur 0 ne modifie que la variable a et le cœur 1 que la variable b, si a et b sont dans la même ligne, chaque écriture invalide la copie de l’autre et la ligne fait des allers-retours entre les deux cœurs. Le résultat est correct, mais les performances chutent fortement : c’est le faux partage. Il survient facilement avec des tableaux de comptage par thread, par exemple.

S'entraîner sur ce thème Retour au thème

Autres questions sur Multicœur et synchronisation

  1. 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 ?
  2. Quelle description de la course aux données (data race) est correcte ?
  3. 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 ?
  4. Quelle description d’une instruction atomique (instruction indivisible) est correcte ?
  5. Quel est le fonctionnement de l’instruction atomique CAS (compare-and-swap) ?

Comparatifs sur ce thème