在MPI项目中使用以下代码有什么问题吗?它可能会产生死锁或缓冲区重叠吗?
//send a data to all nodes on receiver list
for (auto &e : receivers_list) {
MPI_Request request;
MPI_Isend( &data, 1, MPI_INT, e.remot_id , 1234 , MPI_COMM_WORLD, &request);
}
//read data from senders
MPI_Request request_arr[senders_list.size()];
for (auto &e : senders_list) {
MPI_Irecv (&data, 1, MPI_INT, e.remot_id, MPI_ANY_TAG, MPI_COMM_WORLD, &request_arr[request_index++]);
}
//wait for all receives complete
for (int count_recv = 0; count_recv < senders_list.size(); ++count_recv) {
MPI_Waitany(senders_list.size(), request_arr, &request_index, MPI_STATUS_IGNORE);
//do some code here ....
}
答案 0 :(得分:1)
您发布的代码段中存在一些问题,我将在此处详细说明:
data
缓冲区。这是非常非常错误的,这有两个层面:
MPI_Wait()
等)是被禁止的。实际上,这几乎是一种防止我的第一点所描述的竞争条件的方法,但这意味着代码不仅是未定义的行为,从MPI标准的角度来看也是错误的。MPI_Test()
始终重用相同的MPI_Isend()
,在每次迭代时覆盖其值。这意味着您在前一次调用时丢失了任何句柄,从而阻止您强制完成它们,并可能泄漏MPI库中的内存。您应该使用一组请求,就像在接收循环中一样。这就是代码的样子:
request