Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Xin Wang
codes-dev
Commits
3940fa3b
Commit
3940fa3b
authored
Jul 15, 2016
by
Noah
Browse files
Many changes. Bug in sending to destination model-net server lp
parent
3845f80a
Changes
5
Hide whitespace changes
Inline
Side-by-side
codes/net/fattree.h
View file @
3940fa3b
...
...
@@ -35,6 +35,9 @@ struct fattree_message
int
last_hop
;
int
intm_id
;
//to find which port I connect to sender with
/* message originating router id */
unsigned
int
origin_switch_id
;
/* number of hops traversed by the packet */
short
my_N_hop
;
...
...
@@ -42,6 +45,7 @@ struct fattree_message
short
vc_index
;
short
vc_off
;
int
is_pull
;
model_net_event_return
event_rc
;
uint64_t
pull_size
;
/* for reverse computation */
...
...
@@ -50,6 +54,7 @@ struct fattree_message
tw_stime
saved_credit_time
;
uint64_t
packet_size
;
tw_stime
msg_start_time
;
tw_stime
saved_busy_time
;
tw_stime
saved_sample_time
;
tw_stime
saved_avg_time
;
tw_stime
saved_rcv_time
;
...
...
src/network-workloads/conf/tracer-fattree-type2.conf
View file @
3940fa3b
...
...
@@ -11,7 +11,7 @@ LPGROUPS
PARAMS
{
ft_type
=
"1"
;
packet_size
=
"
1024
"
;
packet_size
=
"
32
"
;
message_size
=
"512"
;
modelnet_scheduler
=
"fcfs"
;
#modelnet_scheduler="round-robin";
...
...
src/network-workloads/model-net-synthetic-fattree.c
View file @
3940fa3b
...
...
@@ -134,7 +134,7 @@ static void issue_event(
*/
/* skew each kickoff event slightly to help avoid event ties later on */
kickoff_time
=
g_tw_lookahead
+
arrival_time
+
tw_rand_exponential
(
lp
->
rng
,
(
double
)
arrival_time
/
100
);
kickoff_time
=
1
.
1
*
g_tw_lookahead
+
tw_rand_exponential
(
lp
->
rng
,
arrival_time
);
e
=
tw_event_new
(
lp
->
gid
,
kickoff_time
,
lp
);
m
=
tw_event_data
(
e
);
...
...
@@ -146,6 +146,8 @@ static void svr_init(
svr_state
*
ns
,
tw_lp
*
lp
)
{
ns
->
start_ts
=
0
.
0
;
issue_event
(
ns
,
lp
);
return
;
}
...
...
@@ -165,7 +167,8 @@ static void handle_kickoff_event(
svr_msg
*
m
,
tw_lp
*
lp
)
{
char
*
anno
;
// char* anno;
char
anno
[
MAX_NAME_LENGTH
];
tw_lpid
local_dest
=
-
1
,
global_dest
=
-
1
;
svr_msg
*
m_local
=
malloc
(
sizeof
(
svr_msg
));
...
...
@@ -198,14 +201,18 @@ static void handle_kickoff_event(
local_dest = (rep_id * 2 + offset + 2) % num_nodes;
// printf("\n LP %ld sending to %ld num nodes %d ", rep_id * 2 + offset, local_dest, num_nodes);
}
*/
// assert(local_dest < num_nodes);
*/
assert
(
local_dest
<
num_nodes
);
// codes_mapping_get_lp_id(group_name, lp_type_name, anno, 1, local_dest / num_servers_per_rep, local_dest % num_servers_per_rep, &global_dest);
global_dest
=
codes_mapping_get_lpid_from_relative
(
local_dest
,
group_name
,
lp_type_name
,
NULL
,
0
);
printf
(
"global_dest:%d local_dest:%d
\n
"
,(
int
)
global_dest
,(
int
)
local_dest
);
//printf("localGID:%d global_dest:%d local_dest:%d\n",(int)lp->gid,(int)global_dest,(int)local_dest);
//printf("global_src,%d, local_src, %d, global_dest,%d, local_dest,%d,\n",(int)lp->gid,floor((int)lp->gid/11)*4 + (int)lp->gid % 11, (int)global_dest,(int)local_dest);
ns
->
msg_sent_count
++
;
model_net_event
(
net_id
,
"test"
,
global_dest
,
PAYLOAD_SZ
,
0
.
0
,
sizeof
(
svr_msg
),
(
const
void
*
)
m_remote
,
sizeof
(
svr_msg
),
(
const
void
*
)
m_local
,
lp
);
//printf("LP:%d localID:%d Here\n",(int)lp->gid, (int)local_dest);
issue_event
(
ns
,
lp
);
//printf("Just Checking net_id:%d\n",net_id);
return
;
}
...
...
@@ -308,7 +315,7 @@ static void svr_event(
handle_kickoff_event
(
ns
,
b
,
m
,
lp
);
break
;
default:
printf
(
"
\n
Invalid
message type
%d
"
,
m
->
svr_event_type
);
printf
(
"
\n
LP: %d has received invalid message from src lpID: %d of
message type
:
%d"
,
(
int
)
lp
->
gid
,
(
int
)
m
->
src
,
m
->
svr_event_type
);
assert
(
0
);
break
;
}
...
...
@@ -323,7 +330,6 @@ int main(
int
rank
;
int
num_nets
;
int
*
net_ids
;
char
*
anno
;
lp_io_handle
handle
;
...
...
@@ -353,7 +359,7 @@ int main(
net_ids
=
model_net_configure
(
&
num_nets
);
assert
(
num_nets
==
1
);
//
assert(num_nets==1);
net_id
=
*
net_ids
;
free
(
net_ids
);
...
...
@@ -365,7 +371,7 @@ int main(
}
num_servers_per_rep
=
codes_mapping_get_lp_count
(
"MODELNET_GRP"
,
1
,
"server"
,
NULL
,
1
);
configuration_get_value_int
(
&
config
,
"PARAMS"
,
"num_routers"
,
anno
,
&
num_routers_per_grp
);
configuration_get_value_int
(
&
config
,
"PARAMS"
,
"num_routers"
,
NULL
,
&
num_routers_per_grp
);
num_groups
=
(
num_routers_per_grp
*
(
num_routers_per_grp
/
2
)
+
1
);
num_nodes
=
num_groups
*
num_routers_per_grp
*
(
num_routers_per_grp
/
2
);
...
...
@@ -373,7 +379,7 @@ int main(
num_nodes
=
codes_mapping_get_lp_count
(
"MODELNET_GRP"
,
0
,
"server"
,
NULL
,
1
);
printf
(
"num_nodes:%d
\n
"
,
num_nodes
);
if
(
lp_io_prepare
(
"modelnet-test"
,
LP_IO_UNIQ_SUFFIX
,
&
handle
,
MPI_COMM_WORLD
)
<
0
)
{
...
...
src/networks/model-net/fattree.c
View file @
3940fa3b
...
...
@@ -16,8 +16,9 @@
#define FTREE_HASH_TABLE_SIZE 262144
// debugging parameters
#define TRACK_PKT
-1
#define TRACK_PKT
5
#define FATTREE_HELLO 0
#define FATTREE_DEBUG 0
#define FATTREE_CONNECTIONS 0
#define FATTREE_MSG 0
...
...
@@ -110,6 +111,21 @@ struct ftree_qhash_entry
struct
qhash_head
hash_link
;
};
/* convert GiB/s and bytes to ns */
static
tw_stime
bytes_to_ns
(
uint64_t
bytes
,
double
GB_p_s
)
{
tw_stime
time
;
/* bytes to GB */
time
=
((
double
)
bytes
)
/
(
1024
.
0
*
1024
.
0
*
1024
.
0
);
/* GiB to s */
time
=
time
/
GB_p_s
;
/* s to ns */
time
=
time
*
1000
.
0
*
1000
.
0
*
1000
.
0
;
return
(
time
);
}
/* handles terminal and switch events like packet generate/send/receive/buffer */
typedef
enum
event_t
event_t
;
typedef
struct
ft_terminal_state
ft_terminal_state
;
...
...
@@ -119,6 +135,7 @@ typedef struct switch_state switch_state;
struct
ft_terminal_state
{
unsigned
long
long
packet_counter
;
int
packet_gen
;
int
packet_fin
;
// Fattree specific parameters
unsigned
int
terminal_id
;
...
...
@@ -153,6 +170,8 @@ struct ft_terminal_state
long
finished_chunks
;
long
finished_packets
;
tw_stime
last_buf_full
;
/* For sampling */
long
fin_chunks_sample
;
long
data_size_sample
;
...
...
@@ -219,6 +238,33 @@ static long long total_msg_sz = 0;
static
long
long
N_finished_msgs
=
0
;
static
long
long
N_finished_chunks
=
0
;
static
int
fattree_rank_hash_compare
(
void
*
key
,
struct
qhash_head
*
link
)
{
struct
ftree_hash_key
*
message_key
=
(
struct
ftree_hash_key
*
)
key
;
struct
ftree_qhash_entry
*
tmp
=
NULL
;
tmp
=
qhash_entry
(
link
,
struct
ftree_qhash_entry
,
hash_link
);
if
(
tmp
->
key
.
message_id
==
message_key
->
message_id
&&
tmp
->
key
.
sender_id
==
message_key
->
sender_id
)
return
1
;
return
0
;
}
static
int
fattree_hash_func
(
void
*
k
,
int
table_size
)
{
struct
ftree_hash_key
*
tmp
=
(
struct
ftree_hash_key
*
)
k
;
//uint32_t pc = 0, pb = 0;
//bj_hashlittle2(tmp, sizeof(*tmp), &pc, &pb);
uint64_t
key
=
(
~
tmp
->
message_id
)
+
(
tmp
->
message_id
<<
18
);
key
=
key
*
21
;
key
=
~
key
^
(
tmp
->
sender_id
>>
4
);
key
=
key
*
tmp
->
sender_id
;
return
(
int
)(
key
&
(
table_size
-
1
));
//return (int)(pc % (table_size - 1));
}
static
void
free_tmp
(
void
*
ptr
)
{
struct
ftree_qhash_entry
*
ftree
=
ptr
;
...
...
@@ -573,6 +619,10 @@ void ft_terminal_init( ft_terminal_state * s, tw_lp * lp )
s
->
in_send_loop
=
0
;
s
->
issueIdle
=
0
;
s
->
rank_tbl
=
qhash_init
(
fattree_rank_hash_compare
,
fattree_hash_func
,
FTREE_HASH_TABLE_SIZE
);
if
(
!
s
->
rank_tbl
)
tw_error
(
TW_LOC
,
"
\n
Hash table not initialized! "
);
s
->
params
->
num_terminals
=
codes_mapping_get_lp_count
(
lp_group_name
,
0
,
LP_CONFIG_NM
,
s
->
anno
,
0
);
return
;
...
...
@@ -740,8 +790,9 @@ void switch_init(switch_state * r, tw_lp * lp)
l0_base
++
;
}
if
(
p
->
num_levels
==
3
)
{
int
l2_base
=
0
;
if
(
p
->
ft_type
==
0
)
{
int
l2_base
=
0
;
//
int l2_base = 0;
/* not true anymore */
r
->
start_uneigh
=
p
->
num_switches
[
0
]
+
l2_base
;
r
->
con_per_uneigh
=
1
;
...
...
@@ -775,7 +826,7 @@ void switch_init(switch_state * r, tw_lp * lp)
r
->
port_connections
[
r
->
num_cons
++
]
=
nextTerm
;
#if FATTREE_DEBUG
printf
(
"I am switch %d, connect to upper switch %d L2 (%d) at port %d
\n
"
,
r
->
switch_id
,
l2
_base
,
nextTerm
,
r
->
num_cons
-
1
);
r
->
switch_id
,
l2
,
nextTerm
,
r
->
num_cons
-
1
);
#endif
}
}
...
...
@@ -922,18 +973,27 @@ static void fattree_packet_event_rc(tw_lp *sender)
/* generates packet at the current fattree compute node */
void
ft_packet_generate
(
ft_terminal_state
*
s
,
tw_bf
*
bf
,
fattree_message
*
msg
,
tw_lp
*
lp
)
{
fattree_packet_gen
++
;
s
->
packet_gen
++
;
fattree_param
*
p
=
s
->
params
;
tw_stime
ts
,
nic_ts
;
nic_ts
=
g_tw_lookahead
+
s
->
params
->
cn_delay
*
msg
->
packet_size
+
g_tw_lookahead
*
tw_rand_unif
(
lp
->
rng
);
codes_mapping_get_lp_info
(
msg
->
final_dest_gid
,
lp_group_name
,
&
mapping_grp_id
,
NULL
,
&
mapping_type_id
,
NULL
,
&
mapping_rep_id
,
&
mapping_offset
);
msg
->
dest_terminal_id
=
(
mapping_rep_id
*
(
p
->
switch_radix
[
0
]
/
2
))
+
(
mapping_offset
%
(
p
->
switch_radix
[
0
]
/
2
));
//message for process on the same terminal
int
total_event_size
;
uint64_t
num_chunks
=
msg
->
packet_size
/
p
->
chunk_size
;
if
(
msg
->
packet_size
%
s
->
params
->
chunk_size
)
num_chunks
++
;
if
(
!
num_chunks
)
num_chunks
=
1
;
nic_ts
=
g_tw_lookahead
+
(
num_chunks
*
s
->
params
->
cn_delay
)
+
tw_rand_unif
(
lp
->
rng
);
// codes_mapping_get_lp_info(msg->final_dest_gid, lp_group_name, &mapping_grp_id,
// NULL, &mapping_type_id, NULL, &mapping_rep_id, &mapping_offset);
// msg->dest_terminal_id = (mapping_rep_id * (p->switch_radix[0] / 2)) +
// (mapping_offset % (p->switch_radix[0]/2));
/* //message for process on the same terminal
if(msg->dest_terminal_id == s->terminal_id) {
bf->c1 = 1;
model_net_method_idle_event(nic_ts - s->params->cn_delay * msg->packet_size, 0, lp);
...
...
@@ -965,53 +1025,79 @@ void ft_packet_generate(ft_terminal_state * s, tw_bf * bf, fattree_message * msg
}
return;
}
*/
msg
->
packet_ID
=
lp
->
gid
+
g_tw_nlp
*
s
->
packet_counter
;
fattree_message_list
*
cur_chunk
=
(
fattree_message_list
*
)
malloc
(
// msg->dest_terminal_id = msg->final_dest_gid;
if
(
msg
->
packet_ID
==
LLU
(
TRACK_PKT
))
printf
(
"
\n
Packet %llu generated at terminal %d terminal_gid %llu dest_terminal_id %llu final_dest_gid %llu size %llu num chunks %llu
\n
"
,
msg
->
packet_ID
,
s
->
terminal_id
,
lp
->
gid
,
LLU
(
msg
->
dest_terminal_id
),
LLU
(
msg
->
final_dest_gid
),
LLU
(
msg
->
packet_size
),
LLU
(
num_chunks
));
for
(
uint64_t
i
=
0
;
i
<
num_chunks
;
i
++
)
{
fattree_message_list
*
cur_chunk
=
(
fattree_message_list
*
)
malloc
(
sizeof
(
fattree_message_list
));
init_fattree_message_list
(
cur_chunk
,
msg
);
msg
->
origin_switch_id
=
s
->
switch_id
;
init_fattree_message_list
(
cur_chunk
,
msg
);
if
(
msg
->
remote_event_size_bytes
+
msg
->
local_event_size_bytes
>
0
)
{
cur_chunk
->
event_data
=
(
char
*
)
malloc
(
if
(
msg
->
remote_event_size_bytes
+
msg
->
local_event_size_bytes
>
0
)
{
cur_chunk
->
event_data
=
(
char
*
)
malloc
(
msg
->
remote_event_size_bytes
+
msg
->
local_event_size_bytes
);
}
}
void
*
m_data_src
=
model_net_method_get_edata
(
FATTREE
,
msg
);
if
(
msg
->
remote_event_size_bytes
){
memcpy
(
cur_chunk
->
event_data
,
m_data_src
,
msg
->
remote_event_size_bytes
);
}
if
(
msg
->
local_event_size_bytes
){
m_data_src
=
(
char
*
)
m_data_src
+
msg
->
remote_event_size_bytes
;
memcpy
((
char
*
)
cur_chunk
->
event_data
+
msg
->
remote_event_size_bytes
,
void
*
m_data_src
=
model_net_method_get_edata
(
FATTREE
,
msg
);
if
(
msg
->
remote_event_size_bytes
){
memcpy
(
cur_chunk
->
event_data
,
m_data_src
,
msg
->
remote_event_size_bytes
);
}
if
(
msg
->
local_event_size_bytes
){
m_data_src
=
(
char
*
)
m_data_src
+
msg
->
remote_event_size_bytes
;
memcpy
((
char
*
)
cur_chunk
->
event_data
+
msg
->
remote_event_size_bytes
,
m_data_src
,
msg
->
local_event_size_bytes
);
}
}
append_to_fattree_message_list
(
s
->
terminal_msgs
,
s
->
terminal_msgs_tail
,
0
,
cur_chunk
);
s
->
terminal_length
+=
s
->
params
->
packet_size
;
cur_chunk
->
msg
.
chunk_id
=
i
;
cur_chunk
->
msg
.
origin_switch_id
=
s
->
switch_id
;
append_to_fattree_message_list
(
s
->
terminal_msgs
,
s
->
terminal_msgs_tail
,
0
,
cur_chunk
);
s
->
terminal_length
+=
s
->
params
->
chunk_size
;
}
if
(
s
->
terminal_length
<
2
*
s
->
params
->
cn_vc_size
)
{
model_net_method_idle_event
(
nic_ts
,
0
,
lp
);
}
else
{
bf
->
c11
=
1
;
s
->
issueIdle
=
1
;
msg
->
saved_busy_time
=
s
->
last_buf_full
;
s
->
last_buf_full
=
tw_now
(
lp
);
}
if
(
s
->
in_send_loop
==
0
)
{
fattree_message
*
m
;
bf
->
c5
=
1
;
ts
=
g_tw_lookahead
+
s
->
params
->
cn_delay
*
msg
->
packet_size
+
g_tw_lookahead
*
tw_rand_unif
(
lp
->
rng
);
ts
=
codes_local_latency
(
lp
);
tw_event
*
e
=
model_net_method_event_new
(
lp
->
gid
,
ts
,
lp
,
FATTREE
,
(
void
**
)
&
m
,
NULL
);
if
((
int
)
lp
->
gid
==
48
&&
(
int
)
lp
->
gid
==
90
)
printf
(
"Found the Culprit msg->packet_ID:%llu
\n
"
,
msg
->
packet_ID
);
m
->
type
=
T_SEND
;
m
->
magic
=
fattree_terminal_magic_num
;
m
->
magic
=
fattree_terminal_magic_num
;
s
->
in_send_loop
=
1
;
tw_event_send
(
e
);
//printf("[%d] send loop triggered with ts %lf band %lf\n",
// lp->gid, ts, s->params->cn_bandwidth);
}
total_event_size
=
model_net_get_msg_sz
(
FATTREE
)
+
msg
->
remote_event_size_bytes
+
msg
->
local_event_size_bytes
;
mn_stats
*
stat
;
stat
=
model_net_find_stats
(
msg
->
category
,
s
->
fattree_stats_array
);
stat
->
send_count
++
;
stat
->
send_bytes
+=
msg
->
packet_size
;
stat
->
send_time
+=
(
1
/
p
->
cn_bandwidth
)
*
msg
->
packet_size
;
if
(
stat
->
max_event_size
<
total_event_size
)
stat
->
max_event_size
=
total_event_size
;
return
;
}
...
...
@@ -1041,6 +1127,10 @@ void ft_packet_send(ft_terminal_state * s, tw_bf * bf, fattree_message * msg,
// we are sending an event to the switch, so no method_event here
ts
=
s
->
terminal_available_time
-
tw_now
(
lp
);
if
((
int
)
lp
->
gid
==
48
&&
(
int
)
s
->
switch_lp
==
90
)
printf
(
"Found the Culprit msg->packet_ID:%llu
\n
"
,
msg
->
packet_ID
);
e
=
tw_event_new
(
s
->
switch_lp
,
ts
,
lp
);
m
=
tw_event_data
(
e
);
memcpy
(
m
,
&
cur_entry
->
msg
,
sizeof
(
fattree_message
));
...
...
@@ -1064,6 +1154,8 @@ void ft_packet_send(ft_terminal_state * s, tw_bf * bf, fattree_message * msg,
{
bf
->
c2
=
1
;
double
tsT
=
codes_local_latency
(
lp
);
if
((
int
)
lp
->
gid
==
48
&&
(
int
)
cur_entry
->
msg
.
sender_lp
==
90
)
printf
(
"Found the Culprit msg->packet_ID:%llu
\n
"
,
msg
->
packet_ID
);
tw_event
*
e_new
=
tw_event_new
(
cur_entry
->
msg
.
sender_lp
,
tsT
,
lp
);
fattree_message
*
m_new
=
tw_event_data
(
e_new
);
void
*
local_event
=
(
char
*
)
cur_entry
->
event_data
+
...
...
@@ -1088,6 +1180,8 @@ void ft_packet_send(ft_terminal_state * s, tw_bf * bf, fattree_message * msg,
ts
=
ts
+
g_tw_lookahead
*
tw_rand_unif
(
lp
->
rng
);
tw_event
*
e
=
model_net_method_event_new
(
lp
->
gid
,
ts
,
lp
,
FATTREE
,
(
void
**
)
&
m
,
NULL
);
if
((
int
)
lp
->
gid
==
48
&&
(
int
)
lp
->
gid
==
90
)
printf
(
"Found the Culprit msg->packet_ID:%llu
\n
"
,
msg
->
packet_ID
);
m
->
type
=
T_SEND
;
m
->
magic
=
fattree_terminal_magic_num
;
tw_event_send
(
e
);
...
...
@@ -1128,7 +1222,14 @@ void switch_packet_receive( switch_state * s, tw_bf * bf,
max_vc_size
=
s
->
params
->
cn_vc_size
;
to_terminal
=
1
;
}
int
dest_term_local_id
=
codes_mapping_get_lp_relative_id
(
msg
->
dest_terminal_id
,
0
,
0
);
if
(
msg
->
packet_ID
==
LLU
(
TRACK_PKT
))
printf
(
"
\n
Packet %llu arrived at switch %d switch_gid %llu dest_terminal_id %llu dest_term_local_id %llu final_dest_gid %llu output_port %d to_terminal %d
\n
"
,
msg
->
packet_ID
,
s
->
switch_id
,
lp
->
gid
,
LLU
(
msg
->
dest_terminal_id
),
LLU
(
dest_term_local_id
),
LLU
(
msg
->
final_dest_gid
),
output_port
,
to_terminal
);
fattree_message_list
*
cur_chunk
=
(
fattree_message_list
*
)
malloc
(
sizeof
(
fattree_message_list
));
init_fattree_message_list
(
cur_chunk
,
msg
);
...
...
@@ -1337,6 +1438,8 @@ void ft_terminal_buf_update(ft_terminal_state * s, tw_bf * bf,
tw_stime
ts
=
codes_local_latency
(
lp
);
tw_event
*
e
=
model_net_method_event_new
(
lp
->
gid
,
ts
,
lp
,
FATTREE
,
(
void
**
)
&
m
,
NULL
);
if
((
int
)
lp
->
gid
==
48
&&
(
int
)
lp
->
gid
==
90
)
printf
(
"Found the Culprit msg->packet_ID:%llu
\n
"
,
msg
->
packet_ID
);
m
->
type
=
T_SEND
;
m
->
type
=
fattree_terminal_magic_num
;
s
->
in_send_loop
=
1
;
...
...
@@ -1377,6 +1480,38 @@ void switch_buf_update(switch_state * s, tw_bf * bf, fattree_message * msg,
return
;
}
void
ft_send_remote_event
(
ft_terminal_state
*
s
,
fattree_message
*
msg
,
tw_lp
*
lp
,
tw_bf
*
bf
,
char
*
event_data
,
int
remote_event_size
)
{
void
*
tmp_ptr
=
model_net_method_get_edata
(
FATTREE
,
msg
);
tw_stime
ts
=
g_tw_lookahead
+
bytes_to_ns
(
msg
->
remote_event_size_bytes
,
(
1
/
s
->
params
->
cn_bandwidth
));
if
(
msg
->
is_pull
){
bf
->
c4
=
1
;
struct
codes_mctx
mc_dst
=
codes_mctx_set_global_direct
(
msg
->
sender_mn_lp
);
struct
codes_mctx
mc_src
=
codes_mctx_set_global_direct
(
lp
->
gid
);
int
net_id
=
model_net_get_id
(
LP_METHOD_NM
);
model_net_set_msg_param
(
MN_MSG_PARAM_START_TIME
,
MN_MSG_PARAM_START_TIME_VAL
,
&
(
msg
->
msg_start_time
));
msg
->
event_rc
=
model_net_event_mctx
(
net_id
,
&
mc_src
,
&
mc_dst
,
msg
->
category
,
msg
->
sender_lp
,
msg
->
pull_size
,
ts
,
remote_event_size
,
tmp_ptr
,
0
,
NULL
,
lp
);
}
else
{
tw_event
*
e
=
tw_event_new
(
msg
->
final_dest_gid
,
ts
,
lp
);
if
(
msg
->
packet_ID
==
LLU
(
TRACK_PKT
))
// printf("\n Packet %llu arrived at lp %llu\n", msg->packet_ID, LLU(lp->gid));
printf
(
"lp:%d sending pscket %llu remote event to model-net final_dest_gid:%d
\n
"
,(
int
)
lp
->
gid
,
msg
->
packet_ID
,
(
int
)
msg
->
final_dest_gid
);
void
*
m_remote
=
tw_event_data
(
e
);
memcpy
(
m_remote
,
event_data
,
remote_event_size
);
tw_event_send
(
e
);
}
return
;
}
/* packet arrives at the destination terminal */
void
ft_packet_arrive
(
ft_terminal_state
*
s
,
tw_bf
*
bf
,
fattree_message
*
msg
,
tw_lp
*
lp
)
{
...
...
@@ -1393,9 +1528,12 @@ void ft_packet_arrive(ft_terminal_state * s, tw_bf * bf, fattree_message * msg,
//If no chunks (sending msgs as whole) then set to 1
if
(
!
total_chunks
)
total_chunks
=
1
;
// printf("packet:%llu arrived at destination terminal lp->gid:%d msg->dest_terminal_id:%d\n",msg->packet_ID, (int)lp->gid, (int)msg->dest_terminal_id);
assert
(
lp
->
gid
==
msg
->
dest_terminal_id
);
if
(
msg
->
packet_ID
==
LLU
(
TRACK_PKT
))
printf
(
"
\n
Packet %llu arrived at lp %llu
\n
"
,
msg
->
packet_ID
,
LLU
(
lp
->
gid
));
// if(msg->packet_ID == LLU(TRACK_PKT))
// printf("\n Packet %llu arrived at lp %llu hops %d", msg->packet_ID, LLU(lp->gid), msg->my_N_hop);
...
...
@@ -1578,12 +1716,15 @@ void ft_packet_arrive(ft_terminal_state * s, tw_bf * bf, fattree_message * msg,
total_msg_sz
+=
msg
->
total_size
;
s
->
total_msg_size
+=
msg
->
total_size
;
s
->
finished_msgs
++
;
if
(
msg
->
packet_ID
==
LLU
(
TRACK_PKT
))
printf
(
"
\n
Packet %llu has been sent from lp %llu
\n
"
,
msg
->
packet_ID
,
LLU
(
lp
->
gid
));
//assert(tmp->remote_event_data && tmp->remote_event_size > 0);
send_remote_event
(
s
,
msg
,
lp
,
bf
,
tmp
->
remote_event_data
,
tmp
->
remote_event_size
);
ft_
send_remote_event
(
s
,
msg
,
lp
,
bf
,
tmp
->
remote_event_data
,
tmp
->
remote_event_size
);
/* Remove the hash entry */
qhash_del
(
hash_link
);
rc_stack_push
(
lp
,
tmp
,
free_tmp
,
s
->
st
);
//
rc_stack_push(lp, tmp, free_tmp, s->st);
s
->
rank_tbl_pop
--
;
}
...
...
@@ -1591,6 +1732,7 @@ void ft_packet_arrive(ft_terminal_state * s, tw_bf * bf, fattree_message * msg,
}
/* gets the output port corresponding to the next stop of the message */
/* expects dest_terminal_id to be a local ID not global ID */
int
ft_get_output_port
(
switch_state
*
s
,
tw_bf
*
bf
,
fattree_message
*
msg
,
tw_lp
*
lp
,
int
*
out_off
)
{
...
...
@@ -1598,10 +1740,12 @@ int ft_get_output_port( switch_state * s, tw_bf * bf, fattree_message * msg,
int
start_port
,
end_port
;
fattree_param
*
p
=
s
->
params
;
int
dest_term_local_id
=
codes_mapping_get_lp_relative_id
(
msg
->
dest_terminal_id
,
0
,
0
);
if
(
s
->
switch_level
==
0
)
{
//message for a terminal node
if
(
msg
->
dest_term
in
al_id
>=
s
->
start_lneigh
&&
msg
->
dest_term
in
al_id
<
s
->
end_lneigh
)
{
outport
=
msg
->
dest_term
in
al_id
-
s
->
start_lneigh
;
if
(
dest_term
_loc
al_id
>=
s
->
start_lneigh
&&
dest_term
_loc
al_id
<
s
->
end_lneigh
)
{
outport
=
dest_term
_loc
al_id
-
s
->
start_lneigh
;
*
out_off
=
0
;
return
outport
;
}
else
{
//go up the least congested path
...
...
@@ -1609,7 +1753,7 @@ int ft_get_output_port( switch_state * s, tw_bf * bf, fattree_message * msg,
end_port
=
s
->
num_cons
;
}
}
else
if
(
s
->
switch_level
==
1
)
{
int
dest_switch_id
=
msg
->
dest_term
in
al_id
/
(
p
->
switch_radix
[
0
]
/
2
);
int
dest_switch_id
=
dest_term
_loc
al_id
/
(
p
->
switch_radix
[
0
]
/
2
);
//if only two level or packet going down, send to the right switch
if
(
p
->
num_levels
==
2
||
(
dest_switch_id
>=
s
->
start_lneigh
&&
dest_switch_id
<
s
->
end_lneigh
))
{
...
...
@@ -1620,7 +1764,7 @@ int ft_get_output_port( switch_state * s, tw_bf * bf, fattree_message * msg,
end_port
=
s
->
num_cons
;
}
}
else
{
//switch level 2
int
dest_l1_group
=
msg
->
dest_term
in
al_id
/
p
->
l1_term_size
;
int
dest_l1_group
=
dest_term
_loc
al_id
/
p
->
l1_term_size
;
if
(
s
->
params
->
ft_type
==
0
)
{
start_port
=
dest_l1_group
*
(
p
->
l1_set_size
/
2
)
*
s
->
con_per_lneigh
;
end_port
=
start_port
+
((
p
->
l1_set_size
/
2
)
*
s
->
con_per_lneigh
);
...
...
@@ -1931,6 +2075,7 @@ tw_lptype fattree_lps[] =
(
pre_run_f
)
NULL
,
(
event_f
)
ft_terminal_event
,
(
revent_f
)
ft_terminal_rc_event_handler
,
// (commit_f) NULL,
(
final_f
)
fattree_terminal_final
,
(
map_f
)
codes_mapping
,
sizeof
(
ft_terminal_state
)
...
...
src/networks/model-net/model-net-lp.c
View file @
3940fa3b
...
...
@@ -259,6 +259,8 @@ void model_net_base_configure(){
offsetof
(
model_net_wrap_msg
,
msg
.
m_dfly
);
msg_offsets
[
SLIMFLY
]
=
offsetof
(
model_net_wrap_msg
,
msg
.
m_slim
);
msg_offsets
[
FATTREE
]
=
offsetof
(
model_net_wrap_msg
,
msg
.
m_fat
);
msg_offsets
[
LOGGP
]
=
offsetof
(
model_net_wrap_msg
,
msg
.
m_loggp
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment