2012-11-27 4 views
1

J'ai du code qui ressemble à ceci:OpenMP multiples pour les boucles

for(i=0; i<max;i++){ 
    for(j=0; j<max2;j++) 
    //stuff 
} 

for(i=0; i<max;i++){ 
    for(j=0; j<max2;j++) 
    //other stuff 
} 

for(i=0; i<max;i++){ 
    for(j=0; j<max2;j++) 
    //final stuff 
} 

Je veux paralléliser cela en utilisant OpenMP. Quelle est la meilleure méthode? J'ai essayé de faire le #pragma omp parallel private(i) au début et #pragma omp for avant chaque boucle j. C'est ce que je veux dire:

#pragma omp parallel private(i) 
{ 
for(i=0; i<max;i++){ 
    #pragma omp for 
    for (j=0; j<max2;j++){ 
    //and so on and so forth 

Le fait est que cela ne me donne aucune amélioration de performance. Je suppose que c'est parce que les 3 for boucles ne sont pas exécutées en parallèle ... si je pouvais faire fonctionner ces 3 en même temps, je pense que je pourrais obtenir une augmentation de performance. Des idées? Merci!

+2

Voulez-vous dire que les trois boucles ne sont pas des données dépendantes les unes des autres afin qu'ils puissent fonctionner en parallèle ou voulez-vous distribuer chaque boucle entre les fils dans l'équipe OpenMP? –

+0

Oui, les trois boucles ne sont pas dépendantes les unes des autres, donc je veux qu'elles fonctionnent en parallèle – pauliwago

+0

Pourquoi parallélisez-vous la boucle interne? Pour la parallélisation, il est généralement avantageux de donner à chaque thread un gros morceau de données, donc à moins que les itérations de la boucle externe ne dépendent l'une de l'autre (donc la boucle sur i doit être exécutée dans l'ordre) sens de paralléliser la boucle interne au lieu de l'externe. – Grizzly

Répondre

2

Une solution rapide est de faire une section parallèle et itérative ceci:

#pragma omp for 
for (k=0;k<3;k++){ 
    if (k==0) do_stuff(); 
    if (k==1) do_other_stuff(); 
    if (k==2) do_final_stuff(); 
} 

Une meilleure solution est d'utiliser omp sections directive. (Solution prise de here)

#pragma omp parallel sections 
{ 
    #pragma omp section 
    { 
    /* Executes in thread 1 */ 
    do_stuff(); 
    } 
    #pragma omp section 
    { 
    /* Executes in thread 2 */ 
    do_other_stuff(); 
    } 
    #pragma omp section 
    { 
    /* Executes in thread 3 */ 
    do_final_stuff(); 
    } 
} 
+0

Je donne rarement -1 à des réponses sur SO et je m'abstiendrai de le faire dans votre cas aussi si vous vous familiarisez avec la construction OpenMP 'sections' et modifiez votre réponse en conséquence. –

+0

Désolé, je ne connaissais pas '' omp sections'. – banuj

+0

Maintenant vous savez - mission accomplie! :) –