Skip to content

Commit f2a0635

Browse files
committed
split rust code into crates
so that we get more parallelism out of cargo
1 parent 2268045 commit f2a0635

File tree

3 files changed

+79
-38
lines changed

3 files changed

+79
-38
lines changed

crates/intrinsic-test/src/arm/mod.rs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ use crate::common::SupportedArchitectureTest;
1313
use crate::common::cli::ProcessedCli;
1414
use crate::common::compare::compare_outputs;
1515
use crate::common::gen_c::{write_main_cpp, write_mod_cpp};
16-
use crate::common::gen_rust::{compile_rust_programs, write_cargo_toml, write_main_rs};
16+
use crate::common::gen_rust::{
17+
compile_rust_programs, write_bin_cargo_toml, write_lib_cargo_toml, write_lib_rs, write_main_rs,
18+
};
1719
use crate::common::intrinsic::Intrinsic;
1820
use crate::common::intrinsic_helpers::TypeKind;
1921
use config::{AARCH_CONFIGURATIONS, F16_FORMATTING_DEF, build_notices};
@@ -125,19 +127,17 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
125127
"aarch64"
126128
};
127129

128-
let available_parallelism = std::thread::available_parallelism().unwrap().get();
129-
let chunk_size = self.intrinsics.len().div_ceil(available_parallelism);
130+
let (chunk_size, chunk_count) = chunk_info(self.intrinsics.len());
130131

131132
let mut cargo = File::create("rust_programs/Cargo.toml").unwrap();
132-
write_cargo_toml(&mut cargo, &[]).unwrap();
133+
write_bin_cargo_toml(&mut cargo, chunk_count).unwrap();
133134

134135
let mut main_rs = File::create("rust_programs/src/main.rs").unwrap();
135136
write_main_rs(
136137
&mut main_rs,
137-
available_parallelism,
138-
architecture,
138+
chunk_count,
139139
AARCH_CONFIGURATIONS,
140-
F16_FORMATTING_DEF,
140+
"",
141141
self.intrinsics.iter().map(|i| i.name.as_str()),
142142
)
143143
.unwrap();
@@ -151,20 +151,21 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
151151
.par_chunks(chunk_size)
152152
.enumerate()
153153
.map(|(i, chunk)| {
154-
use std::io::Write;
154+
std::fs::create_dir_all(format!("rust_programs/mod_{i}/src"))?;
155155

156-
let rust_filename = format!("rust_programs/src/mod_{i}.rs");
156+
let rust_filename = format!("rust_programs/mod_{i}/src/lib.rs");
157157
trace!("generating `{rust_filename}`");
158-
let mut file = File::create(rust_filename).unwrap();
158+
let mut file = File::create(rust_filename)?;
159159

160-
write!(file, "{notice}")?;
160+
let cfg = AARCH_CONFIGURATIONS;
161+
let definitions = F16_FORMATTING_DEF;
162+
write_lib_rs(&mut file, architecture, notice, cfg, definitions, chunk)?;
161163

162-
writeln!(file, "use core_arch::arch::{architecture}::*;")?;
163-
writeln!(file, "use crate::{{debug_simd_finish, debug_f16}};")?;
164+
let toml_filename = format!("rust_programs/mod_{i}/Cargo.toml");
165+
trace!("generating `{toml_filename}`");
166+
let mut file = File::create(toml_filename).unwrap();
164167

165-
for intrinsic in chunk {
166-
crate::common::gen_rust::create_rust_test_module(&mut file, intrinsic)?;
167-
}
168+
write_lib_cargo_toml(&mut file, &format!("mod_{i}"))?;
168169

169170
Ok(())
170171
})

crates/intrinsic-test/src/common/compare.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target:
2424
let rust = runner_command(runner)
2525
.arg(format!("target/{target}/release/intrinsic-test-programs"))
2626
.arg(intrinsic_name)
27+
.current_dir("rust_programs")
2728
.output();
2829

2930
let (c, rust) = match (c, rust) {

crates/intrinsic-test/src/common/gen_rust.rs

Lines changed: 61 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,46 +9,53 @@ use super::intrinsic_helpers::IntrinsicTypeDefinition;
99
// The number of times each intrinsic will be called.
1010
const PASSES: u32 = 20;
1111

12-
pub fn write_cargo_toml(w: &mut impl std::io::Write, binaries: &[String]) -> std::io::Result<()> {
12+
fn write_cargo_toml_header(w: &mut impl std::io::Write, name: &str) -> std::io::Result<()> {
1313
writeln!(
1414
w,
1515
concat!(
1616
"[package]\n",
17-
"name = \"intrinsic-test-programs\"\n",
17+
"name = \"{name}\"\n",
1818
"version = \"{version}\"\n",
1919
"authors = [{authors}]\n",
2020
"license = \"{license}\"\n",
2121
"edition = \"2018\"\n",
22-
"[workspace]\n",
23-
"[dependencies]\n",
24-
"core_arch = {{ path = \"../crates/core_arch\" }}",
2522
),
23+
name = name,
2624
version = env!("CARGO_PKG_VERSION"),
2725
authors = env!("CARGO_PKG_AUTHORS")
2826
.split(":")
2927
.format_with(", ", |author, fmt| fmt(&format_args!("\"{author}\""))),
3028
license = env!("CARGO_PKG_LICENSE"),
31-
)?;
29+
)
30+
}
3231

33-
for binary in binaries {
34-
writeln!(
35-
w,
36-
concat!(
37-
"[[bin]]\n",
38-
"name = \"{binary}\"\n",
39-
"path = \"{binary}/main.rs\"\n",
40-
),
41-
binary = binary,
42-
)?;
32+
pub fn write_bin_cargo_toml(
33+
w: &mut impl std::io::Write,
34+
module_count: usize,
35+
) -> std::io::Result<()> {
36+
write_cargo_toml_header(w, "intrinsic-test-programs")?;
37+
38+
writeln!(w, "[dependencies]")?;
39+
40+
for i in 0..module_count {
41+
writeln!(w, "mod_{i} = {{ path = \"mod_{i}/\" }}")?;
4342
}
4443

4544
Ok(())
4645
}
4746

47+
pub fn write_lib_cargo_toml(w: &mut impl std::io::Write, name: &str) -> std::io::Result<()> {
48+
write_cargo_toml_header(w, name)?;
49+
50+
writeln!(w, "[dependencies]")?;
51+
writeln!(w, "core_arch = {{ path = \"../../crates/core_arch\" }}")?;
52+
53+
Ok(())
54+
}
55+
4856
pub fn write_main_rs<'a>(
4957
w: &mut impl std::io::Write,
50-
available_parallelism: usize,
51-
architecture: &str,
58+
chunk_count: usize,
5259
cfg: &str,
5360
definitions: &str,
5461
intrinsics: impl Iterator<Item = &'a str> + Clone,
@@ -65,10 +72,7 @@ pub fn write_main_rs<'a>(
6572
writeln!(w, "{cfg}")?;
6673
writeln!(w, "{definitions}")?;
6774

68-
writeln!(w, "use core_arch::arch::{architecture}::*;")?;
69-
70-
for module in 0..Ord::min(available_parallelism, intrinsics.clone().count()) {
71-
writeln!(w, "mod mod_{module};")?;
75+
for module in 0..chunk_count {
7276
writeln!(w, "use mod_{module}::*;")?;
7377
}
7478

@@ -91,6 +95,38 @@ pub fn write_main_rs<'a>(
9195
Ok(())
9296
}
9397

98+
pub fn write_lib_rs<T: IntrinsicTypeDefinition>(
99+
w: &mut impl std::io::Write,
100+
architecture: &str,
101+
notice: &str,
102+
cfg: &str,
103+
definitions: &str,
104+
intrinsics: &[impl IntrinsicDefinition<T>],
105+
) -> std::io::Result<()> {
106+
write!(w, "{notice}")?;
107+
108+
writeln!(w, "#![feature(simd_ffi)]")?;
109+
writeln!(w, "#![feature(f16)]")?;
110+
writeln!(w, "#![allow(unused)]")?;
111+
112+
// Cargo will spam the logs if these warnings are not silenced.
113+
writeln!(w, "#![allow(non_upper_case_globals)]")?;
114+
writeln!(w, "#![allow(non_camel_case_types)]")?;
115+
writeln!(w, "#![allow(non_snake_case)]")?;
116+
117+
writeln!(w, "{cfg}")?;
118+
119+
writeln!(w, "use core_arch::arch::{architecture}::*;")?;
120+
121+
writeln!(w, "{definitions}")?;
122+
123+
for intrinsic in intrinsics {
124+
crate::common::gen_rust::create_rust_test_module(w, intrinsic)?;
125+
}
126+
127+
Ok(())
128+
}
129+
94130
pub fn compile_rust_programs(toolchain: Option<&str>, target: &str, linker: Option<&str>) -> bool {
95131
/* If there has been a linker explicitly set from the command line then
96132
* we want to set it via setting it in the RUSTFLAGS*/
@@ -100,6 +136,9 @@ pub fn compile_rust_programs(toolchain: Option<&str>, target: &str, linker: Opti
100136
let mut cargo_command = Command::new("cargo");
101137
cargo_command.current_dir("rust_programs");
102138

139+
// Do not use the target directory of the workspace please.
140+
cargo_command.env("CARGO_TARGET_DIR", "target");
141+
103142
if let Some(toolchain) = toolchain
104143
&& !toolchain.is_empty()
105144
{

0 commit comments

Comments
 (0)