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.