OpenMP是基于线程的并行编程模型。OpenMP采用Fork-Join并行执行方式:OpenMP程序开始于一个单独的主线程(Master Thread),然后主线程一直串行执行,直到遇见第一个并行域(Parallel Region),然后开始并行执行并行区域。其程序由一组编译制导、运行时库函数(Run-Time routines)和环境变量组成。
其过程如下:
Fork:主线程创建一个并行线程队列,然后,并行域中的代
码在不同的线程上并行执行;
Join:当并行域执行完之后,它们或被同步或被中断,最后只有主线程在执行。
常用制导命令:
- parallel 用在一个代码段之前,表示这段代码将被多个线程并行执行
- for 用于for循环之前,将循环分配到多个线程中并行执行,必须保证每 次循环之间无相关性。
- parallel for parallel 和 for语句的结合,也是用在一个for循环之前,表示for 循环的代码将被多个线程并行执行。
- sections 用在可能会被并行执行的代码段之前
- parallel sections parallel和sections两个语句的结合
- critical 用在一段代码临界区之前
- single 用在一段只被单个线程执行的代码段之前,表示后面的代码段将 被单线程执行
- barrier,用于并行区内代码的线程同步,所有线程执行到barrier时要停止 直到所有线程都执行到barrier时才继续往下执行。
- Atomic 用于指定一块内存区域被制动更新
- Master 用于指定一段代码块由主线程执行
- Ordered 用于指定并行区域的循环按顺序执行
- threadprivate 用于指定一个变量是线程私有
常用库函数:
- omp_get_num_procs, 返回运行本线程的多处理机的处理器个数。
- omp_get_num_threads, 返回当前并行区域中的活动线程个数。
- omp_get_thread_num, 返回线程号
- omp_set_num_threads, 设置并行执行代码的线程个数
- omp_init_lock, 初始化一个简单锁
- omp_set_lock, 上锁操作
- omp_unset_lock, 解锁操作,要和omp_set_lock函数配对使用。
- omp_destroy_lock, omp_init_lock函数的配对操作函数,关闭一个锁。
常用子句:
- private, 指定每个线程都有它自己的变量私有副本。
- firstprivate,指定每个线程都有它自己的变量私有副本,并且变量要被 继承主线程中的初值。
- lastprivate,主要是用来指定将线程中的私有变量的值在并行处理结束后 复制回主线程中的对应变量。
- reduction,用来指定一个或多个变量是私有的,并且在并行处理结束后 这些变量要执行指定的运算。
- nowait,忽略指定中暗含的等待
- num_threads,指定线程的个数
- schedule,指定如何调度for循环迭代
- shared,指定一个或多个变量为多个线程间的共享变量
- ordered,用来指定for循环的执行要按顺序执行
- copyprivate,用于single指导中的指定变量广播到并行区中其它线程
- copyin,用来指定一个threadprivate的变量的值要用主线程的值进行初始化
- default,用来指定并行处理区域内的变量的使用方式,缺省是shared