在MPI中订购输出

GBB*_*BBL 14 stdout mpi

在一个简单的MPI程序中,我使用了一个大矩阵的列式划分.如何订购输出,使每个矩阵出现在另一个矩阵旁边?我试过这个简单的代码,效果与想要的完全不同:

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");
}
Run Code Online (Sandbox Code Playgroud)

似乎每个进程都有自己的标准输出,因此不可能在没有将所有数据发送到一个将打印输出的主数据的情况下排序行输出.我的猜测是真的吗?或者我做错了什么?

Sha*_*hin 27

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

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

例如,在伪代码中:

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, ...);
}
Run Code Online (Sandbox Code Playgroud)

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

for(i = 0; i < comm_size; i++) {
    MPI_Barrier(MPI_COMM_WORLD);
    if (i == rank) {
         printf(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

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