отправка нескольких сообщений разной длины с одинаковым рангом

Допустим, у меня 3 ранга.

Ранг 0 получает 1 MPI_INT с ранга 1 и получает 10 MPI_INT с ранга 2:

MPI_Recv(buf1, 1, MPI_INT,
    1, 0, MPI_COMM_WORLD, &status);
MPI_Recv(buf2, 10, MPI_INT,
    2, 0, MPI_COMM_WORLD, &status);

Ранг 1 и ранг 2 отправляют 1 и 10 MPI_INT на ранг 0 соответственно. MPI_Recv - это блокирующий вызов. Предположим, что 10 MPI_INIT из ранга 2 прибывают до 1 MPI_INT из ранга 1. В этот момент блоки ранга 0 ожидают данных из ранга 1.

В этом случае может ли вернуться первый MPI_Recv? Сначала поступают данные из ранга 2, но данные не помещаются в buf1, который может содержать одно целое число.

И тогда приходит сообщение с ранга 1. Может ли MPI выбрать это сообщение и позволить первому MPI_Recv вернуться?


person JACK M    schedule 14.04.2018    source источник


Ответы (1)


Поскольку вы указываете источник при вызове MPI_Recv(), у вас нет времени беспокоиться о порядке сообщений. Первый MPI_Recv() вернется, когда будет получен 1 MPI_INT из ранга 1, а второй MPI_Recv() вернется, когда 10 MPI_INT будут получены из ранга 2.

Если бы у вас было MPI_Recv(..., source=MPI_ANY_SOURCE, ...), это была бы другая история.

Не стесняйтесь писать простую программу с sleep() кое-где, если вам все еще нужно убедить себя.

person Gilles Gouaillardet    schedule 14.04.2018