1

MPICH-2.1.5 和 PGI 编译器出现以下错误;

Fatal error in PMPI_Waitall: Invalid MPI_Request, error stack:
PMPI_Waitall(311): MPI_Waitall(count=4, req_array=0x2ca0ae0, status_array=0x2c8d220) failed
PMPI_Waitall(288): The supplied request in array element 0 was invalid (kind=0)

在以下基于模板的算法的示例 Fortran 代码中,

Subroutine data_exchange

! data declaration

integer request(2*neighbor),status(MPI_STATUS_SIZE,2*neighbor)
integer n(neighbor),iflag(neighbor)
integer itag(neighbor),neigh(neighbor)

! Data initialization
request = 0; n = 0; iflag = 0;

! Create data buffers to send and recv
! Define values of n,iflag,itag,neigh based on boundary values

! Isend/Irecv look like this
ir=0
do i=1,neighbor
   if(iflag(i).eq.1) then
      ir=ir+1
      call MPI_Isend(buf_send(i),n(i),MPI_REAL,neigh(i),itag(i),MPI_COMM_WORLD,request(ir),ierr)
      ir=ir+1
      call MPI_Irecv(buf_recv(i),nsize,MPI_REAL,neigh(i),MPI_ANY_TAG,MPI_COMM_WORLD,request(ir),ierr)
   endif
enddo

! Calculations

call MPI_Waitall(2*neighbor,request,status,ierr)

end subroutine

array_of_requestin mpi_waitall 获得空值 ( request(i)=0) 时会发生错误。不满足array_of_request条件时出现空值。iflag(i)=1直接的解决方案是注释掉条件,但这会引入发送和接收大小为 0 的消息的开销,这对于大型系统(1000 个内核)是不可行的。

根据MPI 论坛链接,该array_of_requests列表可能包含空句柄或非活动句柄。

我试过以下,

  1. 不初始化array_of_requests
  2. 调整大小array_of_request以匹配MPI_isend + MPI_irecv计数,
  3. 将虚拟值分配给array_of_request
  4. 我还使用 MPICH-1 以及 OpenMPI 1.4 测试了相同的代码,并且代码可以正常工作。

任何见解将不胜感激!

4

1 回答 1

2

您也可以将第一个增量 of 移动ir到条件中。request(1:ir)然后,您将在循环的 and 处拥有所有句柄并发出:

call MPI_Waitall(ir,request(1:ir),status(:,1:ir),ierr)

这将确保所有请求都正确初始化。

另一件事:n(i)in是否MPI_Isendnsize对应的MPI_Irecv?

编辑:在咨询 MPI 标准(3.0,Ch. 3.7.3)后,我认为MPI_REQUEST_NULL如果要将整个请求数组提供给MPI_Waitall.

于 2013-09-16T20:56:16.973 回答