• OpenMP笔记(五)


    任务调度主要用于并行的for循环中,当循环中每次迭代的计算量不相等时,如果简单地给各个线程分配相同次数的迭代的话,会造成各个线程计算负载不均衡,这会使得有些线程先执行完,有些后执行完,造成某些CPU核空闲,影响程序性能。在OpenMP中,对for循环并行化的任务调度使用schedule子句来实现。

    一、Schedule

    schedule子句的使用格式为:

    schedule(type[,size])

    schedule有两个参数:type和size,size参数是可选的。在这里,type有四种参数:dynamic、guided、runtime、static,runtime实际上是根据环境变量来选择前三种中的某中类型,当type参数类型为runtime时,size参数是非法的(不需要使用,如果使用的话编译器会报错)。

    二、static,静态调度

    静态调度比较简单,就是假设有n次循环迭代,t个线程,那么给每个线程静态分配大约n/t次迭代计算。因为不一定是整除,所有实际分配的迭代次数可能存在差1的情况,但是如果指定了size参数的话,那么就会每个线程一次分配size个任务,出现的情况是:1、不足分t个线程,那么会先将线程ID底的分配完先;2、足够分t-1个线程,那么剩下的都给第t个线程;3、超过t个线程的,再依次重新分配。

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

    可以看到线程0和1分配了三个任务,2和3分配了2个任务,因为是循环10次,而线程是4,所以平均是2个线程,多出的2个平均分给了0和1。

    使用size的情况:

    #pragma omp parallel for schedule(static, 3)

    可以看到线程0-2都分配了3个任务,而线程3只分配了1个。

    三、dynamic,动态调度

    态调度则是动态地分配任务到线程中,不加size的情况

    #pragma omp parallel for schedule(dynamic)

    æ­¤å¾åçaltå±æ§ä¸ºç©ºï¼æ件å为image-7.png

    加size的情况:

    #pragma omp parallel for schedule(dynamic, 3)

    四、guided,导向性调度

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

    不加size的情况:

    #pragma omp parallel for schedule(guided)

    æ­¤å¾åçaltå±æ§ä¸ºç©ºï¼æ件å为image-9.png

    加size的情况:

    #pragma omp parallel for schedule(guided, 3)

    五、rumtime调度

    rumtime跟前面的几个用法就不一样的,它是在运行时根据环境变量OMP_SCHEDULE来确定调度类型,最终使用的调度类型仍然是上述三种调度方式中的某种。

    在unix系统中,可以使用setenv命令来设置OMP_SCHEDULE环境变量:setenv OMP_SCHEDULE “dynamic, 2”,这里的2是size。

    在windows环境中,可以在“系统属性|高级|环境变量”对话框中进行设置环境变量。

    上善若水,为而不争。
  • 相关阅读:
    v4l2程序实例
    uboot的readme导读
    基于Linux的v4l2视频架构驱动编写
    V4L2
    Uboot优美代码赏析1:目录结构和malkefile分析
    查找 mysql 配置文件 my.cnf
    thinkphp中array_diff运行无效 Invalid opcode 153/1/8
    thinkphp后端开发ajax接口开发测试
    Thinkphp getLastSql函数用法
    web日志分析的重要性
  • 原文地址:https://www.cnblogs.com/Bearoom/p/11721805.html
Copyright © 2020-2023  润新知