为什么需要使用 MPI_probe 查找长度,同时在发送/接收函数中指定消息长度?

问题描述 投票:0回答:1

以下代码是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);
    
}

}

c performance parallel-processing mpi
1个回答
0
投票

此方法允许找到您在 MPI_Recv 中使用的 numberOfElementsReceived。如果这个值已知,那么使用 MPI_Probe 和 MPI_Get_count 确实没有意义。

但通常只知道 numberOfElementsToSend 。因此,您首先探测接收到的元素数量并将其写入 numberOfElementsReceived (如 MPI_Get_count 中的最后一个参数所示),然后才能在 MPI_Recv 中使用此变量。

强烈不建议在 MPI_Recv 中使用 numberOfElementsToSend,因为它更有可能导致错误。

P.s.也许四年后你不需要答案啊哈哈,但是其他人会发现它有用/)

© www.soinside.com 2019 - 2024. All rights reserved.