Да, это возможно.
Как объяснено в https://github.com/catchorg/Catch2/issues/566,, вам нужно будет предоставить пользовательскую основную функцию.
#define CATCH_CONFIG_RUNNER
#include "catch.hpp"
#include <mpi.h>
int main( int argc, char* argv[] ) {
MPI_Init(&argc, &argv);
int result = Catch::Session().run( argc, argv );
MPI_Finalize();
return result;
}
Чтобы усилить ваш опыт использования Catch2 вВ сочетании с MPI вы можете избежать избыточного вывода на консоль. Это требует внедрения некоторого кода в ConsoleReporter :: testRunEnded of catch.hpp.
#include <mpi.h>
void ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) {
int rank id = -1;
MPI Comm rank(MPI COMM WORLD,&rank id);
if(rank id != 0 && testRunStats.totals.testCases.allPassed())
return;
printTotalsDivider(_testRunStats.totals);
printTotals(_testRunStats.totals);
stream << std::endl;
StreamingReporterBase::testRunEnded(_testRunStats);
}
Наконец, вы также можете выполнить свои тестовые случаи с другим числом рангов MPI. Я нашел следующее простое и хорошо работающее решение:
SCENARIO("Sequential Testing", "[1rank]") {
// Perform sequential tests here
}
SCENARIO("Parallel Testing", "[2ranks]") {
// Perform parallel tests here
}
Затем вы можете вызывать сценарии тегов индивидуально с помощью
mpiexec -1 ./Paco [1rank]
mpiexec -2 ./Paco [2rank]