! fortran 统计时间
REAL time_begin,time_end
CALL CPU_TIME (time_begin)
CALL CPU_TIME (time_end)
PRINT *, 'Time of operation was ', time_end - time_begin, ' seconds'
fortran openmp使用
4、常用到的两个函数:
OMP_SET_NUM_THREADS(NUMBER) 用于设置你所需要的线程数NUMBER
OMP_GET_THREAD_NUM()
5、另外两个常用的指令:
!$OMP DO 和!$OMP END DO表明接下来的循环将被并行执行;
!$OMP SECTION和!$OMP END SECTION表明指定段中的代码被分配到线程组的线程中执行。
这两个指令对应着一些参数设置,在此就不赘述了。
获取当前程序运行的线程号
TID = OMP_GET_THREAD_NUM()
并行do时
最外面需要使用 !$OMP PARALLEL
!$OMP PARALLEL DO
区域并行
!$OMP PARALLEL
代码区
!$OMP END PARALLEL
循环do并行
!$OMP DO [clause ...]
SCHEDULE (type [,chunk])
ORDERED
PRIVATE (list)
FIRSTPRIVATE (list)
LASTPRIVATE (list)
SHARED (list)
REDUCTION (operator | intrinsic : list)
COLLAPSE (n)
do循环
!$OMP END DO [ NOWAIT ]
fortran 特有的方式WORKSHARE,在不能多线程计算的程序代码块,可以用这种方式声明只能有一个thread进行计算
$OMP WORKSHARE
FORALL statements
FORALL constructs
WHERE statements
WHERE constructs等等
!$OMP END WORKSHARE [ NOWAIT ]
在不能多线程计算的程序代码块,可以用这种方式声明只能有一个thread进行计算
!$OMP SINGLE [clause ...]
PRIVATE (list)
FIRSTPRIVATE (list)
代码区
!$OMP END SINGLE [ NOWAIT ]
代码编译的时候,需要加上-openmp(ifort)或者-fopenmp(gfortran),并且需要通过OMP_NUM_THREADS控制线程数目,对于存在大数组的程序,需要ulimit -s unlimited;export OMP_STACKSIZE=200000调大栈大小来消除segment fault (gfortran是GOMP_STACKSIZE,intel fortran是KMP_STACKSIZE)要彻底消除这个问题,可以通过将所有数组改成allocatable放到堆上来解决。
PROGRAM HELLO
use omp_lib
integer tid
!$OMP PARALLEL PRIVATE(TID)
TID = OMP_GET_THREAD_NUM()
PRINT *, 'Hello World from thread = ', TID
!$OMP END PARALLEL
END