diff --git a/codes/dragonfly.h b/codes/dragonfly.h index 13e87d95eb77edcf53f3fa23aec2387c7a753cbc..f4dfc56b6b9913958e889abd5ca5ce36b251f545 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 73b68393cc4da316057f09be5d13a9ddf86864a1..0f9bf0d498298a6b739e745736140a6bbb44eb5f 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 b8f6c2c1fb04c815bea140c33dcc75419ed4d55f..1dbc466abd68e491e3cb8746d2d6f74f23e17073 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 388c210482d2a82d3ca5aee969cfbcafb67bfa4e..8d6999e79ebb352654d8e20993143c8145846063 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 b37e7b1a63fc36ccb71db7a41fda07913987c538..cc444d66dc399f0a4cb7d93c36f0a62ac6e50a4f 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 66cb9ae09ed64f5d899fddb6dde61d372b23e7c7..8b453e1524feb11cf2bcf601e5c5ab2fb52ba9c5 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 f112f176c9c8dbd87baff96c7a31661d6307e9aa..8a75417964655ed46208de7e3fbcf9d07065a766 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 8ae74303e294ef2381cfb6a01a69ab5af679dc8a..9a45cc2060f76232a06ced4f996ff66a0a9ad987 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 */