我有一个小的通信问题,耗费了数小时的搜索。我正在使用MPICH2在不同的工作人员之间进行通信。在我的程序的某些点上,一个过程需要向一小部分工人(在总共20个中的2个或3个)中多次传递消息。因此,我暂时需要创建一个包含所有这些工作者的级别的组,然后使用MPI_BCast。但是,这似乎是不可能的!
我尝试过MPI_Comm_Create,但程序只是挂起,因为它需要“每个”工作者调用MPI_Comm_Create。我不能也使用MPI_Comm_Split因为我事先不知道收件人工作人员的等级因此无法对它们进行颜色编码。
你能帮帮我吗。
答案 0 :(得分:0)
为什么你需要创建一个新的沟通者?
您的描述,您实际想要达到的目标以及约束条件有点缺乏,但这里有一些提示,可能适用于您的问题。
我认为,坚持传统的双向沟通,您需要在某个时候进行涉及识别收件人的所有流程的沟通。例如,您可以向作为接收者的每个人广播,然后将实际消息发送给具有点对点通信的人(如果这种关系将随着时间的推移而改变,我不会为每个创建一个新的通信器而烦恼时间)。
您可以使用MPI的片面通信概念,并简单地将来自广播等级的消息写入接收等级的专用存储区域。然而,单方面通常被认为有些不好,而且在表现方面也不太好。
使用MPI-3,您可以利用非阻挡屏障:所有进程都打开屏障,那些不是广播级别的进程立即开始测试完成此屏障,打开非屏障阻止接收任何来源并定期测试,否则他们照常进行。然而,广播等级开始向实际接收者发送其消息,并且当它完成时,它等待非阻塞屏障完成。现在,所有进程都会找到完成的障碍,现在他们可以停止监听接收,那些没有收到消息的人可以简单地向自己发送消息以正确关闭通信并继续进行计算。