diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b46b4a2..adcb724 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: - run: cargo fmt --all -- --check unit-tests: - name: Tests - ${{ matrix.os }} - ${{ matrix.toolchain }} - ${{ matrix.llvm[0] }} + name: Tests - ${{ matrix.os }} - ${{ matrix.toolchain }} - ${{ matrix.llvm[0] }} - ${{ matrix.features }} runs-on: ${{ matrix.os }} strategy: matrix: @@ -37,13 +37,17 @@ jobs: - stable os: - ubuntu-latest + features: + - "rayon cranelift" include: - toolchain: stable os: windows-latest llvm: "" + features: "rayon cranelift" - toolchain: stable os: macos-latest llvm: ["16.0", "16-0"] + features: "rayon cranelift" #- toolchain: stable # os: ubuntu-24.04-arm # llvm: ["16.0", "16-0"] @@ -53,9 +57,24 @@ jobs: - toolchain: beta os: ubuntu-latest llvm: ["16.0", "16-0"] + features: "rayon cranelift" - toolchain: nightly os: ubuntu-latest llvm: ["16.0", "16-0"] + features: "rayon cranelift" + - toolchain: stable + os: ubuntu-latest + llvm: "" + features: "" + - toolchain: stable + os: ubuntu-latest + llvm: "" + features: "rayon" + - toolchain: stable + os: ubuntu-latest + llvm: "" + features: "cranelift" + steps: @@ -67,14 +86,14 @@ jobs: path: | ${{ env.CARGO_HOME }} target - key: unit-test-${{ runner.os }}-${{ matrix.toolchain}}-${{ matrix.llvm }} + key: unit-test-${{ runner.os }}-${{ matrix.toolchain}}-${{ matrix.llvm }}-${{ matrix.features }} - name: Set up Rust run: rustup default ${{ matrix.toolchain }} && rustup update ${{ matrix.toolchain }} --no-self-update && rustup component add clippy rust-docs - name: Rust version run: rustc -Vv - name: Install LLVM and Clang uses: KyleMayes/install-llvm-action@v2 - if : matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' || matrix.os == 'ubuntu-24.04-arm' + if : matrix.llvm != '' && (matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest' || matrix.os == 'ubuntu-24.04-arm') with: version: ${{ matrix.llvm[0] }} - name: Install LLVM 16 (macos-13) @@ -83,16 +102,16 @@ jobs: brew install llvm@16 - name: Run tests (LLVM) if : matrix.llvm != '' - run: cargo test --verbose --features llvm${{ matrix.llvm[1] }} --features cranelift + run: cargo test --verbose --features llvm${{ matrix.llvm[1] }} --features "${{ matrix.features }}" - name: Run tests if : matrix.llvm == '' - run: cargo test --verbose --features cranelift + run: cargo test --verbose --features "${{ matrix.features }}" - name: Run Clippy (LLVM) if: matrix.toolchain == 'nightly' - run: cargo clippy --verbose --features llvm${{ matrix.llvm[1] }} --features cranelift + run: cargo clippy --verbose --features llvm${{ matrix.llvm[1] }} --features "${{ matrix.features }}" - name: Run Docs (LLVM) if: matrix.toolchain == 'nightly' - run: cargo rustdoc --features llvm${{ matrix.llvm[1] }} --features cranelift + run: cargo rustdoc --features llvm${{ matrix.llvm[1] }} --features "${{ matrix.features }}" book: runs-on: ubuntu-latest steps: diff --git a/Cargo.toml b/Cargo.toml index 6bc5bd5..e730f0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ repository = "https://github.com/martinjrobins/diffsl" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] -default = ["rayon"] +default = [] llvm15-0 = ["inkwell-150", "llvm-sys-150", "llvm", "enzyme"] llvm16-0 = ["inkwell-160", "llvm-sys-160", "llvm", "enzyme"] llvm17-0 = ["inkwell-170", "llvm-sys-170", "llvm", "enzyme"] diff --git a/src/execution/compiler.rs b/src/execution/compiler.rs index 0911e58..7cf504e 100644 --- a/src/execution/compiler.rs +++ b/src/execution/compiler.rs @@ -257,6 +257,7 @@ impl Compiler { } } + #[cfg(feature = "rayon")] fn with_threading(&self, f: F) where F: Fn(u32, u32) + Sync + Send, @@ -278,7 +279,13 @@ impl Compiler { } else { f(0, 1); } - #[cfg(not(feature = "rayon"))] + } + + #[cfg(not(feature = "rayon"))] + fn with_threading(&self, f: F) + where + F: Fn(u32, u32), + { f(0, 1); } @@ -864,15 +871,11 @@ impl Compiler { mod tests { use crate::{ discretise::DiscreteModel, - execution::module::{ - CodegenModule, CodegenModuleCompile, CodegenModuleEmit, CodegenModuleJit, - }, + execution::module::{CodegenModule, CodegenModuleCompile, CodegenModuleJit}, parser::parse_ds_string, Compiler, }; use approx::assert_relative_eq; - use std::io::Write; - use target_lexicon::triple; use super::CompilerMode; @@ -1096,24 +1099,6 @@ mod tests { .unwrap(); } - #[allow(dead_code)] - fn write_to_wasm( - discrete_model: &DiscreteModel, - filename: &str, - mode: CompilerMode, - ) { - let module = M::from_discrete_model( - discrete_model, - mode, - Some(triple!("wasm32-unknown-unknown")), - ) - .unwrap(); - let buffer = module.to_object().unwrap(); - let full_filename = format!("test_output/{filename}.wasm"); - let mut file = std::fs::File::create(full_filename.as_str()).unwrap(); - file.write_all(&buffer).unwrap(); - } - #[allow(dead_code)] fn tensor_test_common( discrete_model: &DiscreteModel, @@ -1364,7 +1349,6 @@ mod tests { #[cfg(feature = "llvm")] { use crate::execution::llvm::codegen::LlvmModule; - write_to_wasm::(&discrete_model, concat!(stringify!($name),"_llvm"), CompilerMode::SingleThreaded); let results = tensor_test_common::(&discrete_model, $tensor_name, CompilerMode::SingleThreaded); assert_relative_eq!(results[0].as_slice(), $expected_value.as_slice()); } @@ -1567,7 +1551,6 @@ mod tests { #[cfg(feature = "llvm")] { use crate::execution::llvm::codegen::LlvmModule; - write_to_wasm::(&discrete_model, concat!(stringify!($name),"_llvm"), CompilerMode::SingleThreaded); let results = tensor_test_common::(&discrete_model, $tensor_name, CompilerMode::SingleThreaded); assert_relative_eq!(results[1].as_slice(), $expected_grad.as_slice()); assert_relative_eq!(results[2].as_slice(), $expected_rgrad.as_slice()); @@ -1651,7 +1634,6 @@ mod tests { #[cfg(feature = "llvm")] { use crate::execution::llvm::codegen::LlvmModule; - write_to_wasm::(&discrete_model, concat!(stringify!($name),"_llvm"), CompilerMode::SingleThreaded); let results = tensor_test_common::(&discrete_model, $tensor_name, CompilerMode::SingleThreaded); assert_relative_eq!(results[0].as_slice(), $expected_value.as_slice()); assert_relative_eq!(results[1].as_slice(), $expected_grad.as_slice()); diff --git a/src/execution/module.rs b/src/execution/module.rs index 96259ac..e67096c 100644 --- a/src/execution/module.rs +++ b/src/execution/module.rs @@ -7,8 +7,12 @@ use crate::discretise::DiscreteModel; use super::compiler::CompilerMode; +#[cfg(feature = "rayon")] pub trait CodegenModule: Sized + Sync {} +#[cfg(not(feature = "rayon"))] +pub trait CodegenModule: Sized {} + pub trait CodegenModuleCompile: CodegenModule { fn from_discrete_model( model: &DiscreteModel,