以下代码是MPI的实现。正在发送并返回一条长度不断增加的消息。随着每次迭代,消息元素的数量都会增加。
代码中有2条语句我不明白。
MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
MPI_Get_count(&status, MPI_INT, &numberOfElementsReceived);
乍一看,似乎没有必要来回传递消息,但是当我检测到它并编译我的代码时,它给出了错误。
我还查看了这篇文章:mpi 中的 MPI_Probe 和 MPI_Get_count 有什么区别
“”虽然 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, 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);
}
}
此方法允许找到您在 MPI_Recv 中使用的 numberOfElementsReceived。如果这个值已知,那么使用 MPI_Probe 和 MPI_Get_count 确实没有意义。
但通常只知道 numberOfElementsToSend 。因此,您首先探测接收到的元素数量并将其写入 numberOfElementsReceived (如 MPI_Get_count 中的最后一个参数所示),然后才能在 MPI_Recv 中使用此变量。
强烈不建议在 MPI_Recv 中使用 numberOfElementsToSend,因为它更有可能导致错误。
P.s.也许四年后你不需要答案啊哈哈,但是其他人会发现它有用/)