常用制导指令
文章目录
Parallel
!设置线程数
!$OMP PARALLEL NUM_THREADS(64)
并行区域
!$OMP END PARALLEL
Do
!对do/for循环并行化
!$OMP DO
并行区域
!$OMP END DO
Sections
!对多个没有依赖关系(没有顺序因果关系)的代码块并行化
!$OMP SECTIONS
!$OMP section
并行代码1(与代码2、代码3同时执行)
!$OMP section
并行代码2
!$OMP section
并行代码3
!$OMP END SECTIONS
Single
!代码块仅由单个线程执行,该线程为最快到达 Omp Single 指令的线程
!其他线程在 !$Omp End Single 等待
!结束子句可为NOWAIT子句或者COPYPRIVATE子句,二者选其一,不可同时存在
!$OMP SINGLE
代码块
!$OMP END SINGLE
Master
!代码块仅主线程执行,与 !$Omp Single + Nowait 子句类似
!$OMP MASTER
代码块
!$OMP END MASTER
Critical
!代码块每次仅允许一个线程进入,相当于临界区加锁,其他线程被阻塞至 !$Omp Critical 或者 !$Omp End Critical
!$OMP CRITICAL
代码块
!$OMP END CRITICAL
Barrier
! 显示同步,等待所有线程都到达该点
代码行
!$OMP BARRIER
Ordered
! 只用于 Do/For 循环,使指令区域的执行按顺序执行,在前面迭代完成前,无线程可进入指令区域;
! 注:每个循环域中的每次迭代只能有一个 Ordered 块可见(如存在 If 语句中可能会有多个Ordered块);
!$OMP ORDERED
代码块
!$OMP END ORDERED
Workshare
! Workshare将代码块分解为共享单位并分配给一组线程
!$OMP WORKSHARE
代码块
!$OMP END WORKSHARE
Atomic
! Atomic仅对其后的一条语句生效,效果与 Critical 相似
!$OMP ATOMIC
代码行
Flush
! Flush 将线程可见的变量从寄存器写回内存
!$OMP FLUSH
代码行