From dd36955660a6a153029ce78c16321e6b1b174b30 Mon Sep 17 00:00:00 2001 From: John Jenkins Date: Wed, 16 Apr 2014 08:17:02 -0500 Subject: [PATCH] Packet-ordering fix - packets had essentially random order --- codes/dragonfly.h | 2 +- codes/model-net-method.h | 3 ++- codes/torus.h | 3 ++- src/models/networks/model-net/dragonfly.c | 6 +++--- src/models/networks/model-net/loggp.c | 9 ++++++--- src/models/networks/model-net/model-net.c | 18 +++++++++++++++--- src/models/networks/model-net/simplenet-upd.c | 9 ++++++--- src/models/networks/model-net/torus.c | 5 +++-- 8 files changed, 38 insertions(+), 17 deletions(-) diff --git a/codes/dragonfly.h b/codes/dragonfly.h index 13e87d9..f4dfc56 100755 --- a/codes/dragonfly.h +++ b/codes/dragonfly.h @@ -65,7 +65,7 @@ static tw_lpid dragonfly_find_local_device(tw_lp *sender); /* dragonfly packet event method called by modelnet, this method triggers the packet * generate event of dragonfly and attached remote and local events to the last packet * of the message */ -static void dragonfly_packet_event(char* category, tw_lpid final_dest_lp, int packet_size, int remote_event_size, const void* remote_event, int self_event_size, const void* self_event, tw_lp *sender, int is_last_pckt); +static tw_stime dragonfly_packet_event(char* category, tw_lpid final_dest_lp, int packet_size, tw_stime offset, int remote_event_size, const void* remote_event, int self_event_size, const void* self_event, tw_lp *sender, int is_last_pckt); /* returns dragonfly message size */ static int dragonfly_get_msg_sz(void); diff --git a/codes/model-net-method.h b/codes/model-net-method.h index 73b6839..0f9bf0d 100644 --- a/codes/model-net-method.h +++ b/codes/model-net-method.h @@ -14,10 +14,11 @@ struct model_net_method char* method_name; /* example: "dragonfly" */ int packet_size; /* packet size */ void (*mn_setup)(const void* net_params); /* For initializing the network */ - void (*model_net_method_packet_event)( + tw_stime (*model_net_method_packet_event)( char* category, tw_lpid final_dest_lp, int packet_size, + tw_stime offset, int remote_event_size, /* 0 means don't deliver remote event */ const void* remote_event, int self_event_size, /* 0 means don't deliver self event */ diff --git a/codes/torus.h b/codes/torus.h index b8f6c2c..1dbc466 100644 --- a/codes/torus.h +++ b/codes/torus.h @@ -59,10 +59,11 @@ typedef struct nodes_state nodes_state; typedef struct nodes_message nodes_message; /* Issues a torus packet event call */ -static void torus_packet_event( +static tw_stime torus_packet_event( char* category, tw_lpid final_dest_lp, int packet_size, + tw_stime offset, int remote_event_size, const void* remote_event, int self_event_size, diff --git a/src/models/networks/model-net/dragonfly.c b/src/models/networks/model-net/dragonfly.c index 388c210..8d6999e 100644 --- a/src/models/networks/model-net/dragonfly.c +++ b/src/models/networks/model-net/dragonfly.c @@ -56,7 +56,7 @@ static void dragonfly_report_stats() return; } /* dragonfly packet event , generates a dragonfly packet on the compute node */ -static void dragonfly_packet_event(char* category, tw_lpid final_dest_lp, int packet_size, int remote_event_size, const void* remote_event, int self_event_size, const void* self_event, tw_lp *sender, int is_last_pckt) +static tw_stime dragonfly_packet_event(char* category, tw_lpid final_dest_lp, int packet_size, tw_stime offset, int remote_event_size, const void* remote_event, int self_event_size, const void* self_event, tw_lp *sender, int is_last_pckt) { tw_event * e_new; tw_stime xfer_to_nic_time; @@ -73,7 +73,7 @@ static void dragonfly_packet_event(char* category, tw_lpid final_dest_lp, int pa codes_mapping_get_lp_id(lp_group_name, "modelnet_dragonfly", mapping_rep_id, mapping_offset, &dest_nic_id); xfer_to_nic_time = 0.01 + codes_local_latency(sender); /* Throws an error of found last KP time > current event time otherwise when LPs of one type are placed together*/ - e_new = tw_event_new(local_nic_id, xfer_to_nic_time, sender); + e_new = tw_event_new(local_nic_id, xfer_to_nic_time+offset, sender); msg = tw_event_data(e_new); strcpy(msg->category, category); msg->final_dest_gid = final_dest_lp; @@ -103,7 +103,7 @@ static void dragonfly_packet_event(char* category, tw_lpid final_dest_lp, int pa } //printf("\n torus remote event %d local event %d last packet %d %lf ", msg->remote_event_size_bytes, msg->local_event_size_bytes, is_last_pckt, xfer_to_nic_time); tw_event_send(e_new); - return; + return xfer_to_nic_time; } /* returns the torus message size */ diff --git a/src/models/networks/model-net/loggp.c b/src/models/networks/model-net/loggp.c index b37e7b1..cc444d6 100644 --- a/src/models/networks/model-net/loggp.c +++ b/src/models/networks/model-net/loggp.c @@ -105,10 +105,11 @@ static int loggp_get_magic(); static void loggp_setup(const void* net_params); /* Issues a loggp packet event call */ -static void loggp_packet_event( +static tw_stime loggp_packet_event( char* category, tw_lpid final_dest_lp, int packet_size, + tw_stime offset, int remote_event_size, const void* remote_event, int self_event_size, @@ -480,10 +481,11 @@ static void handle_msg_start_event( /*This method will serve as an intermediate layer between loggp and modelnet. * It takes the packets from modelnet layer and calls underlying loggp methods*/ -static void loggp_packet_event( +static tw_stime loggp_packet_event( char* category, tw_lpid final_dest_lp, int packet_size, + tw_stime offset, int remote_event_size, const void* remote_event, int self_event_size, @@ -503,7 +505,7 @@ static void loggp_packet_event( codes_mapping_get_lp_id(lp_group_name, "modelnet_loggp", mapping_rep_id, mapping_offset, &dest_id); xfer_to_nic_time = codes_local_latency(sender); - e_new = tw_event_new(dest_id, xfer_to_nic_time, sender); + e_new = tw_event_new(dest_id, xfer_to_nic_time+offset, sender); msg = tw_event_data(e_new); strcpy(msg->category, category); msg->final_dest_gid = final_dest_lp; @@ -536,6 +538,7 @@ static void loggp_packet_event( // printf("\n Last packet size: %d ", loggp_get_msg_sz() + remote_event_size + self_event_size); } tw_event_send(e_new); + return xfer_to_nic_time; } static void loggp_setup(const void* net_params) diff --git a/src/models/networks/model-net/model-net.c b/src/models/networks/model-net/model-net.c index 66cb9ae..8b453e1 100644 --- a/src/models/networks/model-net/model-net.c +++ b/src/models/networks/model-net/model-net.c @@ -14,13 +14,14 @@ #define PROC_TIME 10.0 extern struct model_net_method simplenet_method; +extern struct model_net_method simplewan_method; extern struct model_net_method torus_method; extern struct model_net_method dragonfly_method; extern struct model_net_method loggp_method; /* Global array initialization, terminated with a NULL entry */ static struct model_net_method* method_array[] = - {&simplenet_method, &torus_method, &dragonfly_method, &loggp_method, NULL}; + {&simplenet_method, &simplewan_method, &torus_method, &dragonfly_method, &loggp_method, NULL}; static int model_net_get_msg_sz(int net_id); @@ -174,6 +175,7 @@ void model_net_event( * passed along through network hops and delivered to final_dest_lp */ + tw_stime offset = 0.0; for( i = 0; i < num_packets; i++ ) { /*Mark the last packet to the net method API*/ @@ -184,7 +186,9 @@ void model_net_event( packet_size = message_size - ((num_packets-1)*packet_size); } /* Number of packets and packet ID is passed to the underlying network to mark the final packet for local event completion*/ - method_array[net_id]->model_net_method_packet_event(category, final_dest_lp, packet_size, remote_event_size, remote_event, self_event_size, self_event, sender, last); + offset += method_array[net_id]->model_net_method_packet_event(category, + final_dest_lp, packet_size, offset, remote_event_size, remote_event, + self_event_size, self_event, sender, last); } return; } @@ -216,6 +220,12 @@ int model_net_set_params() net_params.net_bw_mbps = net_bw_mbps; net_id = model_net_setup("simplenet", packet_size, (const void*)&net_params); /* Sets the network as simplenet and packet size 512 */ } + else if (strcmp("simplewan",mn_name)==0){ + simplewan_param net_params; + configuration_get_value_relpath(&config, "PARAMS", "net_startup_ns_file", net_params.startup_filename, MAX_NAME_LENGTH); + configuration_get_value_relpath(&config, "PARAMS", "net_bw_mbps_file", net_params.bw_filename, MAX_NAME_LENGTH); + net_id = model_net_setup("simplewan", packet_size, (const void*)&net_params); + } else if(strcmp("loggp",mn_name)==0) { char net_config_file[256]; @@ -462,7 +472,9 @@ void model_net_add_lp_type(int net_id) case SIMPLENET: lp_type_register("modelnet_simplenet", model_net_get_lp_type(net_id)); break; - + case SIMPLEWAN: + lp_type_register("modelnet_simplewan", model_net_get_lp_type(net_id)); + break; case TORUS: lp_type_register("modelnet_torus", model_net_get_lp_type(net_id)); break; diff --git a/src/models/networks/model-net/simplenet-upd.c b/src/models/networks/model-net/simplenet-upd.c index f112f17..8a75417 100644 --- a/src/models/networks/model-net/simplenet-upd.c +++ b/src/models/networks/model-net/simplenet-upd.c @@ -98,10 +98,11 @@ static int sn_get_magic(); static void sn_setup(const void* net_params); /* Issues a simplenet packet event call */ -static void simplenet_packet_event( +static tw_stime simplenet_packet_event( char* category, tw_lpid final_dest_lp, int packet_size, + tw_stime offset, int remote_event_size, const void* remote_event, int self_event_size, @@ -476,10 +477,11 @@ static void handle_msg_start_event( /*This method will serve as an intermediate layer between simplenet and modelnet. * It takes the packets from modelnet layer and calls underlying simplenet methods*/ -static void simplenet_packet_event( +static tw_stime simplenet_packet_event( char* category, tw_lpid final_dest_lp, int packet_size, + tw_stime offset, int remote_event_size, const void* remote_event, int self_event_size, @@ -499,7 +501,7 @@ static void simplenet_packet_event( codes_mapping_get_lp_id(lp_group_name, "modelnet_simplenet", mapping_rep_id, mapping_offset, &dest_id); xfer_to_nic_time = codes_local_latency(sender); - e_new = tw_event_new(dest_id, xfer_to_nic_time, sender); + e_new = tw_event_new(dest_id, xfer_to_nic_time+offset, sender); msg = tw_event_data(e_new); strcpy(msg->category, category); msg->final_dest_gid = final_dest_lp; @@ -532,6 +534,7 @@ static void simplenet_packet_event( // printf("\n Last packet size: %d ", sn_get_msg_sz() + remote_event_size + self_event_size); } tw_event_send(e_new); + return xfer_to_nic_time; } static void sn_setup(const void* net_params) diff --git a/src/models/networks/model-net/torus.c b/src/models/networks/model-net/torus.c index 8ae7430..9a45cc2 100644 --- a/src/models/networks/model-net/torus.c +++ b/src/models/networks/model-net/torus.c @@ -38,7 +38,7 @@ static void torus_packet_event_rc(tw_lp *sender) } /* torus packet event , generates a torus packet on the compute node */ -static void torus_packet_event(char* category, tw_lpid final_dest_lp, int packet_size, int remote_event_size, const void* remote_event, int self_event_size, const void* self_event, tw_lp *sender, int is_last_pckt) +static tw_stime torus_packet_event(char* category, tw_lpid final_dest_lp, int packet_size, tw_stime offset, int remote_event_size, const void* remote_event, int self_event_size, const void* self_event, tw_lp *sender, int is_last_pckt) { tw_event * e_new; tw_stime xfer_to_nic_time; @@ -56,7 +56,7 @@ static void torus_packet_event(char* category, tw_lpid final_dest_lp, int packet /* TODO: Should send the packets in correct sequence. Currently the last packet is being sent first due to codes_local_latency offset. */ xfer_to_nic_time = 0.01 + codes_local_latency(sender); /* Throws an error of found last KP time > current event time otherwise */ - e_new = tw_event_new(local_nic_id, xfer_to_nic_time, sender); + e_new = tw_event_new(local_nic_id, xfer_to_nic_time+offset, sender); msg = tw_event_data(e_new); strcpy(msg->category, category); msg->final_dest_gid = final_dest_lp; @@ -93,6 +93,7 @@ static void torus_packet_event(char* category, tw_lpid final_dest_lp, int packet // printf("\n torus remote event %d local event %d last packet %d %lf ", msg->remote_event_size_bytes, msg->local_event_size_bytes, is_last_pckt, xfer_to_nic_time); } tw_event_send(e_new); + return xfer_to_nic_time; } /*Initialize the torus model, this initialization part is borrowed from Ning's torus model */ -- 2.26.2