我有两个类似的代码。
First
#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++;
}
Second
#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
.
和...之间的不同static
时间表类型和dynamic
时间表类型是static
可以预先计算块,并决定如何在编译期间调度到线程,而dynamic
在运行时也会做同样的事情。
随着使用dynamic
,它涉及到一些复杂的机制,如死锁处理机制、负载处理等。
您可以在以下位置获取更多信息:http://openmp.blogspot.com http://openmp.blogspot.com.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)