Définir le nombre de threads à l'aide de omp_set_num_threads() à 2, mais omp_get_num_threads() renvoie 1
J'ai la suite de code C/C++ en utilisant OpenMP:
int nProcessors=omp_get_max_threads();
if(argv[4]!=NULL){
printf("argv[4]: %s\n",argv[4]);
nProcessors=atoi(argv[4]);
printf("nProcessors: %d\n",nProcessors);
}
omp_set_num_threads(nProcessors);
printf("omp_get_num_threads(): %d\n",omp_get_num_threads());
exit(0);
Comme vous pouvez le voir, je suis en train de définir le nombre de processeurs à utiliser basée sur un argument transmis sur la ligne de commande.
Cependant, j'obtiens le résultat suivant:
argv[4]: 2 //OK
nProcessors: 2 //OK
omp_get_num_threads(): 1 //WTF?!
Pourquoi n'est-ce pas omp_get_num_threads()
retour 2?!!!
Comme cela a été souligné, je vais appeler omp_get_num_threads()
dans une série de région, d'où la fonction renvoie 1
.
Cependant, j'ai le texte suivant du code en parallèle:
#pragma omp parallel for private(i,j,tid,_hash) firstprivate(firstTime) reduction(+:nChunksDetected)
for(i=0;i<fileLen-CHUNKSIZE;i++){
tid=omp_get_thread_num();
printf("%d\n",tid);
int nThreads=omp_get_num_threads();
printf("%d\n",nThreads);
...
sorties:
0 //tid
1 //nThreads - this should be 2!
0
1
0
1
0
1
...
- Faites-vous appel à ce à partir d'une série qui fait partie de votre programme? Si oui, le nombre de threads est en fait 1.
- Il stephan - merci beaucoup pour le comprendre. J'ai édité l'OP avec une autre question connexe.
- Si vous utilisez Intel IPP bibliothèques avec OpenMP activé, j'ai vu des cas dans lesquels ils entrent en collision...
- C'est intéressant. Je suis à l'aide d'Intel fil blocs de construction...
Vous devez vous connecter pour publier un commentaire.
La
omp_get_num_threads()
appel retourne 1 dans la série section de code. Voir LienSi vous avez besoin d'avoir de code parallèle pour obtenir la valeur correcte, voici comment votre code devrait ressembler à:
Ce code produit:
2
Il semble que vous avez ouvert mp pas activé ou votre boucle n'est pas dans la forme qui peut être parallized par openmp
vous utilisez la mauvaise fonction. utilisation
omp_get_max_threads
pour vérifier le nombre maximum de threads.Il a été déjà souligné que
omp_get_num_threads()
retourne1
dans les sections séquentielles du code. En conséquence, même si le réglage, paromp_set_num_threads()
, un nombre de threads de plus de1
, tout appel àomp_get_num_threads()
sera de retour1
, à moins que nous sommes dans une section parallèle. L'exemple ci-dessous tente de clarifier ce point