2013-05-25 32 views
1

我试图解决这个问题,因为现在几天。我有一个混合OpenMPI + Pthreads程序。这意味着,程序运行在多台机器上,每台机器运行一组pthread。OpenMPI通信问​​题

为了简化问题,让我们假设有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_Brier和P1中的MPI_Send/Recv都未注释,则程序崩溃。

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

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

有没有办法做到这一点?

+0

你使用单独的MPI通信器来设置P1和P2吗? P1和P2在同一台机器上以某种方式进行同步?如果您提供了通信代码(仅简化为通信/同步操作)会更好。 – Inspired

+0

此外,请确保使用'MPI_THREAD_MULTIPLE'通过'MPI_Init_thread'初始化MPI(而不是'MPI_Init')。 – Inspired

+0

[1]我使用相同的默认(MPI_COMM_WORLD)通信器来设置P1和P2。 [2]是的,同一台机器上的P1和P2使用pthread同步进行同步。基本上在初始化期间,P2信号P1开始通信并且在关闭期间,P2信号P1停止通信。在某种程度上,您可以将P2视为主控P1启动和关闭。 [3]我最初计划提供来自现有代码的最小通信代码。但是由于代码分布在不同的文件/方法中,这样做有点困难。 – Keval

回答

2

您所看到的错误大部分与错误初始化的MPI相似(如果您在多线程应用程序中调用了MPI_Init而不是MPI_Init_thread)。见http://www.mpi-forum.org/docs/mpi-20-html/node165.htm

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

+0

是的。这是由于MPI的初始化不正确。我现在使用MPI_Init_thread和“MPI_THREAD_MULTIPLE”。事情工作正常。谢谢启发。 – Keval