2011-12-01 31 views
7

que estoy trabajando con OpenMP para paralelizar un escalar anidado bucle for:Cómo paralelizar correctamente un bucles for anidados

double P[N][N]; 
double x=0.0,y=0.0; 

for (int i=0; i<N; i++) 
{ 
    for (int j=0; j<N; j++) 
    { 
     P[i][j]=someLongFunction(x,y); 
     y+=1; 
    } 
    x+=1; 
} 

En este bucle, lo importante es que la matriz P debe ser la misma en ambos escalares y versiones paralelas:

todos mis posibles ensayos no tuvieron éxito ...

Respuesta

13

El problema aquí es que se ha añadido dependencias de iteración a iteración con:

x+=1; 
y+=1; 

Por lo tanto, como el código está parado ahora, no es paralelizable. Intentar hacerlo dará como resultado resultados incorrectos. (Como es probable que esté viendo)

Afortunadamente, en su caso, se puede calcular directamente sin la introducción de esta dependencia:

for (int i=0; i<N; i++) 
{ 
    for (int j=0; j<N; j++) 
    { 
     P[i][j]=someLongFunction((double)i, (double)N*i + j); 
    } 
} 

Ahora usted puede intentar tirar un pragma OpenMP sobre esto y ver si funciona:

#pragma omp parallel for 
for (int i=0; i<N; i++) 
{ 
    for (int j=0; j<N; j++) 
    { 
     P[i][j]=someLongFunction((double)i, (double)N*i + j); 
    } 
} 
+0

Ok gracias por las respuestas. ¿Puedo hacerte otra pregunta? ¿Qué sucede si quiero restablecer cada vez y = 0 antes del ciclo interno? ¿Cómo cambiaría la implementación de openmp? – linello

+0

Luego cambie '(doble) N * i + j' a' (doble) j'. La clave aquí es que derivé las expresiones para 'x' y' y' como una función de los índices de bucle. Esto le permite romper las dependencias. – Mysticial

+0

Muchas gracias a sus respuestas, me aclararon cómo desenredar los bucles para prepararlos para la paralelización OpenMP. Una última pregunta, ¿por qué las versiones en serie y paralelas de este código me dan una porción muy pequeña de diferentes elementos? 'for (int i = 0; i linello

Cuestiones relacionadas