fortran 语言使用

! 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

你可能感兴趣的:(fortran,openmp)