Différence entre statique et dynamique dans le calendrier d'OpenMP en C
J'en ai deux codes similaires.
Première
#pragma omp parallel for shared(g) private(i) schedule(dynamic, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
AddCrossoverChromosome(g, i); //it doesnt change actualNumberOfChromosomes
#pragma omp atomic
(*g).actualNumberOfChromosomes++;
}
Deuxième
#pragma omp parallel for shared(g) private(i) schedule(static, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
AddCrossoverChromosome(g, i); //it doesnt change actualNumberOfChromosomes
#pragma omp atomic
(*g).actualNumberOfChromosomes++;
}
La seule différence est dans la première ligne. Premier code fonctionne très bien, mais la seconde se bloque. Pourquoi?
Problème est quelque part dans actualNumberOfChromosomes
, mais je voudrais comprendre pourquoi, et pas seulement les résoudre. J'ai pu résoudre ce problème en créant plus variable p
et l'attribution actualNumberOfChromosomes
et la modification de la boucle, de sorte que i
était égale à p
.
Pourriez vous détailler pourquoi le deuxième programme se bloque? A l'aide du pointeur, g, été corrompu? Et, quand il s'est écrasé? Vous pourriez printf la valeur de i. J'ai besoin de plus d'informations pour comprendre ce problème. Vous pouvez imprimer certaines variables pour chaque itération et pour chaque thread.
OriginalL'auteur Tomek Tarczynski | 2010-11-23
Vous devez vous connecter pour publier un commentaire.
Le problème est que ce code n'est pas OpenMP conformes et non-conformes programmes "non spécifié" de comportement. Si vous regardez la OpenMP API V3.0 spec, section 2.5.1 Boucle de Construire, sous la description d'états:
La grande différence entre un type de planification de la statique et de la dynamique, c'est que de l'électricité statique, les morceaux peuvent être un peu calculé et prévu des filets lors de la compilation, tandis que de la dynamique, il est fait au cours de l'exécution (nécessitant plus de verrouillage).
OriginalL'auteur ejd
La différence entre
static
type de planification etdynamic
type de planification, c'est qu'avecstatic
les morceaux peuvent être pré-calculées ainsi que la décidé de la manière prévue aux discussions lors de la compilation elle-même, alors qu'avecdynamic
la même chose est faite au cours de l'exécution.Avec l'utilisation de
dynamic
, il implique des mécanismes complexes comme le blocage d'un mécanisme de gestion, de la manutention de la charge, etc.Vous pouvez obtenir un peu plus d'info sur: http://openmp.blogspot.com.
OriginalL'auteur anshu