Skip to content

Commit 9807d16

Browse files
nlslattcz4rs
authored andcommitted
Merge pull request #1674 from DARMA-tasking/1550-allow-passing-appconfig-to-vt-during-init
#1550 allow passing appconfig to vt during init
2 parents 797a81b + 87d7da8 commit 9807d16

File tree

11 files changed

+743
-341
lines changed

11 files changed

+743
-341
lines changed

docs/md/tutorial.md

+37
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,43 @@ int main(int argc, char** argv) {
3030
}
3131
\endcode
3232

33+
If, for any reason, you want to predefine configuration, you can do it
34+
by creating `AppConfig` object, setting its members as you wish,
35+
and passing it to `vt::initialize`:
36+
37+
\code{.cpp}
38+
int main(int argc, char** argv) {
39+
arguments::AppConfig appConfig{};
40+
appConfig.vt_lb_name = "RotateLB";
41+
appConfig.vt_lb_stats = true;
42+
43+
vt::initialize(argc, argv, &appConfig);
44+
// program here
45+
vt::finalize();
46+
}
47+
\endcode
48+
49+
You can do also do it if you initialized MPI on your own:
50+
51+
\code{.cpp}
52+
int main(int argc, char** argv) {
53+
MPI_Init(&argc, &argv);
54+
55+
arguments::AppConfig appConfig{};
56+
appConfig.vt_lb_name = "RotateLB";
57+
appConfig.vt_lb_stats = true;
58+
59+
vt::initialize(argc, argv, &MPI_COMM_WORLD, &appConfig);
60+
// program here
61+
vt::finalize();
62+
MPI_Finalize();
63+
}
64+
\endcode
65+
66+
It is worth noting that if you run your application with any of vt's command-line arguments and at the same time you define and pass `AppConfig` to `vt::initialize`, CLI arguments have a higher priority. In other words, if you predefine in source code and give from the command line the same vt's argument, but with a different value, the program will use the CLI one.
67+
68+
There is also an option to use configuration file. Refer to CLI11 documentation for details https://cliutils.github.io/CLI11/book/chapters/config.html. Important thing to remember - CLI11 processes configuration file before command line arguments, so in the end command line arguments might overwrite values defined in configuration file.
69+
3370
\section tutorial-walkthrough Tutorial Code Snippets
3471

3572
This page walks through the tutorial that exists in the source code. See

examples/hello_world/objgroup.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ struct MyObjGroup {
5757
};
5858

5959
int main(int argc, char** argv) {
60-
vt::initialize(argc, argv, nullptr);
60+
vt::initialize(argc, argv);
6161

6262
vt::NodeType this_node = vt::theContext()->getNode();
6363
vt::NodeType num_nodes = vt::theContext()->getNumNodes();

src/vt/collective/collective_ops.cc

+166-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
*/
4343

4444
#include "vt/collective/collective_ops.h"
45+
#include "vt/context/context.h"
4546
#include "vt/runtime/runtime.h"
4647
#include "vt/scheduler/scheduler.h"
4748
#include "vt/runtime/runtime_inst.h"
@@ -53,10 +54,166 @@
5354

5455
namespace vt {
5556

57+
namespace {
58+
59+
#define printIfOverwritten(opt) \
60+
do { \
61+
if (cliConfig.opt != appConfig.opt) { \
62+
++overwrittens; \
63+
fmt::print( \
64+
"{}\t{}--" #opt "{}\n", \
65+
vt_pre, magenta, reset \
66+
); \
67+
} \
68+
} while (0)
69+
70+
void printOverwrittens(
71+
vt::arguments::AppConfig const &cliConfig,
72+
vt::arguments::AppConfig const &appConfig
73+
) {
74+
auto const green = debug::green();
75+
auto const reset = debug::reset();
76+
auto const magenta = debug::magenta();
77+
auto const vt_pre = debug::vtPre();
78+
79+
fmt::print(
80+
"{}{}Predefined options overwritten by CLI arguments:{}\n",
81+
vt_pre, green, reset
82+
);
83+
84+
int overwrittens = 0;
85+
86+
printIfOverwritten(vt_color);
87+
printIfOverwritten(vt_no_color);
88+
printIfOverwritten(vt_quiet);
89+
printIfOverwritten(vt_sched_progress_han);
90+
printIfOverwritten(vt_sched_progress_sec);
91+
printIfOverwritten(vt_no_sigint);
92+
printIfOverwritten(vt_no_sigsegv);
93+
printIfOverwritten(vt_no_sigbus);
94+
printIfOverwritten(vt_no_terminate);
95+
printIfOverwritten(vt_memory_reporters);
96+
printIfOverwritten(vt_print_memory_each_phase);
97+
printIfOverwritten(vt_print_memory_node);
98+
printIfOverwritten(vt_allow_memory_report_with_ps);
99+
printIfOverwritten(vt_print_memory_at_threshold);
100+
printIfOverwritten(vt_print_memory_threshold);
101+
printIfOverwritten(vt_print_memory_sched_poll);
102+
printIfOverwritten(vt_print_memory_footprint);
103+
printIfOverwritten(vt_no_warn_stack);
104+
printIfOverwritten(vt_no_assert_stack);
105+
printIfOverwritten(vt_no_abort_stack);
106+
printIfOverwritten(vt_no_stack);
107+
printIfOverwritten(vt_stack_file);
108+
printIfOverwritten(vt_stack_dir);
109+
printIfOverwritten(vt_stack_mod);
110+
printIfOverwritten(vt_trace);
111+
printIfOverwritten(vt_trace_mpi);
112+
printIfOverwritten(vt_trace_pmpi);
113+
printIfOverwritten(vt_trace_sys_all);
114+
printIfOverwritten(vt_trace_sys_term);
115+
printIfOverwritten(vt_trace_sys_location);
116+
printIfOverwritten(vt_trace_sys_collection);
117+
printIfOverwritten(vt_trace_sys_serial_msg);
118+
printIfOverwritten(vt_trace_file);
119+
printIfOverwritten(vt_trace_dir);
120+
printIfOverwritten(vt_trace_mod);
121+
printIfOverwritten(vt_trace_flush_size);
122+
printIfOverwritten(vt_trace_spec);
123+
printIfOverwritten(vt_trace_spec_file);
124+
printIfOverwritten(vt_trace_memory_usage);
125+
printIfOverwritten(vt_trace_event_polling);
126+
printIfOverwritten(vt_trace_irecv_polling);
127+
printIfOverwritten(vt_lb);
128+
printIfOverwritten(vt_lb_show_spec);
129+
printIfOverwritten(vt_lb_quiet);
130+
printIfOverwritten(vt_lb_file_name);
131+
printIfOverwritten(vt_lb_name);
132+
printIfOverwritten(vt_lb_args);
133+
printIfOverwritten(vt_lb_interval);
134+
printIfOverwritten(vt_lb_stats);
135+
printIfOverwritten(vt_lb_stats_compress);
136+
printIfOverwritten(vt_lb_stats_dir);
137+
printIfOverwritten(vt_lb_stats_file);
138+
printIfOverwritten(vt_lb_stats_dir_in);
139+
printIfOverwritten(vt_lb_stats_file_in);
140+
printIfOverwritten(vt_help_lb_args);
141+
printIfOverwritten(vt_no_detect_hang);
142+
printIfOverwritten(vt_print_no_progress);
143+
printIfOverwritten(vt_epoch_graph_on_hang);
144+
printIfOverwritten(vt_epoch_graph_terse);
145+
printIfOverwritten(vt_term_rooted_use_ds);
146+
printIfOverwritten(vt_term_rooted_use_wave);
147+
printIfOverwritten(vt_hang_freq);
148+
printIfOverwritten(vt_diag_enable);
149+
printIfOverwritten(vt_diag_print_summary);
150+
printIfOverwritten(vt_diag_summary_csv_file);
151+
printIfOverwritten(vt_diag_summary_file);
152+
printIfOverwritten(vt_diag_csv_base_units);
153+
printIfOverwritten(vt_pause);
154+
printIfOverwritten(vt_no_assert_fail);
155+
printIfOverwritten(vt_throw_on_abort);
156+
printIfOverwritten(vt_max_mpi_send_size);
157+
printIfOverwritten(vt_debug_level);
158+
printIfOverwritten(vt_debug_all);
159+
printIfOverwritten(vt_debug_none);
160+
printIfOverwritten(vt_debug_gen);
161+
printIfOverwritten(vt_debug_runtime);
162+
printIfOverwritten(vt_debug_active);
163+
printIfOverwritten(vt_debug_term);
164+
printIfOverwritten(vt_debug_termds);
165+
printIfOverwritten(vt_debug_barrier);
166+
printIfOverwritten(vt_debug_event);
167+
printIfOverwritten(vt_debug_pipe);
168+
printIfOverwritten(vt_debug_pool);
169+
printIfOverwritten(vt_debug_reduce);
170+
printIfOverwritten(vt_debug_rdma);
171+
printIfOverwritten(vt_debug_rdma_channel);
172+
printIfOverwritten(vt_debug_rdma_state);
173+
printIfOverwritten(vt_debug_param);
174+
printIfOverwritten(vt_debug_handler);
175+
printIfOverwritten(vt_debug_hierlb);
176+
printIfOverwritten(vt_debug_temperedlb);
177+
printIfOverwritten(vt_debug_scatter);
178+
printIfOverwritten(vt_debug_sequence);
179+
printIfOverwritten(vt_debug_sequence_vrt);
180+
printIfOverwritten(vt_debug_serial_msg);
181+
printIfOverwritten(vt_debug_trace);
182+
printIfOverwritten(vt_debug_location);
183+
printIfOverwritten(vt_debug_lb);
184+
printIfOverwritten(vt_debug_vrt);
185+
printIfOverwritten(vt_debug_vrt_coll);
186+
printIfOverwritten(vt_debug_worker);
187+
printIfOverwritten(vt_debug_group);
188+
printIfOverwritten(vt_debug_broadcast);
189+
printIfOverwritten(vt_debug_objgroup);
190+
printIfOverwritten(vt_debug_phase);
191+
printIfOverwritten(vt_debug_context);
192+
printIfOverwritten(vt_debug_epoch);
193+
printIfOverwritten(vt_debug_print_flush);
194+
printIfOverwritten(vt_user_1);
195+
printIfOverwritten(vt_user_2);
196+
printIfOverwritten(vt_user_3);
197+
printIfOverwritten(vt_user_int_1);
198+
printIfOverwritten(vt_user_int_2);
199+
printIfOverwritten(vt_user_int_3);
200+
printIfOverwritten(vt_user_str_1);
201+
printIfOverwritten(vt_user_str_2);
202+
printIfOverwritten(vt_user_str_3);
203+
printIfOverwritten(vt_output_config);
204+
printIfOverwritten(vt_output_config_file);
205+
206+
if (overwrittens == 0) {
207+
fmt::print("{}\tNone.\n", vt_pre);
208+
}
209+
}
210+
211+
} /* end anon namespace */
212+
56213
template <runtime::RuntimeInstType instance>
57214
RuntimePtrType CollectiveAnyOps<instance>::initialize(
58215
int& argc, char**& argv, WorkerCountType const num_workers,
59-
bool is_interop, MPI_Comm* comm
216+
bool is_interop, MPI_Comm* comm, arguments::AppConfig const* appConfig
60217
) {
61218
using vt::runtime::RuntimeInst;
62219
using vt::runtime::Runtime;
@@ -66,7 +223,8 @@ RuntimePtrType CollectiveAnyOps<instance>::initialize(
66223

67224
#pragma sst global rt
68225
RuntimeInst<instance>::rt = std::make_unique<Runtime>(
69-
argc, argv, num_workers, is_interop, resolved_comm
226+
argc, argv, num_workers, is_interop, resolved_comm,
227+
eRuntimeInstance::DefaultInstance, appConfig
70228
);
71229

72230
#pragma sst global rt
@@ -79,6 +237,12 @@ RuntimePtrType CollectiveAnyOps<instance>::initialize(
79237
#pragma sst global rt
80238
RuntimeInst<instance>::rt->initialize();
81239

240+
// If appConfig is not nullptr, compare CLI arguments with user-defined ones,
241+
// and report overwritten ones.
242+
if (appConfig && theContext()->getNode() == 0) {
243+
printOverwrittens(*rt->getAppConfig(), *appConfig);
244+
}
245+
82246
return runtime::makeRuntimePtr(rt_ptr);
83247
}
84248

src/vt/collective/collective_ops.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ struct CollectiveAnyOps {
6363
// The general methods that interact with the managed runtime holder
6464
static RuntimePtrType initialize(
6565
int& argc, char**& argv, WorkerCountType const num_workers = no_workers,
66-
bool is_interop = false, MPI_Comm* comm = nullptr
66+
bool is_interop = false, MPI_Comm* comm = nullptr,
67+
arguments::AppConfig const* appConfig = nullptr
6768
);
6869
static void finalize(RuntimePtrType in_rt = nullptr);
6970
static void scheduleThenFinalize(

src/vt/collective/startup.cc

+22-4
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,20 @@ namespace vt {
5252
// vt::{initialize,finalize} for main ::vt namespace
5353
RuntimePtrType initialize(
5454
int& argc, char**& argv, WorkerCountType const num_workers,
55-
bool is_interop, MPI_Comm* comm
55+
bool is_interop, MPI_Comm* comm, arguments::AppConfig const* appConfig
5656
) {
57-
return CollectiveOps::initialize(argc,argv,num_workers,is_interop,comm);
57+
return CollectiveOps::initialize(
58+
argc, argv, num_workers, is_interop, comm, appConfig
59+
);
5860
}
5961

60-
RuntimePtrType initialize(int& argc, char**& argv, MPI_Comm* comm) {
62+
RuntimePtrType initialize(
63+
int& argc, char**& argv, MPI_Comm* comm, arguments::AppConfig const* appConfig
64+
) {
6165
bool const is_interop = comm != nullptr;
62-
return CollectiveOps::initialize(argc,argv,no_workers,is_interop,comm);
66+
return CollectiveOps::initialize(
67+
argc, argv, no_workers, is_interop, comm, appConfig
68+
);
6369
}
6470

6571
RuntimePtrType initialize(MPI_Comm* comm) {
@@ -69,6 +75,18 @@ RuntimePtrType initialize(MPI_Comm* comm) {
6975
return CollectiveOps::initialize(argc,argv,no_workers,is_interop,comm);
7076
}
7177

78+
RuntimePtrType initialize(
79+
int& argc, char**& argv, arguments::AppConfig const* appConfig
80+
) {
81+
return initialize(argc, argv, nullptr, appConfig);
82+
}
83+
84+
RuntimePtrType initialize(arguments::AppConfig const* appConfig) {
85+
int argc = 0;
86+
char** argv = nullptr;
87+
return initialize(argc, argv, nullptr, appConfig);
88+
}
89+
7290
void finalize(RuntimePtrType in_rt) {
7391
if (in_rt) {
7492
return CollectiveOps::finalize(std::move(in_rt));

src/vt/collective/startup.h

+9-2
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,17 @@ namespace vt {
5151

5252
RuntimePtrType initialize(
5353
int& argc, char**& argv, WorkerCountType const num_workers,
54-
bool is_interop = false, MPI_Comm* comm = nullptr
54+
bool is_interop = false, MPI_Comm* comm = nullptr,
55+
arguments::AppConfig const* appConfig = nullptr
56+
);
57+
RuntimePtrType initialize(
58+
int& argc, char**& argv, MPI_Comm* comm = nullptr,
59+
arguments::AppConfig const* appConfig = nullptr
5560
);
56-
RuntimePtrType initialize(int& argc, char**& argv, MPI_Comm* comm = nullptr);
5761
RuntimePtrType initialize(MPI_Comm* comm = nullptr);
62+
RuntimePtrType initialize(
63+
int& argc, char**& argv, arguments::AppConfig const* appConfig
64+
);
5865

5966
void finalize(RuntimePtrType in_rt);
6067
void finalize();

0 commit comments

Comments
 (0)