MPI получать и отправлять функции блокируя друг друга? - PullRequest
0 голосов
/ 04 марта 2020

Допустим, у меня есть MPI process_0, ожидающий сообщений от двух разных процессов (process_1 и process_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);
...

Представьте себе сценарий, в котором когда process_2 отправляет свое сообщение process_0, перед process_1. Что происходит тогда?

Я полагаю, что process_0 должен получить сообщение от process_1, прежде чем сможет прочитать сообщение от process_2?

Что происходит с функцией отправки в process_2? Будет ли она зависать в функции send, пытающейся доставить сообщение, пока process_0 не сможет ее получить? Или он отправит сообщение, не заботясь о том, получил ли process_0 его или нет, и продолжит выполнение последовательного кода после функции отправки?

1 Ответ

1 голос
/ 05 марта 2020

Согласно стандарту MPI, правильная программа всегда должна предполагать, что блокирующая отправка (например, MPI_Send()) будет блокироваться до тех пор, пока не будет опубликован соответствующий прием.

Обратите внимание, что если сообщение достаточно короткое (в зависимости от ваша реализация MPI, ваше межсоединение и другие факторы), она может быть отправлена ​​в активном режиме и MPI_Send() немедленно вернется. Если ваша реализация MPI имеет поток выполнения, MPI_Send() может также вернуться до публикации соответствующего получения. При этом вы не должны предполагать, что это поведение, предписанное стандартом, и если вы хотите написать переносимый код, вы должны предположить, что MPI_Send() всегда будет блокировать, пока не будет опубликован соответствующий прием.

...