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

Fra*_*coN 17 mpi

我不确定何时必须在MPI发送,接收呼叫中使用不同的数字作为标记字段.我读过这篇文章,但我无法理解.

有时候,A可能需要向B发送许多不同类型的消息.而不是B必须通过额外的措施来区分所有这些消息,MPI允许发送者和接收者也用消息指定消息ID(称为标记) ).当进程B仅请求具有特定标签号的消息时,具有不同标签的消息将由网络缓冲,直到B为它们做好准备.

我是否必须使用标签,例如,当我在进程A中有多个调用"isend"(带有不同的标签)并且在进程B中只有1个调用"ireceive"时?

mor*_*ort 12

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

像你所说的标签可以使用由不同类型(的消息之间进行区分MPI_INTEGER,MPI_REAL,MPI_BYTE,等).您还可以使用标签添加有关数据实际表示内容的一些信息(如果您有一个nx n矩阵,发送此矩阵行的消息将包含n值,以及发送该矩阵列的消息;不过,您可能希望以不同方式处理行和列数据).

请注意,接收操作必须与其要接收的消息的标记匹配.但是,这并不意味着您必须指定相同的标记,您也可以使用通配符MPI_ANY_TAG作为消息标记; 然后,接收操作将匹配任意消息标记.您可以在帮助下找出发件人使用的标签MPI_Probe.


msm*_*886 10

一般来说,我倾向于避免它们.您无需使用标签.如果您需要在解析消息之前获取消息大小,则可以使用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();

}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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