0

我有这个简单的 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;
}
4

1 回答 1

1

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

于 2012-10-16T16:18:34.817 回答