Когда использовать теги при отправке и получении сообщений в 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.
Существует много таких алгоритмов, которые различают типы сообщений и тег, которые могут быть полезны для классификации среди таких сообщений.