Что произойдет, когда я MPI_Send завершить процесс? - PullRequest
2 голосов
/ 20 апреля 2010

Что произойдет, когда я MPI_Send завершил процесс?

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

Могу ли я сделать:

if (MPI_Send(...)) {
    ...
    /* destination has ended */
    ...
}

А игнорировать код ошибки?

Спасибо

Ответы [ 2 ]

1 голос
/ 22 апреля 2010

Написание кода с несогласованными вызовами MPI_Send не разрешено стандартом. Среди прочего, это означает, что получающееся поведение будет зависеть от реализации. Диапазон возможных вариантов поведения включает несколько «очевидных» вариантов: выход, зависание / тупик, повреждение памяти и т. Д.

Большинство реализаций имеют некоторый уровень вывода отладочной информации, который может быть полезен для отслеживания такого рода логической ошибки программирования. Можно использовать MPI_Wait * для барьера на завершение всех пар MPI_Send / MPI_Recv. В общем случае невозможно знать, что MPI_Send не будет сопоставлен до тех пор, пока принимающий узел не введет MPI_Finalize. Иными словами, использование барьера в этом состоянии приведет к зависанию программы.

В любом случае это было бы ошибочным условием для MPI_Finalize. Целевой ранг для MPI_Send должен быть обнаружен как выходящий ... так что MPI_Send никогда не может быть сопоставлен. Однако этот тип ошибки может привести к сбою задания MPI для очистки всех процессов ранга.

0 голосов
/ 21 апреля 2010

Насколько мне известно, стандарт MPI не определяет никаких возвращаемых значений и параметров out для MPI_Send (): он не предоставляет никакой информации о событии отправки сообщения, возможно, потому что буферизация сообщения может сделать так, что нет информация о результате доступна на момент возврата вызова.

Если вы хотите, чтобы один процесс видел, когда завершается другой, вы должны отправить сообщение из завершающего процесса с указанным тегом, и постидокально опубликовать неблокирующее получает в другом процессе, чтобы увидеть, было ли уведомление о выходе отправлено.

Или, если вы хотите, чтобы вся программа прерывалась при остановке одного процесса, проще всего просто вызвать MPI_Abort () в завершающем процессе с MPI_COMM_WORLD в качестве коммуникатора, который гарантированно завершит работу всех процессов.

Редактировать: На самом деле ответить на вопрос в заголовке: «Что происходит, когда я MPI_Send завершить процесс?»: Насколько я понимаю, это зависит от того, используется ли буферизация или нет. Если буферизация не используется, то программа зависнет. Если используется буферизация, то MPI_Send () будет буферизировать сообщение, и процесс продолжит выполняться, но, поскольку не будет отправлено ни одного соответствующего приема, сообщение никогда не покинет буфер. Многое в конечном итоге приведет к тому, что программе не хватит памяти.

...