OpenMPI通信问​​题

时间:2013-05-25 19:02:08

标签: c++ pthreads mpi

我正在努力解决这个问题,因为现在几天。我有一个混合的OpenMPI + Pthreads程序。这意味着,程序在多台机器上运行,以便每台机器运行一组pthread。

为了简化问题,让我们假设有3台机器,每台机器运行2个pthreads: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都未被注释,程序将崩溃。
  4. 因此,我能想到的唯一原因是MPI_Barrier和MPI_Send / Recv在基础通信级别上相互影响。

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

    有办法做到这一点吗?

1 个答案:

答案 0 :(得分:2)

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

如果问题仍然存在,我还建议你至少使用一个单独的MPI通讯器进行MPI_Barrier()通话。