OpenMp détectant le nombre de threads suivant le parallélisme nested avant la région parallèle

Comment détecter le nombre de threads dans OpenMp avant le démarrage de la région parallèle? Si j’utilise un parallélisme nested, la variable d’environnement OMP_NUM_THREADS ressemble à 4,64 .

 get_nested_num_threads(); #pragma omp parallel { // starting 4 threads #pragma omp parallel { // starting 64 threads for each of the 4 } } 

Cette réponse me conduit à implémenter OMP_NUM_THREADS avec le code suivant:

 #include  #include  int get_nested_num_threads(){ char delimiter[] = ","; char *ptr = NULL; char *num_threads = NULL; num_threads = getenv("OMP_NUM_THREADS"); int threads=1, nested=0; ptr = strtok(num_threads, delimiter); while ( ptr != NULL ){ threads *= atoi(ptr); ptr = strtok(NULL,delimiter); nested += 1; } assert( nested <= 2 ); return threads; } 

Malheureusement, si j’appelle getenv("OMP_NUM_THREADS") je remarque un parallélisme nested de 4,4 au lieu de 4,64 . Ce qui est vraiment étrange pour moi. Avez-vous une explication à cela?

Je l’ai résolu en ouvrant une région parallèle nestede pour interroger tous les threads:

 int get_nested_num_threads(){ int threads=1; #pragma omp parallel shared(threads) { #pragma omp single { threads = omp_get_num_threads(); #pragma omp parallel shared(threads) { #pragma omp single { threads *= omp_get_num_threads(); } } } } return threads; } 

Pour autant que je sache, vous n’avez pas besoin d’utiliser firstprivate et lastprivate en C dans ce cas. Mais vous devez le faire à Fortran.