22 static void initialize(
int argc,
char** argv)
25 MPI_Init(&argc, &argv);
26 MPI_Comm_dup(MPI_COMM_WORLD, &comm);
27 MPI_Comm_rank(comm, &rank);
28 MPI_Comm_size(comm, &size);
29 Log::info(
"MPI Initialized, rank: {}, size: {}", rank, size);
47 static void run(std::string
const& installPath, std::string
const& modulesPath,
48 std::string
const& pedPath, std::string
const& mapPath,
49 std::string
const& paramsPath,
size_t count,
auto&& callback =
VOID{})
53 sim.set_install_dir(installPath);
54 sim.set_modules(modulesPath);
58 _mpiTimings.start_new();
61 _inputTimings.start_new();
62 load_inputs(params.get_input(), paramsPath);
64 load_inputs(sim.get_map_input(), mapPath);
65 if ( ! pedPath.empty() ) load_inputs(sim.get_ped_input(), pedPath);
68 size_t localCount = sim_count(rank, size, count);
72 sim.add_sim_id(start_sim_id(rank, size, count));
74 for (
size_t i = 0; i < localCount; ++i ) {
78 if constexpr ( std::is_same_v<
decltype(callback),
VIPRA::VOID> ) {
83 callback(sim.get_sim_id());
91 sim.set_sim_id(count);
94 _timings.output_timings();
98 MPI_Barrier(MPI_COMM_WORLD);
101 _mpiTimings.output_timings();
105 [[nodiscard]]
static auto get_rank() ->
int {
return rank; }
106 [[nodiscard]]
static auto get_size() ->
int {
return size; }
107 [[nodiscard]]
static auto is_parallel() ->
bool {
return size > 1; }
108 [[nodiscard]]
static auto is_root() ->
bool {
return rank == 0; }
111 struct DeferredFinalize {
112 DeferredFinalize(DeferredFinalize
const&) =
default;
113 DeferredFinalize(DeferredFinalize&&) =
default;
114 auto operator=(DeferredFinalize
const&) -> DeferredFinalize& =
default;
115 auto operator=(DeferredFinalize&&) -> DeferredFinalize& =
default;
116 DeferredFinalize() =
default;
121 MPI_Initialized(&flag);
122 if ( flag ) MPI_Finalize();
129 static MPI_Comm comm;
132 static Util::Timings _timings;
133 static Util::Timings _mpiTimings;
134 static Util::Timings _inputTimings;
138 static DeferredFinalize _finalize;
147 template <
typename input_t>
148 static void load_inputs(input_t& input, std::string
const& filepath)
150 input.load(filepath);
153 static void disseminate_input(Modules::Serializable& input)
155 std::string serialized{};
158 serialized = input.serialize();
159 length =
static_cast<int>(serialized.size());
162 _mpiTimings.resume();
163 MPI_Bcast(&length, 1, MPI_INT, 0, comm);
166 serialized.resize(length);
169 MPI_Bcast(serialized.data(), length, MPI_CHAR, 0, comm);
173 input.parse(serialized);
static VIPRA_INLINE void info(fmt::format_string< param_ts... > message, param_ts &&... params)
Calls the provided Logger with Level INFO.
Definition logging.hpp:68
static void run(std::string const &installPath, std::string const &modulesPath, std::string const &pedPath, std::string const &mapPath, std::string const ¶msPath, size_t count, auto &&callback=VOID{})
Runs a parameter sweep over the worker nodes.
Definition parameter_sweep.hpp:47