美文网首页
schedule(线程执行for循环的次数)

schedule(线程执行for循环的次数)

作者: 小幸运Q | 来源:发表于2020-04-02 11:19 被阅读0次

https://blog.csdn.net/gengshenghong/java/article/details/7000979


  • parallel for后面是不需要{}

  • parallel如果忘记跟for就不是COUNT个任务分配给8个线程而是每个线程COUNT个任务,如下

(1)静态调度static:

对于schedule(static,size)的含义,OpenMP会给每个线程分配size次迭代计算。这个分配是静态的,“静态”体现在这个分配过程跟实际的运行是无关的,可以从逻辑上推断出哪几次迭代会在哪几个线程上运行。具体而言,对一个threadnum*size次的for循环迭代,使用threadnum个线程,那么,[0,size-1]的size次的迭代是在第一个线程上运行,[size, size + size -1]是在第二个线程上运行,依次类推。不会因为线程启动的快慢而改变执行的位置。

#include<stdio.h>
#include <omp.h>
#define COUNT 4*3 
int main()  
{
#pragma omp parallel for schedule(static,4)
    for(int i = 0;i < COUNT; i++) 
    {
        printf("Thread: %d, Iteration: %d\n", omp_get_thread_num(), i);
    } 
    return 0;  
}

# g++ -fopenmp OMP.cpp -o a.out
# fopenmp是cpp的库,所以要g++
# ./a.out
Thread: 1, Iteration: 4
Thread: 1, Iteration: 5
Thread: 1, Iteration: 6
Thread: 1, Iteration: 7
Thread: 0, Iteration: 0
Thread: 0, Iteration: 1
Thread: 0, Iteration: 2
Thread: 0, Iteration: 3
Thread: 2, Iteration: 8
Thread: 2, Iteration: 9
Thread: 2, Iteration: 10
Thread: 2, Iteration: 11

(2)动态调度dynamic

对于dynamic,没有size参数的情况下,每个线程按先执行完先分配的方式执行1次循环,比如,刚开始,线程1先启动,那么会为线程1分配一次循环开始去执行(i=0的迭代),然后,可能线程2启动了,那么为线程2分配一次循环去执行(i=1的迭代),假设这时候线程0和线程3没有启动,而线程1的迭代已经执行完,可能会继续为线程1分配一次迭代,如果线程0或3先启动了,可能会为之分配一次迭代,直到把所有的迭代分配完。所以,动态分配的结果是无法事先知道的,因为我们无法知道哪一个线程会先启动,哪一个线程执行某一个迭代需要多久等等,这些都是取决于系统的资源、线程的调度等等。

dynamic也可以有一个size参数,size表示,每次线程执行完(空闲)的时候给其一次分配的迭代的数量,如果没有知道size(上面的分析),那么每次就分配一个迭代。有了前面的理解,这个size的含义是很容易理解的了。

#include<stdio.h>
#include <omp.h>
#define COUNT 4*3
int main()  
{
#pragma omp parallel for schedule(dynamic)
    for(int i = 0;i < COUNT; i++) 
    {
        printf("Thread: %d, Iteration: %d\n", omp_get_thread_num(), i);
    }
    return 0;  
}
# g++ -fopenmp OMP.cpp -o a.out
# 因为i5-8代是四核八线程,所以分配了8个线程

Thread: 4, Iteration: 6
Thread: 4, Iteration: 8
Thread: 4, Iteration: 9
Thread: 4, Iteration: 10
Thread: 4, Iteration: 11
Thread: 6, Iteration: 4
Thread: 2, Iteration: 3
Thread: 3, Iteration: 7
Thread: 5, Iteration: 5
Thread: 0, Iteration: 2
Thread: 7, Iteration: 0
Thread: 1, Iteration: 1

(3)guided调度

类似于动态调度,但每次分配的循环次数不同,开始比较大,以后逐渐减小。size表示每次分配的迭代次数的最小值,由于每次分配的迭代次数会逐渐减少,较少到size时,将不再减少。如果不知道size的大小,那么默认size为1,即一直减少到1。

(4)runtime

runtime表示根据环境变量确定上述调度策略中的某一种,默认也是静态的(static)。
控制schedule环境变量的是OMP_SCHEDULE环境变量,其值和上面的三中类型一样了,比如:

setenv OMP_SCHEDULE “dynamic, 5”

就是schedule(dynamic,5)的含义了。

相关文章

网友评论

      本文标题:schedule(线程执行for循环的次数)

      本文链接:https://www.haomeiwen.com/subject/yqzjuhtx.html