-/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2007-2018. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#endif
std::unordered_map<std::string, double> location2speedup;
-simgrid::smpi::Process **process_data = nullptr;
+static simgrid::smpi::Process** process_data = nullptr;
int process_count = 0;
int smpi_universe_size = 0;
int* index_to_process_data = nullptr;
* "this == MPI_COMM_UNINITIALIZED"? If yes, it uses smpi_process()->comm_world()
* instead of "this".
* This is basically how we only have one global variable but all processes have
- * different communicators (basically, the one their SMPI instance uses).
+ * different communicators (the one their SMPI instance uses).
*
* See smpi_comm.cpp and the functions therein for details.
*/
xbt_os_walltimer_start(global_timer);
}
- if (xbt_cfg_get_string("smpi/comp-adjustment-file")[0] != '\0') {
- std::string filename {xbt_cfg_get_string("smpi/comp-adjustment-file")};
+ std::string filename = xbt_cfg_get_string("smpi/comp-adjustment-file");
+ if (not filename.empty()) {
std::ifstream fstream(filename);
if (not fstream.is_open()) {
xbt_die("Could not open file %s. Does it exist?", filename.c_str());
// and the (computed) event_set.
std::map</* computation unit name */ std::string, papi_process_data> units2papi_setup;
- if (xbt_cfg_get_string("smpi/papi-events")[0] != '\0') {
+ if (not xbt_cfg_get_string("smpi/papi-events").empty()) {
if (PAPI_library_init(PAPI_VER_CURRENT) != PAPI_VER_CURRENT)
XBT_ERROR("Could not initialize PAPI library; is it correctly installed and linked?"
" Expected version is %i",
typedef boost::tokenizer<boost::char_separator<char>> Tokenizer;
boost::char_separator<char> separator_units(";");
- std::string str = std::string(xbt_cfg_get_string("smpi/papi-events"));
+ std::string str = xbt_cfg_get_string("smpi/papi-events");
Tokenizer tokens(str, separator_units);
// Iterate over all the computational units. This could be processes, hosts, threads, ranks... You name it.
smpi_bench_destroy();
smpi_shared_destroy();
smpi_deployment_cleanup_instances();
- for (int i = 0, count = smpi_process_count(); i < count; i++) {
+ int count = smpi_process_count();
+ for (int i = 0; i < count; i++) {
if(process_data[i]->comm_self()!=MPI_COMM_NULL){
simgrid::smpi::Comm::destroy(process_data[i]->comm_self());
}
xbt_os_timer_free(global_timer);
}
- xbt_free(index_to_process_data);
+ delete[] index_to_process_data;
if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP)
smpi_destroy_global_memory_segments();
smpi_free_static();
}
-extern "C" {
-
-static void smpi_init_logs(){
-
- /* Connect log categories. See xbt/log.c */
-
- XBT_LOG_CONNECT(smpi); /* Keep this line as soon as possible in this function: xbt_log_appender_file.c depends on it
- DO NOT connect this in XBT or so, or it will be useless to xbt_log_appender_file.c */
- XBT_LOG_CONNECT(instr_smpi);
- XBT_LOG_CONNECT(smpi_bench);
- XBT_LOG_CONNECT(smpi_coll);
- XBT_LOG_CONNECT(smpi_colls);
- XBT_LOG_CONNECT(smpi_comm);
- XBT_LOG_CONNECT(smpi_datatype);
- XBT_LOG_CONNECT(smpi_dvfs);
- XBT_LOG_CONNECT(smpi_group);
- XBT_LOG_CONNECT(smpi_host);
- XBT_LOG_CONNECT(smpi_kernel);
- XBT_LOG_CONNECT(smpi_mpi);
- XBT_LOG_CONNECT(smpi_memory);
- XBT_LOG_CONNECT(smpi_op);
- XBT_LOG_CONNECT(smpi_pmpi);
- XBT_LOG_CONNECT(smpi_process);
- XBT_LOG_CONNECT(smpi_request);
- XBT_LOG_CONNECT(smpi_replay);
- XBT_LOG_CONNECT(smpi_rma);
- XBT_LOG_CONNECT(smpi_shared);
- XBT_LOG_CONNECT(smpi_utils);
-}
-}
-
static void smpi_init_options(){
- //return if already called
- if (smpi_cpu_threshold > -1)
- return;
- simgrid::smpi::Colls::set_collectives();
- simgrid::smpi::Colls::smpi_coll_cleanup_callback=nullptr;
- smpi_cpu_threshold = xbt_cfg_get_double("smpi/cpu-threshold");
- smpi_host_speed = xbt_cfg_get_double("smpi/host-speed");
- const char* smpi_privatize_option = xbt_cfg_get_string("smpi/privatization");
- if (std::strcmp(smpi_privatize_option, "no") == 0)
- smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE;
- else if (std::strcmp(smpi_privatize_option, "yes") == 0)
- smpi_privatize_global_variables = SMPI_PRIVATIZE_DEFAULT;
- else if (std::strcmp(smpi_privatize_option, "mmap") == 0)
- smpi_privatize_global_variables = SMPI_PRIVATIZE_MMAP;
- else if (std::strcmp(smpi_privatize_option, "dlopen") == 0)
- smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN;
-
- // Some compatibility stuff:
- else if (std::strcmp(smpi_privatize_option, "1") == 0)
- smpi_privatize_global_variables = SMPI_PRIVATIZE_DEFAULT;
- else if (std::strcmp(smpi_privatize_option, "0") == 0)
- smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE;
-
- else
- xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option);
+ // return if already called
+ if (smpi_cpu_threshold > -1)
+ return;
+ simgrid::smpi::Colls::set_collectives();
+ simgrid::smpi::Colls::smpi_coll_cleanup_callback = nullptr;
+ smpi_cpu_threshold = xbt_cfg_get_double("smpi/cpu-threshold");
+ smpi_host_speed = xbt_cfg_get_double("smpi/host-speed");
+ std::string smpi_privatize_option = xbt_cfg_get_string("smpi/privatization");
+ if (smpi_privatize_option == "no" || smpi_privatize_option == "0")
+ smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE;
+ else if (smpi_privatize_option == "yes" || smpi_privatize_option == "1")
+ smpi_privatize_global_variables = SMPI_PRIVATIZE_DEFAULT;
+ else if (smpi_privatize_option == "mmap")
+ smpi_privatize_global_variables = SMPI_PRIVATIZE_MMAP;
+ else if (smpi_privatize_option == "dlopen")
+ smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN;
+ else
+ xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option.c_str());
#if defined(__FreeBSD__)
if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
if (smpi_cpu_threshold < 0)
smpi_cpu_threshold = DBL_MAX;
- char* val = xbt_cfg_get_string("smpi/shared-malloc");
- if (not strcasecmp(val, "yes") || not strcmp(val, "1") || not strcasecmp(val, "on") ||
- not strcasecmp(val, "global")) {
+ std::string val = xbt_cfg_get_string("smpi/shared-malloc");
+ if ((val == "yes") || (val == "1") || (val == "on") || (val == "global")) {
smpi_cfg_shared_malloc = shmalloc_global;
- } else if (not strcasecmp(val, "local")) {
+ } else if (val == "local") {
smpi_cfg_shared_malloc = shmalloc_local;
- } else if (not strcasecmp(val, "no") || not strcmp(val, "0") || not strcasecmp(val, "off")) {
+ } else if ((val == "no") || (val == "0") || (val == "off")) {
smpi_cfg_shared_malloc = shmalloc_none;
} else {
xbt_die("Invalid value '%s' for option smpi/shared-malloc. Possible values: 'on' or 'global', 'local', 'off'",
- val);
+ val.c_str());
}
}
}
}
int ret = 0;
- for (int i = 0, count = smpi_process_count(); i < count; i++) {
+ int count = smpi_process_count();
+ for (int i = 0; i < count; i++) {
if(process_data[i]->return_value()!=0){
ret=process_data[i]->return_value();//return first non 0 value
break;
// Called either directly from the user code, or from the code called by smpirun
void SMPI_init(){
- smpi_init_logs();
smpi_init_options();
smpi_global_init();
smpi_check_options();