openmp常用指令集(Fortran版)(1)
前言
最近一直在学习关于openmp的用法,在网上查到的资料都是基于C++的用法,现在总结一下关于openmp在Fortran上用法,共同学习吧
关于设置计算机
(1)在vs2008中新建fortran控制台程序,选择项目(Project) -> 属性(property) -> Fortran -> 语言(Language),在 Process OpenMP Directives 选项中选择 Generate Parallel Code (/Qopenmp),点击确定以打开 OpenMP 支持。
(2)设置环境变量:我的电脑 -> 属性 -> 高级 -> 环境变量,在系统变量栏中新建一个OMP_NUM_THREADS 变量,值设为 4,即为程序执行的线程数(线程数一般设为处理器核数)。
运行如下代码:
program test
!$OMP PARALLEL
print*, 'ok!'
!$OMP END PARALLEL
End program
运行结果是:
ok!
ok!
ok!
ok!
使用openmp的限制条件
(1)!
(2)并行区域内的代码必须为结构化代码,即不能跳入或跳出并行区,如使用GOTO语句。
除了以上两个规则,没有其他的限制条件。尽管如此,在使用并行区域的时候也得小心,因为即使考虑上述限制条件,也可能得到不正确的程序。这是因为openmp本身采用共享内存的模式,这一点常常产生数据竞争;
嵌套循环
可以将平行区域嵌套到另一个平行区域。如果平行队列里的一个线程遇到另一个平行区域,它将创建新的线程组,本身称为新线程组中的主线程。第二个平行区域称为嵌套平行区域,示例如下:
use omp_lib
call omp_set_nested(.true.)
!$OMP PARALLEL
write(*,*) "Hello"
!$OMP PARALLEL
write(*,*) "Hi"
!$OMP END PARALLEL
!$OMP END PARALLEL
假设每个平行区域都使用Np个线程,总共将有Np2+Np个消息出现在屏幕上。这里需要注意use omp_lib是调用omp 运行库以后看当前线程数能用到,call omp_set_nested(.true.)是将嵌套并行设为true;运行之后会看到