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 precision
! t1
和 t2
声明为单精度浮点数。
基于 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 秒.
的时间段
使用双精度。
我正在使用 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 precision
! t1
和 t2
声明为单精度浮点数。
基于 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 秒.
使用双精度。