MPI Fortran WTIME无法正常运行

b-f*_*-fg 2 parallel-processing fortran hpc mpi

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ogt 5

来自文档:返回值:从过去的任意时间开始的时间(以秒为单位)。他们没有指定多远;-)只有t2-t1在这里有意义...

而且,返回值MPI_Wtime()double precisiont1t2声明为单精度浮点数。


Hri*_*iev 5

在亚历山大·沃格特(Alexander Vogt)的答案的基础上,我想添加许多MPI_WTIME使用gettimeofday(2)(或类似方法)的Unix实现来检索系统时间,然后将返回的struct timeval值转换为浮点值。Unix中的计时是通过跟踪自纪元(1970年1月1日00:00 UTC)以来经过的秒数来完成的。编写此代码时,该值为1424165330.897136秒并进行计数。

对于许多Fortran编译器,REAL默认情况下为单精度浮点表示形式,仅可容纳7.22个十进制数字,而您至少需要9个数字(如果需要亚秒精度,则需要更多)。当存储在REAL变量中时,上述高精度时间值将变为1.42416538E9 。该类型可以表示的下一个最接近的值是1.4241655E9。因此,您无法测量短于(1.4241655-1.42416538).10 9或120秒的时间段。

使用双精度。