Fortran mpich2中的mpi_waitall在请求的数组_中具有空值
我使用MPICH-2.1.5和PGI编译器得到以下错误:Fortran mpich2中的mpi_waitall在请求的数组_中具有空值,fortran,fortran90,mpich,pgi,Fortran,Fortran90,Mpich,Pgi,我使用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 inv
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
当mpi_waitall中请求的数组request(i)=0
)时,会发生错误。当不满足条件iflag(i)=1
时,请求的数组\u中的空值出现。直截了当的解决方案是注释掉有条件的,但这将导致发送和接收0大小消息的开销,这对于大型系统(1000个内核)是不可行的
根据,请求的数组\u
列表可能包含空句柄或非活动句柄
我试着跟着
未初始化请求的数组
调整请求的数组大小以匹配MPI isend+MPI irecv计数
将虚拟值分配给请求的数组
我还使用MPICH-1以及OpenMPI 1.4测试了完全相同的代码,代码可以正常工作
任何见解都将不胜感激 您也可以将ir
的第一个增量移动到条件中。然后,在循环和问题的and处,您将拥有请求(1:ir)
中的所有句柄:
call MPI_Waitall(ir,request(1:ir),status(:,1:ir),ierr)
这将确保所有请求都已正确初始化
另一件事:MPI Isend中的n(i)
是否与相应的MPI Irecv中的nsize
保持相同的值
编辑:
参考MPI标准(3.0,第3.7.3章)后,我认为如果要将整个请求数组设置为MPI\u request\u NULL
,则需要将请求数组初始化为MPI\u Waitall
这可能是相关的(尽管不是完全相同的问题):MPI中的Null句柄是命名常量,例如MPI\u PROC\u Null
,MPI\u REQUEST\u Null
,等等。它们的值是特定于实现的,在大多数情况下不是0
!将ir移动到条件并更改mpi_waitall调用中的计数后,问题得到解决。问题仍然是为什么MPICH2不喜欢\u请求数组中的null。n(i)和nsize确实具有相同的值。我的猜测是MPICH2不再为您初始化请求数组。MPI_request_NULL
等于英特尔MPI中的738197504
,它源自MPICH2,因此我假设在MPICH2中它也是一个非零常量。