Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么需要使用MPI_探测器查找长度,同时在发送/接收函数中指示消息长度?_C_Performance_Parallel Processing_Mpi - Fatal编程技术网

C 为什么需要使用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的一个实现。正在发送并返回一条长度不断增加的消息。随着每次迭代,消息的元素数量都会增加

代码中有两条语句我不理解

    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都应该循环相同的迭代次数。更干净的变量将有两个循环,每个秩中一个。