C 为什么需要使用MPI_探测器查找长度,同时在发送/接收函数中指示消息长度?
以下代码是MPI的一个实现。正在发送并返回一条长度不断增加的消息。随着每次迭代,消息的元素数量都会增加 代码中有两条语句我不理解C 为什么需要使用MPI_探测器查找长度,同时在发送/接收函数中指示消息长度?,c,performance,parallel-processing,mpi,C,Performance,Parallel Processing,Mpi,以下代码是MPI的一个实现。正在发送并返回一条长度不断增加的消息。随着每次迭代,消息的元素数量都会增加 代码中有两条语句我不理解 MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); MPI_Get_count(&status, MPI_INT, &numberOfElementsReceived); 乍一看,前后传递消息似乎没有必要,但当我详细分析并编译代码时,它给出了一个错误
MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
MPI_Get_count(&status, MPI_INT, &numberOfElementsReceived);
乍一看,前后传递消息似乎没有必要,但当我详细分析并编译代码时,它给出了一个错误
我还查看了这篇帖子:
“”虽然可以使用MPI_探测器查找消息的大小,但必须使用MPI_Get_count来获取该大小。MPI_Probe返回一个状态,该状态是一个数据结构,提供有关消息的信息,包括消息源、标记和大小。但要获得该大小,可以调用MPI\u get\u 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, MPI_INT, 1, 0,
MPI_COMM_WORLD);
MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
MPI_Get_count(&status, MPI_INT, &numberOfElementsReceived);
MPI_Recv(myArray, numberOfElementsReceived, MPI_INT, 1, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
endTime = MPI_Wtime();
printf("Rank %2.1i: Received %i elements\n",
myRank, 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_ANY_TAG, MPI_COMM_WORLD, &status);
MPI_Get_count(&status, MPI_INT, &numberOfElementsReceived);
MPI_Recv(myArray, numberOfElementsReceived, MPI_INT, 0, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("Rank %2.1i: Received %i elements\n",
myRank, numberOfElementsReceived);
numberOfElementsToSend = numberOfElementsReceived;
printf("Rank %2.1i: Sending back %i elements\n",
myRank, numberOfElementsToSend);
MPI_Send(myArray, numberOfElementsToSend, MPI_INT, 0, 0,
MPI_COMM_WORLD);
}
for(message\u size=1;message\u size如果您不知道要接收的下一条消息的大小,可以使用这两个子例程,然后使用malloc()
接收缓冲区和MPI\u Recv()
。但是如果您尝试接收的数据少于发送的数据,那么您的应用程序将中止。我在代码段中没有显示这一点,但最大数组大小是1仅当发送的数据大于MPI\u Recv()时才会出现问题
愿意接受。你的情况正好相反,没有问题。在你的情况下,你可以跳过MPI\u Probe()
并使用MPI\u Status
而不是MPI\u Status\u IGNORE
来检索已接收的数据量。恐怕您是在他们的上下文之外进行这些MPI练习。这一练习的目的是教您如何在事先不知道大小的情况下接收消息。这个示例确实是精心设计的,因为您知道t在每次迭代中,有一个外部循环会使消息大小加倍,但循环存在的原因是秩0和秩1都应该循环相同的迭代次数。更干净的变量将有两个循环,每个秩中一个。