• C++ OpenMp的并行编程


    基于OpenMp的并行编程

    功能:并行处理比较耗时的for循环

    在OpenMP中,对for循环并行化的任务调度使用schedule子句来实现:

    • 使用格式:schedule(type[,size])

    • type参数表示调度类型:static、dynamic、guided

    • size参数(可选):分配给每个线程的连续迭代计算的次数

      • 静态调度(static)

        大部分编译器在没有使用schedule子句的时候,默认是static调度。static在编译的时候就已经确定了,那些循环由哪些线程执行。

        当不使用size 时,将给每个线程分配┌N/t┐个迭代。当使用size时,将每次给线程分配size次迭代。

        #pragma omp parallel for schedule(static)
        //#pragma omp parallel for schedule(static,2)
        for (int i = 0; i < 10; ++i)
        {
        printf("i=%d, thread_id=%d ", i, omp_get_thread_num());
        }

     

    • 动态调度(dynamic)

      动态地将迭代分配到各个线程,动态调度可以使用size参数也可以不使用size参数,不使用size参数时是将迭代逐个地分配到各个线程,使用size参数时,每次分配给线程的迭代次数为指定的size次

      #pragma omp parallel for schedule(dynamic)
      //#pragma omp parallel for schedule(dynamic,2)
      for (int i = 0; i < 10; ++i)
      {
      printf("i=%d, thread_id=%d ", i, omp_get_thread_num());
      }

       

      从结果看出:这个调度是逐个将任务分配到每一个核心,然后哪个执行完了就接着分配。如果指定size为2,就会每一次为每一个核心连续分配两个任务

       

    • guided调度(guided)

      guided调度是一种采用指导性的启发式自调度方法。开始时每个线程会分配到较大的迭代块,之后分配到的迭代块会逐渐递减。迭代块的大小会按指数级下降到指定的size大小,如果没有指定size参数,那么迭代块大小最小会降到1

      #pragma omp parallel for schedule(guided)
      for (int i = 0; i < 10; ++i)
      {
      printf("i=%d, thread_id=%d ", i, omp_get_thread_num());
      }

       

       

    • 三种运行方式总结:

      静态调度static:每次哪些循环由那个线程执行时固定的,编译调试。由于每个线程的任务是固定的,但是可能有的循环任务执行快,有的慢,不能达到最优。

      动态调度dynamic:根据线程的执行快慢,已经完成任务的线程会自动请求新的任务或者任务块,每次领取的任务块是固定的。

      启发式调度guided:每个任务分配的任务是先大后小,指数下降。当有大量任务需要循环时,刚开始为线程分配大量任务,最后任务不多时,给每个线程少量任务,可以达到线程任务均衡。

            open MP 与串行执行  对比:

           https://www.cnblogs.com/mfryf/p/6863089.html 

           

           四种调度方式实例: dynamic、guided、runtime、static

           https://blog.csdn.net/billbliss/article/details/44131919

  • 相关阅读:
    SGX技术初探
    DH 密钥交换算法
    SSM整合框架实现ajax校验
    为什么要重写toString()方法和hashcode()方法
    java数组实现简单的DVD管理
    java冒泡排序
    windows下java环境变量配置
    Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能
    Eclipse SVN 冲突的 介绍 及 四种解决方式
    java中的重载(overload)和重写(override)区别
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/10746092.html
Copyright © 2020-2023  润新知