【问题标题】:googlebenchmark and MPI: Is there hope?googlebenchmark 和 MPI:有希望吗?
【发布时间】:2019-08-12 17:49:38
【问题描述】:

我想在谷歌基准测试下运行一个特定的 MPI 函数。比如:

#include <mpi.h>
#include <benchmark/benchmark.h>

template<class Real>
void MPIInitFinalize(benchmark::State& state)
{

    auto mpi = []() {
        MPI_Init(nullptr, nullptr);
        foo();
        MPI_Finalize();
    };

    for(auto _ : state) {
       mpi();
    }
}

BENCHMARK_TEMPLATE(MPIInitFinalize, double);

BENCHMARK_MAIN();

当然,我们知道会发生什么:

*** The MPI_Init() function was called after MPI_FINALIZE was invoked.
*** This is disallowed by the MPI standard.
*** Your MPI job will now abort.

我知道 MPI 不适合我想做的事情。但是 google benchmark 实在是太有用了,至少不能尝试找到一个 hack 来完成这项工作。

有什么可以做的吗?我可以分叉一个进程并将 lambda 传递给它吗?有没有可行的线程模式?即使是昂贵的东西也会有所帮助,因为我可以从调用 foo() 的调用中减去调用 foo() 的任何黑客工作的成本。

【问题讨论】:

  • 您真的想在基准测量中包含MPI_InitMPI_Finalize 吗?如果没有,为什么不自己做主?
  • 另外,你如何开始你的基准测试?与mpirun ?如果不是,那么您只是在单例模式下进行测试(例如,单个 MPI 任务),这不太可能是您想要做的。

标签: mpi google-benchmark


【解决方案1】:

如果您不需要在您的时间中包含 MPI_InitMPI_Finalize(您可能不想要),您可以查看以下要点:https://gist.github.com/mdavezac/eb16de7e8fc08e522ff0d420516094f5

它包含一个关于如何使用谷歌基准测试启用 MPI 的代码的示例。基本思想是从您自己的主要方法(使用::benchmark::Initialize(&amp;argc, argv)::benchmark::RunSpecifiedBenchmarks())调用google benchmark,使用MPI_Barrier 进行同步,使用std::chrono::high_resolution_clock 为您的代码计时,并使用MPI_Allreduce 来查找最慢的进程。然后,您可以使用 state.SetIterationTime 发布该时间(但只能在主进程上)。

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 2012-02-04
    • 2016-03-02
    • 1970-01-01
    • 2015-05-10
    • 2015-02-11
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多