c/c++语言开发共享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 ,但我想了解原因,而不仅仅是解决这个问题。 我可以通过创建附加变量pactualNumberOfChromosomes分配actualNumberOfChromosomes并更改循环以使i等于p来解决此问题。

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

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

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

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

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

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

    需要了解更多c/c++开发分享C语言中OpenMP中静态和动态调度的区别,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享C语言中OpenMP中静态和动态调度的区别相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979150.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐