static void smpi_init_options(){
//return if already called
- if(smpi_cpu_threshold!=-1)
+ 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/privatize-global-variables");
+ 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_NONE;
else
- xbt_die("Invalid value for smpi/privatize-global-variables: %s",
- smpi_privatize_option);
+ xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option);
if (smpi_cpu_threshold < 0)
smpi_cpu_threshold = DBL_MAX;
typedef std::function<int(int argc, char *argv[])> smpi_entry_point_type;
typedef int (* smpi_c_entry_point_type)(int argc, char **argv);
-typedef void (* smpi_fortran_entry_point_type)(void);
+typedef void (*smpi_fortran_entry_point_type)();
static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector<std::string> args)
{
// TODO, remove the number of functions involved here
static smpi_entry_point_type smpi_resolve_function(void* handle)
{
- smpi_fortran_entry_point_type entry_point2 =
- (smpi_fortran_entry_point_type) dlsym(handle, "user_main_");
- if (entry_point2 != nullptr) {
- // fprintf(stderr, "EP user_main_=%p\n", entry_point2);
- return [entry_point2](int argc, char** argv) {
+ smpi_fortran_entry_point_type entry_point_fortran = (smpi_fortran_entry_point_type)dlsym(handle, "user_main_");
+ if (entry_point_fortran != nullptr) {
+ return [entry_point_fortran](int argc, char** argv) {
smpi_process_init(&argc, &argv);
- entry_point2();
+ entry_point_fortran();
return 0;
};
}
- smpi_c_entry_point_type entry_point = (smpi_c_entry_point_type) dlsym(handle, "main");
+ smpi_c_entry_point_type entry_point = (smpi_c_entry_point_type)dlsym(handle, "main");
if (entry_point != nullptr) {
- // fprintf(stderr, "EP main=%p\n", entry_point);
return entry_point;
}
+ "_" + std::to_string(getpid())
+ "_" + std::to_string(rank++) + ".so";
- int fdout = open(target_executable.c_str(), O_WRONLY);
+ int fdout = open(target_executable.c_str(), O_CREAT | O_RDWR, S_IRWXU);
xbt_assert(fdout >= 0, "Cannot write into %s", target_executable.c_str());
#if HAVE_SENDFILE
- sendfile(fdout, fdin, NULL, fdin_size);
+ off_t offset = 0;
+ sendfile(fdout, fdin, &offset, fdin_size);
#else
XBT_WARN("Copy %d bytes into %s", static_cast<int>(fdin_size), target_executable.c_str());
const int bufsize = 1024 * 1024 * 4;
void* handle = dlopen(target_executable.c_str(), RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND);
unlink(target_executable.c_str());
if (handle == nullptr)
- xbt_die("dlopen failed");
+ xbt_die("dlopen failed: %s (errno: %d -- %s)", dlerror(), errno, strerror(errno));
smpi_entry_point_type entry_point = smpi_resolve_function(handle);
if (!entry_point)
xbt_die("Could not resolve entry point");