【问题标题】:When to use tags when sending and receiving messages in MPI?在 MPI 中发送和接收消息时何时使用标签?
【发布时间】:2015-10-01 21:52:49
【问题描述】:

我不确定何时必须为 MPI 发送、接收呼叫中的 tag 字段使用不同的数字。我看过this,但看不懂。

有时 A 可能需要发送许多不同的 给 B 的消息类型。而不是 B 必须经过额外的 区分所有这些消息的措施,MPI 允许发送者和 接收者还可以使用消息指定消息 ID(称为 标签)。当进程 B 只请求带有某个标签的消息时 number,不同标签的消息会被网络缓存 直到 B 为他们准备好。

我是否必须使用标签,例如,当我从进程 A 多次调用“isend”(使用不同的标签)而在进程 B 中只有 1 次调用“ireceive”时?

【问题讨论】:

  • 本例你在receive端使用MPI_TAG_ANY,查看receive后的Status结构,判断使用的是哪个tag,并进行相应处理。

标签: mpi


【解决方案1】:

一般来说,我倾向于避开它们。不要求您使用标签。如果需要在解析消息前获取消息大小,可以使用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 不需要更改标签,对吗?跨度>
  • 是的。如果您计划发送不同类型的消息,则只需要不同的标签。否则,0 是好的。
  • 不同类型仅表示 MPI_INTEGER 和 MPI_REAL 之类的,对吧?
  • 这是一个很好的例子。虽然不是那么具体。您可以在两者上发送整数,其中 tag1 是某物的 ID,第二个标签可以是值。关键是标签是完全可选的,用户可以根据自己的条件来区分它们。
【解决方案2】:

消息标签是可选的。您可以为它们使用任意整数值,并使用您喜欢并且对您有用的任何语义。

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

请注意,接收操作必须与它想要接收的消息的标签相匹配。但是,这并不意味着您必须指定相同的标签,您还可以使用通配符MPI_ANY_TAG 作为消息标签;然后接收操作将匹配任意消息标签。您可以通过MPI_Probe了解发件人使用的标签。

【讨论】:

    【解决方案3】:

    标签在分布式计算算法中很有用,其中可能有多种类型的消息。考虑领导选举问题,其中一个进程(选举候选人)发送 requestVote 类型的消息,而其他进程以 voteGrant 类型的消息进行响应。

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

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      相关资源
      最近更新 更多