OpenMP charge inégale sans boucle for

J’ai un code OpenMP qui ressemble à ce qui suit

while(counter < MAX) { #pragma omp parallel reduction(+:counter) { // do monte carlo stuff // if a certain condition is met, counter is incremented } } 

Par conséquent, l’idée est que la section parallèle soit exécutée par les threads disponibles tant que le compteur est inférieur à une certaine valeur. En fonction du scénario (je fais ici des trucs MC, c’est donc aléatoire), les calculs peuvent prendre plus de temps que d’autres, de sorte qu’il existe un déséquilibre entre les travailleurs ici qui devient apparent à cause de la barrière implicite à la fin du parallèle section.

Il semble que #pragma omp parallel for puisse avoir des moyens de contourner cela (c’est-à-dire directive maintenant / planification dynamic), mais je ne peux pas l’utiliser car je ne connais pas de numéro d’itération supérieur pour la boucle for.

Des idées / modèles de conception comment faire face à une telle situation?

Meilleures salutations!

Tout exécuter dans une seule section parallèle et accéder au counter atomique.

 int counter = 0; #pragma omp parallel while(1) { int local_counter; #pragma omp atomic read local_counter = counter; if (local_counter >= MAX) { break; } // do monte carlo stuff // if a certain condition is met, counter is incremented if (certain_condition) { #pragma omp atomic update counter++; } } 

Vous ne pouvez pas vérifier directement la condition while en raison de l’access atomique. Notez que ce code va dépasser, c’est-à-dire que le counter > MAX est possible après la section parallèle. Gardez à l’esprit que le counter est partagé et lu / mis à jour par plusieurs threads.