在MPI中订购输出

时间:2011-03-14 21:56:06

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

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

4 个答案:

答案 0 :(得分:26)

你猜对了。 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实现以及它如何处理stdout。

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

要解决此问题,您可以使用短暂睡眠。我使用然后它在99%

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

它不是很优雅但有效。