Utiliser OpenMP avec Code::Blocks

Afin d’accélérer un code sans entrer dans une ingénierie trop développée, j’ai décidé d’utiliser OpenMP pour paralléliser des tâches et casser des boucles. Ceci peut être très avantageux, sur un bi-processeur, mon code a réduit de 72 % son temps d’exécution . Je ne sais pas pourquoi mais par défaut (constaté sous Windows seulement) mon programme se lance sur le processeur occupé. En parallélisant, le processeur totalement libre est utilisé (d’où un gain supérieur à 50% en utilisant schedule et sections). J’ai probablement un montage particulier sur la machine en question.

Afin de tester la bonne portabilité de ce code, j’ai voulu le tester sous Ubuntu. Je vais donc dans ce petit billet vous expliquer comment utiliser OpenMP avec Code::Blocks sous Ubuntu (et probablement d’autres distributions GNU/Linux) et sous Windows.

Ce billet concerne la version 10.05 de Code::Blocks.

Sous Ubuntu

Installer OpenMP GNU GCC :

sudo apt-get install libgomp1          # pour les 32 bits

sudo apt-get install lib64gomp1   # Pour les 64 bits

Installer GNU GCC (ou autre).

Installer Code::blocks:

sudo apt-get install codeblocks

On va compiler le hello_world suivant:

#include <iostream>
#include <omp.h>

using namespace std;

int
main ()  {

int nthreads, tid;

/* Fork a team of threads with each thread having a private tid variable */
#pragma omp parallel private(tid)
{

/* Obtain and print thread id */
tid = omp_get_thread_num();
cout << "Hello World from thread " << tid << endl;

/* Only master thread does this */
if (tid == 0)
{
nthreads = omp_get_num_threads();
cout << "Number of threads = " << nthreads << endl;
}

}  /* All threads join master thread and terminate */
return 0;

}

Code::Blocks repère les compilateurs classiques installés à son lancement. Donc, il n’y a rien à faire de ce point de vue.
Collez le code ci-dessus dans main.cpp (après avoir créer le projet hello_omp).

Il va falloir maintenant indiquer que nous utilisons OpenMP et où se trouve la librairie. Dans le menu, project -> Buid options, aller dans l’onglet Compiler Settings, sous onglet Other options et mettre -fopenmp comme sur l’image suivante.

Fenêtre Code::Blocks

Fenêtre Code::Blocks (project -> Build options)

Ensuite, aller dans l’onglet Linker Settings et cliquer sur add pour indiquer où se trouve libgomp1.so. Voir image ci-dessous. Pour trouver libgomp.so, dans un terminal, tapez : locate libgomp. Prendre lalirairie se situant dans votre dernière version de GCC.

Fenêtre Code::Blocks

Fenêtre Code::Blocks (project -> Build options)

Pour moi ce chemin est : /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/libgomp.so

Voilà, vous pouvez compiler, vous obtiendrez le résultat suivant :

Hello World from thread Hello World from thread 10

Number of threads = 2

Comme on peut le voir la résolution parallèle de l’affichage Hello se superpose.

Sous Windows

C’est globalement la même chose sauf qu’il faut réinstaller MinGW.

Vous installez Code::Blocks avec l’installeur récupérer sur le site en lien au début du billet. Par défaut, Code::Blocks installe MinGW. Mais ce n’est pas une version assez récente pour supporter OpenMP.

Il faut donc récupérer un version plus récente de MinGW, par exemple là : http://www.tdragon.net/recentgcc/
Installer cette version non officielle de MinGW dans C:\\MinGW.
Aller dans le répertoire de Code::Blocks (C:\\Program files\\Codeblocks) et supprimer le répertoire MinGW. Copier le répertoire C:\\MinGW en lieu et place de celui que vous venez de supprimer. Pour ma part, j’ai d’abord changer le MinGW en MinGW_save au cas où.

Ensuite, créez le projet hello_omp et mettez le code ci-dessus dans le main.cpp.

Aller dans Project -> Build options, pour ajouter comme précedemment -fopenmp à l’endroit désigné par la première photo. Si vous ne voulez compiler que des programmes avec OpenMP, vous pouvez mettre ces options en dures dans Settings -> Compiler and debugger (valable aussi pour GNU/Linux) avec la fenêtre suivante.

Fenêtre Code::Blocks (Settings -> Compiler and debugger)

Fenêtre Code::Blocks (Settings -> Compiler and debugger)

Ensuite, on indique où se situe la DLL gomp1.dll. Comme sur l’image ci-dessous ou comme sur la seconde image du billet.

Fenêtre Code::Blocks (Settings -> Compiler and debugger)

Fenêtre Code::Blocks (Settings -> Compiler and debugger)

Chez moi l’adresse de la DLL est : C:\\Program Files\\CodeBlocks\\MinGW\\bin\\libgomp-1.dll

Plus qu’à compiler et voir l’affichage pas terrible obtenu.

Bonne compilation.


Vus : 2468
Publié par Boutor : 56