Example #1
0
MPI_Comm smpi_process_comm_self(void)
{
  smpi_process_data_t data = smpi_process_data();
  if(data->comm_self==MPI_COMM_NULL){
    MPI_Group group = smpi_group_new(1);
    data->comm_self = smpi_comm_new(group, NULL);
    smpi_group_set_mapping(group, smpi_process_index(), 0);
  }

  return data->comm_self;
}
Example #2
0
void smpi_global_init(void)
{
  int i;
  MPI_Group group;
  char name[MAILBOX_NAME_MAXLEN];
  int smpirun=0;

  if (!MC_is_active()) {
    global_timer = xbt_os_timer_new();
    xbt_os_walltimer_start(global_timer);
  }
  if (process_count == 0){
    process_count = SIMIX_process_count();
    smpirun=1;
  }
  smpi_universe_size = process_count;
  process_data = xbt_new0(smpi_process_data_t, process_count);
  for (i = 0; i < process_count; i++) {
    process_data[i]                       = xbt_new(s_smpi_process_data_t, 1);
    //process_data[i]->index              = i;
    process_data[i]->argc                 = NULL;
    process_data[i]->argv                 = NULL;
    process_data[i]->mailbox              = simcall_rdv_create(get_mailbox_name(name, i));
    process_data[i]->mailbox_small        =
        simcall_rdv_create(get_mailbox_name_small(name, i));
    process_data[i]->mailboxes_mutex      = xbt_mutex_init();
    process_data[i]->timer                = xbt_os_timer_new();
    if (MC_is_active())
      MC_ignore_heap(process_data[i]->timer, xbt_os_timer_size());
    process_data[i]->comm_self            = MPI_COMM_NULL;
    process_data[i]->comm_intra           = MPI_COMM_NULL;
    process_data[i]->comm_world           = NULL;
    process_data[i]->state                = SMPI_UNINITIALIZED;
    process_data[i]->sampling             = 0;
    process_data[i]->finalization_barrier = NULL;
  }
  //if the process was launched through smpirun script
  //we generate a global mpi_comm_world
  //if not, we let MPI_COMM_NULL, and the comm world
  //will be private to each mpi instance
  if(smpirun){
    group = smpi_group_new(process_count);
    MPI_COMM_WORLD = smpi_comm_new(group, NULL);
    MPI_Attr_put(MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, (void *)(MPI_Aint)process_count);
    xbt_bar_t bar=xbt_barrier_init(process_count);

    for (i = 0; i < process_count; i++) {
      smpi_group_set_mapping(group, i, i);
      process_data[i]->finalization_barrier = bar;
    }
  }
}
//get the index of the process in the process_data array
void smpi_deployment_register_process(const char* instance_id, int rank, int index,MPI_Comm** comm, xbt_bar_t* bar){

  if(smpi_instances==nullptr){//no instance registered, we probably used smpirun.
    index_to_process_data[index]=index;
    *bar = nullptr;
    *comm = nullptr;
    return;
  }

  s_smpi_mpi_instance_t* instance =
     static_cast<s_smpi_mpi_instance_t*>(xbt_dict_get_or_null(smpi_instances, instance_id));
  xbt_assert(instance, "Error, unknown instance %s", instance_id);

  if(instance->comm_world == MPI_COMM_NULL){
    MPI_Group group = smpi_group_new(instance->size);
    instance->comm_world = smpi_comm_new(group, nullptr);
  }
  instance->present_processes++;
  index_to_process_data[index]=instance->index+rank;
  smpi_group_set_mapping(smpi_comm_group(instance->comm_world), index, rank);
  *bar = instance->finalization_barrier;
  *comm = &instance->comm_world;
  return;
}