私は2つの同様のコードを持っています。OpenMPの静的スケジュールと動的スケジュールの相違点
まず
#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++;
}
第
#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++;
}
唯一の違いは、最初の行です。最初のコードは正常に動作しますが、2番目のコードはクラッシュします。どうして?
問題はactualNumberOfChromosomes
のどこかにありますが、これを解決するだけではなく、理由を理解したいと思います。私はこれを解決変数p
を作成し、それにactualNumberOfChromosomes
を割り当てて、i
がp
に等しくなるようにループを変更することで解決できました。
2番目のプログラムがクラッシュする理由を詳しく説明できますか?ポインタgが壊れていますか?そして、それが墜落したとき?あなたはiの値をprintfすることができます。この問題を理解するにはもっと情報が必要です。各反復と各スレッドに対していくつかの変数を出力することができます。 – minjang