C语言中OpenMP中静态和动态调度的区别

时间:2010-11-23 21:21:56

标签: c 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++;
}

唯一的区别在于第一行。第一个代码工作正常,但第二个代码崩溃。为什么呢?

问题出现在actualNumberOfChromosomes的某个地方,但我想了解原因,而不仅仅是解决这个问题。我可以通过创建添加变量p并为其分配actualNumberOfChromosomes并更改循环以使i等于p来解决此问题。

2 个答案:

答案 0 :(得分:15)

static 计划类型与 dynamic 计划类型之间的区别在于static可以预先计算数据块以及决定如何在编译期间调度线程,而使用dynamic时,在运行时也会完成同样的事情。

使用dynamic时,它涉及一些复杂的机制,如死锁处理机制,负载处理等。

您可以在http://openmp.blogspot.com获得更多信息。

答案 1 :(得分:13)

问题是此代码不符合OpenMP标准,不符合规定的程序具有“未指定”的行为。如果您查看OpenMP API V3.0规范,第2.5.1节“循环结构”,请在说明中说明:

  

在进入最外层之前计算每个相关循环的迭代计数   环。如果任何相关循环的执行改变了用于计算的任何值   任何迭代计数,然后行为是未指定的。

静态和动态的调度类型之间的最大区别在于,对于静态,块可以在编译期间稍微计算并调度到线程,而动态则在运行时完成(需要更多锁定)。 / p>

相关问题