在OpenMP中使用C静态和动态调度的区别 [英] Difference between static and dynamic schedule in openMP in C

查看:1200
本文介绍了在OpenMP中使用C静态和动态调度的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个类似codeS。

I've got two similar codes.

首先

    #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++;
    }

唯一的区别是在第一行。首先code正常工作,但第二个崩溃。
问题是为什么?问题是在某处actualNumberOfChromosomes,但我想知道为什么,而不是仅仅解决这个问题。我可以通过创建另外变量p,并把它分配actualNumberOfChromosomes和改变的循环,所以我等于P,在这种情况下解决这个既codeS做工精细。

The only difference is in first line. First code works fine, but the second one crashes. The question is why?? Problem is somewhere in actualNumberOfChromosomes, but I would like to understand why, and not just solve this. I could solve this by creating addition variable p and assigning actualNumberOfChromosomes to it and changing the loop so i was equal to p, in such case both codes work fine.

推荐答案

的问题是,这个code未OpenMP的符合和不符合的程序有未指定行为。如果你看一下OpenMP API的V3.0规范,部分2.5.1循环结构,说明其下规定:

The problem is that this code is not OpenMP compliant and non-compliant programs have "unspecified" behavior. If you look at the OpenMP API V3.0 spec, section 2.5.1 Loop Construct, under the description it states:

每个相关循环迭代计数条目到最外面的前计算
  循环。如果任何相关的循环的执行改变任何用于计算的值的
  任何循环计数则行为是不确定的。

The iteration count for each associated loop is computed before entry to the outermost loop. If execution of any associated loop changes any of the values used to compute any of the iteration counts then the behavior is unspecified.

日程类型的静态和动态之间的最大区别,就是用静态的,块可有些计算和编译过程中定线程,同时具有动态它在运行时(需要更多的锁)就完成了。

The big difference between a schedule type of static and dynamic, is that with static, the chunks can be somewhat computed and scheduled to threads during compilation, while with dynamic it is done during run-time (requiring more locking).

这篇关于在OpenMP中使用C静态和动态调度的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆