我有这个在两个处理器上运行的简单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;
}
答案 0 :(得分:1)
并行写入共享缓冲区时,不使用并行i / o库,无法保证首先清除哪个缓冲区。如果您希望它们按顺序出现,您应该在打印命令后刷新输出缓冲区,例如fflush(stdout);
,打印到每次自动刷新的缓冲区,例如fprintf(stderr,...);
或使用MPI_Barrier
分隔打印命令。不建议使用最后一个,因为它可能导致性能不佳。