Когда использовать теги при отправке и получении сообщений в MPI?

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

Иногда бывают случаи, когда A может послать много разных типов сообщений B. Вместо того, чтобы B должен был пройти дополнительные меры для дифференциации всех этих сообщений, MPI позволяет отправителям и получателям также указывать идентификаторы сообщений с сообщением (известным как теги). Когда процесс B запрашивает только сообщение с определенным номером тега, сообщения с разными тегами будут буферизироваться сетью, пока B не будет готов для них.

Должен ли я использовать теги, например, когда у меня есть несколько вызовов "isend" (с разными тегами) из процесса A и только 1 вызов "ireceive" в процессе B?

Ответ 1

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

Как вы сказали, теги могут использоваться для различения сообщений, которые состоят из разных типов (MPI_INTEGER, MPI_REAL, MPI_BYTE и т.д.). Вы также можете использовать теги, чтобы добавить некоторую информацию о фактических представлениях данных (если у вас есть n x n матрица, сообщение для отправки строки этой матрицы будет состоять из n значений, равно как и сообщение для отправки столбца этого матрица, тем не менее, вы можете обрабатывать данные строк и столбцов по-разному).

Обратите внимание, что операция получения должна соответствовать тегу сообщения, которое оно хочет получить. Это, однако, не означает, что вы должны указать один и тот же тег, вы также можете использовать подстановочный знак MPI_ANY_TAG качестве тега сообщения; операция получения затем будет соответствовать произвольным тегам сообщения. Вы можете узнать, какой тег используется отправителем с помощью MPI_Probe.

Ответ 2

В общем, я стараюсь избегать их. Нет необходимости использовать теги. Если вам нужно получить размер сообщения до разбора сообщения, вы можете использовать MPI_Probe. Таким образом, вы можете отправлять разные сообщения, а не указывать теги. Обычно я использую теги, потому что MPI_Recv требует, чтобы вы знали размер сообщения перед извлечением данных. Если у вас разные размеры и типы, теги могут помочь вам различать их, если несколько потоков или процессов прослушиваются в другом подмножестве. Тег 1 может означать, что сообщения типа X и тега 2 будут сообщениями типа Y. Кроме того, он позволяет вам иметь несколько "каналов" связи без необходимости выполнять работу по созданию уникальных коммуникаторов и групп.

#include <mpi.h>
#include <iostream>

using namespace std;

int main( int argc, char* argv[] )
{
    // Init MPI
    MPI_Init( &argc, &argv);

    // Get the rank and size
    int rank, size;
    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
    MPI_Comm_size( MPI_COMM_WORLD, &size );

    // If Master
    if( rank == 0 ){

        char* message_r1 = "Hello Rank 1";
        char* message_r2 = "Hello Rank 2";

        // Send a message over tag 0
        MPI_Send( message_r1, 13, MPI_CHAR, 1, 0, MPI_COMM_WORLD );

        // Send a message over tag 1
        MPI_Send( message_r2, 13, MPI_CHAR, 2, 1, MPI_COMM_WORLD );


    }
    else{

        // Buffer
        char buffer[256];
        MPI_Status status;

        // Wait for your own message
        MPI_Recv( buffer, 13, MPI_CHAR, 0, rank-1, MPI_COMM_WORLD, &status );

        cout << "Rank: " << rank << ", Message: " << buffer << std::endl;

    }

    // Finalize MPI
    MPI_Finalize();

}

Ответ 3

Теги могут быть полезны в распределенных вычислительных алгоритмах, где могут быть несколько типов сообщений. Рассмотрим проблему выбора лидера, когда процесс (кандидат на выборах) отправляет сообщение типа requestVote, а другие процессы отвечают сообщением типа voteGrant.

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