Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran mpich2中的mpi_waitall在请求的数组_中具有空值_Fortran_Fortran90_Mpich_Pgi - Fatal编程技术网

Fortran mpich2中的mpi_waitall在请求的数组_中具有空值

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

我使用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
当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中它也是一个非零常量。