Comportamento di omp_get_max_threads nelle regioni parallele
Domanda
compilo questo pezzo di codice su Snow Leopard e Linux e ottengo risultati diversi. Il Leopardo delle nevi, la prima chiamata di omp_get_max_threads restituisce 2, che è il mio numero di core, mentre il secondo torna 1. Su Linux, entrambe le chiamate di ritorno 4, che è il mio numero di core. Penso che Linux ha il comportamento corretto, ho ragione? Sono sia corretta e non mi resta che un malinteso di questa funzione?
#include <stdio.h>
#include <omp.h>
int main() {
printf(" In a serial region; max threads are : %d\n", omp_get_max_threads());
#pragma omp parallel
{
#pragma omp master
printf(" In a parallel region; max threads are : %d\n", omp_get_max_threads());
}
}
uscita Mac:
In a serial region; max threads are : 2
In a parallel region; max threads are : 1
uscita Linux:
In a serial region; max threads are : 4
In a parallel region; max threads are : 4
Soluzione
Questa chiamata è ben specificato nelle specifiche OpenMP. Linux ha il comportamento corretto qui. con questo detto, ci si trova in una regione principale che è effettivamente seriale e FHE il filo principale, quindi la num thread chiamano è spiegabile. se si arent legato al puro c io vi incoraggio a guardare la libreria C ++ TBB e in particolare il ppl sottoinsieme, troverete più generalità e la componibilità, come per il parallelismo annidato. Sono su MyPhone quindi mi scuso per errori di battitura qui.
Altri suggerimenti
Con Apple fornito gcc 4.2 [versione di gcc 4.2.1 (Apple Inc. costruire 5566)] su Leopard, ottengo gli stessi risultati, come si (tranne che il mio MacBook hanno un minor numero di core).
In a serial region; max threads are : 2
In a parallel region; max threads are : 1
Lo stesso vale per 4.3.4 da MacPorts.
Tuttavia, con gcc 4.4.2 e 4.5.0 20.091.231 (sperimentale) da MacPorts, sullo stesso computer ottengo:
In a serial region; max threads are : 2
In a parallel region; max threads are : 2
Sembra che questo non è un Mac rispetto a Linux problema, ma a causa della versione gcc.
P.S. OpenMP può fare il parallelismo annidato.
Solo un promemoria, c'è un forum dedicato solo per OpenMP, e leggere dagli sviluppatori di OpenMP, nonché esperti OpenMP tutto il mondo. E 'finita sul sito ufficiale OpenMP: http://openmp.org/forum
Ottimo posto per porre domande come questa, e di trovare un sacco di altre risorse a openmp.org
Strano. Ho sempre trovato il comportamento previsto (utilizzando 4.2.1, costruisco 5646 punti 1) con OS X 10.6.2:
Sul mio Mac Pro
In a serial region; max threads are : 8
In a parallel region; max threads are : 8
e sul mio iMac
In a serial region; max threads are : 2
In a parallel region; max threads are : 2
Deve essere qualcos'altro qui. La compilazione con solo?
gcc fname.c -fopenmp