我有两个类似的代码。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