MPI中发送和接收消息时何时使用标签?

30
我不确定在MPI发送和接收调用中的tag字段何时需要使用不同的数字。我已经阅读了这篇文章,但我无法理解它。
有时A可能需要向B发送许多不同类型的消息。为了避免B必须采取额外的措施来区分所有这些消息,MPI允许发送方和接收方在消息中指定消息ID(称为标签)。当进程B仅请求具有特定标记号的消息时,具有不同标记的消息将被网络缓冲,直到B准备好接收它们。
例如,当进程A从多个" isend "调用(具有不同标记)中进行选择,并且只有一个"ireceive"调用的进程B时,是否必须使用标记?

1
在这种情况下,您在接收端使用MPI_TAG_ANY,在接收后查看状态结构以确定使用了哪个标记,然后相应地进行处理。 - Jonathan Dursi
3个回答

23

消息标签是可选的。您可以使用任意整数值并使用您认为有用的任何语义来区分它们。

如您所建议,可以使用标签来区分由不同类型(MPI_INTEGERMPI_REALMPI_BYTE等)组成的消息。您还可以使用标签来添加一些关于数据实际表示的信息(如果您有一个 n x n 的矩阵,则发送此矩阵的一行的消息将包含 n 个值,发送该矩阵列的消息也将包含 n 个值;尽管如此,您可能还想以不同的方式处理行和列数据)。

请注意,接收操作必须匹配要接收的消息的标签。但是,这并不意味着您必须指定相同的标签,您也可以使用通配符MPI_ANY_TAG作为消息标签;接收操作将匹配任意消息标签。您可以通过使用MPI_Probe来找出发送者使用了哪个标签。


14

通常我会避免使用标签。你不必使用标签。如果你需要在解析消息之前获取消息大小,可以使用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();

}

如果我需要按顺序(1次发送=1条消息)从进程A发送多条消息到进程B,那么不需要更改标签,对吗? - FrancescoN
是的,只有当您计划发送不同类型的消息时才需要不同的标签。否则,0 是可以的。 - msmith81886
不同的类型只是指例如MPI_INTEGER和MPI_REAL,对吗? - FrancescoN
这是一个很好的例子。虽然它不是那么具体。您可以通过两个标签发送整数,其中tag1是某个东西的ID,第二个标签可以是值。关键在于标签是完全可选的,用户可以根据自己的术语区分它们。 - msmith81886

5

标签在分布式计算算法中非常有用,因为可以有多种类型的消息。考虑领导者选举问题,其中一个进程(选举候选人)发送一条请求投票的消息,其他进程则会回复一个授予投票的消息。

有许多这样区分消息类型的算法,而标签可以有助于对这些消息进行分类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接