TP4 (Sections Parallèles)

Sections parallèles

Dans ce exercice nous allons étudier l'utilisation des sections parallèles d'openMP en nous basant sur l'implémentation d'un QuickSort. Ces sections sont activées par la combinaison de deux pragma (omp parallel sections et omp parallel section)

  1. Téléchargez le squelette de quicksort et vérifiez qu'il compile/fonctionne
    1. Exécutez le pour des tailles croissantes de tableau, mesurez le temps d'exécution et tracez une courbe du temps en fonction de la taille.
    2. Que constatez vous ?
    3. Expliquez ce comportement
  2. En déduire qu'il faut se méfier du code qu'on vous donne
  3. Modifiez la méthode quicksort pour que les appels récursifs soient effectués dans deux sections parallèles d'openMP. Combien de threads sont créées lors du tri d'un tableau ? (utilisez l'option -L de ps sous Linux, -M sous BSD, l'option -H de top ou simplement htop)
  4. OpenMP supporte la notion de parallélisme imbriqué mais elle n'est pas activée par défaut. Utilisez la méthode omp_set_nested pour l'activer. Combien de threads sont créees lors du tri ? En déduire le principe de fonctionnement du parallélisme imbriqué
  5. Que se passe-t-il si vous fixez le nombre de threads à 1 ?
  6. Mesurez les performances des versions séquentielles et parallèles en fonction de la taille du tableau. Qu'en concluez vous ?

La lenteur de la version parallèle vient du coût de création des threads au début et du coût d'entrée/sortie des sections parallèles, même quand elles ne créent pas de nouveaux threads.

  1. Ajoutez un dry run sur un petit tableau juste avant votre mesure de temps pour forcer openMP à créer les threads.
  2. Modifiez le code de sorte que la pragma omp parallel sections ne soit executée qu'une unique fois au début de l'exécution.
  3. Comparez à nouveau les temps d'exécution des versions parallèle et séquentielle.
  4. Une alternative à sections est l'utilisation de tasks. Implémentez cette nouvelle approche et discutez les résultats.