c++ - OpenMPI 通信问题

标签 c++ pthreads mpi

几天以来,我一直在努力解决这个问题。我有一个混合 OpenMPI + Pthreads 程序。这意味着,程序在多台机器上运行,每台机器运行一组 pthreads。

为了简化问题,让我们假设有 3 台机器,每台机器运行 2 个 pthread:P1 和 P2。现在,每台机器上的 P1 使用 MPI_Send/Recv 与其他机器上的 P1 持续通信。同时,P2 做一些工作并定期调用 MPI_Barrier(与其他机器上的 P2 同步)。这会导致 MPI_Send/Recv 方法失败,并且程序会因随机错误而崩溃,例如:连接由对等方重置/错误的文件描述符/tcp 错误等。

  1. 如果我从 P2 注释掉 MPI_Barrier,一切正常。
  2. 如果我从 P1 注释掉 MPI_Send/Recv,一切正常。
  3. 如果 P2 中的 MPI_Barrier 和 P1 中的 MPI_Send/Recv 都没有注释,程序就会崩溃。

因此,我能想到的唯一原因是 MPI_Barrier 和 MPI_Send/Recv 在底层通信级别相互影响。

但是,我确实需要 P1 中的通信(如 MPI_Send/Recv)和 P2 中的同步(如 MPI_Barrier)以保持语义正确性。我同时需要它们(这意味着我不想在达到同步点之前暂停通信,然后从它离开的地方继续通信)。

有办法吗?

最佳答案

您得到的错误看起来主要是 MPI 初始化不正确(就像您在多线程应用程序中调用了 MPI_Init 而不是 MPI_Init_thread 一样)。参见 http://www.mpi-forum.org/docs/mpi-20-html/node165.htm .

如果问题仍然存在,我还建议您至少为 MPI_Barrier() 调用使用单独的 MPI 通信器。

关于c++ - OpenMPI 通信问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16752950/

相关文章:

c++ - 内存泄漏std::vector 管理c++

c++ - 如何将 vector 从存储库返回到服务层

c - 线程传递参数

mpi - 我可以从执行的程序中获取 mpiexec 命令行参数吗?

数组结构的 MPI 数据类型

c++ - 如何将 int* 转换为 int

C++:使用选择()

c++ - Totalview:有没有办法硬编码断点?

c - 使用线程,我应该如何处理理想情况下应该按顺序发生的事情?

c - 使用条件变量进行异步执行。