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

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

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

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


person Ankur Gautam    schedule 10.07.2013    source источник


Ответы (1)


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

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

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

person Wesley Bland    schedule 11.07.2013
comment
И самое главное, я почти уверен, что данные принимаются в принимающем процессе при использовании MPI_Send(), поэтому этот вывод не дает ничего в пользу ожидания рукопожатия при использовании MPI_Ssend(). мой код отлично работает с MPI_Send(), но бесконечно ждет с MPI_Ssend(). Можете ли вы назвать какие-либо возможные причины? - person Ankur Gautam; 11.07.2013
comment
Это будет полностью зависеть от вашего кода. Если по какой-то причине ваш код не достигает соответствующего вызова MPI_RECV без перехода от MPI_SEND по какой-то причине, это может привести к взаимоблокировке, но это невозможно определить, не видя кода. - person Wesley Bland; 11.07.2013
comment
stackoverflow.com/questions/17820445/ может пожалуйста, ответьте на это? - person Ankur Gautam; 24.07.2013