我不确定何时必须在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 类型的消息响应。
有许多此类区分消息类型的算法,并且标签可用于对此类消息进行分类。