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_request
in mpi_waitall 获得空值 ( request(i)=0
) 时会发生错误。不满足array_of_request
条件时出现空值。iflag(i)=1
直接的解决方案是注释掉条件,但这会引入发送和接收大小为 0 的消息的开销,这对于大型系统(1000 个内核)是不可行的。
根据MPI 论坛链接,该array_of_requests
列表可能包含空句柄或非活动句柄。
我试过以下,
- 不初始化
array_of_requests
, - 调整大小
array_of_request
以匹配MPI_isend + MPI_irecv
计数, - 将虚拟值分配给
array_of_request
- 我还使用 MPICH-1 以及 OpenMPI 1.4 测试了相同的代码,并且代码可以正常工作。
任何见解将不胜感激!