Подтвердить что ты не робот

Разница между MPI_Send() и MPI_Ssend()?

Я знаю, что MPI_Send() - это блокирующий вызов, который ждет, пока не будет безопасно модифицировать буфер приложения для повторного использования. Для того, чтобы синхронный вызов отправки (должно быть рукопожатие с приемником), мы должны использовать MPI_Ssend(). Я хочу знать разницу между ними. Предположим, мне нужно отправить количество исправлений Bytes между процессами, на которые, как предполагается, требуется больше времени?
Со мной код хорошо работает с вызовом MPI_Send(), но для неопределенного ожидания для MPI_Ssend(). Каковы могут быть возможные причины?

И самое главное, я уверен, что данные принимаются в процессе приема при использовании MPI_Send(), поэтому этот вывод ничего не ведет к ожиданию рукопожатия при использовании MPI_Ssend().

Или я могу сделать вывод: при MPI_Send() вы можете отправлять данные в самостоятельный процесс, но не можете использовать MPI_Ssend()?

4b9b3361

Ответ 1

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

Разница между этим и MPI_SSEND заключается в том, что последний всегда будет ждать, пока получение не будет опубликовано на принимающей стороне. Даже если сообщение маленькое и может быть буферизовано внутри, оно все равно будет ждать, пока сообщение не будет получено на другой стороне.

MPI_SSEND - это способ гарантировать, что оба процесса достигли определенной точки своего выполнения, например, без необходимости выполнять MPI_BARRIER. Если ваша заявка отправляет и получает в один и тот же ранг и обратно, это небезопасно делать MPI_SEND ИЛИ MPI_SSEND, поскольку любой из них может блокироваться на неопределенный срок. Вместо этого вы должны использовать MPI_ISEND и MPI_IRECV чтобы вызовы немедленно возвращались, а фактическая отправка/получение могла выполняться одновременно (при вызове MPI_WAITALL).