使用MPI进行简单的消息交换

时间:2012-10-16 15:53:53

标签: c mpi

我有这个在两个处理器上运行的简单MPI程序。在我的示例中(或者可能只是在我的计算机上),我的控制台在发送消息之前输出接收消息。

我知道有一种方法可以使用MPI对接收进行排序,但我认为我的示例会等待处理器0发送数据,因此接收输出必然是秒。

如何在发送信息后打印接收信息?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mpi.h>

int main(int argc, char *argv[]){
        int np, myId;
        char send[100], recv[100];

        MPI_Init(&argc, &argv);

        MPI_Comm_size(MPI_COMM_WORLD, &np);
        MPI_Comm_rank(MPI_COMM_WORLD, &myId);

        MPI_Status stat;
        if(myId == 0){
                int length = sprintf(send, "hey!"); 

                for(int i = 1; i < np; i++){
                        printf("send %d => %d (%d)", myId, i, length);
                        MPI_Send(send, length, MPI_CHAR, i, 0, MPI_COMM_WORLD);
                }

        }else if (myId == 1){
                MPI_Recv(send, 41, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &stat); 
                printf("receive %d <= %d\n", myId, 0);
        }

        MPI_Finalize();
        return 0;
}

1 个答案:

答案 0 :(得分:1)

并行写入共享缓冲区时,不使用并行i / o库,无法保证首先清除哪个缓冲区。如果您希望它们按顺序出现,您应该在打印命令后刷新输出缓冲区,例如fflush(stdout);,打印到每次自动刷新的缓冲区,例如fprintf(stderr,...);或使用MPI_Barrier分隔打印命令。不建议使用最后一个,因为它可能导致性能不佳。