我已经实现了 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。
任何人都可以有这方面的经验吗?
这是添加的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。不幸的是,在我看来,我又被锁定了......