2009-12-24 7 views
2

J'essaie d'implémenter le problème de listranking (connu aussi par raccourci) avec omp pour avoir les préfixes sums du tableau W. sais pas si je l'utilise correctement le pragma flush .. et j'ai un avertissement lors de la compilation « zone barrière ne peut pas être étroitement imbriquées à l'intérieur du partage du travail, critique, ordonné, maître ou d'une région de tâche explicite »comment utiliser omp barrier sur une boucle while sans nombre égal d'itérations pour les threads

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <omp.h> 

main(int argc, char *argv[]) 
{ 
    int Q[9]={1,2,3,4,5,6,7,8,0}; 
    int W[8]={1,2,3,4,5,6,7,8}; 
    int i,j=6,id; 

    printf("Before:\n"); 
    for(j=0;j<8;j++) 
    printf("%d",W[j]); 
    printf("\n"); 
    #pragma omp parallel for shared(Q,W) private(id) num_threads(7) 
    for (i=6; i>=0; i--) 
    { 
    id= omp_get_thread_num(); 
    while((Q[i] !=0)&& (Q[Q[i]] !=0)) 
    { 
     #pragma omp flush(W) 

     W[i]=W[i]+W[Q[i]]; 

     #pragma omp flush(W) 

     printf("Am %d \t W[%d]= %d",id,i,W[i]); 

    #pragma omp barrier  
    #pragma omp flush(Q) 
    Q[i]=Q[Q[i]]; 
    #pragma omp flush(Q) 
    printf("Am %d \n Q[%d]= %d",id,i,Q[i]); 
    }; 
} 
    printf("Result:\n"); 
    for(j=0; j<8; j++) 
    printf("%d \t",W[j]); 
    printf("\n"); 

}

PLEAAAAAAAAAAAASE AIDE!

Répondre

4

Vous ne pouvez pas utiliser de barrière à l'intérieur d'un parallèle omp, vous pouvez pratiquement uniquement utiliser une barrière dans une région parallèle omp. La raison de ceci est que si votre boucle est de 1 à N, une barrière à l'intérieur va effectivement créer N threads qui auront un impact de perf négatif si N est grand.

Je n'ai pas recherché l'algorithme ici, mais deux choix raisonnables sont de refactoriser pour utiliser 2 parallèle pour les boucles l'une après l'autre où la barrière est, ou pour refactoriser votre algorithme pour utiliser une région parallèle #pragma. J'ai recherché l'algorithme de classement de la liste, vous serez bien servi pour trouver une implémentation de la somme ou du scan du préfixe si vous devez utiliser openmp.

-Rick

+0

Merci Rick j'ai remarqué qu'il n'est pas nécessaire d'utiliser une barrière dans la boucle. J'ai mis #pragma omp flush (Q) et #pragma omp flush (W) après avoir modifié les valeurs de Q [i] et W [i] mais j'ai toujours un problème là quand un autre thread fait un flush avant que l'autre ne change son Q [i] valeur. – maya

+0

maya Si vous êtes sur Windows, jetez un oeil à la bibliothèque de modèles parallèles dans VS2010, nous avons implémenté le scan de préfixe comme exemple sur code.msdn.com/concrtextras. Si vous n'êtes pas sur Windows, les blocs de construction de threads d'Intel ont une analyse implémentée. Vous pouvez également regarder l'exemple et remplacer parallel_for par un openmp for. – Rick

Questions connexes