OpenMP多线程编程(三)

     这次我们来看看线程的调度问题吧,线程的调度主要是解决线程间的负载平衡,尽可能让核忙碌起来,也将调度开销、上下文切换开销以及同步开销降到最低。OpenMP给出了四种调度方案:静态,动态,知道以及运行时调度。

调度语法格式为#pragma omp for schedule(放适当的参数[,chunksize]),其中第一个参数值可以为:static,dynamic,guided,runtime.

1静态(static)调度

    将所有循环迭代划分成相等大小的块,块的大小由上述语法中的第二个参数指定。默认情况下,迭代的划分尽可能平均,每个线程分到一块。如果chunksize=1,相当于循环迭代交错分配各个线程,开销较大。

    默认情况下,OpenMP的调度策略是静态调度。

2动态(dynamic)调度

    与静态调度有些类似,也是将所有循环迭代划分成若干块,块的大小由上述语法中的第二个参数指定。但是使用一个内部任务队列,采用先来先服务的方式进行调度。当某个线程闲下来,就为其分配一个循环块。由此可见,动态策略可以极大地保证线程组的负载平衡,但是需要额外的开销,不能达到最佳性能。

3指导(guided)调度策略

    这种调度策略和动态调度有些类似,但是循环块大小刚开始比较大,后来逐渐减小,从而减少了线程用于访问任务队列的时间。这种调度策略的循环划分是基于下列公式来完成的,其中初值是迭代次数,然后每次根据线程数(迭代次数/(线程数×2)),以及剩余的迭代次数进行计算,最后当小于chunksize参数的值时,就用该参数代替。

例如,给定一个循环,迭代次数为800,线程数为2,chunksize=80,则循环块的划分为{200,150,113,85,80,80,80,12}

    这种调度策略一般比动态调度策略性能好一些~

4运行时(runtime)调度

     根据环境变量确定上述调度策略中的某一种。比较灵活~默认值是静态调度。

     以上的调度策略,大家可以通过在程序中做显示设置来考察效率问题,默认情况下,我们不是不使用调度策略,而是都采用了静态调度,简单,易懂。

 

 

你可能感兴趣的:(多线程,编程)