使用MPI,在发送之前,似乎已收到一条消息 [英] Using MPI, a message appears to have been recieved before it has been sent

查看:60
本文介绍了使用MPI,在发送之前,似乎已收到一条消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在下面的测试程序中,我正在从一个进程向另一个进程发送一条消息.跟踪printfs似乎指示在发送消息之前已接收到什么消息,为什么会这样?

In my test program below I am sending a message from one process to another. The trace printfs seem to indicate what the message is being received before it is sent, why is this so?

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
/* Run with two processes */
void main(int argc, char *argv[]) {
    int rank, i, count;
    float data[100],value[200];
    MPI_Status status;   
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    printf("before if:%d\n",rank);
    if(rank==1) {
        printf("in if:%d\n",rank);
        for(i=0;i<100;++i) data[i]=i;
        MPI_Send(data,100,MPI_FLOAT,0,55,MPI_COMM_WORLD);
    } else {
        printf("else:%d\n",rank);
        MPI_Recv(value,200,MPI_FLOAT,MPI_ANY_SOURCE,55,MPI_COMM_WORLD,&status);
        printf("P:%d Got data from processor %d \n",rank, status.MPI_SOURCE);
        MPI_Get_count(&status,MPI_FLOAT,&count);
        printf("P:%d Got %d elements \n",rank,count);
        printf("P:%d value[5]=%f \n",rank,value[5]);
    }
    MPI_Finalize();
}

/用于运行8个进程的程序,我得到以下结果. 进程1发送之前,进程0如何收到/

/for running the program for 8 processes i got the following result. how could process 0 recieve before process 1 sends/

- RESULT:

-before if:4\n
-before if:8\n
-else:8\n
-before if:0\n
-else:0\n
-P:0 Got data from processor 1\n 
-P:0 Got 100 elements \n
-P:0 value[5]=5.000000 \n
-before if:1\n
-in if:1\n
-before if:2\n
-else:2\n
-before if:5\n
-else:5\n
-before if:6\n
-else:6\n
-before if:7\n
-else:7\n  -before if:9\n  -else:9\n  -else:4\n  -before if:3\n  -else:3\n
*/

推荐答案

这里的问题不是您打破了时间的因果关系,仅仅是因为MPI无法保证在屏幕上打印消息的顺序(请参见 MPI-按顺序打印以获取更多详细信息).

The problem here isn't that you've broken the causality of time, just that MPI makes no guarantees about the order of printing messages to the screen (see MPI - Printing in an order for more details).

MPI将所有stdoutstderr都转发回称为mpiexec/mpirun的进程,然后再将其打印到屏幕上(因为这是与用户连接的地方.这些消息来自所有不同的进程可以按任何顺序到达,因此您可能会看到一行消息已收到一条消息,然后又收到另一行消息已发送,这条消息仍按正确的顺序发生,只是通信延迟了渠道.

MPI forwards all of your stdout and stderr back to the process that called mpiexec/mpirun before printing it to the screen (since that's where the user is connected. Those messages coming from all of the different processes can arrive in any order so you may be seeing one line saying a message was received before you get another line saying the message has been sent. The messages are still occurring in the right order, they're just getting delayed in the communication channels along the way.

这篇关于使用MPI,在发送之前,似乎已收到一条消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆