DawnCC parallélise automatiquement des programmes avec OpenMP et OpenACC

Le défi pour exploiter la puissance des processeurs actuels est d’écrire son code avec un degré de parallélisme suffisant, de telle sorte qu’il s’exécute sur tous les cœurs (voire en utilisant les accélérateurs matériels disponibles, comme des cartes graphiques). Même avec des outils comme OpenACC et OpenMP, qui permettent cette parallélisation avec de simples annotations du code, il est nécessaire de repasser sur son code, parfois des années ou des dizaines d’années après son écriture — et ces annotations doivent prévenir certains problèmes d’accès en mémoire (dès que plusieurs cœurs travaillent sur une même zone en mémoire, des problèmes d’écriture concurrente apparaissent).

Le projet DawnCC a pour objectif d’ajouter les instructions OpenACC ou OpenMP nécessaires pour que cette parallélisation soit effectuée. Le code source original est ainsi conservé, mais annoté aux endroits où cela est possible. DawnCC ne se focalise pas sur la performance du code ainsi produit, mais bien sur sa correction. Pour ce faire, l’outil se base sur LLVM, qui propose une représentation du code en cours de compilation (une représentation intermédiaire, IR) et différentes passes d’analyse, notamment pour détecter les dépendances en mémoire pour une série de lignes de code.

En visant OpenACC et OpenMP, le projet permet d’aller encore plus loin qu’une “simple” parallélisation sur les différents cœurs d’un processeur : ces normes définissent aussi des structures pour décharger l’exécution du code sur des accélérateurs, notamment des processeurs graphiques (GPU). Elles facilitent énormément le travail par rapport à l’implémentation manuelle avec CUDA ou OpenCL, mais ce processus reste fastidieux et le risque d’erreur est élevé. Par rapport à des annotations pour plusieurs cœurs, il faut indiquer explicitement les parties de la mémoire à transférer sur l’accélérateur, ce qui n’est pas trivial. DawnCC s’occupe de calculer précisément les parties nécessaires, à l’aide d’analyse statique du code source.

Sur le site officiel du projet, il est possible d’exécuter DawnCC sur des fonctions en C ou en C++, voire des fichiers complets. Par exemple, cette fonction incrémente le contenu d’un tableau, mais jusqu’à un indice qui dépend de l’argument passé à la fonction.


void func(int a) {
  int n[100];
  int i;
  for (i = 0; i < a; i++) {     n[i+1] = n[i+1] + 1;   } } 

La version OpenMP possède une annotation au niveau de la boucle for pour en demander la parallélisation au compilateur, mais aussi une autre annotation pour indiquer quelles parties de la mémoire doivent être transférées sur l’accélérateur — en fonction de la valeur du paramètre.

 void func(int a) {   int n[100];   int i;   long long int AI1[8];   AI1[0] = a + -1;   AI1[1] = 4 * AI1[0];   AI1[2] = 4 + AI1[1];   AI1[3] = AI1[2] + 4;   AI1[4] = AI1[3] / 4;   AI1[5] = (AI1[4] > 0);
  AI1[6] = (AI1[5] ? AI1[4] : 0);
  AI1[7] = AI1[6] - 1;
  #pragma omp target data map(tofrom: n[1:AI1[7]])
  #pragma omp target
  for (i = 0; i < a; i++) {
    n[i + 1] = n[i + 1] + 1;
  }
}

Source : [llvm-dev] Automatic Insertion of OpenACC/OpenMP directives.

Voir aussi : le dépôt GitHub du projet, Automatic Insertion of Copy Annotation in Data-Parallel Programs, DawnCC: a Source-to-Source Automatic Parallelizer of C and C++ Programs.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s