2012-11-13 9 views
20

Il seguente codice esegue solo il parallelismo dei primi cicli (esterni) o parallelizza l'intero ciclo annidato?Come OpenMP gestisce i cicli annidati?

#pragma omp parallel for 
    for (int i=0;i<N;i++) 
    { 
     for (int j=0;j<M;j++) 
     { 
     //do task(i,j)// 
     } 
    } 

voglio solo verificare se il precedente codice parallelizzare l'intero for innestati-loop (così un filo compito direttamente correlato (i, j)), oppure parallelizza solo l'esterno per-loop (così assicura che, per ogni filo parallelo con indice di ciclo i, il suo ciclo interno venga eseguito sequenzialmente in un singolo thread, che è molto importato).

risposta

27

Le righe che hai scritto saranno parallele solo al ciclo esterno. Per parallelizzare entrambi è necessario aggiungere una clausola collapse:

#pragma omp parallel for collapse(2) 
    for (int i=0;i<N;i++) 
    { 
     for (int j=0;j<M;j++) 
     { 
     //do task(i,j)// 
     } 
    } 

Si consiglia di verificare OpenMP 3.1 specifiche (SEC 2.5.1) per maggiori dettagli.

+1

Grazie, va benissimo, voglio solo parallelo i loop esterni, mentre assicurano che i loop interni facciano il loro lavoro in sequenza. – user0002128

4

OpenMP esegue solo il parallelismo del ciclo accanto al pragma. Puoi parallelizzare anche il ciclo interno se lo desideri, ma non verrà eseguito automaticamente.