计算 MPI 运行时间(Fortran)

计算 MPI 运行时间(Fortran)

    • 实现
    • 陷阱

实现

让所有进程同一时间开始运算,最后选取运行时间最长的那个进程的时间。

program main
    use mpi
    implicit none
    
    integer :: rank, size, ierr
    real(8) :: local_finish, local_start
    real :: local_elapsed, elapsed
    
    ! 初始化
    call MPI_INIT(ierr)

    call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
    call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)

    local_start = MPI_WTIME()
    call SLEEP(2)
    local_finish = MPI_WTIME()
    local_elapsed = local_finish - local_start
    call MPI_REDUCE(local_elapsed, elapsed, 1, MPI_REAL, MPI_MAX, 0, MPI_COMM_WORLD, ierr)
    if (rank == 0) then
        print *, "elapsed:", elapsed
    endif

    ! 结束
    call MPI_FINALIZE(ierr)
end program main

运行结果:

 elapsed:   2.000131 

陷阱

进程内的局部变量使用了双精度,而运行时间使用了单精度。local_finishlocal_start 是因为 MPI_WTIME 函数返回的是双精度,采用单精度会丢失精度;local_elapsedelapsed 采用单精度是因为 MPI_REDUCE 好像并不支持双精度,传双精度失败(没有查到资料,自己测试的,如果知道原因的麻烦告知,谢谢?)。

你可能感兴趣的:(MPI,Fortran)