Skip to content

Utiliser OpenMP avec Code::Blocks sous Windows

7 novembre 2015

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.

Le lanceur TDM-GCC

Le lanceur TDM-GCC

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\

Emplacement de création du TDM-GCC

Emplacement de création du TDM-GCC

Il faut ne pas oublier de cocher que l’on veut installer OpenMP.

TDM settings

TDM settings

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).

Compiler settings

Compiler settings

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.

Compiler Other options

Compiler 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.

Linked libraries

Linked libraries

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).

Advertisements
4 commentaires leave one →
  1. Malheig permalink
    30 janvier 2017 23 h 40 mi

    Salut et merci beaucoup pour ton petit tuto!
    Est-ce que tu saurais quelles modifs faire pour faire marcher un programme écrit en C au lieu de C++? Sur le site de TDM-gcc ils disent que leur programme fonctionne aussi avec le C mais j’y arrive pas sur CodeBlocks…
    Merci de ta réponse si t’as le temps de regarder le problème!

    • 1 février 2017 8 h 03 mi

      Normalement, c’est pareil en adaptant un peu les options de compilation.

    • 1 février 2017 8 h 04 mi

      Non pas propre.

  2. Malheig permalink
    1 février 2017 0 h 03 mi

    En fait le problème ne dépend pas du langage mais du nombre de bits de la machine. Sur ma machine 64 bits, il va toujours chercher les include 32 bits même en suivant pas à pas ton tutoriel. Je sais pas où il a gardé en mémoire le chemin des include ou s’il le déduit à partir de celui des executables de compilation. Je l’ai rajouté dans le path mais ça a rien changé. Du coup j’ai renommé le dossier include du 32 bits… pas très propre mais ça marche.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :