Thread OpenMP

Résolu/Fermé
JwTdd Messages postés 21 Date d'inscription vendredi 25 janvier 2013 Statut Membre Dernière intervention 7 mai 2015 - Modifié par JwTdd le 11/05/2013 à 16:54
JwTdd Messages postés 21 Date d'inscription vendredi 25 janvier 2013 Statut Membre Dernière intervention 7 mai 2015 - 11 mai 2013 à 17:51
Bonjour,

J'utilise OpenMP pour paralleliser une boucle for, ça semble fonctionner, en utilisant par exemple
#pragma omp parallel for
for(i=0, i<=1000, i++)
J'ais bien 4 Threads (mon OMP_NUM_THREADS est à 4 d'origine vue que j'ais un quad core) qui se créent avec une repartition des tâches (le thread 1 fait les i de 0 à 250, thread 2 fait de 250 à 500 etc)

Cependant lorsque j'execute ceci:
#include <iostream> 
#include <math.h> 

bool estpremier(unsigned long long xt) 
{ 
    unsigned long sqxt = sqrt(xt); 
    if ((xt==1)||(xt==0))return 0; 
    if (xt==2) return 1; 
        for (unsigned long long i=2; i<sqxt; i++) 
        { 
            if (xt%i == 0) return 0; 
        } 
        return 1; 
} 



int main() 
{ 
    unsigned long long nombre_de_premiers=0, nombre_de_non_premiers=0; 
    while (1) 
    { 
      nombre_de_premiers=0;
      nombre_de_non_premiers=0; 
    std::cout << "Test  210xN-107 jusqu'a N=100000" << std::endl; 
#pragma omp parallel for shared(nombre_de_premiers,nombre_de_non_premiers) 
    for (unsigned long long j=1; j<=100000;j++) 
    { 
        if (estpremier(210*j-107)) nombre_de_premiers++; 
        else nombre_de_non_premiers++; 
    } 
    std::cout << "nombre_de_premiers:" << nombre_de_premiers <<" nombre_de_non_premiers:"<< nombre_de_non_premiers  << std::endl; 
    } 
    return 0; 
} 

J'obtiens des resultats differents lorsque je repète la boucle, se qui est impossible (sur une même suite on devrais conserver le même nombre de nombres premiers). Evidemment lorsque je retire
 #pragma omp parallel for shared(nombre_de_premiers,nombre_de_non_premiers) 
le resultat est bon (le nombre reste le même), mais je perds le multithreading normal mais c'est genant vous avez du remarquer les int long long, j'ais mis des petits chiffres que pour l'exemple...

Donc je me demandais si c'est parcequ'il suffisait qu'un seul thread atteigne la condition du for pour terminer la boucle avant que les autres thread aient aussi terminé. Et dans se cas comment faire pour qu'ils continuent jusqu'a qu'ils ais tous terminé?
Les specifications d'OpenMP sont plutot complètes, d'habitude je me debrouille en anglais mais là je cale...
En esperant avoir quelques réponses, merci d'avoir pris le temps de lire.

1 réponse

JwTdd Messages postés 21 Date d'inscription vendredi 25 janvier 2013 Statut Membre Dernière intervention 7 mai 2015 2
Modifié par JwTdd le 11/05/2013 à 18:08
C'est bon c'est resolu... il fallait que j'indique qu'il faille ecrire dans une variable partagé par un thread a la fois à la fois avec:
#pragma omp parallel for shared(nombre_de_premiers,nombre_de_non_premiers)   
    for (j=1; j<=100000;j++)   
    {   
        if (estpremier(210*j-107))   
        {   
#pragma omp critical   
        nombre_de_premiers++;   
        }   

        else   
        {   
#pragma omp critical   
        nombre_de_non_premiers++;   
        }   
    }
0