-/* Copyright (c) 2007-2014. The SimGrid Team.
+/* Copyright (c) 2007-2015. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "private.h"
#include "smpi_mpi_dt_private.h"
#include "mc/mc.h"
-#include "mc/mc_record.h"
+#include "src/mc/mc_record.h"
#include "xbt/replay.h"
#include "surf/surf.h"
-#include "simix/smx_private.h"
+#include "src/simix/smx_private.h"
#include "simgrid/sg_config.h"
+#include "src/mc/mc_replay.h"
+#include "src/msg/msg_private.h"
#include <float.h> /* DBL_MAX */
#include <stdint.h>
static smpi_process_data_t *process_data = NULL;
int process_count = 0;
+int smpi_universe_size = 0;
int* index_to_process_data = NULL;
extern double smpi_total_benched_time;
xbt_os_timer_t global_timer;
MPI_Comm MPI_COMM_WORLD = MPI_COMM_UNINITIALIZED;
-int MPI_UNIVERSE_SIZE;
MPI_Errhandler *MPI_ERRORS_RETURN = NULL;
MPI_Errhandler *MPI_ERRORS_ARE_FATAL = NULL;
if (argc && argv) {
proc = SIMIX_process_self();
//FIXME: dirty cleanup method to avoid using msg cleanup functions on these processes when using MSG+SMPI
- proc->context->cleanup_func=SIMIX_process_cleanup;
+ SIMIX_process_set_cleanup_function(proc, SIMIX_process_cleanup);
char* instance_id = (*argv)[1];
int rank = atoi((*argv)[2]);
index = smpi_process_index_of_smx_process(proc);
if(!index_to_process_data){
- index_to_process_data=(int*)xbt_malloc(SIMIX_process_count()*sizeof(int));
+ index_to_process_data=(int*)xbt_malloc(SIMIX_process_count()*sizeof(int));
}
+
+ if(smpi_privatize_global_variables){
+ /* Now using segment index of the process */
+ index = proc->segment_index;
+ /* Done at the process's creation */
+ SMPI_switch_data_segment(index);
+ }
+
MPI_Comm* temp_comm_world;
xbt_bar_t temp_bar;
smpi_deployment_register_process(instance_id, rank, index, &temp_comm_world ,&temp_bar);
data->index = index;
data->instance_id = instance_id;
data->replaying = 0;
- xbt_free(simcall_process_get_data(proc));
- simcall_process_set_data(proc, data);
+ //xbt_free(simcall_process_get_data(proc));
+
+ simdata_process_t simdata = simcall_process_get_data(proc);
+ simdata->data = data;
+
if (*argc > 3) {
free((*argv)[1]);
memmove(&(*argv)[0], &(*argv)[2], sizeof(char *) * (*argc - 2));
simcall_rdv_set_receiver(data->mailbox_small, proc);
XBT_DEBUG("<%d> New process in the game: %p", index, proc);
- if(smpi_privatize_global_variables){
- smpi_switch_data_segment(index);
- }
-
}
if (smpi_process_data() == NULL)
xbt_die("smpi_process_data() returned NULL. You probably gave a NULL parameter to MPI_Init. Although it's required by MPI-2, this is currently not supported by SMPI.");
*/
int smpi_process_initialized(void)
{
- int index = smpi_process_index();
- return ( (index != MPI_UNDEFINED)
- && (process_data[index_to_process_data[index]]->state == SMPI_INITIALIZED));
+ if (!index_to_process_data){
+ return false;
+ }
+ else{
+ int index = smpi_process_index();
+ return ( (index != MPI_UNDEFINED)
+ && (process_data[index_to_process_data[index]]->state == SMPI_INITIALIZED));
+ }
}
/**
smpi_process_data_t smpi_process_data(void)
{
- return SIMIX_process_self_get_data(SIMIX_process_self());
+ simdata_process_t simdata = SIMIX_process_self_get_data(SIMIX_process_self());
+ return simdata->data;
}
smpi_process_data_t smpi_process_remote_data(int index)
&& ((char*)buff < smpi_start_data_exe + smpi_size_data_exe )
){
XBT_DEBUG("Privatization : We are copying from a zone inside global memory... Saving data to temp buffer !");
- smpi_switch_data_segment(((smpi_process_data_t)SIMIX_process_get_data(comm->comm.src_proc))->index);
+ smpi_switch_data_segment(((smpi_process_data_t)(((simdata_process_t)SIMIX_process_get_data(comm->comm.src_proc))->data))->index);
tmpbuff = (void*)xbt_malloc(buff_size);
memcpy(tmpbuff, buff, buff_size);
}
&& ((char*)comm->comm.dst_buff < smpi_start_data_exe + smpi_size_data_exe )
){
XBT_DEBUG("Privatization : We are copying to a zone inside global memory - Switch data segment");
- smpi_switch_data_segment(((smpi_process_data_t)SIMIX_process_get_data(comm->comm.dst_proc))->index);
+ smpi_switch_data_segment(((smpi_process_data_t)(((simdata_process_t)SIMIX_process_get_data(comm->comm.dst_proc))->data))->index);
}
static void smpi_check_options(){
//check correctness of MPI parameters
- xbt_assert(sg_cfg_get_int("smpi/async_small_thres") <=
- sg_cfg_get_int("smpi/send_is_detached_thres"));
+ xbt_assert(sg_cfg_get_int("smpi/async_small_thresh") <=
+ sg_cfg_get_int("smpi/send_is_detached_thresh"));
if (sg_cfg_is_default_value("smpi/running_power")) {
XBT_INFO("You did not set the power of the host running the simulation. "
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]->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();
+ 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]->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
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);
- MPI_UNIVERSE_SIZE = smpi_comm_size(MPI_COMM_WORLD);
for (i = 0; i < process_count; i++) {
smpi_group_set_mapping(group, i, i);
process_data[i]->finalization_barrier = bar;
TRACE_add_end_function(TRACE_smpi_release);
SIMIX_global_init(&argc, argv);
+ MSG_init(&argc,argv);
+
+ SMPI_switch_data_segment = smpi_switch_data_segment;
smpi_init_options();
fflush(stderr);
if (MC_is_active()) {
- MC_do_the_modelcheck_for_real();
+ MC_run();
} else {
SIMIX_run();
xbt_os_walltimer_stop(global_timer);
if (sg_cfg_get_boolean("smpi/display_timing")){
double global_time = xbt_os_timer_elapsed(global_timer);
- XBT_INFO("Simulated time: %g seconds. \n "
+ XBT_INFO("Simulated time: %g seconds. \n\n"
"The simulation took %g seconds (after parsing and platform setup)\n"
"%g seconds were actual computation of the application"
, SIMIX_get_clock(), global_time , smpi_total_benched_time);