diff --git a/juno_samples/rodinia/bfs/benches/bfs_bench.rs b/juno_samples/rodinia/bfs/benches/bfs_bench.rs index 9c09c180a82cf402ae75b1f6d001b1065e7efd5c..f87b4e09bc2c3707b1436ad21b2f8f8407033e52 100644 --- a/juno_samples/rodinia/bfs/benches/bfs_bench.rs +++ b/juno_samples/rodinia/bfs/benches/bfs_bench.rs @@ -13,37 +13,37 @@ fn bfs_bench(c: &mut Criterion) { let mut r = runner!(bfs); - let input = "data/graph4096.txt"; - let (nodes, source, edges) = parse_graph(input.into()).unwrap(); - let n = nodes.len() as u64; - let m = edges.len() as u64; - let nodes = HerculesImmBox::from(&nodes as &[Node]); - let edges = HerculesImmBox::from(&edges as &[u32]); group.bench_function("bfs bench 4096", |b| { + let input = "data/graph4096.txt"; + let (nodes, source, edges) = parse_graph(input.into()).unwrap(); + let n = nodes.len() as u64; + let m = edges.len() as u64; + let nodes = HerculesImmBox::from(&nodes as &[Node]); + let edges = HerculesImmBox::from(&edges as &[u32]); b.iter(|| { async_std::task::block_on(async { r.run(n, m, nodes.to(), source, edges.to()).await }); }) }); - let input = "data/graph65536.txt"; - let (nodes, source, edges) = parse_graph(input.into()).unwrap(); - let n = nodes.len() as u64; - let m = edges.len() as u64; - let nodes = HerculesImmBox::from(&nodes as &[Node]); - let edges = HerculesImmBox::from(&edges as &[u32]); group.bench_function("bfs bench 65536", |b| { + let input = "data/graph65536.txt"; + let (nodes, source, edges) = parse_graph(input.into()).unwrap(); + let n = nodes.len() as u64; + let m = edges.len() as u64; + let nodes = HerculesImmBox::from(&nodes as &[Node]); + let edges = HerculesImmBox::from(&edges as &[u32]); b.iter(|| { async_std::task::block_on(async { r.run(n, m, nodes.to(), source, edges.to()).await }); }) }); - let input = "/scratch/aaronjc4/rodinia_3.1/data/bfs/graph64M.txt"; - let (nodes, source, edges) = parse_graph(input.into()).expect("PANIC: Couldn't read input file for 64M benchmark. Currently, this benchmark uses a hard-coded path, so it can only be run on the lab machines."); - let n = nodes.len() as u64; - let m = edges.len() as u64; - let nodes = HerculesImmBox::from(&nodes as &[Node]); - let edges = HerculesImmBox::from(&edges as &[u32]); group.bench_function("bfs bench 64M", |b| { + let input = "/scratch/aaronjc4/rodinia_3.1/data/bfs/graph64M.txt"; + let (nodes, source, edges) = parse_graph(input.into()).expect("PANIC: Couldn't read input file for 64M benchmark. Currently, this benchmark uses a hard-coded path, so it can only be run on the lab machines."); + let n = nodes.len() as u64; + let m = edges.len() as u64; + let nodes = HerculesImmBox::from(&nodes as &[Node]); + let edges = HerculesImmBox::from(&edges as &[u32]); b.iter(|| { async_std::task::block_on(async { r.run(n, m, nodes.to(), source, edges.to()).await }); }) diff --git a/juno_samples/rodinia/cfd/benches/cfd_bench.rs b/juno_samples/rodinia/cfd/benches/cfd_bench.rs index 962c524918b4a03770629e4d55cc3c4fb6613638..aa6d772724238d13b6464398b07b67e287716085 100644 --- a/juno_samples/rodinia/cfd/benches/cfd_bench.rs +++ b/juno_samples/rodinia/cfd/benches/cfd_bench.rs @@ -12,149 +12,161 @@ fn cfd_bench(c: &mut Criterion) { let mut group = c.benchmark_group("cfd bench"); group.sample_size(10); - let mut r = runner!(euler); - let data_file = "/scratch/aaronjc4/rodinia_3.1/data/cfd/missile.domn.0.2M".to_string(); - let iterations = 150; - let block_size = 16; - let FarFieldConditions { - ff_variable, - ff_fc_momentum_x, - ff_fc_momentum_y, - ff_fc_momentum_z, - ff_fc_density_energy, - } = set_far_field_conditions(); - let GeometryData { - nelr, - areas, - elements_surrounding_elements, - normals, - } = read_domain_geometry(data_file, block_size); - let mut variables = initialize_variables(nelr, &ff_variable); + let mut euler_bench = |name, data_file, iterations| { + group.bench_function(name, |b| { + let mut r = runner!(euler); + let block_size = 16; + let FarFieldConditions { + ff_variable, + ff_fc_momentum_x, + ff_fc_momentum_y, + ff_fc_momentum_z, + ff_fc_density_energy, + } = set_far_field_conditions(); + let GeometryData { + nelr, + areas, + elements_surrounding_elements, + normals, + } = read_domain_geometry(data_file, block_size).expect("PANIC: Couldn't read input for CFD benchmark. Currently, the path for the largest CFD benchmark is hard-coded, so it can only be run on the lab machines."); + let mut variables = initialize_variables(nelr, &ff_variable); - let mut v_density = HerculesMutBox::from(variables.density.as_mut_slice()); - let mut v_momentum_x = HerculesMutBox::from(variables.momentum.x.as_mut_slice()); - let mut v_momentum_y = HerculesMutBox::from(variables.momentum.y.as_mut_slice()); - let mut v_momentum_z = HerculesMutBox::from(variables.momentum.z.as_mut_slice()); - let mut v_energy = HerculesMutBox::from(variables.energy.as_mut_slice()); + let mut v_density = HerculesMutBox::from(variables.density.as_mut_slice()); + let mut v_momentum_x = HerculesMutBox::from(variables.momentum.x.as_mut_slice()); + let mut v_momentum_y = HerculesMutBox::from(variables.momentum.y.as_mut_slice()); + let mut v_momentum_z = HerculesMutBox::from(variables.momentum.z.as_mut_slice()); + let mut v_energy = HerculesMutBox::from(variables.energy.as_mut_slice()); - let areas = HerculesImmBox::from(areas.as_slice()); - let elements_surrounding_elements = - HerculesImmBox::from(elements_surrounding_elements.as_slice()); + let areas = HerculesImmBox::from(areas.as_slice()); + let elements_surrounding_elements = + HerculesImmBox::from(elements_surrounding_elements.as_slice()); - let normals_x = HerculesImmBox::from(normals.x.as_slice()); - let normals_y = HerculesImmBox::from(normals.y.as_slice()); - let normals_z = HerculesImmBox::from(normals.z.as_slice()); + let normals_x = HerculesImmBox::from(normals.x.as_slice()); + let normals_y = HerculesImmBox::from(normals.y.as_slice()); + let normals_z = HerculesImmBox::from(normals.z.as_slice()); - group.bench_function("cfd bench euler large", |b| { - b.iter(|| { - async_std::task::block_on(async { - r.run( - nelr as u64, - iterations as u64, - v_density.to(), - v_momentum_x.to(), - v_momentum_y.to(), - v_momentum_z.to(), - v_energy.to(), - areas.to(), - elements_surrounding_elements.to(), - normals_x.to(), - normals_y.to(), - normals_z.to(), - ff_variable.density, - ff_variable.momentum.x, - ff_variable.momentum.y, - ff_variable.momentum.z, - ff_variable.energy, - ff_fc_density_energy.x, - ff_fc_density_energy.y, - ff_fc_density_energy.z, - ff_fc_momentum_x.x, - ff_fc_momentum_x.y, - ff_fc_momentum_x.z, - ff_fc_momentum_y.x, - ff_fc_momentum_y.y, - ff_fc_momentum_y.z, - ff_fc_momentum_z.x, - ff_fc_momentum_z.y, - ff_fc_momentum_z.z, - ) - .await - }); - }) - }); + b.iter(|| { + async_std::task::block_on(async { + r.run( + nelr as u64, + iterations as u64, + v_density.to(), + v_momentum_x.to(), + v_momentum_y.to(), + v_momentum_z.to(), + v_energy.to(), + areas.to(), + elements_surrounding_elements.to(), + normals_x.to(), + normals_y.to(), + normals_z.to(), + ff_variable.density, + ff_variable.momentum.x, + ff_variable.momentum.y, + ff_variable.momentum.z, + ff_variable.energy, + ff_fc_density_energy.x, + ff_fc_density_energy.y, + ff_fc_density_energy.z, + ff_fc_momentum_x.x, + ff_fc_momentum_x.y, + ff_fc_momentum_x.z, + ff_fc_momentum_y.x, + ff_fc_momentum_y.y, + ff_fc_momentum_y.z, + ff_fc_momentum_z.x, + ff_fc_momentum_z.y, + ff_fc_momentum_z.z, + ) + .await + }); + }) + }); + }; + euler_bench("cfd bench euler small", "data/fvcorr.domn.097K", 1); + euler_bench( + "cfd bench euler large", + "/scratch/aaronjc4/rodinia_3.1/data/cfd/missile.domn.0.2M", + 150, + ); - let mut r = runner!(pre_euler); - let data_file = "/scratch/aaronjc4/rodinia_3.1/data/cfd/missile.domn.0.2M".to_string(); - let iterations = 150; - let block_size = 16; - let FarFieldConditions { - ff_variable, - ff_fc_momentum_x, - ff_fc_momentum_y, - ff_fc_momentum_z, - ff_fc_density_energy, - } = set_far_field_conditions(); - let GeometryData { - nelr, - areas, - elements_surrounding_elements, - normals, - } = read_domain_geometry(data_file, block_size); - let mut variables = initialize_variables(nelr, &ff_variable); + let mut pre_euler_bench = |name, data_file, iterations| { + group.bench_function(name, |b| { + let mut r = runner!(pre_euler); + let block_size = 16; + let FarFieldConditions { + ff_variable, + ff_fc_momentum_x, + ff_fc_momentum_y, + ff_fc_momentum_z, + ff_fc_density_energy, + } = set_far_field_conditions(); + let GeometryData { + nelr, + areas, + elements_surrounding_elements, + normals, + } = read_domain_geometry(data_file, block_size).expect("PANIC: Couldn't read input for CFD benchmark. Currently, the path for the largest CFD benchmark is hard-coded, so it can only be run on the lab machines."); + let mut variables = initialize_variables(nelr, &ff_variable); - let mut v_density = HerculesMutBox::from(variables.density.as_mut_slice()); - let mut v_momentum_x = HerculesMutBox::from(variables.momentum.x.as_mut_slice()); - let mut v_momentum_y = HerculesMutBox::from(variables.momentum.y.as_mut_slice()); - let mut v_momentum_z = HerculesMutBox::from(variables.momentum.z.as_mut_slice()); - let mut v_energy = HerculesMutBox::from(variables.energy.as_mut_slice()); + let mut v_density = HerculesMutBox::from(variables.density.as_mut_slice()); + let mut v_momentum_x = HerculesMutBox::from(variables.momentum.x.as_mut_slice()); + let mut v_momentum_y = HerculesMutBox::from(variables.momentum.y.as_mut_slice()); + let mut v_momentum_z = HerculesMutBox::from(variables.momentum.z.as_mut_slice()); + let mut v_energy = HerculesMutBox::from(variables.energy.as_mut_slice()); - let areas = HerculesImmBox::from(areas.as_slice()); - let elements_surrounding_elements = - HerculesImmBox::from(elements_surrounding_elements.as_slice()); + let areas = HerculesImmBox::from(areas.as_slice()); + let elements_surrounding_elements = + HerculesImmBox::from(elements_surrounding_elements.as_slice()); - let normals_x = HerculesImmBox::from(normals.x.as_slice()); - let normals_y = HerculesImmBox::from(normals.y.as_slice()); - let normals_z = HerculesImmBox::from(normals.z.as_slice()); + let normals_x = HerculesImmBox::from(normals.x.as_slice()); + let normals_y = HerculesImmBox::from(normals.y.as_slice()); + let normals_z = HerculesImmBox::from(normals.z.as_slice()); - group.bench_function("cfd bench pre-euler large", |b| { - b.iter(|| { - async_std::task::block_on(async { - r.run( - nelr as u64, - iterations as u64, - v_density.to(), - v_momentum_x.to(), - v_momentum_y.to(), - v_momentum_z.to(), - v_energy.to(), - areas.to(), - elements_surrounding_elements.to(), - normals_x.to(), - normals_y.to(), - normals_z.to(), - ff_variable.density, - ff_variable.momentum.x, - ff_variable.momentum.y, - ff_variable.momentum.z, - ff_variable.energy, - ff_fc_density_energy.x, - ff_fc_density_energy.y, - ff_fc_density_energy.z, - ff_fc_momentum_x.x, - ff_fc_momentum_x.y, - ff_fc_momentum_x.z, - ff_fc_momentum_y.x, - ff_fc_momentum_y.y, - ff_fc_momentum_y.z, - ff_fc_momentum_z.x, - ff_fc_momentum_z.y, - ff_fc_momentum_z.z, - ) - .await - }); - }) - }); + b.iter(|| { + async_std::task::block_on(async { + r.run( + nelr as u64, + iterations as u64, + v_density.to(), + v_momentum_x.to(), + v_momentum_y.to(), + v_momentum_z.to(), + v_energy.to(), + areas.to(), + elements_surrounding_elements.to(), + normals_x.to(), + normals_y.to(), + normals_z.to(), + ff_variable.density, + ff_variable.momentum.x, + ff_variable.momentum.y, + ff_variable.momentum.z, + ff_variable.energy, + ff_fc_density_energy.x, + ff_fc_density_energy.y, + ff_fc_density_energy.z, + ff_fc_momentum_x.x, + ff_fc_momentum_x.y, + ff_fc_momentum_x.z, + ff_fc_momentum_y.x, + ff_fc_momentum_y.y, + ff_fc_momentum_y.z, + ff_fc_momentum_z.x, + ff_fc_momentum_z.y, + ff_fc_momentum_z.z, + ) + .await + }); + }) + }); + }; + pre_euler_bench("cfd bench pre-euler small", "data/fvcorr.domn.097K", 1); + pre_euler_bench( + "cfd bench pre-euler large", + "/scratch/aaronjc4/rodinia_3.1/data/cfd/missile.domn.0.2M", + 150, + ); } criterion_group!(benches, cfd_bench); diff --git a/juno_samples/rodinia/cfd/src/lib.rs b/juno_samples/rodinia/cfd/src/lib.rs index a9800ed0d373bddcc678714f81537210236ed412..3b1e21e62f78f2dd1017d908f7b0f73a38712d7f 100644 --- a/juno_samples/rodinia/cfd/src/lib.rs +++ b/juno_samples/rodinia/cfd/src/lib.rs @@ -237,7 +237,7 @@ pub fn cfd_harness(args: CFDInputs) { areas, elements_surrounding_elements, normals, - } = read_domain_geometry(data_file, block_size); + } = read_domain_geometry(data_file, block_size).unwrap(); let variables = initialize_variables(nelr, &ff_variable); println!("Running CFD with nelr = {}.", nelr); diff --git a/juno_samples/rodinia/cfd/src/setup.rs b/juno_samples/rodinia/cfd/src/setup.rs index 0da0025162c919d2e420d6bbb0e69f98d83e52ff..669810d601a9ccfcbff7b4d06cace3ab8623d0de 100644 --- a/juno_samples/rodinia/cfd/src/setup.rs +++ b/juno_samples/rodinia/cfd/src/setup.rs @@ -29,7 +29,7 @@ pub struct AlignedSlice<T> { impl<T> Debug for AlignedSlice<T> where - T: Debug + T: Debug, { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { write!(f, "{:?}", self.as_slice()) @@ -127,7 +127,15 @@ pub struct FarFieldConditions { } pub fn set_far_field_conditions() -> FarFieldConditions { - let mut ff_variable = Variable { density: 0.0, momentum: Float3 { x: 0.0, y: 0.0, z: 0.0 }, energy: 0.0 }; + let mut ff_variable = Variable { + density: 0.0, + momentum: Float3 { + x: 0.0, + y: 0.0, + z: 0.0, + }, + energy: 0.0, + }; let angle_of_attack = std::f32::consts::PI / 180.0 * deg_angle_of_attack; @@ -186,19 +194,21 @@ pub struct GeometryData { pub normals: Normals, } -pub fn read_domain_geometry<P>(path: P, block_size: usize) -> GeometryData +pub fn read_domain_geometry<P>(path: P, block_size: usize) -> Result<GeometryData, String> where P: AsRef<Path>, { - let mut file = File::open(path).expect("Error opening input file"); + let mut file = File::open(path).map_err(|err| format!("Error opening input file: {}", err))?; let mut contents = String::new(); file.read_to_string(&mut contents) - .expect("Error reading input file"); + .map_err(|err| format!("Error reading input file: {}", err))?; let mut parser = nom::combinator::all_consuming(|s| cfd_parser(block_size, s)); - let (_, result) = parser.parse(&contents).expect("Parser error"); + let (_, result) = parser + .parse(&contents) + .map_err(|err| format!("Parser error: {}", err))?; - result + Ok(result) } fn cfd_parser<'a>(block_size: usize, text: &'a str) -> nom::IResult<&'a str, GeometryData> { @@ -240,17 +250,17 @@ fn cfd_parser<'a>(block_size: usize, text: &'a str) -> nom::IResult<&'a str, Geo let val = i32::from_str(val).unwrap(); let val = if neg { -val } else { val }; elements_surrounding_elements[i + j * nelr] = if val < 0 { -1 } else { val } - 1; // it's coming in with Fortran numbering - + let t = nom::character::complete::multispace0(text)?.0; let (t, val) = nom::number::complete::float(t)?; text = t; normals.x[i + j * nelr] = -val; - + let t = nom::character::complete::multispace0(text)?.0; let (t, val) = nom::number::complete::float(t)?; text = t; normals.y[i + j * nelr] = -val; - + let t = nom::character::complete::multispace0(text)?.0; let (t, val) = nom::number::complete::float(t)?; text = t;