1.编译制导
支持OpenMP的编译器能识别、处理这些制导指令并实现其功能。其中指令或命令是可以单独出现的,子句必须出现在制导指令之后。
制导指令和子句功能上大体分为4类:
(1)并行域控制类 指示编译器产生多个线程以并发执行任务
(2)任务分担类 指示编译器如何给各个线程分配任务
(3)同步控制类 指示编译器协调并发线程之间的时间约束关系
(4)数据环境类 处理并行域内外的变量共享或者私有属性以及边界上的数据传送
1)版本为2.5的OpenMP规范中的指令:
(1)parallel 用在一个结构块之前,表示这段代码将被多个线程并行执行产生并行域
(2)for 用于for循环语句之前,表示将循环计算任务分配到多个线程中并行执行任务分配
(3)parallel for 用在for循环语句之前,表示for循环体代码将被多个线程并行执行,它同时具有并行域的产生和任务分担两个功能
(4)sections 用在可被并行的代码段之前,用于实现多个结构快语句的任务分担,可并行执行的代码段各自用section指令标出
(5)parallel sections 类似parallel for
(6)single 用在并行域内,表示一段只能被单个线程执行的代码
(7)critical 临界区代码
(8)flush 保证各个OpenMP线程数据影像的一致性
(9)barrier 用于并行域内代码的线程同步,线程执行到barrier要停下等待,直到所有线程执行到barrier才继续往下执行
(10)atomic 对数据原子访问
(11)master 指定一段代码由主线程完成
(12)threadprivate 用于指定一个或多个变量是线程专有
2)相应的OpenMP的子句
(1)private 指定一个或多个变量在每个线程中都有自己的私有副本
(2)firstprivate 指定一个或多个变量在每个线程中都有自己的私有副本,并且私有副本要在进入并行域或者任务分担域时,继承主线程中的同名变量的值为初值
(3)lastprivate 用在指定将线程中一个或多个私有变量的值在并行处理结束后复制到主线程的同名变量中,for或sections任务分担中的最后一个线程负责拷贝
(4)reduction 用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的归约运算,并将结果返回给主线程的同名变量
(5)nowait 指出并发进程可以忽略其他制导指令中暗含的路障同步
(6)num_threads 指定并行域的线程数目
(7)schedule 指定for任务分担中的任务分配调度类型
(8)shared 指定一个或多个变量为多个线程共享变量
(9)ordered 用来指定for任务分担域内指定代码段需要按照串行循环次序执行
(10)copyprivate 配合single指令,将指定线程的专有变量广播到并行域内其他线程的同名变量中
(11)copyin 用来指定一个threadprivate类型的变量需要用主线程同名变量进行初始化
(12)default 用来指定并行域内变量的使用方式,默认为shared
2.API函数
omp_in_paraell 判断当前线程是否在并行域中
omp_get_thread_num 返回线程号
omp_set_num_threads设置后续并行域的线程数
omp_get_num_threads返回当前并行域的线程数
omp_get_max_threads获取并行域可用的最大线程数
omp_get_num_procs 返回系统中的处理器数
omp_get_dynamic 判断是否支持动态改变线程的数目
omp_set_dynamic 启用或关闭线程数目的动态改变
omp_get_nested 判断系统是否支持并行嵌套
omp_set_nested 启用或关闭并行嵌套
omp_init(_nest)_lock初始化一个(嵌套)锁
omp_destroy(_nest)_lock销毁一个(嵌套)锁
omp_set(_nest)_lock (嵌套)加锁操作omp_unset(_nest)_lock(嵌套)解锁操作
omp_test(_nest)_lock非阻塞的(嵌套)加锁
omp_get_wtime 获取wall time时间 系统时间
omp_set_wtime 设置wall time时间
3.环境变量
OMP_SCHEDULE 用于for循环并行化后的调度,它的值就时循环调度的类型
OMP_NUM_THREADS 设置并行域中的线程数
OMP_DYNAMIC 设定变量值,确定是否允许动态设定并行域的线程数
OMP_NESTED 指出是否可以并行嵌套