如何解决为什么还需要在MPI_probe中找到长度,同时还要在发送/接收功能中指明消息长度?
以下代码是MPI的实现。有一条长度不断增加的消息正在发送并返回。每次迭代,消息的元素数量都会增加。
我不理解代码中有2条语句。
MPI_Probe(MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
MPI_Get_count(&status,MPI_INT,&numberOfElementsReceived);
乍一看,似乎不需要前后传递消息,但是当我检测到它并编译我的代码时,它给出了一个错误。
我还检查了此帖子:what is the difference between MPI_Probe and MPI_Get_count in mpi
“”“虽然可以使用MPI_Probe查找消息的大小,但必须使用MPI_Get_count来获取该大小。 MPI_Probe返回一个状态,该状态是一个数据结构,提供有关消息的信息,包括消息的来源,标签和大小。但是要获得该大小,您可以使用状态作为参数来调用MPI_Get_count。“”
为什么使用MPI_Probe和MPI_Get_Count函数知道消息的大小和长度很重要?这让我感到困惑,因为您已经在MPI_Send和MPI_Recv函数中描述了发送和接收的元素数量。
for (message_size = 1; message_size <= MAX_ARRAY_SIZE; message_size <<= 1)
{
// Use a loop to vary the message size
if (myRank == 0)
{
double startTime,endTime;
numberOfElementsToSend = message_size;
printf("Rank %2.1i: Sending %i elements\n",myRank,numberOfElementsToSend);
// Measure the time spent in MPI communication
// (use the variables startTime and endTime)
startTime = MPI_Wtime();
MPI_Send(myArray,numberOfElementsToSend,1,MPI_COMM_WORLD);
MPI_Probe(MPI_ANY_SOURCE,&numberOfElementsReceived);
MPI_Recv(myArray,numberOfElementsReceived,MPI_STATUS_IGNORE);
endTime = MPI_Wtime();
printf("Rank %2.1i: Received %i elements\n",numberOfElementsReceived);
printf("Ping Pong took %f seconds\n",endTime - startTime);
}
else if (myRank == 1)
{
// Probe message in order to obtain the amount of data
MPI_Probe(MPI_ANY_SOURCE,MPI_STATUS_IGNORE);
printf("Rank %2.1i: Received %i elements\n",numberOfElementsReceived);
numberOfElementsToSend = numberOfElementsReceived;
printf("Rank %2.1i: Sending back %i elements\n",numberOfElementsToSend);
MPI_Send(myArray,MPI_COMM_WORLD);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。