2010-10-17 28 views
3

J'écris un programme OpenMP en C. J'ai ce tableau partagé "données" qui est en cours de mise à jour par tous les threads. Je veux m'assurer que chaque thread a terminé la partie lecture et stocké la valeur dans temp avant la prochaine instruction data [j] = temp est exécutée.éviter course dans OpenMP (dans une boucle parallèle)

J'ai essayé de mettre #pragma omp barrier entre les deux instructions mais le compilateur génère une erreur. S'il vous plaît aider.

#pragma omp parallel for shared(data) 

for (j = 0; j < numints; j++){ 

    if (j >= max_j) 

    { 

       temp = data[j] + data[j - max_j]; 
      data[j] = temp; 
    } 

} 
+0

Quelle est l'erreur du compilateur? – BobbyShaftoe

+0

La directive de barrière ne peut pas apparaître dans parallel pour construct (sur le compilateur IBM) – bcubed

Répondre

2

Comme vous l'avez vu, barrier ne fonctionnera pas; critical est plutôt lourd pour cette opération particulière. Atomic est plus léger que critique; vous pouvez toujours faire

if (j >= max_j) 
{ 
    #pragma omp atomic 
    data[j] += data[j-max_j]; 
} 

mais vous devriez toujours se méfier d'avoir une telle construction (atomique, critique) dans une boucle - il tue la performance, car il tue le parallélisme (qui est, après tout, leur but entier). Il serait utile de savoir ce que vous essayez d'accomplir avec ce bit de code, car même une fois que les courses de données dans les mises à jour sont éliminées, le résultat final dans (par exemple) les données [maxints-1] dépendra de quelles données de commande [maxints-1-max_j], data [maxints-1-2 * max_j] .. ont été mises à jour, ce qui n'est explicitement pas garanti par OpenMPs parallel for. (Vous pouvez utiliser la construction ordonnée, mais c'est à peine mieux que de ne pas utiliser de parallèle du tout). Si maxints < 2*max_jmaxints < 2*max_j, alors c'est facile vous pouvez juste faire

#pragma omp parallel for shared(data) 
for (j = max_j; j < numints; j++){ 
    data[j] += data[j-max_j]; 
} 

et vous n'avez pas besoin de synchronisation du tout, parce que chaque fil est mise à jour seulement une donnée [j] et ne dépendent d'autres. Mais j'ai l'impression (a) que ce n'est pas le cas, et (b) ceci est un extrait d'un gros morceau de code ...