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_j
maxints < 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 ...
Quelle est l'erreur du compilateur? – BobbyShaftoe
La directive de barrière ne peut pas apparaître dans parallel pour construct (sur le compilateur IBM) – bcubed