0

我想在谷歌基准下运行特定的 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 对我想做的事情并不酷。但是谷歌基准测试太有用了,至少不能尝试找到一个黑客来完成这项工作。

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

4

1 回答 1

0

如果您不需要包括在您MPI_Init的时间(您可能不想要),您可以看看这个要点: httpsMPI_Finalize ://gist.github.com/mdavezac/eb16de7e8fc08e522ff0d420516094f5

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

于 2021-03-08T10:13:20.050 回答