【问题标题】:How to run the same MPI program multiple times如何多次运行同一个 MPI 程序
【发布时间】:2017-03-17 18:21:35
【问题描述】:

我有一个 MPI 程序来计算排序时间。我用mpirun -np 2 mpiSort 运行它。所以这给了我2个过程的排序时间。

我想获得 5 次的排序时间来平均它们。如何自动执行此操作?

如果我在mpiSort 程序中执行循环。它实际上执行了 5(次) x 2(进程) = 10 次。

编辑:mpiSort 并行进行排序。基本上,我尝试在不输入 5 次的情况下执行 mpirun -np 2 mpiSort。因为我想对 4 核、8 核做同样的事情。

【问题讨论】:

    标签: mpi mpich mpic++


    【解决方案1】:

    您可以使用mpirun -np 5 mpiSort 在五个内核上运行并在末尾添加MPI_gather。排序代码实际上是否使用 MPI(即在开头调用 MPI_init?)。假设你是,你可以在 5 个核心上运行,并在最后用一个 reduce 进行平均,

    # include <mpi.h>
    #include <iostream>
    using namespace std;
    
    int main ( int argc, char *argv[] )
    {
    
        int ierr, rank, nprocs, root=0;
        double time, buf;
        ierr = MPI_Init ( &argc, &argv );
        ierr = MPI_Comm_rank (MPI_COMM_WORLD, &rank);
        ierr = MPI_Comm_size (MPI_COMM_WORLD, &nprocs);
        time = 0.5;
        ierr = MPI_Reduce (&time, &buf, 1, MPI_DOUBLE_PRECISION, 
                              MPI_SUM, root, MPI_COMM_WORLD);
        if (rank == root){
            buf = buf / nprocs;
            cout << buf << "\n";
        }
    
      MPI_Finalize ( );
    
    }
    

    其中time是每个进程的排序时间。

    【讨论】:

    • 是的,它的开头有 MPI_init。我认为您的代码要么按不同的单核排序 5 次,要么一次按 5 个核心排序?但我想让 2 个核心完成 5 次排序时间。
    • 对不起,我不确定我是否理解,你能发布一个最小的代码来说明这一点吗?它们是并行排序的吗?使用 MPI,每个内核同时作为一个单独的实例运行,然后使用 MPI 命令进行通信。上面的代码模拟了 5 个单独的 sort 实例的运行(将 time=0.5 替换为函数),它将在 5 个内核上同时运行,然后进行通信以获得所有五个内核的平均值。
    • 为什么不直接运行mpirun -np 2 mpiSort 5 次并计算可执行文件的平均时间(如果这是您想要的)?请注意,整个 MPI 可执行文件将在您使用 mpirun -np 指定的内核数量上同时运行,这与 openMP 不同,您只需在一个部分上进行多线程处理。
    • 我编辑了这个问题。稍后我会尝试发布一个简化的代码。
    【解决方案2】:

    放入循环是要走的路。我很困惑,因为我得到了 10 个 endTime = MPI_Wtime() 的值,而我只从根进程中使用了其中的 5 个。感谢@EdSmith 和他的MPI_Reduce 代码,正确计算的时间是使用MPI_Reduce 的两个进程的平均值。

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &nProcs);
    
    for (int run=0; run<5; run++) {
      ...
      endTime = MPI_Wtime();
      totalTime = endTime - startTime;
      MPI_Reduce (&totalTime, &workTime, 1, MPI_DOUBLE_PRECISION, MPI_SUM, root, MPI_COMM_WORLD);
      if (rank == root) {
        paraTime = workTime/nProcs;
      }
      ...
    }
    
    MPI_Finalize();
    

    【讨论】:

      猜你喜欢
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 2017-01-03
      • 2017-05-05
      • 2020-06-26
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多