我的部分代码对最初完全存在于进程0的有限元网格进行分区,并将其中的一部分发送给其他处理器。这涉及将节点ID列表以及其他数据发送到其他处理器。我的代码看起来有点像这样:
std::vector<std::vector<unsigned int> > id_send_lists(nproc);
// Fill in the id lists with correct ids here...
if (rank==0){
MPI_Request reqs[nproc-1];
for (int p=1; p<nproc; ++p){
MPI_Isend(node_id_lists[p].data(), node_id_lists[p].size(), MPI_UNSIGNED, p, 0, _communicator, &reqs[p-1]);
}
MPI_Waitall(nproc-1, reqs.data(), MPI_STATUSES_IGNORE);
}
else{
MPI_Status status;
int count;
std::vector<unsigned int> id_recv_vec;
MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
MPI_GetCount(&status, MPU_UNSIGNED, &count);
id_recv_vec.resize(count);
MPI_Recv(id_recv_vec.data(), count, MPI_UNSIGNED, 0, 0, MPI_COMM_WORLD, &status);
// Parse the id vector and create nodes here...
}
然而,出于某种原因,我的消息有时会在路上出现乱码,这取决于我正在查看的接收处理器以及我正在运行的处理器数量。例如,在1到5个处理器上运行时,我的代码似乎工作得非常好但是当我在6个处理器上运行时,发送到处理器3的消息在路上的某个地方出现乱码,只收到随机整数。然而,处理器1,2,4和5上收到的消息很好。另外,我在处理器0发送它们之前检查了ID,它们看起来很好。
奇怪的是,它在7个处理器上再次正常运行,然后在8个或更多处理器上,总是至少有一个处理器收到乱码消息。