【问题标题】:Difference between omp_get_wtime() and mpi_wtime() when using both MPI and shared memory parallelization同时使用 MPI 和共享内存并行化时 omp_get_wtime() 和 mpi_wtime() 之间的区别
【发布时间】:2014-03-27 19:11:01
【问题描述】:

我同时使用 OpenMPI 和 OpenMP(共享内存)来并行化一段代码。我正在尝试为基准测试和加速目的计时该代码,但我不明白 omp_get_wtime() 和 mpi_wtime() 之间的区别。

以下是我的代码及其运行架构的概述:

我有 8 个节点,每个节点有 16 个处理器。我有 128 个任务要运行。

我正在测试两种场景,我想知道哪个更快。

第一个场景: 我给每个节点 1/8 的任务(使用 OpenMPI),对于每个任务,节点使用它的 16 个处理器(使用 OpenMP)来完成任务。所以Node0会做Task0,Task0完成后会做Task8,Task8完成后会做Task16;同时 Node1 将执行 Task1,然后是 Task9,然后是 Task15,等等,直到每个任务都完成。我想知道整个过程需要多长时间,如果知道每项任务完成(平均)需要多长时间。

第二种情况:我将 128 个任务中的每一个都放在一个处理器上(使用 MPI)。我只是想知道这需要多长时间才能运行,而且很高兴知道每个处理器需要多长时间才能完成其工作。

基本上,我在这里所做的是将 MPI+OpenMP 与仅使用 MPI 进行代码比较。

我应该使用哪个计时器,两者之间有什么区别?

谢谢!

【问题讨论】:

    标签: timer parallel-processing openmp openmpi


    【解决方案1】:

    omp_get_wtime()MPI_WTIME 之间没有主要区别。两者都是亚秒级精度的挂钟计时器,可返回自过去某个时间点以来经过的时间。通过重复调用它们并减去值,两者也以相同的方式使用,例如:

    double tmr = omp_get_wtime();
    ...
    // routine to be timed
    ...
    tmr = omp_get_wtime() - tmr;
    // tmr now holds the elapsed time in seconds
    

    或:

    double tmr = MPI_Wtime();
    ...
    // routine to be timed
    ...
    tmr = MPI_Wtime() - tmr;
    // tmr now holds the elapsed time in seconds
    

    这两个函数都是本地的,例如他们测量调用代码执行的节点上的时间。 MPI_WTIME 允许在所有节点之间同步,但很少有实现这样做。它们在所有其他方面应该是相当的,并提供相似的精度(在大多数平台上,两者通常都使用相同的特定于操作系统的计时器例程来实现)。绝对不能保证两个计时器在过去具有相同的参考点,因此不应混合使用它们,例如以下代码无效:

    double tmr = MPI_Wtime();
    ...
    tmr = omp_get_wtime() - tmr;
    // tmr now holds the elapsed time in seconds + possibly a constant difference
    

    我最好使用MPI_WTIME 来代替omp_get_wtime(),这取决于是否启用了OpenMP。如果您允许您的程序同时编译为纯 MPI 和混合 MPI+OpenMP,那么最好不要对 OpenMP 运行时库进行多次(或任何)调用,否则您将不得不为这种情况提供存根实现未启用 OpenMP 时。当然,混合代码的存根omp_get_wtime() 实现需要一个预处理器宏:

    #define omp_get_wtime MPI_Wtime
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-25
      • 2022-11-30
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      相关资源
      最近更新 更多