mod common;
use caminos_lib::*;
use caminos_lib::config_parser::ConfigurationValue;
use common::*;
#[test]
fn input_output_switch_local_traffic()
{
let network_sides = vec![1];
let servers_per_router = 2;
let hamming_builder = HammingBuilder{
sides: network_sides.into_iter().map(|a| ConfigurationValue::Number(a as f64) ).collect(), servers_per_router,
};
let total_sides = vec![2, 1]; let cartesian_shift = vec![1, 0]; let shift_pattern_builder = ShiftPatternBuilder{
sides: total_sides.into_iter().map(|a| ConfigurationValue::Number(a as f64)).collect(), shift: cartesian_shift.into_iter().map(|a| ConfigurationValue::Number(a as f64)).collect(), };
let pattern = create_shift_pattern(shift_pattern_builder);
let servers = 2;
let messages_per_server = 1;
let message_size = 16;
let burst_traffic_builder = BurstTrafficBuilder{
pattern,
servers,
messages_per_server,
message_size,
};
let vcp_args = VirtualChannelPoliciesBuilder{
policies: vec![
ConfigurationValue::Object("LowestLabel".to_string(), vec![]),
ConfigurationValue::Object("EnforceFlowControl".to_string(), vec![]),
ConfigurationValue::Object("Random".to_string(), vec![])
]
};
let vcp = create_vcp(vcp_args);
let crossbar_delay = 1;
let crossbar_frequency_divisor = 1;
let router_args = InputOutputRouterBuilder{
virtual_channels: 1,
vcp,
crossbar_delay,
crossbar_frequency_divisor,
allocator: ConfigurationValue::Object("Random".to_string(), vec![("seed".to_string(), ConfigurationValue::Number(1f64))]),
buffer_size: 64,
bubble: ConfigurationValue::False,
flit_size: message_size, allow_request_busy_port: ConfigurationValue::True,
intransit_priority: ConfigurationValue::False,
output_buffer_size: 32,
neglect_busy_outport: ConfigurationValue::False,
};
let cycles = crossbar_delay + messages_per_server * message_size + 2; let maximum_packet_size=16;
let topology = create_hamming_topology(hamming_builder);
let traffic = create_burst_traffic(burst_traffic_builder);
let router = create_input_output_router(router_args);
let routing = create_shortest_routing();
let link_classes = create_link_classes();
let simulation_builder = SimulationBuilder{
random_seed: 1,
warmup: 0,
measured: cycles,
topology,
traffic,
router,
maximum_packet_size,
general_frequency_divisor: 1,
routing,
link_classes
};
let plugs = Plugs::default();
let simulation_cv = create_simulation(simulation_builder);
let mut simulation = Simulation::new(&simulation_cv, &plugs);
simulation.run();
let results = simulation.get_simulation_results();
println!("{:#?}", results);
let estimated_injected_load = (message_size * messages_per_server) as f64 / (cycles as f64); let packet_hops = 0.0;
match_object_panic!( &results, "Result", value,
"cycle" => assert_eq!(value.as_f64().expect("Cycle data"), cycles as f64, "Cycle"),
"injected_load" => assert_eq!(value.as_f64().expect("Injected load data"), estimated_injected_load, "Injected load"), "accepted_load" => assert_eq!(value.as_f64().expect("Accepted load load data"), estimated_injected_load, "Accepted load"), "average_packet_hops" => assert_eq!(value.as_f64().expect("Packet hops data"), packet_hops, "Total hops"), _ => (),
);
}
#[test]
fn input_output_two_servers_two_routers()
{
let network_sides = vec![2];
let servers_per_router = 1;
let hamming_builder = HammingBuilder{
sides: network_sides.into_iter().map(|a| ConfigurationValue::Number(a as f64) ).collect(), servers_per_router,
};
let total_sides = vec![1, 2]; let cartesian_shift = vec![0, 1]; let shift_pattern_builder = ShiftPatternBuilder{
sides: total_sides.into_iter().map(|a| ConfigurationValue::Number(a as f64)).collect(), shift: cartesian_shift.into_iter().map(|a| ConfigurationValue::Number(a as f64)).collect(), };
let pattern = create_shift_pattern(shift_pattern_builder);
let servers = 2;
let messages_per_server = 1;
let message_size = 16;
let burst_traffic_builder = BurstTrafficBuilder{
pattern,
servers,
messages_per_server,
message_size,
};
let vcp_args = VirtualChannelPoliciesBuilder{
policies: vec![
ConfigurationValue::Object("LowestLabel".to_string(), vec![]),
ConfigurationValue::Object("EnforceFlowControl".to_string(), vec![]),
ConfigurationValue::Object("Random".to_string(), vec![])
]
};
let vcp = create_vcp(vcp_args);
let crossbar_delay = 1;
let crossbar_frequency_divisor = 1;
let router_args = InputOutputRouterBuilder{
virtual_channels: 1,
vcp,
crossbar_delay,
crossbar_frequency_divisor,
allocator: ConfigurationValue::Object("Random".to_string(), vec![("seed".to_string(), ConfigurationValue::Number(1f64))]),
buffer_size: 64,
bubble: ConfigurationValue::False,
flit_size: message_size, allow_request_busy_port: ConfigurationValue::True,
intransit_priority: ConfigurationValue::False,
output_buffer_size: 32,
neglect_busy_outport: ConfigurationValue::False,
};
let cycles = 2 * crossbar_delay + messages_per_server * message_size + 3; let maximum_packet_size=16;
let topology = create_hamming_topology(hamming_builder);
let traffic = create_burst_traffic(burst_traffic_builder);
let router = create_input_output_router(router_args);
let routing = create_shortest_routing();
let link_classes = create_link_classes();
let simulation_builder = SimulationBuilder{
random_seed: 1,
warmup: 0,
measured: cycles,
topology,
traffic,
router,
maximum_packet_size,
general_frequency_divisor: 1,
routing,
link_classes
};
let plugs = Plugs::default();
let simulation_cv = create_simulation(simulation_builder);
let mut simulation = Simulation::new(&simulation_cv, &plugs);
simulation.run();
let results = simulation.get_simulation_results();
println!("{:#?}", results);
let estimated_injected_load = (message_size * messages_per_server) as f64 / (cycles as f64); let packet_hops = 1.0;
match_object_panic!( &results, "Result", value,
"cycle" => assert_eq!(value.as_f64().expect("Cycle data"), cycles as f64, "Cycle"),
"injected_load" => assert_eq!(value.as_f64().expect("Injected load data"), estimated_injected_load, "Injected load"), "accepted_load" => assert_eq!(value.as_f64().expect("Accepted load load data"), estimated_injected_load, "Accepted load"), "average_packet_hops" => assert_eq!(value.as_f64().expect("Packet hops data"), packet_hops, "Total hops"), _ => (),
);
}
#[test]
fn input_output_internal_speedup()
{
let network_sides = vec![2];
let servers_per_router = 1;
let hamming_builder = HammingBuilder{
sides: network_sides.into_iter().map(|a| ConfigurationValue::Number(a as f64) ).collect(), servers_per_router,
};
let total_sides = vec![1, 2]; let cartesian_shift = vec![0, 1]; let shift_pattern_builder = ShiftPatternBuilder{
sides: total_sides.into_iter().map(|a| ConfigurationValue::Number(a as f64)).collect(), shift: cartesian_shift.into_iter().map(|a| ConfigurationValue::Number(a as f64)).collect(), };
let pattern = create_shift_pattern(shift_pattern_builder);
let servers = 2;
let messages_per_server = 1;
let message_size = 16;
let burst_traffic_builder = BurstTrafficBuilder{
pattern,
servers,
messages_per_server,
message_size,
};
let vcp_args = VirtualChannelPoliciesBuilder{
policies: vec![
ConfigurationValue::Object("LowestLabel".to_string(), vec![]),
ConfigurationValue::Object("EnforceFlowControl".to_string(), vec![]),
ConfigurationValue::Object("Random".to_string(), vec![])
]
};
let vcp = create_vcp(vcp_args);
let crossbar_delay = 1;
let crossbar_frequency_divisor = 1;
let router_args = InputOutputRouterBuilder{
virtual_channels: 1,
vcp,
crossbar_delay,
crossbar_frequency_divisor,
allocator: ConfigurationValue::Object("Random".to_string(), vec![("seed".to_string(), ConfigurationValue::Number(1f64))]),
buffer_size: 64,
bubble: ConfigurationValue::False,
flit_size: message_size, allow_request_busy_port: ConfigurationValue::True,
intransit_priority: ConfigurationValue::False,
output_buffer_size: 32,
neglect_busy_outport: ConfigurationValue::False,
};
let general_frequency_divisor = 2;
let cycles = general_frequency_divisor * (messages_per_server * (message_size-1) ) + 6; let maximum_packet_size=16;
let topology = create_hamming_topology(hamming_builder);
let traffic = create_burst_traffic(burst_traffic_builder);
let router = create_input_output_router(router_args);
let routing = create_shortest_routing();
let link_classes = create_link_classes();
let simulation_builder = SimulationBuilder{
random_seed: 1,
warmup: 0,
measured: cycles,
topology,
traffic,
router,
maximum_packet_size,
general_frequency_divisor,
routing,
link_classes
};
let plugs = Plugs::default();
let simulation_cv = create_simulation(simulation_builder);
let mut simulation = Simulation::new(&simulation_cv, &plugs);
simulation.run();
let results = simulation.get_simulation_results();
println!("{:#?}", results);
let estimated_injected_load = (message_size * messages_per_server) as f64 / (cycles as f64); let packet_hops = 1.0;
match_object_panic!( &results, "Result", value,
"cycle" => assert_eq!(value.as_f64().expect("Cycle data"), cycles as f64, "Cycle"),
"injected_load" => assert_eq!(value.as_f64().expect("Injected load data"), estimated_injected_load, "Injected load"), "accepted_load" => assert_eq!(value.as_f64().expect("Accepted load load data"), estimated_injected_load, "Accepted load"), "average_packet_hops" => assert_eq!(value.as_f64().expect("Packet hops data"), packet_hops, "Total hops"), _ => (),
);
}