J'ai le code suivant:Pourquoi openMP se bloque-t-il sur une barrière dans un cycle de temps?
int working_threads=1;
#pragma omp parallel
{
int my_num=omp_get_thread_num()+1;
int idle=false;
while(working_threads>0) {
if(my_num==1)
working_threads=0;
#pragma omp barrier
}
}
Si je le lance, chaque maintenant et puis se bloque sur la barrière. Plus il y a de threads, plus il est probable que cela arrive. J'ai essayé de le déboguer avec printf et il semble que parfois tous les threads ne sont pas exécutés et donc la barrière les attend pour toujours. Cela arrive dans la première itération, le second n'est évidemment jamais exécuté.
Est-ce un morceau de code invalide? Si oui, comment puis-je le changer? J'ai besoin de courir une boucle while en parallèle. On ne sait pas combien de boucles seront exécutées avant, mais il est garanti que tous les threads auront le même nombre d'itérations.
_ "... il est garanti que tous les threads auront le même nombre d'itérations" _ - est-ce une propriété intrinsèque de la boucle ou est-ce réalisé en utilisant une variable partagée comme dans le cas démontré? Si le premier, rend simplement la variable conditionnelle privée. –
Ce dernier, il est fait en testant contre une variable partagée. C'est aussi la raison de l'état de la course. – knezi