欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

openmp常用指令集(Fortran版)(1)

程序员文章站 2022-03-07 13:08:42
...

前言

最近一直在学习关于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)!OMPPARALLELclause1clause2/!OMP END PARALLEL 指令对必须出现在程序的同一文件中;
(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;运行之后会看到
openmp常用指令集(Fortran版)(1)

相关标签: openmp fortran