这几天以来,我一直在努力解决这个问题。我有一个混合的OpenMPI +多线程程序。这意味着程序在多台机器上运行,因此每台机器都运行一组p线程。
为了简化这个问题,让我们假设有3台机器,每台机器都运行两个线程: 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)来维护语义正确性。我同时需要它们(这意味着我不想在到达同步点之前暂停通信,然后从它离开的地方继续通信)。
有办法这样做吗?
发布于 2013-05-25 19:25:24
您所得到的错误主要是一个错误初始化的MPI (就好像您在多线程应用程序中调用了MPI_Init而不是MPI_Init_thread )。见http://www.mpi-forum.org/docs/mpi-20-html/node165.htm。
如果问题仍然存在,我还建议您至少在MPI_Barrier()调用时使用单独的MPI通信器。
https://stackoverflow.com/questions/16752950
复制相似问题