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
(но только на основном процессе).