代码之家  ›  专栏  ›  技术社区  ›  Galaxy

与printf()相比,MPI函数似乎执行不正常

  •  0
  • Galaxy  · 技术社区  · 3 年前

    我有一个使用MPI的非常奇怪的代码,其中的语句似乎以错误的顺序执行。具体来说,MPI语句似乎在 printf 即使它在代码中位于它之后。

    #include <mpi.h>
    #include <stdio.h>
    
    int main(int argc, char** argv)
    {
        int numProcs, rank, data;
        MPI_Status status;
        
        // Initialize the MPI library
        MPI_Init(&argc, &argv);
    
        // Get entity identification
        MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    
        // Do something different in each a rank
        if (rank == 0) {
            // Get the data from rank   1
        // with tag                    0
        printf("rank = %d\tGet the data from rank 1 with tag 0\n", rank);
        MPI_Recv(&data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &status);
        } else if (rank == 1) {
            // Send the data to rank    0
        // with tag                    0
        printf("rank = %d\tSend the data to rank 0 with tag 0\n", rank);
            MPI_Send(&data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
        }
    
        printf("rank %d finishing\n", rank);
    
        // Clean up the MPI library
        MPI_Finalize();
    
        return 0;
    }
    

    这是正在生成的输出:

    $ mpirun -n 2 ./a.out
    rank = 0    Get the data from rank 1 with tag 0
    rank 0 finishing
    rank = 1    Send the data to rank 0 with tag 0
    rank 1 finishing
    

    排名0似乎起作用 输出函数 ,然后它从秩1中获取数据,然后它完成,然后秩1执行 输出函数 ? 但由于排名1必须做到 输出函数 在它真正将数据发送到秩0之前,秩0怎么可能已经获得了数据并完成了?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Victor Eijkhout    3 年前

    屏幕输出由操作系统缓冲,然后必须通过ssh隧道到达启动MPI运行的进程。因此,屏幕输出可以按照各种顺序到达。基本上没有办法获得整齐有序的屏幕输出,除了将所有文本发送到零处理,然后按正确的顺序打印。

    推荐文章