我正在努力解决这个问题,因为现在几天。我有一个混合的OpenMPI + Pthreads程序。这意味着,程序在多台机器上运行,以便每台机器运行一组pthread。
为了简化问题,让我们假设有3台机器,每台机器运行2个pthreads:P1和P2。现在,每台机器上的P1使用MPI_Send / Recv连续与其他机器上的P1通信。同时,P2做了一些工作并定期调用MPI_Barrier(与其他机器上的P2同步)。这使MPI_Send / Recv方法失败,并且程序崩溃时出现随机错误,例如:通过对等/错误文件描述符/ tcp错误等连接重置。
因此,我能想到的唯一原因是MPI_Barrier和MPI_Send / Recv在基础通信级别上相互影响。
但是,我确实需要P1中的通信(如MPI_Send / Recv)和P2中的同步(如MPI_Barrier)以保持语义正确性。我同时需要它们(这意味着我不想在达到同步点之前暂停通信,然后继续从它离开的地方继续通信)。
有办法做到这一点吗?
答案 0 :(得分:2)
您看到的错误大多与初始化错误的MPI相似(就像您在多线程应用程序中调用MPI_Init
而不是MPI_Init_thread
一样)。请参阅http://www.mpi-forum.org/docs/mpi-20-html/node165.htm。
如果问题仍然存在,我还建议你至少使用一个单独的MPI通讯器进行MPI_Barrier()
通话。