2012-05-16 25 views
7

Cuando intento el siguiente códigoprograma OpenMP es más lento que uno secuencial

double start = omp_get_wtime(); 

long i; 

#pragma omp parallel for 
    for (i = 0; i <= 1000000000; i++) { 
     double x = rand(); 
    } 

    double end = omp_get_wtime(); 

    printf("%f\n", end - start); 

El tiempo de ejecución es de 168 segundos, mientras que la versión secuencial pasa solamente 20 segundos.

Todavía soy un novato en programación paralela. ¿Cómo podría obtener una versión paralela que sea más rápida que la secuencia?

Respuesta

13

El generador de números aleatorios rand(3) utiliza variables de estado globales (ocultas en la implementación de (g) libc). El acceso a ellos desde múltiples subprocesos conduce a problemas de caché y tampoco es seguro para subprocesos. Se debe utilizar la llamada rand_r(3) con seed parámetro privado a la rosca:

long i; 
unsigned seed; 

#pragma omp parallel private(seed) 
{ 
    // Initialise the random number generator with different seed in each thread 
    // The following constants are chosen arbitrarily... use something more sensible 
    seed = 25234 + 17*omp_get_thread_num(); 
    #pragma omp for 
    for (i = 0; i <= 1000000000; i++) { 
     double x = rand_r(&seed); 
    } 
} 

Tenga en cuenta que esto producirá diferente secuencia de números aleatorios cuando se ejecuta en paralelo que cuando se ejecuta en serie. También recomendaría erand48(3) como una mejor fuente de número (pseudo) aleatorio.

+0

También se debe tener en cuenta que dado que 'double x = rand()' no modifica el estado externo, el compilador podría tener la tentación de optimizar el bucle en la versión secuencial. En general, debe probar con un código que no se puede optimizar. – Vanwaril

+2

@Vanwaril, 'rand()' no es intrínseco. El compilador no sabe si es una función pura o no (es _not_) y, por lo tanto, no debería optimizar la llamada. –

+0

Muchas gracias. Ahora la versión paralela gasta 5 segundos mientras que la secuencia pasa unos 9 segundos. –

Cuestiones relacionadas