2011-12-01 21 views
7

sto lavorando con OpenMP per parallelizzare uno scalare nidificato ciclo for:Come parallelizzare correttamente un cicli for innestati

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; 
} 

In questo ciclo la cosa importante è che matrice P deve essere la stessa in entrambi i scalare versioni parallele:

tutti i miei eventuali prove non ci sono riusciti ...

risposta

13

Il problema qui è che avete aggiunto dipendenze iterazione-to-iterazione con:

x+=1; 
y+=1; 

Pertanto, poiché il codice è valido al momento, non è parallelizzabile. Il tentativo di farlo risulterà in risultati errati. (Come probabilmente stai vedendo)

Fortunatamente, nel tuo caso, è possibile calcolare direttamente senza l'introduzione di questa dipendenza:

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

Ora si può provare a lanciare un OpenMP pragma su questo e vedere se funziona:

#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, grazie per le risposte. Posso farti un'altra domanda? Cosa succede se voglio resettare ogni volta che y = 0 prima del ciclo interno? Come cambierebbe l'implementazione di openmp? – linello

+0

Quindi cambia '(doppio) N * i + j' a' (doppio) j'. La chiave qui è che ho derivato le espressioni per 'x' e' y' come una funzione degli indici del ciclo. Questo ti permette di rompere le dipendenze. – Mysticial

+0

Mille grazie alle vostre risposte, mi hanno chiarito come districare i loop per prepararli alla parallelizzazione di OpenMP. Un'ultima domanda, perché le versioni seriali e parallele di questo codice mi forniscono una porzione molto piccola di elementi diversi? 'for (int i = 0; i linello

Problemi correlati