在MPI中sorting输出

在一个简单的MPI程序中,我已经使用了一个大型matrix的明智的分区。 我怎样才能sorting输出,使每个matrix出现在另一个有序的旁边? 我试过这个简单的代码,效果与想要的完全不同:

for(int i=0;i<10;i++) { for(int k=0;k<numprocs;k++) { if (my_id==k){ for(int j=1;j<10;j++) printf("%d",data[i][j]); } MPI_Barrier(com); } if(my_id==0) printf("\n"); } 

似乎每个进程都有他自己的标准输出,所以不可能有有线的输出,而不是将所有的数据发送到一个主打印出来。 我的猜测是真的吗? 或者我做错了什么?

你猜对了。 MPI标准没有指定如何收集来自不同节点的stdout,以便在始发进程中进行打印。 通常情况下,当多个进程正在进行打印时,输出将以非特定方式合并。 fflush没有帮助。

如果您希望以某种方式sorting输出,则最便携的方法是将数据发送到主进程进行打印。

例如,在伪代码中:

 if (rank == 0) { print_col(0); for (i = 1; i < comm_size; i++) { MPI_Recv(buffer, .... i, ...); print_col(i); } } else { MPI_Send(data, ..., 0, ...); } 

另一种有时可以工作的方法是使用Barries来locking步骤处理,以便每个处理依次打印。 这当然取决于MPI实现以及它如何处理stdout。

 for(i = 0; i < comm_size; i++) { MPI_Barrier(MPI_COMM_WORLD); if (i == rank) { printf(...); } } 

当然,在生产代码中数据太大而无法合理打印时,数据最终会通过将每个进程写入单独的文件并单独合并或使用MPI I / O ( 在MPI2标准中定义 )来协调并行写道。

在使用完全相同的方法之前,我将有序输出生成到文件中。 您可以尝试打印到临时文件,打印该文件的内容,然后删除它。

让根处理器完成所有的打印。 使用MPI_Send / MPI_Recv或MPI_Gather(或其他)将数据依次从每个处理器发送到根。

要解决这个问题,你可以使用短暂的睡眠。 我使用,然后在99%

 printf("text nr 1\n"); MPI_Barrier(MPI_COMM_WORLD); usleep(100); printf("text nr 2\n"); 

这不是很优雅,但工作。