MPI_Isend 和 MPI_Waitall 不能很好地工作

问题描述 投票:0回答:1

我已经实现了 mpi_isend 和 mpi_waitwall 以便 将每个CPU的消息发送给其相应的邻居。 在 mpi_Isend 之后,我调用 mpi_waitall 以保证 消息已从每个 CPU 发送出去:

无效 myisend() {

int numcpuneibs{commute_->numcpuneibs()}; 
MPI_Request req[numcpuneibs];
MPI_Status  status[numcpuneibs];

for(int neib=0; neib<numcpuneibs; neib++)
{
    MPI_Isend(bndgridfunc_->sendptr(neib),
              bndgridfunc_->numbndptsatneib(neib),
              MPI_DOUBLE,
              commute_->neighbor(neib),                  
              0,
              commute_->comm(),
              &req[neib]
             );  
}


MPI_Waitall(numcpuneibs,
            req,
            status

}

但是,我只能发送非常少量的数据。我有 检查计算机上的内存。有足够的内存 在电脑上。

如果我注释掉 MPI_Waitall。程序即可完成。但我是 不确定消息是否已完全发送而无需调用 mpi_waitall。

任何人都可以有这方面的经验吗?

mpi
1个回答
0
投票

这是添加的recv片段:

无效 myirecv()

{

int numcpuneibs{commute_->numcpuneibs()}; 

MPI_Request req[numcpuneibs];
MPI_Status  status[numcpuneibs];

for(int neib=0; neib<numcpuneibs; neib++)
{
    MPI_Irecv(bndgridfunc_->recvptr(neib),
              bndgridfunc_->numbndptsatneib(neib),
              MPI_DOUBLE,
              commute_->neighbor(neib),                  
              0,
              commute_->comm(),
              &req[neib]
             ); 
}


MPI_Waitall(numcpuneibs,
            req,
            status
           );  

}

之后,我依次调用 myisend 和 myrecv。不幸的是,在我看来,我又被锁定了......

© www.soinside.com 2019 - 2024. All rights reserved.