program main_mpi_test
use mpi
implicit none
integer(kind=8) :: n
integer(kind=8) :: max_optical_depth
integer(kind=8) :: bin
integer(kind=8) :: tmax
integer(kind=8) :: sum_scatt
integer(kind=8) :: i,j,k
real(kind=8) :: rad
real(kind=8), dimension(:), allocatable :: send_results, recv_results
integer :: nrank, nproc,ierr,root
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, nrank, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nproc, ierr)
call MPI_BARRIER(MPI_COMM_WORLD, ierr)
root = 0
max_optical_depth = 10
bin = 10
tmax = max_optical_depth*bin
allocate(send_results(tmax))
allocate(recv_results(tmax))
do i = nrank+1, tmax, nproc
rad = real(i)/real(bin)
send_results(i) = rad
print*,'send', rad, send_results(i)
end do
call MPI_BARRIER(MPI_COMM_WORLD, ierr)
call MPI_REDUCE(send_results, recv_results, tmax, MPI_DOUBLE_PRECISION, &
MPI_SUM, root, MPI_COMM_WORLD, ierr)
if (nrank ==0) then
do i = 1, tmax
rad = real(i)/real(bin)
print*,'recv',rad, recv_results(i)
end do
end if
call MPI_FINALIZE(ierr)
deallocate(send_results)
deallocate(recv_results)
end program main_mpi_test
这是我的代码。 我使用 MPI_REDUCE。我使用 mpiifort 编译器。
问题是当我打印recv_results时, rad和recv_results的值必须相等,但在某个位置显示Nan或大约1e186的大数。 在其他位置,rad和recv_results具有相同的值。
我该如何解决这个问题?
MPI_Reduce 仅减少根排名中的结果,即您在
root
参数中指定的排名。如果您想获得所有排名的结果,请使用 MPI_AllReduce
代替。