Parallel processing MPI接收和发送功能是否相互阻塞?

Parallel processing MPI接收和发送功能是否相互阻塞?,parallel-processing,mpi,Parallel Processing,Mpi,假设我有一个MPI进程_0等待来自两个不同进程(进程_1和进程_2)的消息。大概是这样的: ... MPI_Recv(&message_1, 1, MPI_INT, process_1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); MPI_Recv(&message_2, 1, MPI_INT, process_2, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); ... 想象一下这样的场景:当进程_2在进程_1之

假设我有一个MPI进程_0等待来自两个不同进程(进程_1和进程_2)的消息。大概是这样的:

...
MPI_Recv(&message_1, 1, MPI_INT, process_1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(&message_2, 1, MPI_INT, process_2, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
...
想象一下这样的场景:当进程_2在进程_1之前将其消息发送到进程_0。然后呢

我猜进程_0必须先接收来自进程_1的消息,然后才能读取来自进程_2的消息


进程2的发送函数会发生什么情况?在进程0可以接收消息之前,它是否会在尝试传递消息的发送函数处卡住?或者,它是否会发送消息,而不管进程0是否已接收到该消息,并在发送功能后继续运行连续代码?

根据MPI标准,正确的程序应始终假定阻塞发送(例如,
MPI\u send()
)将阻塞,直到发布匹配的接收

请注意,如果消息足够短(取决于您的MPI实现、互连和其他因素),它可能会以急切模式发送,
MPI\u Send()
将立即返回。如果您的MPI实现具有进度线程,
MPI\u Send()
也可能在发布匹配的接收之前返回。也就是说,您不应该假设这是标准强制的行为,如果您想编写可移植代码,您应该假设
MPI\u Send()
将始终阻止,直到发布匹配的接收。

进程2的Send函数会发生什么?这在很大程度上取决于P2发送此消息的方式。在4种不同的通信模式(标准、缓冲、同步和就绪)中分别有阻塞和非阻塞发送操作。