{
std::unique_ptr<simgrid::mc::RemoteClient> process(new simgrid::mc::RemoteClient(pid, socket));
// TODO, automatic detection of the config from the process
- process->privatized(smpi_privatize_global_variables != SMPI_PRIVATIZE_NONE);
+ process->privatized(smpi_privatize_global_variables != SmpiPrivStrategies::None);
modelChecker_ = std::unique_ptr<ModelChecker>(
new simgrid::mc::ModelChecker(std::move(process)));
xbt_assert(mc_model_checker == nullptr);
region.size = size;
region.block = ((char*)stack - (char*)heap->heapbase) / BLOCKSIZE + 1;
#if HAVE_SMPI
- if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP && process)
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap && process)
region.process_index = process->pid - 1;
else
#endif
} else if (siginfo->si_signo == SIGSEGV) {
fprintf(stderr, "Segmentation fault.\n");
#if HAVE_SMPI
- if (smpi_enabled() && smpi_privatize_global_variables == SMPI_PRIVATIZE_NONE) {
+ if (smpi_enabled() && smpi_privatize_global_variables == SmpiPrivStrategies::None) {
#if HAVE_PRIVATIZATION
fprintf(stderr, "Try to enable SMPI variable privatization with --cfg=smpi/privatization:yes.\n");
#else
XBT_PUBLIC smpi_trace_call_location_t* smpi_trace_get_call_location();
}
-enum smpi_priv_strategies {
- SMPI_PRIVATIZE_NONE = 0,
- SMPI_PRIVATIZE_MMAP = 1,
- SMPI_PRIVATIZE_DLOPEN = 2,
- SMPI_PRIVATIZE_DEFAULT = SMPI_PRIVATIZE_DLOPEN
-};
+enum class SmpiPrivStrategies { None = 0, Mmap = 1, Dlopen = 2, Default = Dlopen };
-extern XBT_PRIVATE int smpi_privatize_global_variables;
+extern XBT_PRIVATE SmpiPrivStrategies smpi_privatize_global_variables;
#endif
void smpi_bench_begin()
{
- if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
smpi_switch_data_segment(simgrid::s4u::Actor::self());
}
auto private_blocks = merge_private_blocks(src_private_blocks, dst_private_blocks);
check_blocks(private_blocks, buff_size);
void* tmpbuff=buff;
- if ((smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) && (static_cast<char*>(buff) >= smpi_data_exe_start) &&
+ if ((smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) &&
+ (static_cast<char*>(buff) >= smpi_data_exe_start) &&
(static_cast<char*>(buff) < smpi_data_exe_start + smpi_data_exe_size)) {
XBT_DEBUG("Privatization : We are copying from a zone inside global memory... Saving data to temp buffer !");
smpi_switch_data_segment(comm->src_proc->iface());
memcpy_private(tmpbuff, buff, private_blocks);
}
- if ((smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) && ((char*)comm->dst_buff >= smpi_data_exe_start) &&
+ if ((smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) && ((char*)comm->dst_buff >= smpi_data_exe_start) &&
((char*)comm->dst_buff < smpi_data_exe_start + smpi_data_exe_size)) {
XBT_DEBUG("Privatization : We are copying to a zone inside global memory - Switch data segment");
smpi_switch_data_segment(comm->dst_proc->iface());
xbt_os_timer_free(global_timer);
}
- if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP)
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap)
smpi_destroy_global_memory_segments();
smpi_free_static();
}
xbt_assert(smpi_host_speed >= 0, "You're trying to set the host_speed to a negative value (%f)", 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;
+ smpi_privatize_global_variables = SmpiPrivStrategies::None;
else if (smpi_privatize_option == "yes" || smpi_privatize_option == "1")
- smpi_privatize_global_variables = SMPI_PRIVATIZE_DEFAULT;
+ smpi_privatize_global_variables = SmpiPrivStrategies::Default;
else if (smpi_privatize_option == "mmap")
- smpi_privatize_global_variables = SMPI_PRIVATIZE_MMAP;
+ smpi_privatize_global_variables = SmpiPrivStrategies::Mmap;
else if (smpi_privatize_option == "dlopen")
- smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN;
+ smpi_privatize_global_variables = SmpiPrivStrategies::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) {
- XBT_INFO("mmap privatization is broken on FreeBSD, switching to dlopen privatization instead.");
- smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN;
- }
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+ XBT_INFO("mmap privatization is broken on FreeBSD, switching to dlopen privatization instead.");
+ smpi_privatize_global_variables = SmpiPrivStrategies::Dlopen;
+ }
#endif
if (smpi_cpu_threshold < 0)
SIMIX_comm_set_copy_data_callback(smpi_comm_copy_buffer_callback);
smpi_init_options();
- if (smpi_privatize_global_variables == SMPI_PRIVATIZE_DLOPEN) {
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Dlopen) {
std::string executable_copy = executable;
smpi_check_options();
TRACE_smpi_alloc();
simgrid::s4u::onSimulationEnd.connect(TRACE_smpi_release);
- if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP)
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap)
smpi_backup_global_memory_segment();
}
int smpi_loaded_page = -1;
char* smpi_data_exe_start = nullptr;
int smpi_data_exe_size = 0;
-int smpi_privatize_global_variables;
+SmpiPrivStrategies smpi_privatize_global_variables;
static void* smpi_data_exe_copy;
// We keep a copy of all the privatization regions: We can then delete everything easily by iterating over this
XBT_DEBUG("bss+data segment found : size %d starting at %p", smpi_data_exe_size, smpi_data_exe_start);
if (smpi_data_exe_size == 0) { // no need to do anything as global variables don't exist
- smpi_privatize_global_variables=false;
+ smpi_privatize_global_variables = SmpiPrivStrategies::None;
return;
}
// of the simulation and can be used to initialize a dynamically added, new process.
asan_safe_memcpy(smpi_data_exe_copy, TOPAGE(smpi_data_exe_start), smpi_data_exe_size);
#else /* ! HAVE_PRIVATIZATION */
- smpi_privatize_global_variables = false;
+ smpi_privatize_global_variables = SmpiPrivStrategies::None;
xbt_die("You are trying to use privatization on a system that does not support it. Don't.");
return;
#endif
// cheinrich: I'm not sure what the impact of the SMPI_switch_data_segment on this call is. I moved
// this up here so that I can set the privatized region before the switch.
Process* process = smpi_process_remote(proc);
- if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
/* Now using the segment index of this process */
process->set_privatized_region(smpi_init_global_memory_segment_process());
/* Done at the process's creation */
}
int Comm::dup(MPI_Comm* newcomm){
- if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+ // we need to switch as the called function may silently touch global variables
smpi_switch_data_segment(simgrid::s4u::Actor::self());
}
MPI_Group cp = new Group(this->group());
smpi_process()->set_replaying(false);
}
- if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+ // we need to switch as the called function may silently touch global variables
smpi_switch_data_segment(simgrid::s4u::Actor::self());
}
//identify neighbours in comm
Coll_allgather_mpich::allgather(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this);
- if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+ // we need to switch as the called function may silently touch global variables
smpi_switch_data_segment(simgrid::s4u::Actor::self());
}
}
Coll_bcast_mpich::bcast(&(is_uniform_),1, MPI_INT, 0, comm_intra );
- if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+ // we need to switch as the called function may silently touch global variables
smpi_switch_data_segment(simgrid::s4u::Actor::self());
}
// Are the ranks blocked ? = allocated contiguously on the SMP nodes
// FIXME Handle the case of a partial shared malloc.
- if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
smpi_switch_data_segment(simgrid::s4u::Actor::self());
}
/* First check if we really have something to do */
void Op::apply(void *invec, void *inoutvec, int *len, MPI_Datatype datatype)
{
- if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){//we need to switch as the called function may silently touch global variables
+ if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+ // we need to switch as the called function may silently touch global variables
XBT_DEBUG("Applying operation, switch to the right data frame ");
smpi_switch_data_segment(simgrid::s4u::Actor::self());
}
if (not(old_type_->flags() & DT_FLAG_DERIVED)) {
oldbuf = buf_;
if (not process->replaying() && oldbuf != nullptr && size_ != 0) {
- if ((smpi_privatize_global_variables != 0) && (static_cast<char*>(buf_) >= smpi_data_exe_start) &&
+ if ((smpi_privatize_global_variables != SmpiPrivStrategies::None) &&
+ (static_cast<char*>(buf_) >= smpi_data_exe_start) &&
(static_cast<char*>(buf_) < smpi_data_exe_start + smpi_data_exe_size)) {
XBT_DEBUG("Privatization : We are sending from a zone inside global memory. Switch data segment ");
smpi_switch_data_segment(simgrid::s4u::Actor::byPid(src_));
if (((req->flags_ & ACCUMULATE) != 0) ||
(datatype->flags() & DT_FLAG_DERIVED)) { // && (not smpi_is_shared(req->old_buf_))){
- if (not smpi_process()->replaying() && smpi_privatize_global_variables != 0 &&
+ if (not smpi_process()->replaying() && smpi_privatize_global_variables != SmpiPrivStrategies::None &&
static_cast<char*>(req->old_buf_) >= smpi_data_exe_start &&
static_cast<char*>(req->old_buf_) < smpi_data_exe_start + smpi_data_exe_size) {
XBT_VERB("Privatization : We are unserializing to a zone in global memory Switch data segment ");