OpenMP的调度

时间:2022-06-10 07:50:35

schedule(static, size)

这是静态调度,如果没有设置size, 默认是根据任务书来决定, 比如我电脑是8核,有26个任务,那么分配后结果是4 4 3 3 3 3 3 3. 因为先分配的先调度,所以把没对齐部分分配给先调度的任务。

这种调度适合每个任务运行时间都差不多的情况。

size一般不用写,默认即可。

schedule (dynamic, size)

这是动态调度,刚开始以为size如果是默认的话,每个块的大小是平均的,结果试了下发现默认size是1,导致调度消耗比较大。如果任务数不是很大,可以使用默认size,如果任务数很大,最好自己计算size的大小。

    #pragma omp parallel for schedule(dynamic)
for(int i=; i<; i++)
{
_sleep(i);
int j =;
while(j--);
#pragma omp critical
cout <<omp_get_thread_num() << " " << i << " " << endl;
}

上面是测试代码,运行结果是

5 0
1 1
6 2
4 3
3 4
2 5
0 6
7 7
5 8
1 9
6 10
4 11
3 12
2 13
0 14
7 15
5 16
1 17
6 18
4 19
3 20
2 21
0 22
7 23
5 24
1 25

可以发现,默认size是1. 如果改成2。结果在下面

5 0
5 1
6 2
1 4
6 3
3 6
0 8
1 5
2 10
4 12
3 7
7 14
0 9
5 16
2 11
6 18
4 13
7 15
1 20
5 17
3 22
0 24
6 19
1 21
3 23
0 25

可以发现,没有对齐部分也是按照size来分配的,导致没有对齐部分的其它cpu都空闲。