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