Qu'est-ce que Faux partage (false sharing) ?

Phénomène où des threads distincts modifient des variables distinctes situées sur la même ligne de cache, ce qui fait circuler la ligne entre les cœurs et ralentit le traitement.

Nom japonais: 偽共有

« Faux partage (false sharing) » apparaît dans 4 questions d'entraînement réparties sur 2 thèmes, dont Multicœur et synchronisation, CPU et architecture.

Domaine: Multicœur et synchronisation

S'entraîner : questions sur Faux partage (false sharing)

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.

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 ?

  1. AChanger le type des compteurs de long en int pour réduire le tableau
  2. BInsérer un remplissage entre les compteurs ou les aligner pour les placer dans des lignes de cache distinctes
  3. CAugmenter le nombre de threads pour répartir les temps d’attente
Afficher la réponse et l'explication

Réponse : B. Insérer un remplissage entre les compteurs ou les aligner pour les placer dans des lignes de cache distinctes

Si un long fait 8 octets, les 8 compteurs tiennent dans une seule ligne de 64 octets, que tous les threads se disputent. En insérant un remplissage pour placer chaque compteur tous les 64 octets, ou en alignant une structure sur la taille d’une ligne de cache, chaque thread utilise une ligne distincte. Il est aussi efficace que chaque thread compte dans une variable locale et n’ajoute qu’une seule fois le résultat à l’emplacement partagé, à la fin.

« Faux partage (false sharing) » dans les explications

Questions mentionnant « Faux partage (false sharing) » (4)

  1. Quelle description du faux partage (false sharing), qui survient dans les programmes multithreads, est correcte ?
  2. 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 ?
  3. Quelle est la taille usuelle d'une ligne de cache (bloc de cache) dans la plupart des processeurs actuels ?
  4. 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 ?

Termes associés

Ligne de cache Localité spatiale ALE (gravure de couches atomiques) Acquisition-libération (acquire-release) Barrière mémoire Cohérence séquentielle Compare-and-swap Course aux données (data race) Espionnage de bus (snooping) Instruction atomique

Retour au glossaire