微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在 MPI_IRecv 之后所有进程等级都变为 0?

如何解决为什么在 MPI_IRecv 之后所有进程等级都变为 0?

我正在实现一个非常简单的非阻塞发送接收。但是,我注意到在 MPI_Irecv() 之后,所有进程等级都变为 0。如下面的代码所示,我尝试在 MPI_Irecv() 之前打印等级,等级仍然正确。 发生了什么改变了这些排名?以及如何修复?

program send_async
  implicit none
  include 'mpif.h'

  integer :: process_rank,cluster_size,ierror,request,status
  integer,parameter :: MASTER_RANK = 0,ARR_SIZE = 10
  integer,allocatable :: arr(:),arr_p(:)
  integer :: i
  integer :: arr_p_size
  integer :: receiver_rank,start_idx,end_idx

  call MPI_INIT(ierror)
  call MPI_COMM_SIZE(MPI_COMM_WORLD,ierror)
  call MPI_COMM_RANK(MPI_COMM_WORLD,process_rank,ierror)

  ! Initiate the whole array only in the master process
  if (MASTER_RANK == process_rank) then
    allocate(arr(ARR_SIZE))
    arr = [(i,i=1,ARR_SIZE)]
  end if

  ! Initiate partial array in each process (even the master)
  arr_p_size = ARR_SIZE/cluster_size
  allocate(arr_p(arr_p_size))
  ! Master send partial array even to itself
  if (MASTER_RANK == process_rank) then
    do receiver_rank = 0,cluster_size-1
      start_idx = receiver_rank*arr_p_size + 1
      end_idx = (receiver_rank+1)*arr_p_size
      call MPI_ISEND(arr(start_idx:end_idx),arr_p_size,MPI_INT,receiver_rank,&
        1,MPI_COMM_WORLD,ierror)
    end do
  end if

  print *,"Hi,I'm process of rank:",process_rank

  call MPI_IRECV(arr_p(1:arr_p_size),MASTER_RANK,1,&
    MPI_COMM_WORLD,ierror)
  call MPI_WAIT(request,status,ierror)
  print *,"Hi I'm rank:","I have arr_p=",arr_p(:)

  call MPI_FINALIZE(ierror)
end program send_async

我使用 OpenMPI 4.0.3,并使用以下命令编译代码

mpif90 -g -ffpe-trap=zero,invalid,overflow,underflow -Wall -Werror send_async.f90 -o send_async

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。