2010-11-23 300 views
12

我有两个类似的代码。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来解决此问题。

+0

你能否详细解释为什么第二个程序崩溃?指针g是否已损坏?而且,当它坠毁?你可以打印出我的价值。我需要更多的信息来了解这个问题。您可以打印出每个迭代和每个线程的一些变量。 – minjang 2010-11-28 11:22:42

回答

13

问题是,此代码不符合OpenMP,不符合规范的程序具有“未指定”行为。如果你看一下OpenMP API的V3.0规范,部分2.5.1循环结构,说明下它指出:

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

时间表类型的静态和动态之间最大的区别,就是用静态的,块可以稍微计算和编译过程中定线,而动态它在运行时完成(需要更多的锁定)。

13

static计划类型和dynamic计划类型之间的区别是,static的块可以预先计算以及决定如何计划编制过程本身线程,而与dynamic同样的事情做在运行期间。

随着dynamic使用,它涉及到像死锁处理机制,负载处理等

你可以在一些更多的信息有些复杂的机制:http://openmp.blogspot.com

相关问题