中MPI
,是否有任何内置机制来通知一组进程他们需要从其他进程接收消息?
在我的应用程序中,每个进程都需要将数据发送到具有已知等级 ID 的一组进程(在每次迭代中可能会发生变化),但它们不知道将从中接收消息的进程的等级。是否有一种可移植的、最好是内置的方法来实现这一点,而无需查询每个进程?
中MPI
,是否有任何内置机制来通知一组进程他们需要从其他进程接收消息?
在我的应用程序中,每个进程都需要将数据发送到具有已知等级 ID 的一组进程(在每次迭代中可能会发生变化),但它们不知道将从中接收消息的进程的等级。是否有一种可移植的、最好是内置的方法来实现这一点,而无需查询每个进程?
其他人已经提出了各种 MPI_Probe 变体,但我想指出一件事:MPI 不是远程过程调用,即,没有办法通知进程某些消息已进入(例如,通过发出信号)。消息已发送,但如果接收进程实际上并没有去寻找它们,那么什么也不会发生。因此,您的问题的答案是“否”,但进程可以主动确定是否已向其发送消息。
您可以尝试让所有处理器使用MPI_IProbe或MPI_Probe和 MPI_ANY_SOURCE 来检查是否有任何带有给定标签的可接收消息。如果有匹配的消息,您可以从返回的状态中提取发件人排名并立即调用 MPI_Recv。
http://mpitutorial.com/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/有一个描述 MPI_Probe 使用的教程,可能对您有用。
如果发送者知道他们发送给谁,但接收者不知道他们从谁那里接收,只需从 MPI_ANY_SOURCE 发布您的接收。这将使接收与任何向其发送消息的进程相匹配。
如果接收者实际上可能根本没有收到任何东西,他们可以发布 iRecv。每当一个进程完成发送它的消息时,它就可以在 Ibarrier 中发布。当Ibarrier完成时,因为所有进程都进入了它(并在请求对象上调用了MPI_WAIT),每个人都知道通信完成,他们可以取消他们之前的Irecv。