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

18

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

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

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

    
задан Ankur Gautam 11.07.2013 в 01:57
источник

1 ответ

30

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

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

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

    
ответ дан Wesley Bland 11.07.2013 в 14:41
источник
  • И самое главное, я уверен, что данные принимаются в процессе приема при использовании MPI_Send (), поэтому этот вывод ничего не ведет к ожиданию рукопожатия при использовании MPI_Ssend (). мой код отлично работает с MPI_Send (), но ждет неопределенного времени с MPI_Ssend (). Можете ли вы придумать возможные причины? –  Ankur Gautam 11.07.2013 в 17:30
  • Это будет полностью зависеть от вашего кода. Если по какой-то причине ваш код не достигает соответствующего вызова MPI_RECV без прогрессирования из MPI_SEND по какой-то причине, это может вызвать тупик, но невозможно сказать, не видя код. –  Wesley Bland 11.07.2013 в 19:44
  • stackoverflow.com/questions/17820445/... можете ли вы ответить на это? –  Ankur Gautam 23.07.2013 в 22:30
  • +1 для ссылки на стандарт MPI. –  Paulo Tomé 02.12.2013 в 00:07