几天以来,我一直在尝试解决此问题。我有一个混合 OpenMPI + Pthreads 程序。这意味着,程序在多台机器上运行,每台机器运行一组 pthread。
为了简化问题,我们假设有 3 台机器,每台运行 2 个 pthread:P1 和 P2。现在,每台机器上的 P1 使用 MPI_Send/Recv 不断地与其他机器上的 P1 通信。同时,P2 做一些工作并定期调用 MPI_Barrier(与其他机器上的 P2 同步)。这会导致 MPI_Send/Recv 方法失败,并且程序会因随机错误而崩溃,例如:对等方重置连接 / 错误文件描述符 / tcp 错误 / 等。
- 如果我从 P2 中注释掉 MPI_Barrier,一切正常。
- 如果我从 P1 注释掉 MPI_Send/Recv,一切正常。
- 如果 P2 中的 MPI_Barrier 和 P1 中的 MPI_Send/Recv 都未注释,则程序崩溃。
因此,我能想到的唯一原因是 MPI_Barrier 和 MPI_Send/Recv 在底层通信级别相互影响。
但是,我确实需要 P1 中的通信(如 MPI_Send/Recv)和 P2 中的同步(如 MPI_Barrier)以保持语义正确性。而且我同时需要它们(这意味着我不想在达到同步点之前暂停通信,然后从它离开的地方继续通信)。
有没有办法做到这一点?