}
}
-
-static xbt_dynar_t get_reqq_self(){
- char * key;
-
- int size = asprintf(&key, "%d", smpi_process_index());
- if(size==-1)
- xbt_die("could not allocate memory for asprintf");
+static xbt_dynar_t get_reqq_self()
+{
+ char * key = bprintf("%d", smpi_process_index());
xbt_dynar_t dynar_mpi_request = (xbt_dynar_t) xbt_dict_get(reqq, key);
free(key);
return dynar_mpi_request;
}
-static void set_reqq_self(xbt_dynar_t mpi_request){
- char * key;
-
- int size = asprintf(&key, "%d", smpi_process_index());
- if(size==-1)
- xbt_die("could not allocate memory for asprintf");
+static void set_reqq_self(xbt_dynar_t mpi_request)
+{
+ char * key = bprintf("%d", smpi_process_index());
xbt_dict_set(reqq, key, mpi_request, free);
free(key);
}
-
//allocate a single buffer for all sends, growing it if needed
-void* smpi_get_tmp_sendbuffer(int size){
+void* smpi_get_tmp_sendbuffer(int size)
+{
if (!smpi_process_get_replaying())
- return xbt_malloc(size);
+ return xbt_malloc(size);
if (sendbuffer_size<size){
sendbuffer=static_cast<char*>(xbt_realloc(sendbuffer,size));
sendbuffer_size=size;
}
return sendbuffer;
}
+
//allocate a single buffer for all recv
void* smpi_get_tmp_recvbuffer(int size){
if (!smpi_process_get_replaying())
static MPI_Datatype decode_datatype(const char *const action)
{
// Declared datatypes,
-
- switch(atoi(action))
- {
+ switch(atoi(action)) {
case 0:
MPI_CURRENT_TYPE=MPI_DOUBLE;
break;
break;
default:
MPI_CURRENT_TYPE=MPI_DEFAULT_TYPE;
-
}
return MPI_CURRENT_TYPE;
}
const char* encode_datatype(MPI_Datatype datatype, int* known)
{
-
//default type for output is set to MPI_BYTE
// MPI_DEFAULT_TYPE is not set for output, use directly MPI_BYTE
if(known)*known=1;
"Please contact the Simgrid team if support is needed", __FUNCTION__, i, mandatory, optional);\
}
-
static void action_init(const char *const *action)
{
XBT_DEBUG("Initialize the counters");
}
set_reqq_self(xbt_dynar_new(sizeof(MPI_Request),&xbt_free_ref));
-
- /*
- reqq=xbt_new0(xbt_dynar_t,active_processes);
-
- for(i=0;i<active_processes;i++){
- reqq[i]=xbt_dynar_new(sizeof(MPI_Request),&xbt_free_ref);
- }
- }
- */
}
static void action_finalize(const char *const *action)
double clock = smpi_process_simulated_elapsed();
MPI_Request request;
MPI_Status status;
- int flag = TRUE;
+ int flag = true;
request = xbt_dynar_pop_as(get_reqq_self(),MPI_Request);
//if request is null here, this may mean that a previous test has succeeded
flag = smpi_mpi_test(&request, &status);
XBT_DEBUG("MPI_Test result: %d", flag);
- /* push back request in dynar to be caught by a subsequent wait. if the test
- * did succeed, the request is now NULL.
- */
+ /* push back request in dynar to be caught by a subsequent wait. if the test did succeed, the request is now NULL.*/
xbt_dynar_push_as(get_reqq_self(),MPI_Request, request);
TRACE_smpi_testing_out(rank);
request = xbt_dynar_pop_as(get_reqq_self(),MPI_Request);
if (!request){
- /* Assuming that the trace is well formed, this mean the comm might have
- * been caught by a MPI_test. Then just return.
- */
+ /* Assume that the trace is well formed, meaning the comm might have been caught by a MPI_test. Then just return.*/
return;
}
- int rank = request->comm != MPI_COMM_NULL
- ? smpi_comm_rank(request->comm)
- : -1;
+ int rank = request->comm != MPI_COMM_NULL ? smpi_comm_rank(request->comm) : -1;
MPI_Group group = smpi_comm_group(request->comm);
int src_traced = smpi_group_rank(group, request->src);
xbt_dynar_foreach(get_reqq_self(),i,requests[i]);
//save information from requests
-
xbt_dynar_t srcs = xbt_dynar_new(sizeof(int), NULL);
xbt_dynar_t dsts = xbt_dynar_new(sizeof(int), NULL);
xbt_dynar_t recvs = xbt_dynar_new(sizeof(int), NULL);
log_timed_action (action, clock);
}
-
static void action_bcast(const char *const *action)
{
CHECK_ACTION_PARAMS(action, 1, 2);
double size = parse_double(action[2]);
double clock = smpi_process_simulated_elapsed();
int root=0;
- /*
- * Initialize MPI_CURRENT_TYPE in order to decrease
- * the number of the checks
- * */
+ /* Initialize MPI_CURRENT_TYPE in order to decrease the number of the checks */
MPI_CURRENT_TYPE= MPI_DEFAULT_TYPE;
if(action[3]) {
MPI_CURRENT_TYPE=decode_datatype(action[5]);
}
}
-
-
int rank = smpi_process_index();
int root_traced = smpi_group_rank(smpi_comm_group(MPI_COMM_WORLD), root);
void *recvbuf = smpi_get_tmp_sendbuffer(comm_size* smpi_datatype_size(MPI_CURRENT_TYPE));
void *sendbuf = smpi_get_tmp_sendbuffer(comm_size* smpi_datatype_size(MPI_CURRENT_TYPE));
- mpi_coll_reduce_fun(sendbuf, recvbuf, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, root, MPI_COMM_WORLD);
- smpi_execute_flops(comp_size);
+ mpi_coll_reduce_fun(sendbuf, recvbuf, comm_size, MPI_CURRENT_TYPE, MPI_OP_NULL, root, MPI_COMM_WORLD);
+ smpi_execute_flops(comp_size);
TRACE_smpi_collective_out(rank, root_traced, __FUNCTION__);
log_timed_action (action, clock);
log_timed_action (action, clock);
}
-
static void action_gather(const char *const *action) {
- /*
- The structure of the gather action for the rank 0 (total 4 processes)
- is the following:
+ /* The structure of the gather action for the rank 0 (total 4 processes) is the following:
0 gather 68 68 0 0 0
where:
TRACE_smpi_collective_in(smpi_process_index(), root, __FUNCTION__, extra);
- mpi_coll_gather_fun(send, send_size, MPI_CURRENT_TYPE,
- recv, recv_size, MPI_CURRENT_TYPE2,
- root, MPI_COMM_WORLD);
+ mpi_coll_gather_fun(send, send_size, MPI_CURRENT_TYPE, recv, recv_size, MPI_CURRENT_TYPE2, root, MPI_COMM_WORLD);
TRACE_smpi_collective_out(smpi_process_index(), -1, __FUNCTION__);
log_timed_action (action, clock);
}
-
-
static void action_gatherv(const char *const *action) {
- /*
- The structure of the gatherv action for the rank 0 (total 4 processes)
- is the following:
+ /* The structure of the gatherv action for the rank 0 (total 4 processes) is the following:
0 gather 68 68 10 10 10 0 0 0
where:
TRACE_smpi_collective_in(smpi_process_index(), root, __FUNCTION__, extra);
- smpi_mpi_gatherv(send, send_size, MPI_CURRENT_TYPE,
- recv, recvcounts, disps, MPI_CURRENT_TYPE2,
- root, MPI_COMM_WORLD);
+ smpi_mpi_gatherv(send, send_size, MPI_CURRENT_TYPE, recv, recvcounts, disps, MPI_CURRENT_TYPE2, root, MPI_COMM_WORLD);
TRACE_smpi_collective_out(smpi_process_index(), -1, __FUNCTION__);
log_timed_action (action, clock);
}
static void action_reducescatter(const char *const *action) {
-
- /*
- The structure of the reducescatter action for the rank 0 (total 4 processes)
- is the following:
+ /* The structure of the reducescatter action for the rank 0 (total 4 processes) is the following:
0 reduceScatter 275427 275427 275427 204020 11346849 0
where:
2) The value 11346849 is the amount of instructions
3) The last value corresponds to the datatype, see decode_datatype().
- We analyze a MPI_Reduce_scatter call to one MPI_Reduce and one MPI_Scatterv.
-
- */
-
+ We analyze a MPI_Reduce_scatter call to one MPI_Reduce and one MPI_Scatterv. */
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
CHECK_ACTION_PARAMS(action, comm_size+1, 1);
void *sendbuf = smpi_get_tmp_sendbuffer(size* smpi_datatype_size(MPI_CURRENT_TYPE));
void *recvbuf = smpi_get_tmp_recvbuffer(size* smpi_datatype_size(MPI_CURRENT_TYPE));
- mpi_coll_reduce_scatter_fun(sendbuf, recvbuf, recvcounts, MPI_CURRENT_TYPE, MPI_OP_NULL,
- MPI_COMM_WORLD);
+ mpi_coll_reduce_scatter_fun(sendbuf, recvbuf, recvcounts, MPI_CURRENT_TYPE, MPI_OP_NULL, MPI_COMM_WORLD);
smpi_execute_flops(comp_size);
-
TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
xbt_free(recvcounts);
xbt_free(disps);
}
static void action_allgather(const char *const *action) {
- /*
- The structure of the allgather action for the rank 0 (total 4 processes)
- is the following:
+ /* The structure of the allgather action for the rank 0 (total 4 processes) is the following:
0 allGather 275427 275427
where:
1) 275427 is the sendcount
2) 275427 is the recvcount
- 3) No more values mean that the datatype for sent and receive buffer
- is the default one, see decode_datatype().
-
- */
-
+ 3) No more values mean that the datatype for sent and receive buffer is the default one, see decode_datatype(). */
double clock = smpi_process_simulated_elapsed();
CHECK_ACTION_PARAMS(action, 2, 2);
MPI_CURRENT_TYPE2 = decode_datatype(action[5]);
} else {
MPI_CURRENT_TYPE = MPI_DEFAULT_TYPE;
- MPI_CURRENT_TYPE2 = MPI_DEFAULT_TYPE;
+ MPI_CURRENT_TYPE2 = MPI_DEFAULT_TYPE;
}
void *sendbuf = smpi_get_tmp_sendbuffer(sendcount* smpi_datatype_size(MPI_CURRENT_TYPE));
void *recvbuf = smpi_get_tmp_recvbuffer(recvcount* smpi_datatype_size(MPI_CURRENT_TYPE2));
}
static void action_allgatherv(const char *const *action) {
-
- /*
- The structure of the allgatherv action for the rank 0 (total 4 processes)
- is the following:
+ /* The structure of the allgatherv action for the rank 0 (total 4 processes) is the following:
0 allGatherV 275427 275427 275427 275427 204020
where:
1) 275427 is the sendcount
2) The next four elements declare the recvcounts array
3) No more values mean that the datatype for sent and receive buffer
- is the default one, see decode_datatype().
-
- */
-
+ is the default one, see decode_datatype(). */
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra);
- mpi_coll_allgatherv_fun(sendbuf, sendcount, MPI_CURRENT_TYPE, recvbuf, recvcounts, disps, MPI_CURRENT_TYPE2, MPI_COMM_WORLD);
+ mpi_coll_allgatherv_fun(sendbuf, sendcount, MPI_CURRENT_TYPE, recvbuf, recvcounts, disps, MPI_CURRENT_TYPE2,
+ MPI_COMM_WORLD);
TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
log_timed_action (action, clock);
}
static void action_allToAllv(const char *const *action) {
- /*
- The structure of the allToAllV action for the rank 0 (total 4 processes)
- is the following:
+ /* The structure of the allToAllV action for the rank 0 (total 4 processes) is the following:
0 allToAllV 100 1 7 10 12 100 1 70 10 5
where:
1) 100 is the size of the send buffer *sizeof(int),
2) 1 7 10 12 is the sendcounts array
3) 100*sizeof(int) is the size of the receiver buffer
- 4) 1 70 10 5 is the recvcounts array
-
- */
-
-
+ 4) 1 70 10 5 is the recvcounts array */
double clock = smpi_process_simulated_elapsed();
int comm_size = smpi_comm_size(MPI_COMM_WORLD);
recvcounts[i] = atoi(action[i+4+comm_size]);
}
-
int rank = smpi_process_index();
instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
extra->type = TRACING_ALLTOALLV;
TRACE_smpi_collective_in(rank, -1, __FUNCTION__,extra);
- mpi_coll_alltoallv_fun(sendbuf, sendcounts, senddisps, MPI_CURRENT_TYPE,
- recvbuf, recvcounts, recvdisps, MPI_CURRENT_TYPE,
- MPI_COMM_WORLD);
+ mpi_coll_alltoallv_fun(sendbuf, sendcounts, senddisps, MPI_CURRENT_TYPE,recvbuf, recvcounts, recvdisps,
+ MPI_CURRENT_TYPE, MPI_COMM_WORLD);
TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
log_timed_action (action, clock);
xbt_replay_action_register("reduceScatter", action_reducescatter);
xbt_replay_action_register("compute", action_compute);
}
-
+
//if we have a delayed start, sleep here.
if(*argc>2){
char *endptr;
XBT_DEBUG("Force context switch by smpi_execute_flops - Sleeping for 0.0 flops ");
smpi_execute_flops(0.0);
}
-
+
/* Actually run the replay */
xbt_replay_action_runner(*argc, *argv);
/* and now, finalize everything */
double sim_time= 1.;
/* One active process will stop. Decrease the counter*/
- XBT_DEBUG("There are %lu elements in reqq[*]",
- xbt_dynar_length(get_reqq_self()));
+ XBT_DEBUG("There are %lu elements in reqq[*]", xbt_dynar_length(get_reqq_self()));
if (!xbt_dynar_is_empty(get_reqq_self())){
int count_requests=xbt_dynar_length(get_reqq_self());
MPI_Request requests[count_requests];
/* end the simulated timer */
sim_time = smpi_process_simulated_elapsed();
}
-
//TODO xbt_dynar_free_container(get_reqq_self()));
xbt_dict_free(&reqq); //not need, data have been freed ???
reqq = NULL;
}
-
+
instr_extra_data extra_fin = xbt_new0(s_instr_extra_data_t,1);
extra_fin->type = TRACING_FINALIZE;
operation =bprintf("%s_finalize",__FUNCTION__);