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