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

在MPI中发送和接收消息时何时使用标记?,mpi,Mpi,我不确定何时我必须在MPI send,receive calls中的标记中使用不同的号码。我读过,但我不明白 有时,在某些情况下,可能需要发送许多不同的邮件 发送给B的消息类型。而不是B必须通过额外的 为了区分所有这些消息,MPI允许发送者和 接收者还可以指定消息ID和消息(称为 标签)。当进程B仅请求带有特定标记的消息时 编号,具有不同标签的消息将由网络缓冲 直到B准备好了 我必须使用标记吗?例如,当我从进程A有多个调用“isend”(使用不同的标记),而在进程B中只有一个调用“ireceiv

我不确定何时我必须在MPI send,receive calls中的标记中使用不同的号码。我读过,但我不明白

有时,在某些情况下,可能需要发送许多不同的邮件 发送给B的消息类型。而不是B必须通过额外的 为了区分所有这些消息,MPI允许发送者和 接收者还可以指定消息ID和消息(称为 标签)。当进程B仅请求带有特定标记的消息时 编号,具有不同标签的消息将由网络缓冲 直到B准备好了


我必须使用标记吗?例如,当我从进程A有多个调用“isend”(使用不同的标记),而在进程B中只有一个调用“ireceive”时?

通常,我倾向于避免使用标记。没有要求您使用标签。如果在解析消息之前需要获取消息大小,可以使用
MPI\u Probe
。这样,您可以发送不同的消息,而不是指定标记。我通常使用标记,因为
MPI\u Recv
要求您在获取数据之前知道消息大小。如果您有不同的大小和类型,标记可以通过让多个线程或进程监听不同的子集来帮助您区分它们。标记1可以表示类型为X的消息,标记2将表示类型为Y的消息。此外,它使您能够拥有多个通信“通道”,而无需创建唯一的通信者和组

#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
//初始化MPI
MPI_Init(&argc,&argv);
//获得等级和大小
int等级、大小;
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
//如果主人
如果(秩==0){
char*message_r1=“你好排名1”;
char*message_r2=“你好排名2”;
//通过标记0发送消息
MPI_发送(消息r1、13、MPI_字符、1、0、MPI_通信世界);
//通过标记1发送消息
MPI_发送(消息r2、13、MPI_字符、2、1、MPI_通信世界);
}
否则{
//缓冲区
字符缓冲区[256];
MPI_状态;
//等待你自己的消息
MPI_Recv(缓冲区、13、MPI_字符、0、排名1、MPI_通信世界和状态);

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

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

请注意,接收操作必须匹配它想要接收的消息的标记。但是,这并不意味着您必须指定相同的标记,您还可以使用通配符
MPI_ANY_标记作为消息标记;然后接收操作将匹配任意消息标记。您可以在f>代码> MPIX探针< /代码> .

标签可用于分布式计算算法,其中可以有多种类型的消息。考虑领导者选举问题,其中进程(选举候选人)发送类型请求消息的消息,而其他进程用VoTeGrand类型的消息进行响应。
有许多这样的算法可以区分消息的类型,标记可以用于对这些消息进行分类。

在这种情况下,您可以在接收端使用
MPI\u tag\u ANY
,查看接收后的状态结构以确定使用了哪个标记,并进行相应的处理。因此,如果我必须发送多条消息s、 按顺序(1发送=1条消息),从进程A到进程B,不需要更改标记,对吗?是的。如果您计划发送不同类型的消息,则只需要不同的标记。否则,0是好的。不同类型仅表示MPI_整数和MPI_实数,例如,对吗?这是一个很好的示例。但没有那么具体。您可以将整数发送到r两者都是,其中tag1是某物的ID,第二个标记可以是值。关键是标记是完全可选的,用户可以根据自己的条件区分它们。