From: Augustin Degomme Date: Thu, 31 Oct 2013 17:01:52 +0000 (+0100) Subject: add gatherv replay action (bigdft can be replayed easily now) X-Git-Tag: v3_10_rc1~27 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/bdf8656075bd24c0a5ea802acce0272e42b8ce25?hp=9db01cb7fbb5e419ed3a6ab12e40d30e26a0bfe9 add gatherv replay action (bigdft can be replayed easily now) --- diff --git a/src/instr/instr_TI_trace.c b/src/instr/instr_TI_trace.c index 9b11a771d6..7b67d984d1 100644 --- a/src/instr/instr_TI_trace.c +++ b/src/instr/instr_TI_trace.c @@ -148,10 +148,14 @@ void print_TIPushState(paje_event_t event) case TRACING_COMPUTING: fprintf(tracing_file, "%s compute %f\n", process_id, extra->comp_size); break; - + case TRACING_GATHERV: // rank gatherv send_size [recvcounts] root (sendtype) (recvtype) + fprintf(tracing_file, "%s gatherv %d ", process_id, extra->send_size); + for (i = 0; i < extra->num_processes; i++) + fprintf(tracing_file, "%d ", extra->recvcounts[i]); + fprintf(tracing_file, "%d %s %s\n", extra->root, extra->datatype1, extra->datatype2); + break; case TRACING_WAITANY: case TRACING_SENDRECV: - case TRACING_GATHERV: case TRACING_SCATTER: case TRACING_SCATTERV: case TRACING_ALLGATHER: diff --git a/src/smpi/smpi_replay.c b/src/smpi/smpi_replay.c index 27770ca4cd..4507d5286b 100644 --- a/src/smpi/smpi_replay.c +++ b/src/smpi/smpi_replay.c @@ -620,7 +620,7 @@ static void action_gather(const char *const *action) { MPI_CURRENT_TYPE2=MPI_DEFAULT_TYPE; } void *send = calloc(send_size, smpi_datatype_size(MPI_CURRENT_TYPE)); - void *recv = calloc(recv_size, smpi_datatype_size(MPI_CURRENT_TYPE2)); + void *recv = NULL; int root=atoi(action[4]); int rank = smpi_process_index(); @@ -653,6 +653,76 @@ smpi_mpi_gather(send, send_size, MPI_CURRENT_TYPE, } + +static void action_gatherv(const char *const *action) { + /* + 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: + 1) 68 is the sendcount + 2) 68 10 10 10 is the recvcounts + 3) 0 is the root node + 4) 0 is the send datatype id, see decode_datatype() + 5) 0 is the recv datatype id, see decode_datatype() + */ + double clock = smpi_process_simulated_elapsed(); + int comm_size = smpi_comm_size(MPI_COMM_WORLD); + int send_size = parse_double(action[2]); + int *disps = xbt_new0(int, comm_size); + int *recvcounts = xbt_new0(int, comm_size); + int i=0,recv_sum=0; + + MPI_Datatype MPI_CURRENT_TYPE2; + if(action[4+comm_size]) { + MPI_CURRENT_TYPE=decode_datatype(action[4+comm_size]); + MPI_CURRENT_TYPE2=decode_datatype(action[5+comm_size]); + } else { + MPI_CURRENT_TYPE=MPI_DEFAULT_TYPE; + MPI_CURRENT_TYPE2=MPI_DEFAULT_TYPE; + } + void *send = calloc(send_size, smpi_datatype_size(MPI_CURRENT_TYPE)); + void *recv = NULL; + for(i=0;itype = TRACING_GATHERV; + extra->send_size = send_size; + extra->recvcounts= xbt_malloc(comm_size*sizeof(int)); + for(i=0; i< comm_size; i++)//copy data to avoid bad free + extra->recvcounts[i] = recvcounts[i]; + extra->root = root; + extra->num_processes = comm_size; + extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE); + extra->datatype2 = encode_datatype(MPI_CURRENT_TYPE2); + + TRACE_smpi_collective_in(rank, root, __FUNCTION__, extra); +#endif +smpi_mpi_gatherv(send, send_size, MPI_CURRENT_TYPE, + recv, recvcounts, disps, MPI_CURRENT_TYPE2, + root, MPI_COMM_WORLD); + +#ifdef HAVE_TRACING + TRACE_smpi_collective_out(rank, -1, __FUNCTION__); +#endif + + log_timed_action (action, clock); + xbt_free(send); + xbt_free(recv); +} + static void action_reducescatter(const char *const *action) { /* @@ -835,11 +905,8 @@ static void action_allToAllv(const char *const *action) { #ifdef HAVE_TRACING int rank = smpi_process_index(); - int count=0; - for(i=0;itype = TRACING_ALLTOALLV; - extra->send_size = count; extra->recvcounts= xbt_malloc(comm_size*sizeof(int)); extra->sendcounts= xbt_malloc(comm_size*sizeof(int)); extra->num_processes = comm_size; @@ -847,6 +914,7 @@ static void action_allToAllv(const char *const *action) { for(i=0; i< comm_size; i++){//copy data to avoid bad free extra->send_size += sendcounts[i]; extra->sendcounts[i] = sendcounts[i]; + extra->recv_size += recvcounts[i]; extra->recvcounts[i] = recvcounts[i]; } extra->datatype1 = encode_datatype(MPI_CURRENT_TYPE); @@ -903,6 +971,7 @@ void smpi_replay_init(int *argc, char***argv){ xbt_replay_action_register("allToAll", action_allToAll); xbt_replay_action_register("allToAllV", action_allToAllv); xbt_replay_action_register("gather", action_gather); + xbt_replay_action_register("gatherV", action_gatherv); xbt_replay_action_register("allGatherV", action_allgatherv); xbt_replay_action_register("reduceScatter", action_reducescatter); xbt_replay_action_register("compute", action_compute);