Thread OpenMP
Résolu
JwTdd
Messages postés
21
Date d'inscription
Statut
Membre
Dernière intervention
-
JwTdd Messages postés 21 Date d'inscription Statut Membre Dernière intervention -
JwTdd Messages postés 21 Date d'inscription Statut Membre Dernière intervention -
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:
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
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.
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.
A voir également:
- Thread OpenMP
- Compte thread - Accueil - Réseaux sociaux
- Thread instagram c'est quoi - Accueil - Guide réseaux sociaux
- Fausse appli Threads : déjà une imitation frelatée et dangereuse ! - Accueil - Guide arnaque
- Thread instagram - Guide
- C'est quoi thread instagram - Accueil - Instagram
1 réponse
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++; } }