运行时函数接口实例

  通常,这些接口被包含在Fortran头文件omp_lib.h中。下面是omp_lib.h的一个实例,来自于Intel Fortran90编译器所带的头文件(经过修改)。

  MODULE IFLOMP
  !
  !提供用于线程管理的OpenMP运行函数接口
  !

  ! Intel compilers have a default INTEGER kind of 4, for 4 byte INTEGERs
   INTEGER,PARAMETER :: omp_lock_kind = 4
   INTEGER,PARAMETER :: omp_nest_lock_kind = 4
   ! _OPENMP gets macro-substituted by preprocessor
   INTEGER,PARAMETER :: openmp_version = 199910

   INTERFACE

  !设置线程数目(不能在Parallel内部调用)
   SUBROUTINE OMP_SET_NUM_THREADS(NP)
    INTEGER NP
   END SUBROUTINE

  !返回当前线程组所执行的Parallel块的工作线程数
   INTEGER FUNCTION OMP_GET_NUM_THREADS()
   END FUNCTION

  ! 得到可以允许创建的最大线程数,上面的这组调用允许程序员对
  ! 线程数目进行运行时控制
    INTEGER FUNCTION OMP_GET_MAX_THREADS()
    END FUNCTION

  ! 返回当前线程的线程号,主线程号为0,取值范围为[0,nthread-1]
    INTEGER FUNCTION OMP_GET_THREAD_NUM()
    END FUNCTION

  ! 返回当前Parallel块可用的处理器数目
    INTEGER FUNCTION OMP_GET_NUM_PROCS()
    END FUNCTION

  ! 判断当前线程是否正在执行Parallel任务(是返回.TRUE.)
    LOGICAL FUNCTION OMP_IN_PARALLEL()
    END FUNCTION

  ! 设置动态线程数目调整开关,如果FLAG = .TRUE.,允许运行时库
  ! 对Parallel块产生的工作线程数目进行动态调整,否则禁止
    SUBROUTINE OMP_SET_DYNAMIC(FLAG)
    LOGICAL FLAG
    END SUBROUTINE

  ! 得到动态线程数目调整开关的当前设置
    LOGICAL FUNCTION OMP_GET_DYNAMIC()
    END FUNCTION

  ! 嵌套并行开关设置。.TRUE.时允许嵌套并行,否则以串行模式执行嵌套并行块
    SUBROUTINE OMP_SET_NESTED(FLAG)
     LOGICAL FLAG
    END SUBROUTINE

  ! 初始化简单锁
    SUBROUTINE OMP_INIT_LOCK(LOCK)
     POINTER(LOCK,IL)
     INTEGER IL
    END SUBROUTINE

  ! 初始化嵌套锁
    SUBROUTINE OMP_INIT_NEST_LOCK(NLOCK)
     POINTER(NLOCK,NIL)
     INTEGER NIL
    END SUBROUTINE

  ! 删除简单锁
    SUBROUTINE OMP_DESTROY_LOCK(LOCK)
     POINTER(LOCK,IL)
     INTEGER IL
    END SUBROUTINE

  ! 删除嵌套锁
    SUBROUTINE OMP_DESTROY_NEST_LOCK(NLOCK)
     POINTER(NLOCK,NIL)
     INTEGER NIL
    END SUBROUTINE

  ! 简单锁加锁(需要经过初始化),阻塞等待加锁完成
    SUBROUTINE OMP_SET_LOCK(LOCK)
     POINTER(LOCK,IL)
     INTEGER IL
    END SUBROUTINE

  ! 嵌套锁加锁(需要经过初始化),锁计数器加1
    SUBROUTINE OMP_SET_NEST_LOCK(NLOCK)
     POINTER (NLOCK, NIL)
     INTEGER NIL
    END SUBROUTINE

  ! 简单锁解锁
    SUBROUTINE OMP_UNSET_LOCK(LOCK)
     POINTER(LOCK,IL)
     INTEGER IL
    END SUBROUTINE

  ! 嵌套锁解锁(锁计数器减1)
    SUBROUTINE OMP_UNSET_NEST_LOCK(NLOCK)
     POINTER(NLOCK,NIL)
     INTEGER NIL
    END SUBROUTINE

  ! 非阻塞加锁
    LOGICAL FUNCTION OMP_TEST_LOCK(LOCK)
     POINTER (LOCK,IL)
     INTEGER IL
    END FUNCTION
 
  ! 非阻塞加锁,如果对嵌套锁没有拥有权,返回0
    INTEGER FUNCTION OMP_TEST_NEST_LOCK(NLOCK)
     POINTER(NLOCK,NIL)
     INTEGER NIL
    END FUNCTION

  ! 返回墙钟时间(线程时间,各线程不要求一致)
    DOUBLE PRECISION FUNCTION OMP_WTIME()
    END FUNCTION

  ! 返回两个Tick之间所经过的时间长度(秒)
    DOUBLE PRECISION FUNCTION OMP_WTICK()
    END FUNCTION

    END INTERFACE
    END MODULE IFLOMP