MPI Fortran WTIME 运行不正常

MPI Fortran WTIME not working well

我正在使用 Fortran MPI 进行编码,我需要获取程序的 运行 时间。因此,我尝试使用 WTIME() 函数,但得到了一些奇怪的结果。

部分代码是这样的:

    program heat_transfer_1D_parallel
    implicit none   
    include 'mpif.h'

    integer myid,np,rc,ierror,status(MPI_STATUS_SIZE)

    integer                       :: N,N_loc,i,k,e !e = number extra points (filled with 0s)
    real                          :: time,tmax,start,finish,dt,dx,xmax,xmin,T_in1,T_in2,T_out1,T_out2,calc_T,t1,t2
    real,allocatable,dimension(:) :: T,T_prev,T_loc,T_loc_prev

    call MPI_INIT(ierror)
    call MPI_COMM_SIZE(MPI_COMM_WORLD,np,ierror)
    call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierror)
...
    t1 = MPI_WTIME()    
    time = 0.
    do while (time.le.tmax)
...
    end do
...
    call MPI_BARRIER(MPI_COMM_WORLD,ierror)
    t2 = MPI_WTIME()        
    call MPI_FINALIZE(ierror)   

    if(myid.eq.0) then
        write(*,"(8E15.7)") T(1:N-e)
        write(*,*)t2
        write(*,*)t1
    end if

而且 t1 和 t2 的输出值相同且非常大:1.4240656E+09 任何想法为什么?非常感谢。

来自 documentation:Return 值:自过去任意时间以来的时间(以秒为单位)。他们没有具体说明有多远 ;-) 这里只有 t2-t1 有意义...

另外,MPI_Wtime()的return值为double precisiont1t2 声明为单精度浮点数。

基于 Alexander Vogt 的回答,我想补充一点 MPI_WTIME 的许多 Unix 实现使用 gettimeofday(2)(或类似的)来检索系统时间,然后将返回的 struct timeval 转换为浮点值。 Unix 中的计时是通过跟踪自纪元(01.01.1970 的 00:00 UTC)以来经过的秒数来完成的。写这篇文章时,值为 1424165330.897136 秒并且还在计数。

对于许多 Fortran 编译器,REAL 默认为只能容纳 7.22 个十进制数字的单精度浮点表示,而您至少需要 9 个(如果需要亚秒级精度则更多)。上面的高精度时间值存储在REAL变量中就变成了1.42416538E9。该类型可以表示的下一个最接近的值是 1.4241655E9。因此,您不能测量短于 (1.4241655 - 1.42416538).109 或 120 秒.

的时间段

使用双精度。