Utiliser OpenMP avec Code::Blocks sous Windows
J’avais déjà fait en 2011 un article sur OpenMP et Code::Blocks (http://wp.me/pJPCq-6H).
Comme celui-ci a toujours du succès et qu’il est franchement daté, je le remets au goût du jour.
Je vous laisse installer Code::Blocks. Quelque soit la version choisie, le MinGW intégré ne supporte pas OpenMP.
Vous allez dans le répertoire C:\\Program Files (x86)\\CodeBlocks et changer le répertoire MinGW en MinGW_old, pour revenir en arrière en cas de besoin.
Vous allez chercher le MinGW de TDM disponible ici : http://tdm-gcc.tdragon.net/download.
Vous lancez l’application et choisissez CREATE.
Choisissez le 32 ou le 64 bits.
On veut que le TDM-gcc vienne remplacer l’ancien wingw, on remplit la destination comme suit : C:\\Program Files (x86)\\CodeBlocks\\MinGW\\
Il faut ne pas oublier de cocher que l’on veut installer OpenMP.
On finit l’installation de TDM-gcc.
On lance code::blocks. Il faut ensuite aller changer les noms des exécutables pour la compilation : Settings -> Compiler.
Et aller dans l’onglet (image ci-dessous) : Global compiler settings, et sous onglet toolchain executables.
Entrez les exécutables correspondant au TDM installé (varie selon 32 ou 64 bits).
Tout est ok pour la partie installation de TDM-gcc.
Je vous propose d’aller tester l’installation réalisée.
Je vous laisse créer un projet OMPTest et de mettre le code suivant dans main.cpp.
#include <iostream> #include <omp.h> #include <ctime> using namespace std; void simple(int n, double *a, double *b) { int i; #pragma omp parallel for for(int j = 0; j < 3300; j++) { for (i=1; i<n; i++) b[i] = (a[i] - a[i-1]) / 2.0; } } int main() { cout << "Hello world!" << endl; int n = 1000000; double *a, *b; time_t tbegin,tend, texec; tbegin=time(NULL); a = new double[n]; b = new double[n]; #pragma omp parallel for for (int i=0; i<n; i++) { a[i] = i * 10.0; b[i] = 0.0; } for (int i=n-10; i<n; i++) cout << b[i] << endl; cout << endl; simple(n, a, b); for (int i=n-10; i<n; i++) cout << b[i] << endl; cout << endl; tend=time(NULL); texec=difftime(tend,tbegin); std::cout << "Execution time : " << texec ; cout << " The end "<< endl; return 0; }
Je l’exécute sans OpenMP, il dure 12 secondes.
Pour activer OpenMP, on va dans Project -> build options et on ajoute -fopenmp dans Compiler Settings, onglet Other options.
On va ensuite dans l’onglet Linker Settings, où on ajoute la librairie : C:\\Program Files (x86)\\CodeBlocks\\MinGW\\lib\\gcc\\x86_64-w64-mingw32\\5.1.0\\libgomp.a. Il faut probablement adapter le lien.
On peut lancer la compilation. Si vous faîtes le test avec le gestionnaire de tâches, vous voyez que les 4 processeurs tournent en parallèle. Le code est très mauvais puisque la version parallèle est plus lente que la version scalaire (54 secondes).