Skip to content

Commit 6f2d27f

Browse files
committed
combine rust functions into #available_parallelism files
1 parent bd809f3 commit 6f2d27f

File tree

4 files changed

+41
-50
lines changed

4 files changed

+41
-50
lines changed

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

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::common::compare::compare_outputs;
1414
use crate::common::gen_rust::{compile_rust_programs, write_cargo_toml, write_main_rs};
1515
use crate::common::intrinsic::Intrinsic;
1616
use crate::common::intrinsic_helpers::TypeKind;
17-
use crate::common::write_file::{write_c_testfiles, write_rust_testfiles};
17+
use crate::common::write_file::write_c_testfiles;
1818
use compile::compile_c_arm;
1919
use config::{AARCH_CONFIGURATIONS, F16_FORMATTING_DEF, POLY128_OSTREAM_DEF, build_notices};
2020
use intrinsic::ArmIntrinsicType;
@@ -81,18 +81,24 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
8181
}
8282

8383
fn build_rust_file(&self) -> bool {
84+
std::fs::create_dir_all("rust_programs/src").unwrap();
85+
8486
let architecture = if self.cli_options.target.contains("v7") {
8587
"arm"
8688
} else {
8789
"aarch64"
8890
};
8991

92+
let available_parallelism = std::thread::available_parallelism().unwrap().get();
93+
let chunk_size = self.intrinsics.len().div_ceil(available_parallelism);
94+
9095
let mut cargo = File::create("rust_programs/Cargo.toml").unwrap();
9196
write_cargo_toml(&mut cargo, &[]).unwrap();
9297

9398
let mut main_rs = File::create("rust_programs/src/main.rs").unwrap();
9499
write_main_rs(
95100
&mut main_rs,
101+
available_parallelism,
96102
architecture,
97103
AARCH_CONFIGURATIONS,
98104
F16_FORMATTING_DEF,
@@ -104,12 +110,29 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
104110
let toolchain = self.cli_options.toolchain.as_deref();
105111
let linker = self.cli_options.linker.as_deref();
106112

107-
write_rust_testfiles(
108-
self.intrinsics.par_iter(),
109-
architecture,
110-
&build_notices("// "),
111-
)
112-
.unwrap();
113+
let notice = &build_notices("// ");
114+
self.intrinsics
115+
.par_chunks(chunk_size)
116+
.enumerate()
117+
.map(|(i, chunk)| {
118+
use std::io::Write;
119+
120+
let rust_filename = format!("rust_programs/src/mod_{i}.rs");
121+
let mut file = File::create(rust_filename).unwrap();
122+
123+
write!(file, "{notice}")?;
124+
125+
writeln!(file, "use core_arch::arch::{architecture}::*;")?;
126+
writeln!(file, "use crate::{{debug_simd_finish, debug_f16}};")?;
127+
128+
for intrinsic in chunk {
129+
crate::common::gen_rust::create_rust_test_module(&mut file, intrinsic)?;
130+
}
131+
132+
Ok(())
133+
})
134+
.collect::<Result<(), std::io::Error>>()
135+
.unwrap();
113136

114137
compile_rust_programs(toolchain, target, linker)
115138
}

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

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ pub fn write_cargo_toml(w: &mut impl std::io::Write, binaries: &[String]) -> std
4747

4848
pub fn write_main_rs<'a>(
4949
w: &mut impl std::io::Write,
50+
available_parallelism: usize,
5051
architecture: &str,
5152
cfg: &str,
5253
definitions: &str,
@@ -61,16 +62,17 @@ pub fn write_main_rs<'a>(
6162

6263
writeln!(w, "use core_arch::arch::{architecture}::*;")?;
6364

64-
for binary in intrinsics.clone() {
65-
writeln!(w, "mod {binary};")?;
65+
for module in 0..available_parallelism {
66+
writeln!(w, "mod mod_{module};")?;
67+
writeln!(w, "use mod_{module}::*;")?;
6668
}
6769

6870
writeln!(w, "fn main() {{")?;
6971

7072
writeln!(w, " match std::env::args().nth(1).unwrap().as_str() {{")?;
7173

7274
for binary in intrinsics {
73-
writeln!(w, " \"{binary}\" => {binary}::run(),")?;
75+
writeln!(w, " \"{binary}\" => run_{binary}(),")?;
7476
}
7577

7678
writeln!(
@@ -194,20 +196,13 @@ fn generate_rust_constraint_blocks<'a, T: IntrinsicTypeDefinition + 'a>(
194196
}
195197

196198
// Top-level function to create complete test program
197-
pub fn create_rust_test_program<T: IntrinsicTypeDefinition>(
199+
pub fn create_rust_test_module<T: IntrinsicTypeDefinition>(
198200
w: &mut impl std::io::Write,
199201
intrinsic: &dyn IntrinsicDefinition<T>,
200-
architecture: &str,
201-
notice: &str,
202202
) -> std::io::Result<()> {
203203
let indentation = Indentation::default();
204204

205-
write!(w, "{notice}")?;
206-
207-
writeln!(w, "use core_arch::arch::{architecture}::*;")?;
208-
writeln!(w, "use crate::{{debug_simd_finish, debug_f16}};")?;
209-
210-
writeln!(w, "pub fn run() {{")?;
205+
writeln!(w, "pub fn run_{}() {{", intrinsic.name())?;
211206

212207
// Define the arrays of arguments.
213208
let arguments = intrinsic.arguments();

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

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::fs::File;
22

3-
use super::gen_rust::create_rust_test_program;
43
use super::intrinsic::IntrinsicDefinition;
54
use super::intrinsic_helpers::IntrinsicTypeDefinition;
65

@@ -40,29 +39,3 @@ where
4039
})
4140
.collect()
4241
}
43-
44-
pub fn write_rust_testfiles<'a, T, I, E>(
45-
intrinsics: I,
46-
architecture: &str,
47-
notice: &str,
48-
) -> std::io::Result<()>
49-
where
50-
T: IntrinsicTypeDefinition + Sized + 'a,
51-
I: ParallelIterator<Item = &'a E>,
52-
E: IntrinsicDefinition<T> + 'a,
53-
{
54-
std::fs::create_dir_all("rust_programs/src")?;
55-
56-
intrinsics
57-
.map(|intrinsic| {
58-
let identifier = intrinsic.name().to_owned();
59-
60-
let rust_filename = format!("rust_programs/src/{identifier}.rs");
61-
let mut file = File::create(rust_filename).unwrap();
62-
63-
create_rust_test_program(&mut file, intrinsic, architecture, notice)?;
64-
65-
Ok(())
66-
})
67-
.collect()
68-
}

crates/intrinsic-test/src/main.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ fn main() {
3030

3131
let test_environment = test_environment_result.unwrap();
3232

33-
info!("building C binaries");
34-
if !test_environment.build_c_file() {
35-
std::process::exit(2);
36-
}
3733
info!("building Rust binaries");
3834
if !test_environment.build_rust_file() {
3935
std::process::exit(3);
4036
}
37+
info!("building C binaries");
38+
if !test_environment.build_c_file() {
39+
std::process::exit(2);
40+
}
4141
info!("comparing outputs");
4242
if !test_environment.compare_outputs() {
4343
std::process::exit(1);

0 commit comments

Comments
 (0)