【问题标题】:Ordering Output in MPIMPI 中的排序输出
【发布时间】:2011-07-15 08:56:59
【问题描述】:

在一个简单的 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");
}

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

【问题讨论】:

  • 注意:我也试过fflush每个进程的输出......没有得到我想要的结果;-)。

标签: stdout mpi


【解决方案1】:

你猜对了。 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, ...);
}

另一种有时会起作用的方法是使用 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) 来协调并行写。

【讨论】:

  • 天哪,如果你还在的话,谢谢你的回答。有一个有点不同的问题,但我认为我做错了其他事情来搞乱输出。我看到过让一个线程处理输出的事情,但正在努力解决如何正确地做到这一点。在经历了几天的挫折之后,可能让我免去了几天的挫败感。 :)
【解决方案2】:

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

【讨论】:

  • 当然,这实际上并没有被定义为这样工作,也不应该在任何最终产品中使用。但是,我也发现通过将我的 mpirun 命令的标准输出重定向到一个文件,输出变得按时间排序。当 std 输出被定向到终端时,情况并非如此。谢谢你的主意。事实证明,这是在我的代码中调试竞争条件的一种快速简便的方法。
  • 这可能是写入文件时集体缓冲(任务将写入数据收集到一个指定的 i/o 任务)的结果,并且可能在某些环境中被禁用。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    要解决此问题,您可以使用短睡眠。我使用,然后它的工作率为 99%

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

    它不是很优雅,但很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 2013-02-12
      • 2018-04-25
      • 1970-01-01
      • 2011-02-15
      • 2018-04-08
      相关资源
      最近更新 更多