Skip to content

Commit 6da8feb

Browse files
committed
combine rust files into one compilation
1 parent 5531955 commit 6da8feb

File tree

6 files changed

+199
-194
lines changed

6 files changed

+199
-194
lines changed

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

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +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;
17-
use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
16+
use crate::common::gen_rust::{compile_rust_programs, write_cargo_toml, write_main_rs};
17+
use crate::common::intrinsic::Intrinsic;
1818
use crate::common::intrinsic_helpers::TypeKind;
19-
use crate::common::write_file::write_rust_testfiles;
2019
use config::{AARCH_CONFIGURATIONS, F16_FORMATTING_DEF, build_notices};
2120
use intrinsic::ArmIntrinsicType;
2221
use json_parser::get_neon_intrinsics;
@@ -118,26 +117,61 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
118117
}
119118

120119
fn build_rust_file(&self) -> bool {
121-
let rust_target = if self.cli_options.target.contains("v7") {
120+
std::fs::create_dir_all("rust_programs/src").unwrap();
121+
122+
let architecture = if self.cli_options.target.contains("v7") {
122123
"arm"
123124
} else {
124125
"aarch64"
125126
};
127+
128+
let available_parallelism = std::thread::available_parallelism().unwrap().get();
129+
let chunk_size = self.intrinsics.len().div_ceil(available_parallelism);
130+
131+
let mut cargo = File::create("rust_programs/Cargo.toml").unwrap();
132+
write_cargo_toml(&mut cargo, &[]).unwrap();
133+
134+
let mut main_rs = File::create("rust_programs/src/main.rs").unwrap();
135+
write_main_rs(
136+
&mut main_rs,
137+
available_parallelism,
138+
architecture,
139+
AARCH_CONFIGURATIONS,
140+
F16_FORMATTING_DEF,
141+
self.intrinsics.iter().map(|i| i.name.as_str()),
142+
)
143+
.unwrap();
144+
126145
let target = &self.cli_options.target;
127146
let toolchain = self.cli_options.toolchain.as_deref();
128147
let linker = self.cli_options.linker.as_deref();
129-
let intrinsics_name_list = write_rust_testfiles(
130-
self.intrinsics
131-
.iter()
132-
.map(|i| i as &dyn IntrinsicDefinition<_>)
133-
.collect::<Vec<_>>(),
134-
rust_target,
135-
&build_notices("// "),
136-
F16_FORMATTING_DEF,
137-
AARCH_CONFIGURATIONS,
138-
);
139148

140-
compile_rust_programs(intrinsics_name_list, toolchain, target, linker)
149+
let notice = &build_notices("// ");
150+
self.intrinsics
151+
.par_chunks(chunk_size)
152+
.enumerate()
153+
.map(|(i, chunk)| {
154+
use std::io::Write;
155+
156+
let rust_filename = format!("rust_programs/src/mod_{i}.rs");
157+
trace!("generating `{rust_filename}`");
158+
let mut file = File::create(rust_filename).unwrap();
159+
160+
write!(file, "{notice}")?;
161+
162+
writeln!(file, "use core_arch::arch::{architecture}::*;")?;
163+
writeln!(file, "use crate::{{debug_simd_finish, debug_f16}};")?;
164+
165+
for intrinsic in chunk {
166+
crate::common::gen_rust::create_rust_test_module(&mut file, intrinsic)?;
167+
}
168+
169+
Ok(())
170+
})
171+
.collect::<Result<(), std::io::Error>>()
172+
.unwrap();
173+
174+
compile_rust_programs(toolchain, target, linker)
141175
}
142176

143177
fn compare_outputs(&self) -> bool {

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

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -146,21 +146,25 @@ where
146146

147147
/// Creates a line for each argument that initializes an array for Rust from which `loads` argument
148148
/// values can be loaded as a sliding window, e.g `const A_VALS: [u32; 20] = [...];`
149-
pub fn gen_arglists_rust(&self, indentation: Indentation, loads: u32) -> String {
150-
self.iter()
151-
.filter(|&arg| !arg.has_constraint())
152-
.map(|arg| {
153-
format!(
154-
"{indentation}{bind} {name}: [{ty}; {load_size}] = {values};",
155-
bind = arg.rust_vals_array_binding(),
156-
name = arg.rust_vals_array_name(),
157-
ty = arg.ty.rust_scalar_type(),
158-
load_size = arg.ty.num_lanes() * arg.ty.num_vectors() + loads - 1,
159-
values = arg.ty.populate_random(indentation, loads, &Language::Rust)
160-
)
161-
})
162-
.collect::<Vec<_>>()
163-
.join("\n")
149+
pub fn gen_arglists_rust(
150+
&self,
151+
w: &mut impl std::io::Write,
152+
indentation: Indentation,
153+
loads: u32,
154+
) -> std::io::Result<()> {
155+
for arg in self.iter().filter(|&arg| !arg.has_constraint()) {
156+
writeln!(
157+
w,
158+
"{indentation}{bind} {name}: [{ty}; {load_size}] = {values};",
159+
bind = arg.rust_vals_array_binding(),
160+
name = arg.rust_vals_array_name(),
161+
ty = arg.ty.rust_scalar_type(),
162+
load_size = arg.ty.num_lanes() * arg.ty.num_vectors() + loads - 1,
163+
values = arg.ty.populate_random(indentation, loads, &Language::Rust)
164+
)?
165+
}
166+
167+
Ok(())
164168
}
165169

166170
/// Creates a line for each argument that initializes the argument from an array `[arg]_vals` at

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

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,28 @@ use super::cli::FailureReason;
22
use rayon::prelude::*;
33
use std::process::Command;
44

5-
pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target: &str) -> bool {
6-
fn runner_command(runner: &str) -> Command {
7-
let mut it = runner.split_whitespace();
8-
let mut cmd = Command::new(it.next().unwrap());
9-
cmd.args(it);
5+
fn runner_command(runner: &str) -> Command {
6+
let mut it = runner.split_whitespace();
7+
let mut cmd = Command::new(it.next().unwrap());
8+
cmd.args(it);
109

11-
cmd
12-
}
10+
cmd
11+
}
1312

13+
pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target: &str) -> bool {
1414
let intrinsics = intrinsic_name_list
1515
.par_iter()
1616
.filter_map(|intrinsic_name| {
17+
1718
let c = runner_command(runner)
18-
.arg("./c_programs/intrinsic-test-programs")
19+
.arg("intrinsic-test-programs")
1920
.arg(intrinsic_name)
21+
.current_dir("c_programs")
2022
.output();
2123

2224
let rust = runner_command(runner)
23-
.arg(format!("target/{target}/release/{intrinsic_name}"))
25+
.arg(format!("target/{target}/release/intrinsic-test-programs"))
26+
.arg(intrinsic_name)
2427
.output();
2528

2629
let (c, rust) = match (c, rust) {
@@ -30,7 +33,7 @@ pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target:
3033

3134
if !c.status.success() {
3235
error!(
33-
"Failed to run C program for intrinsic {intrinsic_name}\nstdout: {stdout}\nstderr: {stderr}",
36+
"Failed to run C program for intrinsic `{intrinsic_name}`\nstdout: {stdout}\nstderr: {stderr}",
3437
stdout = std::str::from_utf8(&c.stdout).unwrap_or(""),
3538
stderr = std::str::from_utf8(&c.stderr).unwrap_or(""),
3639
);
@@ -39,9 +42,9 @@ pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target:
3942

4043
if !rust.status.success() {
4144
error!(
42-
"Failed to run Rust program for intrinsic {intrinsic_name}\nstdout: {stdout}\nstderr: {stderr}",
43-
stdout = String::from_utf8_lossy(&rust.stdout),
44-
stderr = String::from_utf8_lossy(&rust.stderr),
45+
"Failed to run Rust program for intrinsic `{intrinsic_name}`\nstdout: {stdout}\nstderr: {stderr}",
46+
stdout = std::str::from_utf8(&rust.stdout).unwrap_or(""),
47+
stderr = std::str::from_utf8(&rust.stderr).unwrap_or(""),
4548
);
4649
return Some(FailureReason::RunRust(intrinsic_name.clone()));
4750
}

0 commit comments

Comments
 (0)