Multicœur et synchronisation

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.

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

Autres questions sur Multicœur et synchronisation

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

Comparatifs sur ce thème