在新MPI_Isend之前使用MPI_Wait
Using MPI_Wait before a new MPI_Isend
我正在尝试使用MPI_Wait来阻止以前可能调用或可能未调用的MPI_Isend,但它似乎没有阻止下一个MPI_Isend。
基本上,如果之前调用过MPI_Isend并且没有收到,那么我想等到它被接收。之后打电话给一个新的MPI_Isend。每个进程都应始终探测传入的消息并动态接收它们。
for (time_stamp=0; time_stamp<time_max; time_stamp++) { // for each time stamp
// Probe for incoming particles from any process
MPI_Iprobe(MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &flag, &statRec);
// Receive particles from a process
if(flag){
std::cout << "Recieved from rank: " << statRec.MPI_SOURCE << "n";
int recCount{};
MPI_Get_count(&statRec, MPI_Particle, &recCount);
Particle *recbuf = new Particle[recCount];
MPI_Recv(recbuf, recCount, MPI_Particle, statRec.MPI_SOURCE, statRec.MPI_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
for(int i=0; i<recCount; i++)
Particles.emplace_back(recbuf[i]);
delete[] recbuf;
}
int n = (int)Particles.size(), totalp = 0;
MPI_Reduce(&n, &totalp, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
if(rank == root)
std::cout << "Total particles " << totalp << "n";
/* Do particle operations, put them in sendlists
and delete them from this ranks own particle list.... */
// Send to another process
if(!sendParticles.empty()) {
MPI_Wait(&req, MPI_STATUS_IGNORE);
std::cout << "Sending from rank " << rank << "... n" ;
delete[] sendBuf;
sendcount = static_cast<int>(sendParticles.size());
sendBuf = new Particle[sendcount];
for(int i=0; i<sendParticles.size(); i++)
sendBup[i] = sendParticles[i];
MPI_Isend(sendBuf, sendcount, MPI_Particle, some_other_rank, 0, MPI_COMM_WORLD, &req);
}
}
输出:
总粒子数 1000
从等级 1 发送...
从等级 0 发送...
总粒子数 998
从等级 1 发送...
从等级 0 发送...
从等级接收: 1
总粒子数 994
从等级 1 发送...
从等级接收:0
从等级 0 发送...
从等级接收:1
总粒子数 993
从等级 0 发送...
从等级接收:1
总粒子数 993
从等级 1 发送...
从等级 0 发送...
如您所见,它尝试为两个进程连续发送 2 次,忽略MPI_Wait。它似乎也一直在减少到粒子总数,我猜有些会丢失,因为它会覆盖发送缓冲区,因为它不等待。
(对代码进行了一些编辑,使其更具可读性(
如果你对来自前一个MPI_ISend()
的请求调用MPI_Wait()
,那么它将阻塞,直到可以重用发送缓冲区。
从非常接地气的角度来看,如果消息足够短,它将立即返回,并挂起,直到以其他方式发布匹配的接收。 (足够短取决于您的 MPI 库、互连和其他因素。 注意 您永远不应该想当然地认为MPI_Wait()
会立即返回小消息(。
您的描述表明您需要将MPI_Isend()
替换为MPI_Issend()
。
请注意,该标准仅在发布匹配的接收时要求MPI_Wait()
返回,因此严格地说,它可能在远程对等方完全接收消息之前返回。
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- std::memory_order for std::atomic:<T>:wait
- MPI突然停止了对多个核心的操作
- 设置 Visual Studio for MPI: 找不到标识符错误
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 重载 MPI 中的运算符 ()
- MPI:检查是否有任何进程已终止
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 使用 pybind11 共享 MPI 通信器
- 使用 CMake,Microsoft MPI 和 Visual Studio 2017 找不到 mpi.h
- 在具有 MPI 的超立方体中广播
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 使用 MPI 的 C++ 中的并行 for 循环
- 如何将 OpenMP 和 MPI 导入到大型 CLion CMake 项目中?
- 如何通过Boost.MPI发送2d Boost.MultiArray的子阵列?
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- HDF5 构建了并行支持,但找不到特定于 mpi 的功能