MPI 不能丢失消息,除非它们是在“准备好的”模式下发送的,即使用MPI_Rsend
or MPI_Irsend
,而接收者还没有准备好,这显然不是你的情况。MPI_Isend
启动发送操作,但不能保证完成,除非它进行到完成。许多 MPI 调用会导致进行非阻塞操作,但最显式的调用是MPI_Wait
及其变体。还有一些 MPI 实现具有在后台进行非阻塞操作的特殊进程线程(例如,可以通过这种方式编译 Open MPI)。
如果第二个消息非常小并且正在使用不同的发送模式(例如,一些急切的发送协议),则第二个消息可能在第一个消息之前到达。MPI 仅保证具有相同信封的消息保持有序。消息信封是元组(发送者、接收者、标签、通信者)。
您还谈到从不同线程发送消息。您确定您的 MPI 库是线程安全的,并且您是否使用MPI_THREAD_MULTIPLE
线程支持级别对其进行了初始化,例如:
int provided;
MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
if (provided != MPI_THREAD_MULTIPLE)
{
printf("Sorry, your MPI library does not provide MPI_THREAD_MULTIPLE\n");
MPI_Abort(MPI_COMM_WORLD, 0);
}