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

No comments yet

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 :