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!
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
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