Vous trouverez, sur cette page, de l'information et des ressources sur le calcul parallèle, offrant aux professeurs des perspectives sur les avantages et les techniques de l'utilisation du traitement parallèle pour améliorer la puissance de calcul et l'efficacité dans la recherche et l'enseignement.

Afin d’accélérer considérablement vos calculs, vous pouvez créer un programme qui utilise en parallèle plusieurs cœurs d’UCT au lieu d’un seul cœur. Selon le type de calcul, l’accélération pourrait évoluer linéairement en fonction du nombre de cœurs. Par exemple, sur une machine à quatre cœurs, votre programme pourrait courir quatre fois plus vite. Lors de l’exécution sur les grappes disposant de centaines ou de milliers de processeurs, les avantages que le calcul parallèle offre peuvent s’avérer considérables.

Il existe plusieurs façons de faire un calcul parallèle : OpenMP, Python ou MPI.

Méthodes de calcul parallèle

L’une des manières les plus faciles de paralléliser un calcul est OpenMP. Il est disponible pour C, C++ et Fortran et il est présent dans les compilateurs les plus modernes.

Pour activer OpenMP sur les systèmes à mémoire partagée (par exemple, sur un seul ordinateur), vous devez définir une option de compilation. Pour faire passer une boucle en parallèle, ajoutez une seule ligne de texte à côté d’une boucle for. La seule limite dans cette situation est le nombre de cœurs du processeur.

L’exemple suivant illustre une simulation du mouvement des particules, mises en parallèle au niveau physique par l’ajout d’une directive #pragma au-dessus de la boucle for.

Les positions des particules sont initialisées en utilisant le générateur de nombres aléatoires dans C++. Il s’agit d’une partie en série, car le générateur de nombres aléatoires n’est pas thread-safe.

openmp1

La physique réelle se produit en mettant à jour de façon continue les positions de la particule. Cette partie peut être exécutée en parallèle; c’est ce que la directive #pragma ordonne au compilateur.

La compilation de programmes utilisant OpenMP nécessite une option de compilation. Son nom dépendra du compilateur, mais celui-ci est en général -fopenmp ou -openmp. Par exemple, pour compiler l’exemple ci-dessus, utilisez :

g++ main.cpp -fopenmp

Pour plus de renseignements au sujet de la programmation avec OpemMP, regardez ces tutoriels (offerts en anglais seulement).

L’exemple ci-dessus est relativement simple : il s'agit de l’exécution d’un programme en parallèle, car il n’y avait aucune interaction entre les particules.

Vérifiez le code.

openmp2

L’interaction complique les choses parce que l'accès simultané par plusieurs cœurs aux positions des particules pourrait engendrer des effets indésirables. Il y a aussi des limitations en ce qui concerne l’accélération, car il y a toujours des temps système entraînés par le calcul parallèle. Par exemple, l’exemple ci-dessus n’est pas proportionnel de façon linéaire avec le nombre de threads. En fait, l’ajout de plusieurs threads pourrait ralentir le calcul. Par conséquent, il vaut mieux profiler un programme pour voir l’accélération réelle, surtout si vous envisagez une soumission au concours d’allocation des ressources auprès de Calcul Canada.

Un calcul pour l’exemple ci-dessus avec un processeur Intel Xeon E5520 révèle qu’alors une accélération qui a presque doublé pourrait être possible à l’aide de quatre threads, il n’y a aucun gain si plusieurs sont utilisés.

Ce calcul a été généré en synchronisant l’exécution du programme à l’aide de différents threads en ajoutant la variable d’environnement OMP_NUM_THREADS.

plot