2010-01-21 8 views
7

Acabo de empezar a aprender cómo usar OpenMP. Estoy tratando de descubrir por qué el siguiente código no se ejecuta en paralelo con Visual Studio 2008. Se compila y funciona bien. Sin embargo, utiliza solo un núcleo en mi máquina de cuatro núcleos. Esto es parte del código que intento portar a una función mex MATLAB. Cualquier puntero es apreciado.Intentando saber por qué el código de OpenMP no se hace paralelo a

#pragma omp parallel for default(shared) private(dz, t, v, ts_count) reduction(+: sum_v) 
for(t = 0; t<T; t++) 
{ 
    dz = aRNG->randn(); 
    v += mrdt* (tv - v) + 
     vv_v_sqrt_dt * dz + 
     vv_vv_v_dt*(dz*dz - 1.); 

    sum_v += v; 
    if(t == ts_count-1) 
    { 
     int_v->at_w(k++) = sum_v/(double)(t+1); 
     ts_count += ts; 
    } 
} 

Respuesta

4

La variable v se calcula utilizando el valor v de la iteración anterior

for(t = 0; t<T; t++) { 
    ... 
    v += ... (tv - v) .... 
    ... 
    } 

No se puede hacer eso, se rompe el paralelismo. El ciclo debe poder ejecutarse en cualquier secuencia, o con diferentes fragmentos paralelos a la vez, sin efectos secundarios. Desde el primer vistazo, no parece que se pueda paralelizar este tipo de ciclo.

+0

También debe considerar su se de un generador de números aleatorios dentro del ciclo. Dependiendo de su implementación, esto puede bloquearse en un recurso compartido, serializando efectivamente su código después si aborda el problema anterior. –

0

No estoy muy seguro, que ha sido un largo tiempo desde que utiliza OpenMP, pero usted tiene la variable de bucle t conjunto como privado. ¿Es eso lo que quieres? ¿No es esa la variable de paralelización?

0

Una posibilidad es que esté utilizando la variable "sum_v". Dado que está realizando una reducción, el tiempo de ejecución probablemente solo espera acumular valores allí y acceder a él "normalmente" solo después de que finalice el ciclo.

Cuestiones relacionadas