diff --git a/modules/runners/src/runners.cpp b/modules/runners/src/runners.cpp index 642eae60..5f950455 100644 --- a/modules/runners/src/runners.cpp +++ b/modules/runners/src/runners.cpp @@ -82,22 +82,22 @@ int RunAllTests() { } void SyncGTestSeed() { - unsigned int seed = 0; int rank = -1; MPI_Comm_rank(MPI_COMM_WORLD, &rank); - if (rank == 0) { + int seed = ::testing::GTEST_FLAG(random_seed); + if (rank == 0 && seed == 0) { try { - seed = std::random_device{}(); + seed = static_cast((std::random_device{}() % 99999U) + 1U); } catch (...) { seed = 0; } if (seed == 0) { const auto now = static_cast(std::chrono::steady_clock::now().time_since_epoch().count()); - seed = static_cast(((now & 0x7fffffffULL) | 1ULL)); + seed = static_cast((now % 99999ULL) + 1ULL); } } - MPI_Bcast(&seed, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); - ::testing::GTEST_FLAG(random_seed) = static_cast(seed); + MPI_Bcast(&seed, 1, MPI_INT, 0, MPI_COMM_WORLD); + ::testing::GTEST_FLAG(random_seed) = seed; } void SyncGTestFilter() { diff --git a/modules/util/include/func_test_util.hpp b/modules/util/include/func_test_util.hpp index 7d49edde..9564b765 100644 --- a/modules/util/include/func_test_util.hpp +++ b/modules/util/include/func_test_util.hpp @@ -103,6 +103,7 @@ class BaseRunFuncTests : public ::testing::TestWithParamValidation()); + SynchronizeMpiRanks(); EXPECT_TRUE(task_->PreProcessing()); } diff --git a/modules/util/include/perf_test_util.hpp b/modules/util/include/perf_test_util.hpp index de0cb463..8fb0a2ab 100644 --- a/modules/util/include/perf_test_util.hpp +++ b/modules/util/include/perf_test_util.hpp @@ -85,6 +85,7 @@ class BaseRunPerfTests : public ::testing::TestWithParam std::string GetNamespace() { diff --git a/modules/util/src/util.cpp b/modules/util/src/util.cpp index 34c06538..633eac97 100644 --- a/modules/util/src/util.cpp +++ b/modules/util/src/util.cpp @@ -1,5 +1,7 @@ #include "util/include/util.hpp" +#include + #include #include #include @@ -65,3 +67,20 @@ bool ppc::util::IsUnderMpirun() { return static_cast(mpi_env.has_value()); }); } + +void ppc::util::SynchronizeMpiRanks() { + int initialized = 0; + if (MPI_Initialized(&initialized) != MPI_SUCCESS || initialized == 0) { + return; + } + + int finalized = 0; + if (MPI_Finalized(&finalized) != MPI_SUCCESS || finalized != 0) { + return; + } + + const int barrier_res = MPI_Barrier(MPI_COMM_WORLD); + if (barrier_res != MPI_SUCCESS) { + MPI_Abort(MPI_COMM_WORLD, barrier_res); + } +}