MPI_发送和MPI_接收的行为

MPI_发送和MPI_接收的行为,mpi,Mpi,为什么要使用这些代码行: if(my_rank != 0) { sprintf(msg, "Hello from %d of %d...", my_rank, comm_sz); if(my_rank == 2) { sleep(2); sprintf(msg, "Hello from %d of %d, I have slept 2 seconds...", my_rank, comm_sz); } MPI_Send(msg, s

为什么要使用这些代码行:

if(my_rank != 0) {
    sprintf(msg, "Hello from %d of %d...", my_rank, comm_sz);
    if(my_rank == 2) {
        sleep(2);
        sprintf(msg, "Hello from %d of %d, I have slept 2 seconds...", my_rank, comm_sz);
    }
    MPI_Send(msg, strlen(msg), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
}
else {
    printf("Hello from the chosen Master %d\n", my_rank);
    for(i = 1; i < comm_sz; i++) {
        MPI_Recv(msg, MAX_STRING, MPI_CHAR, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf("%s\n", msg);
    }
}

不是每个进程都有其“msg”的副本吗?

strlen()
不包括空终止符,因此它不会被发送到主进程。从秩3接收消息不会覆盖字符串的后面部分,因此仍会显示该消息。您应该使用strlen(msg)+1作为发送计数。

您希望得到什么?请注意,MPI不在线程上工作,但在进程上工作。@Zulan我希望只有第二个进程会写我已经睡了2秒了。。。
Hello from the chosen Master 0  
Hello from 1 of 5...  
Hello from 2 of 5, I have slept 2 seconds...  
Hello from 3 of 5... have slept 2 seconds...  
Hello from 4 of 5... have slept 2 seconds...