• openmp 通用核心 学习 2 数据环境—任务-内存模型


    目录

    openmp 数据环境

    子句:

    在上述三个子句中也可以传入指针和数组

    openmp 任务:

    openmp内存模型:


     

    openmp 数据环境

    子句:

    shared(list)

    private(list)//默认构造 值未被初始化

    对于图6-5:

    1. //File #1
    2. int tmp;
    3. void danger()
    4. {
    5. tmp = 0;
    6. #pragma omp parallel private(tmp)
    7. work();
    8. printf("%d\n", tmp); // tmp has unspecified value
    9. }
    10. // File #2
    11. extern int tmp;
    12. void work()
    13. {
    14. tmp = 5;
    15. }

    输出5;

    1. #include"test6_5.hpp"
    2. #include
    3. #include
    4. int tmp;
    5. int main(){
    6. tmp = 0;
    7. #pragma omp parallel private(tmp)
    8. work(tmp);
    9. std::cout<
    10. return 0;
    11. }
    12. extern int tmp;
    13. void work(int& tmp){
    14. tmp = 5;
    15. }

    输出0;

    1. #include"test6_5.hpp"
    2. #include
    3. #include
    4. int tmp;
    5. int main(){
    6. tmp = 0;
    7. #pragma omp parallel private(tmp)
    8. work(tmp);
    9. std::cout<
    10. return 0;
    11. }
    12. //extern int tmp;
    13. void work(int& tmp){
    14. tmp = 5;
    15. }

    输出0;

    个人理解:extern int tmp 不知道应该使用文件域范围的tmp还是数据环境中私有的tmp所以会出现第一种情况。

    firstprivate(list) //copy复制构造

    default(none) //如果在构造体上使用default(none),那么所有从遭遇线程传递到区域的变量必须明确地列在private、firstprivate、shared、或reduction子句中,编译器会将没有列出的变量标记为错误。

    在上述三个子句中也可以传入指针和数组

    具体参考:https://www.openmp.org/spec-html/5.0/openmpsu21.html#:~:text=When%20the%20size%20of%20the%20array%20dimension%20is,the%20lower-bound%20is%20absent%20it%20defaults%20to%200.

    openmp 任务:

    #pragma omp task //task构造创建一个显式的任务

    #pragma omp single //single构造创建一个共享工作构造,与所有的共享工作构造一样,末尾有一个栅栏,可以使用nowait去除栅栏

    图7—9:

    1. #pragma omp parallel
    2. {
    3. #pragma omp single
    4. {
    5. p = listhead;
    6. while (p)
    7. {
    8. #pragma omp task firstprivate(p)
    9. {
    10. process (p);
    11. } // end of task creation
    12. p = p->next;
    13. }
    14. } // end of single region
    15. } // end of parallel region

    #pragma omp single 只允许一个线程创建任务,其他线程虽然在栅栏处等待,但是会处理process()而且此时single线程,不一定运行到了single块最后,可能还在创建线程。

    图7-11:

    1. int fib (int n)
    2. {
    3. int x,y;
    4. if (n < 2) return n;
    5. #pragma omp task shared(x)
    6. x = fib(n-1);
    7. #pragma omp task shared(y)
    8. y = fib(n-2);
    9. #pragma omp taskwait
    10. return (x+y);
    11. }
    12. int main()
    13. {
    14. int NW = 30;
    15. #pragma omp parallel
    16. {
    17. #pragma omp single
    18. fib(NW);
    19. }
    20. }

     #pragma omp taskwait

    使用taskwait强制等待这个点以前的所有兄弟任务和子任务完成,

    对于这个程序,为了x,y在每个任务的数据环境之外可用,他们必须被共享。

    openmp内存模型:

    三个简单的规则来描述openmp通用核心中的内存模型:

            1.当混合来自多个线程的共享变量的读写操作时,确保在写入和后续读取之间有一个栅栏(显示栅栏或隐式栅栏)

            2.在算法的控制流不支持栅栏的区域内更新共享变量时,要用临界区保护更新

            3.不使用变量的值来定义线程之间的排序约束,即使它们是以无竞争的方式更新的。顺序约束在通用核心中是通过栅栏来定义的。

    内存一致性规则:

            线程使用冲刷来使其变量与内存保持一致。在以下位置隐含了一次冲刷:

            1.进入和退出临界区构造;

            2.从显式或隐式栅栏中退出

  • 相关阅读:
    53. 寻宝(第七期模拟笔试)(最小生成树练习)
    spring transaction propagation 02 isolation
    基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交
    R语言计算代码的运行时间:使用tictoc包计算代码的运行时间长短
    新版本的AndroidStudio生产签名文件打包失败
    C++运算符重载
    PHP - AJAX 与 MySQL
    软件工程学习笔记14——案例解析篇
    java毕业生设计中医药科普网站计算机源码+系统+mysql+调试部署+lw
    泰迪智能科技助力中山三院放射科搭建生成式大模型应用
  • 原文地址:https://blog.csdn.net/qq_52758467/article/details/133772548