Multicœur et synchronisation

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 ?

  1. ATous les threads ajoutent chaque élément à une variable partagée unique en prenant un verrou
  2. BTous les threads ajoutent chaque élément à une variable partagée unique sans synchronisation
  3. CChaque thread somme sa part dans une variable locale, puis ces sommes sont additionnées une fois chacune à la fin
Afficher la réponse et l'explication

Réponse : C. Chaque thread somme sa part dans une variable locale, puis ces sommes sont additionnées une fois chacune à la fin

Mettre à jour une variable partagée pour chaque élément est très lent, à cause des attentes sur les verrous ou instructions atomiques et des allers-retours de la ligne de cache. Si chaque thread calcule une somme partielle dans un registre ou une variable locale, puis que la somme totale est obtenue par autant d’additions que de threads, les écritures partagées sont minimes. Cette méthode s’appelle réduction et est intégrée aux mécanismes de parallélisation comme OpenMP.

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

Autres questions sur Multicœur et synchronisation

  1. Quelle est la caractéristique d’un verrou lecteurs-rédacteurs (reader-writer lock) ?
  2. Quelle est l’utilisation la plus appropriée d’un sémaphore à compteur ?
  3. Quelle est la différence entre cohérence de cache et modèle de cohérence mémoire ?
  4. Quel est le principe de la mémoire transactionnelle matérielle ?
  5. 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