我有兩個類似的代碼。OpenMP中的靜態和動態調度之間的區別C
首先
#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++;
}
唯一的區別是在第一行。第一個代碼工作正常,但第二個崩潰。爲什麼?
問題在actualNumberOfChromosomes
的某個地方,但我想明白爲什麼,而不僅僅是解決這個問題。我可以通過創建加法變量p
並將actualNumberOfChromosomes
賦值給它並更改循環以便i
等於p
來解決此問題。
你能否詳細解釋爲什麼第二個程序崩潰?指針g是否已損壞?而且,當它墜毀?你可以打印出我的價值。我需要更多的信息來了解這個問題。您可以打印出每個迭代和每個線程的一些變量。 – minjang 2010-11-28 11:22:42