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

Tom*_*ski 12 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++;
}
Run Code Online (Sandbox Code Playgroud)

第二

#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++;
}
Run Code Online (Sandbox Code Playgroud)

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

问题在某处actualNumberOfChromosomes,但我想了解原因,而不只是解决这个问题.我可以通过创建附加变量解决这个问题p,并分配actualNumberOfChromosomes给它,并改变环路,这样i等于p.

小智 15

static调度类型和dynamic调度类型之间的区别在于,static可以预先计算块以及在编译期间如何调度线程,而dynamic在运行时期间完成相同的操作.

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

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


ejd*_*ejd 13

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

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

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