Можно ли использовать Catch2 для тестирования кода MPI? - PullRequest
0 голосов
/ 08 октября 2019

Я работаю с довольно большим MPI-кодом. Я начал включать модульные тесты в существующую кодовую базу. Однако, как только тестируемый модуль использует подпрограмму MPI, исполняемый файл теста вылетает с сообщением об ошибке «вызов подпрограммы MPI до MPI_Init»

  • Как лучше всего обойти это?
  • Можно ли запускать тесты с несколькими рангами MPI?

1 Ответ

1 голос
/ 08 октября 2019

Да, это возможно.

Как объяснено в 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...