实现
让所有进程同一时间开始运算,最后选取运行时间最长的那个进程的时间。
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_finish 和 local_start 是因为 MPI_WTIME 函数返回的是双精度,采用单精度会丢失精

本文介绍了如何在 Fortran 中利用 MPI 让所有进程同步开始计算,并选择最长运行时间的进程。在实现过程中,注意到了陷阱:由于时间测量的精度问题,双精度变量与单精度函数不匹配,可能导致精度丢失或运行错误。作者提醒读者在使用时要格外留意这些细节。
7404

被折叠的 条评论
为什么被折叠?



