NoneGooglebenchmark и MPI: есть ли надежда?

Я хочу запустить определенную функцию MPI под Google Benchmark. Что-то вроде:

#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 просто слишком полезен, чтобы по крайней мере попытаться найти взлом, чтобы сделать эту работу.

Есть ли что-нибудь, что можно сделать? Могу ли я разорвать процесс и передать ему лямбду? Есть ли шаблон потоков, который будет работать? Даже дорогие вещи будут полезны, так как я могу просто вычесть стоимость того, что делает хак, без звонка тоже foo() от того, который называют foo(),

1 ответ

Если вам не нужно включать MPI_Initа также MPI_Finalizeв свое время (которое вы, вероятно, не хотите в любом случае), вы можете взглянуть на эту суть: https://gist.github.com/mdavezac/eb16de7e8fc08e522ff0d420516094f5

Он содержит пример того, как тестировать код с поддержкой MPI с помощью бенчмарка Google. Основная идея состоит в том, чтобы вызвать бенчмарк Google из вашего основного метода (используя ::benchmark::Initialize(&argc, argv)а также ::benchmark::RunSpecifiedBenchmarks()), синхронизировать с помощью MPI_Barrier, время вашего кода с помощью std::chrono::high_resolution_clockи используя MPI_Allreduceнайти самый медленный процесс. Затем вы можете опубликовать это время, используя state.SetIterationTime(но только на основном процессе).

Другие вопросы по тегам