Soy nuevo aquí y soy un programador de nivel principiante en C. Estoy teniendo algún problema con el uso de openmp para acelerar el for-loop. A continuación se muestra un ejemplo simple:OpenMP y C parallel for loop: ¿por qué mi código se ralentiza cuando se usa 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);
}
}
El código se basa en una distribución aleatoria gamma para M iteraciones. Resulta que el enfoque paralelo con openmp (opción 1) toma alrededor de 1 minuto, mientras que el enfoque secuencial (opción 2) toma solo 20 segundos. Mientras corro con openmp, puedo ver que el uso de la CPU es de 800% (el servidor que estoy usando tiene 8 CPU). Y el sistema es Linux con GCC 4.1.3. El comando de compilación que estoy usando es gcc -fopenmp -lgsl -lgslcblas -lm (estoy usando GSL)
¿Estoy haciendo algo mal? ¡Por favor, ayúdame! ¡Gracias!
P.S. Como señalaron algunos usuarios, podría ser causado por rng. Pero incluso si reemplazo
tmp=gsl_ran_gamma_mt(rng, 4, 1./3);
por decir
tmp=1000*10000;
el problema sigue ahí ...
No debe hacer que su variable de bucle sea privada, OpenMP se encargará de eso. No sé si esto afecta la ejecución, pero debería arreglarlo y volver a probar. –
Además, tenga en cuenta que tmp = 1000 * 10000 probablemente se optimice por el compilador a un noop, por lo que se sesgará el tiempo. –
¿Estás seguro de que en realidad hay 8 CPU? ¿Podría ser un quad-core con hyperthreading? –