Parallélisation d'un logiciel d'imagerie médical

Patrice Bonneau et Maxime Joanis

Nous allons travailler sur la parallélisation de la partie des calculs du logiciel d'imagerie médicale du professeur Maxime Descoteaux. Pour ce faire, nous allons utiliser la librairie OpenCL, du groupe Khronos, qui peut à la fois paralléliser sur un CPU et sur un GPU. De plus, elle s’utilise aussi bien avec une carte graphique ATI que nVidia.

Le projet exige l’apprentissage de cette libraire  Lors de l'apprentissage les tests suivants ont été faits.

Mes tests sont plutôt simples. Ils consistent à faire calculer le carré(x2)de chaque élément d’un vecteur de 20 entiers par le CPU, et de faire calculer le cube(x3) de ce même vecteur par le GPU de la carte graphique, s’il y en a une dans l’ordinateur hôte bien sûr. Les résultats sont contenus dans deux vecteurs distincts. Il est à noter qu’il est possible faire exécuter très simplement les mêmes calculs tant par le CPU que par le GPU. En effet, OpenCL peut les considérer comme formant ensemble un seul et même périphérique. Cependant, pour bien illustrer les possibilités d’OpenCL, j’ai choisi d’effectuer deux calculs séparés.

Voici donc le fonctionnement (simplifié) de la librairie OpenCL. Pour paralléliser une partie d’un code séquentiel, il faut la retirer du code source et la remplacer par du code OpenCL. L’opération se divise en 10 étapes, que voici.

  1. Création d’une plateforme de travail OpenCL qui contiendra les objets ci-dessous.

  2. Définition des périphériques disponibles (CPU/GPU).

  3. Création d’un contexte de travail.

  4. Création d’une file d'exécution.

  5. Construction et compilation du programme contenant le code à paralléliser.

  6. Création de tampons qui serviront de liens entre le code séquentiel et le code parallèle.

  7. Création du noyau qui contiendra le programme construit à l’étape 5.

  8. Mise en file d’exécution du noyau ci-dessus (lancement instantané des calculs).

  9. Récupération des résultats depuis les tampons d’échange.

  10. Libération des ressources.

Le code qui sera exécuté en parallèle peut être fourni à OpenCL de plusieurs manières. Par exemple, il peut être écrit dans un fichier séparé qui sera lu lors de l’étape 5. Pour ma part, je l’ai tout simplement écrit à l’intérieur d’un « const char* », qui a été lu lors de cette même étape.

Si 10 étapes semblent être une énorme charge de travail, il faut dire que chacune se résume à une commande pour créer l’objet, suivi d’une vérification d’erreur.