L'analyste et formateur de Calcul Québec Maxime Boissonneault pendant les ateliers de la séquence programmation parallèle de l'école de CIP 2017.

 

Mise en contexte : l’école de CIP

Du 15 au 19 mai 2017 se tenait la troisième édition de l’école de calcul informatique de pointe de Calcul Québec. Lors de cette école, les étudiants étaient invités à participer à l’une de deux séquences :

  1. analyse de données avec R;
  2. calcul parallèle.

Cet article est à propos de la séquence calcul parallèle. Lors de cette séquence, les étudiants ont eu la possibilité d’apprendre :

  1. les bases du calcul parallèle;
  2. l’optimisation et la vectorisation de code;
  3. la parallélisation avec OpenMP;
  4. la parallélisation avec MPI;
  5. la parallélisation sur GPU avec CUDA;
  6. la parallélisation sur GPU avec OpenACC.

Pour chaque technologie, on proposait aux étudiants de paralléliser l’un de deux codes. Le premier code réalise la convolution d’une image avec un noyau. Le deuxième code simule les interactions gravitationnelles entre N corps célestes.

Le code de convolution est plus simple à paralléliser, mais offre un plus faible potentiel en raison de l’appel d’une bibliothèque externe qui nécessite une part importante du temps d’exécution. Il fallait utiliser un noyau artificiellement grand afin d’observer un impact de la parallélisation significatif.

Le code de problème à N corps est quant à lui hautement parallèle, mais est plus complexe à paralléliser, car il est constitué de plusieurs sections parallélisables entrecoupées de sections séquentielles. Une parallélisation efficace requiert donc des étapes de synchronisation à plusieurs endroits, ainsi que la parallélisation de plusieurs sections indépendantes.

Avant l’école d’été, les formateurs devaient écrire une solution en utilisant la technologie qu’ils enseignaient. Je recense ci-dessous quelques statistiques sur les deux projets et les solutions obtenues.

Les chiffres d’accélération ont été obtenus en comparant au temps d’exécution sur un coeur de calcul. Dans le cas de MPI, nous avons testé avec 8 coeurs (1 noeud de calcul de Colosse) et 16 coeurs (2 noeuds de calcul de Colosse).

Statistiques pour le code de convolution

Technologie utiliséeRessources utiliséesAccélération de la solution de l'instructeurNombre de nouvelles lignes de codeTemps de développement de l'instructeur [h]Nombre d'étudiants (sur 11) ayant obtenu une solutionAccélération de la meilleure solution des étudiants
Optimisation et vectorisation1 coeur2,6586N/AN/A
OpenMP8 coeurs5,27265,4
MPI8 coeurs4,179214,2
MPI16 coeurs5,079212,0
CUDA1 GPU K805,910053*5,9
OpenACC1 GPU K806,3311??
* La parallélisation avec CUDA donnait un résultat quantitativement différent du code original (avec la précision utilisée), mais qualitativement identique.

Statistiques pour le code de problème à N Corps

Technologie utiliséeRessources utiliséesAccélération de la solution de l'instructeurNombre de nouvelles lignes de codeTemps de développement de l'instructeur [h]Nombre d'étudiants (sur 11) ayant obtenu une solutionAccélération de la meilleure solution des étudiants
Optimisation et vectorisation1 coeur3,1454N/AN/A
OpenMP8 coeurs6,52046,6
MPI8 coeurs6,2197716,0
MPI16 coeurs9,0197717,0
CUDA1 GPU K808,1359101*6
OpenACC1 GPU K8020,6753??
* La parallélisation avec CUDA donnait un résultat quantitativement différent du code original (avec la précision utilisée), mais qualitativement identique.

Résumé

Globalement, les étudiants ont trouvé les exemples beaucoup plus faciles à paralléliser avec OpenMP, et choisiraient cette technologie avant les trois autres à moins d’avoir besoin de beaucoup plus de ressources. Peu d’étudiants ont réussi à paralléliser les exemples en utilisant MPI ou CUDA. Comme la session de vendredi était plus courte et que beaucoup d’étudiants sont partis avant la période d’exercices, nous n’avons pas les données pour OpenACC.