diff --git a/codes/codes-workload.h b/codes/codes-workload.h index 3620e15cb485b022193f9d554dbf83eff70ac648..597023493a0bff0eb5d5dac6d4bf4ef1517b64c2 100644 --- a/codes/codes-workload.h +++ b/codes/codes-workload.h @@ -194,7 +194,7 @@ struct codes_workload_op /* TODO: not sure why source rank is here */ int source_rank;/* source rank of MPI send message */ int dest_rank; /* dest rank of MPI send message */ - int64_t num_bytes; /* number of bytes to be transferred over the network */ + uint64_t num_bytes; /* number of bytes to be transferred over the network */ int16_t data_type; /* MPI data type to be matched with the recv */ int count; /* number of elements to be received */ int tag; /* tag of the message */ @@ -204,7 +204,7 @@ struct codes_workload_op /* TODO: not sure why source rank is here */ int source_rank;/* source rank of MPI recv message */ int dest_rank;/* dest rank of MPI recv message */ - int num_bytes; /* number of bytes to be transferred over the network */ + uint64_t num_bytes; /* number of bytes to be transferred over the network */ int16_t data_type; /* MPI data type to be matched with the send */ int count; /* number of elements to be sent */ int tag; /* tag of the message */ diff --git a/src/network-workloads/model-net-mpi-replay.c b/src/network-workloads/model-net-mpi-replay.c index 779aeacba42a7f6a2de8b82bf1fec08c5a39c7e5..39daa2166c007ef541b2d5f3cabbb494b87bbf55 100644 --- a/src/network-workloads/model-net-mpi-replay.c +++ b/src/network-workloads/model-net-mpi-replay.c @@ -37,7 +37,7 @@ static int msg_size_hash_compare( /* NOTE: Message tracking works in sequential mode only! */ int enable_msg_tracking = 0; -tw_lpid TRACK_LP = -1; +tw_lpid TRACK_LP = 0; int unmatched = 0; char workload_type[128]; @@ -794,15 +794,15 @@ static int notify_posted_wait(nw_state* s, } /* reverse handler of MPI wait operation */ -static void codes_exec_mpi_wait_rc(nw_state* s, tw_lp* lp) +static void codes_exec_mpi_wait_rc(nw_state* s, tw_bf * bf, tw_lp* lp) { - if(s->wait_op) + if(bf->c2) { struct pending_waits * wait_op = s->wait_op; free(wait_op); s->wait_op = NULL; } - else + if(bf->c1) { codes_issue_next_event_rc(lp); completed_requests * qi = rc_stack_pop(s->processed_ops); @@ -812,11 +812,12 @@ static void codes_exec_mpi_wait_rc(nw_state* s, tw_lp* lp) } /* execute MPI wait operation */ -static void codes_exec_mpi_wait(nw_state* s, tw_lp* lp, struct codes_workload_op * mpi_op) +static void codes_exec_mpi_wait(nw_state* s, tw_bf * bf, tw_lp* lp, struct codes_workload_op * mpi_op) { /* check in the completed receives queue if the request ID has already been completed.*/ assert(!s->wait_op); dumpi_req_id req_id = mpi_op->u.wait.req_id; + struct completed_requests* current = NULL; struct qlist_head * ent = NULL; @@ -825,12 +826,15 @@ static void codes_exec_mpi_wait(nw_state* s, tw_lp* lp, struct codes_workload_op current = qlist_entry(ent, completed_requests, ql); if(current->req_id == req_id) { + bf->c1=1; qlist_del(¤t->ql); rc_stack_push(lp, current, free, s->processed_ops); codes_issue_next_event(lp); return; } } + + bf->c2 = 1; /* If not, add the wait operation in the pending 'waits' list. */ struct pending_waits* wait_op = malloc(sizeof(struct pending_waits)); wait_op->op_type = mpi_op->op_type; @@ -1199,6 +1203,7 @@ static void codes_exec_mpi_recv( recv_op->req_id = mpi_op->u.recv.req_id; + //printf("\n Req id %d bytes %d source %d tag %d ", recv_op->req_id, recv_op->num_bytes, recv_op->source_rank, recv_op->tag); if(s->nw_id == (tw_lpid)TRACK_LP) printf("\n Receive op posted num bytes %llu source %d ", recv_op->num_bytes, recv_op->source_rank); @@ -1328,7 +1333,7 @@ static void codes_exec_mpi_send(nw_state* s, local_m.fwd.req_id = mpi_op->u.send.req_id; local_m.fwd.app_id = s->app_id; - + if(mpi_op->u.send.num_bytes < EAGER_THRESHOLD) { /* directly issue a model-net send */ @@ -1945,7 +1950,7 @@ static void get_next_mpi_operation_rc(nw_state* s, tw_bf * bf, nw_message * m, t case CODES_WK_WAIT: { s->num_wait--; - codes_exec_mpi_wait_rc(s, lp); + codes_exec_mpi_wait_rc(s, bf, lp); } break; case CODES_WK_WAITALL: @@ -2044,7 +2049,8 @@ static void get_next_mpi_operation(nw_state* s, tw_bf * bf, nw_message * m, tw_l { //printf("\n MPI WAIT "); s->num_wait++; - codes_exec_mpi_wait(s, lp, &mpi_op); + //TODO: Uncomment: + codes_exec_mpi_wait(s, bf, lp, &mpi_op); } break; case CODES_WK_BCAST: diff --git a/src/workload/codes-workload.c b/src/workload/codes-workload.c index e2a205f52bc0aac97f9096b45b60015a8e3e0d64..8b81ce00802dafc2628f2423088e782629462163 100644 --- a/src/workload/codes-workload.c +++ b/src/workload/codes-workload.c @@ -327,7 +327,7 @@ void codes_workload_print_op( break; case CODES_WK_SEND: fprintf(f, "op: app:%d rank:%d type:send " - "src:%d dst:%d bytes:%lld type:%d count:%d tag:%d " + "src:%d dst:%d bytes:%llu type:%d count:%d tag:%d " "start:%.5e end:%.5e\n", app_id, rank, op->u.send.source_rank, op->u.send.dest_rank, @@ -337,7 +337,7 @@ void codes_workload_print_op( break; case CODES_WK_RECV: fprintf(f, "op: app:%d rank:%d type:recv " - "src:%d dst:%d bytes:%d type:%d count:%d tag:%d " + "src:%d dst:%d bytes:%llu type:%d count:%d tag:%d " "start:%.5e end:%.5e\n", app_id, rank, op->u.recv.source_rank, op->u.recv.dest_rank, @@ -347,7 +347,7 @@ void codes_workload_print_op( break; case CODES_WK_ISEND: fprintf(f, "op: app:%d rank:%d type:isend " - "src:%d dst:%d bytes:%lld type:%d count:%d tag:%d " + "src:%d dst:%d bytes:%llu type:%d count:%d tag:%d " "start:%.5e end:%.5e\n", app_id, rank, op->u.send.source_rank, op->u.send.dest_rank, @@ -357,7 +357,7 @@ void codes_workload_print_op( break; case CODES_WK_IRECV: fprintf(f, "op: app:%d rank:%d type:irecv " - "src:%d dst:%d bytes:%d type:%d count:%d tag:%d " + "src:%d dst:%d bytes:%llu type:%d count:%d tag:%d " "start:%.5e end:%.5e\n", app_id, rank, op->u.recv.source_rank, op->u.recv.dest_rank, diff --git a/src/workload/methods/codes-dumpi-trace-nw-wrkld.c b/src/workload/methods/codes-dumpi-trace-nw-wrkld.c index 57f23180f6b0b7bd971f22d20abe23d264ccd35b..30480a02af3ff26b38bef5304afa8ecb058c41b8 100644 --- a/src/workload/methods/codes-dumpi-trace-nw-wrkld.c +++ b/src/workload/methods/codes-dumpi-trace-nw-wrkld.c @@ -116,7 +116,7 @@ static int dumpi_trace_nw_workload_load(const char* params, int app_id, int rank static void dumpi_trace_nw_workload_get_next(int app_id, int rank, struct codes_workload_op *op); /* get number of bytes from the workload data type and count */ -static int64_t get_num_bytes(rank_mpi_context* my_ctx, dumpi_datatype dt); +static uint64_t get_num_bytes(rank_mpi_context* my_ctx, dumpi_datatype dt); /* computes the delay between MPI operations */ static void update_compute_time(const dumpi_time* time, rank_mpi_context* my_ctx); @@ -440,7 +440,7 @@ int handleDUMPIIRecv(const dumpi_irecv *prm, uint16_t thread, const dumpi_time * wrkld_per_rank.u.recv.tag = prm->tag; wrkld_per_rank.u.recv.num_bytes = prm->count * get_num_bytes(myctx,prm->datatype); - //assert(wrkld_per_rank.u.recv.num_bytes >= 0); + assert(wrkld_per_rank.u.recv.num_bytes >= 0); wrkld_per_rank.u.recv.source_rank = prm->source; wrkld_per_rank.u.recv.dest_rank = -1; wrkld_per_rank.u.recv.req_id = prm->request; @@ -487,7 +487,6 @@ int handleDUMPIRecv(const dumpi_recv *prm, uint16_t thread, (void)wall; (void)perf; - //printf("\n irecv source %d count %d data type %d", prm->source, prm->count, prm->datatype); rank_mpi_context* myctx = (rank_mpi_context*)uarg; struct codes_workload_op wrkld_per_rank; @@ -500,6 +499,7 @@ int handleDUMPIRecv(const dumpi_recv *prm, uint16_t thread, wrkld_per_rank.u.recv.source_rank = prm->source; wrkld_per_rank.u.recv.dest_rank = -1; + //printf("\n recv source %d count %d data type %d bytes %lld ", prm->source, prm->count, prm->datatype, wrkld_per_rank.u.recv.num_bytes); update_times_and_insert(&wrkld_per_rank, wall, myctx); return 0; @@ -933,7 +933,7 @@ int dumpi_trace_nw_workload_load(const char* params, int app_id, int rank) /* Data types are for 64-bit archs. Source: * https://www.tutorialspoint.com/cprogramming/c_data_types.htm * */ -static int64_t get_num_bytes(rank_mpi_context* myctx, dumpi_datatype dt) +static uint64_t get_num_bytes(rank_mpi_context* myctx, dumpi_datatype dt) { (void)myctx;