1

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

为了简化问题,我们假设有 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)以保持语义正确性。而且我同时需要它们(这意味着我不想在达到同步点之前暂停通信,然后从它离开的地方继续通信)。

有没有办法做到这一点?

4

1 回答 1

2

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

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

于 2013-05-25T19:25:24.760 回答