Как получить сценарий тупика с повышением MPI (я использую компилятор MPICH)?

Я пытаюсь выяснить, в каких случаях потенциально блокирующая надстройка mpi «send» фактически блокирует и вызывает тупик.

#include <boost/mpi.hpp>
#include <iostream>

int main(int argc, char *argv[])
{
boost::mpi::environment env{argc, argv};
boost::mpi::communicator world;
if (world.rank() == 0)
{
char buffer[14];
const char *c = "Hello, world from 1!";
world.send(1, 1, c, 13);
std::cout << "1--11111\n";
world.send(1, 1, c, 13);
std::cout << "1--22222\n";
world.recv(1, 1, buffer, 13);
std::cout << "1--33333\n";
world.recv(1, 1, buffer, 13);
std::cout << "1--44444\n";
buffer[13] = '\0';
std::cout << buffer << "11 \n";
}
else
{
char buffer[14];
const char *c = "Hello, world from 2!";
world.send(0, 1, c, 13);
std::cout << "2--11111\n";
world.send(0, 1, c, 13);
std::cout << "2--22222\n";
world.recv(0, 1, buffer, 13);
std::cout << "2--33333\n";
world.recv(0, 1, buffer, 13);
std::cout << "2--44444\n";
buffer[13] = '\0';
std::cout << buffer << "22 \n";
}
}

но он работает нормально и с этим заказом:

2--11111
2--22222
1--11111
1--22222
1--33333
1--44444
Hello, world 11
2--33333
2--44444
Hello, world 22

Я буду благодарен, если кто-то может дать мне сценарий, в котором я на самом деле зашел в тупик.
Как работает потенциально блокирующий boost mpi?

Спасибо.

0

Решение

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

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

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

буферном Отправить (MPI_Bsend) необходимо заполнить, даже если получатель не опубликован. Помимо режимов есть неблокирующий или же немедленный вызовы, которые всегда будут выполняться локально, но еще не могут скопировать данные. Оба гарантируют отсутствие тупика. Однако только последний поддерживается boost.MPI.

1: блокирование в терминологии только означает, что вызов блокируется, пока буфер отправки не может быть повторно использован. Либо потому, что оно было отправлено, либо потому что оно буферизовано локально. Также взгляните на стандарт.

2

Другие решения

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

1