赞
踩
1、 schedule子句的用法
schedule(type,size) type表示调度类型,共有4种类型(static,dynamic,guided,runtime)可选,size参数定义了迭代次数最小的划分单位,每个线程依次分配size个迭代次数。
- #include<iostream>
- #include"omp.h"
- using namespace std;
- void main()
- {
- #pragma omp parallel for schedule(static,3)
- for(int i = 0; i < 9; i++)
- {
- printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());
- }
- }
可以看出每个线程依次分配到3个连续的迭代计算
(1) dynamic动态调度
动态调度是动态的将迭代分配到各个线程上,可以使用size参数,不适合size参数情况下size值默认为1,根据每个线程的完成情况每次再分配2个迭代给已完成迭代任务的线程,使用size参数则每次分配size个迭代次数。较快迭代完成的线程可能执行更多次迭代,较慢的线程执行较少的迭代,以此来解决各线程间负载分配不平衡的问题。
- #include <iostream>
-
- #include "omp.h"
- using namespace std;
- void main() {
- #pragma omp parallel for schedule(dynamic, 2)
- for (int i = 0; i < 12; i++) {
- printf("i=%d, thread_id=%d\n", i * i * i * i, omp_get_thread_num());
- }
- }
执行乘法运算,i比较小的时候计算量小,所以可以看到编号为0的线程执行6次,编号为1、2和3的线程分别执行2次。
(2) guided调度
guided调度跟dynamic动态调度类似,是一种采用指导性的启发式自调度方法。刚开始时候每个线程会分配到较大的迭代块,之后每次分配到的迭代块会以指数级下降,直到下降到自定义的size大小,如果没有定义size,则默认为1.
2、sections制导指令
for制导指令用于迭代计算的任务分配,sections制导指令用于非迭代计算的任务分配,sections的语法格式如下: #pragma omp parallel sections[子句]
- #include <iostream>
-
- #include "omp.h"
- using namespace std;
- void main() {
- #pragma omp parallel sections
- {
- #pragma omp section
- {
- for (int i = 0; i < 4; i++)
- printf("i=%d, thread_id=%d\n", i, omp_get_thread_num());
- }
- #pragma omp section
- {
- for (int i = 0; i < 4; i++)
- printf("j=%d, thread_id=%d\n", i, omp_get_thread_num());
- }
- }
- }

sections语句块中共有2个section段落,所以生成2个线程并行执行。
3、single制导指令
在parallel制导指令产生的并行域中的语句,一般会默认生成4个不同的线程对相同的语句分别执行一次,如果想要其中某些操作只执行一次,可以使用single制导指令,其后的语句块只会被单个线程执行。
- #include <iostream>
-
- #include "omp.h"
- using namespace std;
- void main() {
- #pragma omp parallel
- {
- #pragma omp single
- { printf("single thread_id=%d\n", omp_get_thread_num()); }
- printf("多线程执行,thread_id=%d\n", omp_get_thread_num());
- }
- }
由single引导的语句块只执行一次,第二个printf语句没有single指令,所以被4个不同线程分别执行了一次。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。