Mpi 动态创建通讯器

Mpi 动态创建通讯器,mpi,mpich,Mpi,Mpich,我有一个小的沟通问题,花了几个小时的搜索时间。我使用MPICH2在不同的工人之间进行沟通。在我的程序中的某些时候,一个进程需要向一小部分工作人员(总共20个工作人员中的2到3个)多播一条消息。因此,我暂时需要创建一个包含所有这些工作人员级别的组,然后使用MPI_BCast。然而,这似乎是不可能的 我已经尝试过MPI_Comm_Create,但该程序只是挂起,因为它需要“每个”工作者调用MPI_Comm_Create。我也不能使用MPI_Comm_Split,因为我事先不知道收件人员工的级别,因此

我有一个小的沟通问题,花了几个小时的搜索时间。我使用MPICH2在不同的工人之间进行沟通。在我的程序中的某些时候,一个进程需要向一小部分工作人员(总共20个工作人员中的2到3个)多播一条消息。因此,我暂时需要创建一个包含所有这些工作人员级别的组,然后使用MPI_BCast。然而,这似乎是不可能的

我已经尝试过MPI_Comm_Create,但该程序只是挂起,因为它需要“每个”工作者调用MPI_Comm_Create。我也不能使用MPI_Comm_Split,因为我事先不知道收件人员工的级别,因此无法对他们进行颜色编码


你能帮帮我吗。

你为什么要创建一个新的通讯器

您的描述、您实际想要实现的目标以及约束条件有点欠缺,但这里有一些提示,可能适用于您的问题

  • 坚持传统的双边沟通,我想,在某个时候,你需要一种沟通,它涉及识别接收者的所有过程。例如,您可以向每个将成为接收者的人广播,然后将实际的消息发送给那些进行点对点通信的人(如果这种关系将随着时间的推移而改变,我不会每次都创建一个新的通信者)

  • 您可以使用MPI的单边通信概念,只需将消息从广播列写入接收列的专用内存区域。然而,片面性通常被认为是不好的,在性能方面也不太好

  • 使用MPI-3,您可以使用非阻塞屏障:所有进程都打开该屏障,而非广播级别的进程立即开始测试该屏障的完成情况,为任何源打开非阻塞接收,并定期测试该源,否则它们将照常进行。然而,广播列组开始向实际的接收者发送消息,完成后,等待非阻塞屏障完成。现在,所有进程都会发现障碍需要完成,现在它们可以停止监听接收,那些没有收到消息的人只需向自己发送一条消息,以正确地关闭通信并继续计算

可能的副本