我正在使用MPI实现一个程序,其中主进程(rank=0)应该能够接收其他进程的请求,这些请求是要求根节点知道的变量值。 如果我通过rank 0进行MPI_Recv(...),则必须指定发送请求到根节点的进程的rank,但我无法控制这一点,因为进程不按顺序运行1,2,3...。 如何接收任何rank的请求,并使用发射进程的数字发送必要的信息?
我正在使用MPI实现一个程序,其中主进程(rank=0)应该能够接收其他进程的请求,这些请求是要求根节点知道的变量值。 如果我通过rank 0进行MPI_Recv(...),则必须指定发送请求到根节点的进程的rank,但我无法控制这一点,因为进程不按顺序运行1,2,3...。 如何接收任何rank的请求,并使用发射进程的数字发送必要的信息?
假设您正在使用C语言。 C ++和Fortran中有类似的概念。您只需在MPI_recv()
中指定MPI_ANY_SOURCE
作为来源即可。状态结构包含消息的实际来源。
int buf[32];
MPI_Status status;
// receive message from any source
MPI_recv(buf, 32, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
int replybuf[];
// send reply back to sender of the message received above
MPI_send(buf, 32, MPI_INT, status.MPI_SOURCE, tag, MPI_COMM_WORLD);
MPI_ANY_SOURCE是显而易见的答案。
然而,如果所有的进程都将向rank 0发送请求,则MPI_Irecv与MPI_Testall结合可能也可以作为一种模式。这将允许MPI_Send调用以任意顺序执行,并且信息可以按照MPI_Irecv调用匹配的顺序接收和处理。
status
结构确实用于MPI_Send
操作以识别原始消息的来源:status.MPI_SOURCE
。 - Marius