Sono nuovo qui e un programmatore di livello principianti in C. Sto avendo qualche problema con l'utilizzo di openmp per accelerare il ciclo. Di seguito è riportato un semplice esempio:OpenMP e C paralleli per ciclo: perché il mio codice rallenta quando si utilizza OpenMP?
#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <omp.h>
gsl_rng *rng;
main()
{
int i, M=100000000;
double tmp;
/* initialize RNG */
gsl_rng_env_setup();
rng = gsl_rng_alloc (gsl_rng_taus);
gsl_rng_set (rng,(unsigned long int)791526599);
// option 1: parallel
#pragma omp parallel for default(shared) private(i, tmp) schedule(dynamic)
for(i=0;i<=M-1;i++){
tmp=gsl_ran_gamma_mt(rng, 4, 1./3);
}
// option 2: sequential
for(i=0;i<=M-1;i++){
tmp=gsl_ran_gamma_mt(rng, 4, 1./3);
}
}
Il codice deriva da una distribuzione gamma casuale per M iterazioni. Si scopre che l'approccio parallelo con openmp (opzione 1) richiede circa 1 minuto mentre l'approccio sequenziale (opzione 2) richiede solo 20 secondi. Durante l'esecuzione con openmp, posso vedere l'utilizzo della CPU è 800% (il server che sto usando ha 8 CPU). E il sistema è Linux con GCC 4.1.3. Il comando di compilazione che sto usando è gcc -fopenmp -lgsl -lgslcblas -lm (sto usando GSL)
Sto facendo qualcosa di sbagliato? Mi aiuti per favore! Grazie!
P.S. Come sottolineato da alcuni utenti, potrebbe essere causato da rng. Ma anche se sostituisco
tmp=gsl_ran_gamma_mt(rng, 4, 1./3);
da dire
tmp=1000*10000;
il problema ancora lì ...
Non si dovrebbe rendere privata la variabile del ciclo - OpenMP si prenderà cura di ciò. Non so se questo influisce sull'esecuzione, ma dovresti correggerlo e ripetere il test. –
Inoltre, nota che tmp = 1000 * 10000 probabilmente viene ottimizzato dal compilatore a un noop, in modo tale da distorcere i tempi. –
Sei sicuro che ci siano effettivamente 8 CPU? Potrebbe essere un quad-core con hyperthreading? –