Définir le nombre de threads en utilisant omp définir num threads() à 2, mais omp get num threads () renvoie 1
j'ai le code c/" class="blnk">C / C++ suivant en utilisant OpenMP:
int nProcessors=omp_get_max_threads();
if(argv[4]!=NULL){
printf("argv[4]: %sn",argv[4]);
nProcessors=atoi(argv[4]);
printf("nProcessors: %dn",nProcessors);
}
omp_set_num_threads(nProcessors);
printf("omp_get_num_threads(): %dn",omp_get_num_threads());
exit(0);
comme vous pouvez le voir, j'essaye de définir le nombre de processeurs à utiliser basé sur un argument passé 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 région série, donc la fonction retourne 1
.
cependant, j'ai le code parallèle suivant:
#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("%dn",tid);
int nThreads=omp_get_num_threads();
printf("%dn",nThreads);
...
les résultats:
0 //tid
1 //nThreads - this should be 2!
0
1
0
1
0
1
...
3 réponses
omp_get_num_threads()
call retourne 1 dans la section serial du code. Voir Lien
vous devez donc avoir du code parallèle pour obtenir la valeur correcte, voici à quoi votre code devrait ressembler:
#include <iostream>
#include <omp.h>
int main (int argc, const char * argv[])
{
int nProcessors = omp_get_max_threads();
std::cout<<nProcessors<<std::endl;
omp_set_num_threads(nProcessors);
std::cout<<omp_get_num_threads()<<std::endl;
#pragma omp parallel for
for(int i = 0; i < 5; i++){
int tid = omp_get_thread_num();
std::cout<<tid<<"\t tid"<<std::endl;
int nThreads = omp_get_num_threads();
std::cout<<nThreads<<"\t nThreads"<<std::endl;
}
exit(0);
}
Ce code produit:
2
1
0 tid
2 nThreads
0 tid
2 nThreads
0 tid
2 nThreads
1 tid
2 nThreads
1 tid
2 nThreads
il semble que vous avez soit open mp non activé ou votre boucle n'est pas dans la forme qui peut être paralysée par openmp
vous utilisez la mauvaise fonction. utilisez omp_get_max_threads
à vérifier le nombre maximum de threads.
il a déjà été souligné que omp_get_num_threads()
retourne 1
dans les sections séquentielles du code. En conséquence, même si le réglage, par omp_set_num_threads()
, un nombre total de threads supérieur à 1
, tout appel à omp_get_num_threads()
retour
#include <stdio.h>
#include <omp.h>
int main() {
const int maxNumThreads = omp_get_max_threads();
printf("Maximum number of threads for this machine: %i\n", maxNumThreads);
printf("Not yet started a parallel Section: the number of threads is %i\n", omp_get_num_threads());
printf("Setting the maximum number of threads...\n");
omp_set_num_threads(maxNumThreads);
printf("Once again, not yet started a parallel Section: the number of threads is still %i\n", omp_get_num_threads());
printf("Starting a parallel Section...\n");
#pragma omp parallel for
for (int i = 0; i < maxNumThreads; i++) {
int tid = omp_get_thread_num();
printf("This is thread %i announcing that the number of launched threads is %i\n", tid, omp_get_num_threads());
}
}