stdout - 在 MPI 中排序输出

标签 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");
}

似乎每个进程都有自己的标准输出,因此如果不将所有数据发送到一个将打印出来的主站,就不可能有有序的行输出。我的猜测是真的吗?或者我做错了什么?

最佳答案

你猜对了。 MPI 标准没有指定如何收集来自不同节点的 stdout 以在原始进程中打印。通常情况下,当多个进程进行打印时,输出将以未指定的方式合并。 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, ...);
}

另一种方法可以有时工作 将使用 barries 锁定步骤进程,以便每个进程依次打印。这当然取决于 MPI 实现以及它如何处理标准输出。
for(i = 0; i < comm_size; i++) {
    MPI_Barrier(MPI_COMM_WORLD);
    if (i == rank) {
         printf(...);
    }
}

当然,在数据太大而无法合理打印的生产代码中,最终通过让每个进程写入单独的文件并单独合并或使用 MPI I/O 来合并数据。 ( defined in the MPI2 standards ) 来协调并行写入。

关于stdout - 在 MPI 中排序输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5305061/

相关文章:

C 标准输出 printf

python - 如何使 python curses 应用程序管道友好?

Python subprocess.call() 为每个 stdout 和 stderr 行添加前缀

c - MPI_Send 或 MPI_Recv 的限制?

Python:使用 mpi4py 通过 spawn 将数组广播到其他脚本

bash - git log 的输出在通过管道传输到文件时丢失了——我错过了什么?

c# - 重定向 cmd.exe 的输入和输出

c - MPI - 使用 MPI_Probe() 时发送我自己的结构

c++ - 按值返回 MPI_Request 和 MPI_Status 对象是否危险?

c - mpicc-vt : command not found