为什么 MPI_REDUCE 在某些位置显示不同的数字?

问题描述 投票:0回答:1
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具有相同的值。

我该如何解决这个问题?

print rad, recv_results

fortran mpi fortran90 message-passing
1个回答
0
投票

MPI_Reduce 仅减少根排名中的结果,即您在

root
参数中指定的排名。如果您想获得所有排名的结果,请使用
MPI_AllReduce
代替。

© www.soinside.com 2019 - 2024. All rights reserved.