From 5cbca18263ac8a35b2006429d989f45986d953c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=A9l=20Kerkmann?= Date: Thu, 26 Jun 2025 15:42:01 +0200 Subject: [PATCH 1/2] feat: add intel-sycl support Adding Intel Sycl with the feature flag `intel-sycl` to it. Static linking the intel sycl isn't possible, that's the reason why it's dynamic linked. --- Cargo.toml | 1 + sys/Cargo.toml | 1 + sys/build.rs | 33 ++++++++++++++++++++++++++++----- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8365e48..e9469ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ openblas = ["whisper-rs-sys/openblas"] metal = ["whisper-rs-sys/metal", "_gpu"] vulkan = ["whisper-rs-sys/vulkan", "_gpu"] openmp = ["whisper-rs-sys/openmp"] +intel-sycl = ["whisper-rs-sys/intel-sycl", "_gpu"] _gpu = [] test-with-tiny-model = [] diff --git a/sys/Cargo.toml b/sys/Cargo.toml index adbc89c..8910875 100644 --- a/sys/Cargo.toml +++ b/sys/Cargo.toml @@ -35,6 +35,7 @@ metal = [] vulkan = [] force-debug = [] openmp = [] +intel-sycl = [] [build-dependencies] cmake = "0.1" diff --git a/sys/build.rs b/sys/build.rs index 977dd5f..c441ba0 100644 --- a/sys/build.rs +++ b/sys/build.rs @@ -267,20 +267,39 @@ fn main() { config.define("GGML_OPENMP", "OFF"); } + if cfg!(feature = "intel-sycl") { + config.define("BUILD_SHARED_LIBS", "ON"); + config.define("GGML_SYCL", "ON"); + config.define("GGML_SYCL_TARGET", "INTEL"); + config.define("CMAKE_C_COMPILER", "icx"); + config.define("CMAKE_CXX_COMPILER", "icpx"); + } + let destination = config.build(); add_link_search_path(&out.join("build")).unwrap(); println!("cargo:rustc-link-search=native={}", destination.display()); - println!("cargo:rustc-link-lib=static=whisper"); - println!("cargo:rustc-link-lib=static=ggml"); - println!("cargo:rustc-link-lib=static=ggml-base"); - println!("cargo:rustc-link-lib=static=ggml-cpu"); + if cfg!(feature = "intel-sycl") { + println!("cargo:rustc-link-lib=whisper"); + println!("cargo:rustc-link-lib=ggml"); + println!("cargo:rustc-link-lib=ggml-base"); + println!("cargo:rustc-link-lib=ggml-cpu"); + } else { + println!("cargo:rustc-link-lib=static=whisper"); + println!("cargo:rustc-link-lib=static=ggml"); + println!("cargo:rustc-link-lib=static=ggml-base"); + println!("cargo:rustc-link-lib=static=ggml-cpu"); + } if cfg!(target_os = "macos") || cfg!(feature = "openblas") { println!("cargo:rustc-link-lib=static=ggml-blas"); } if cfg!(feature = "vulkan") { - println!("cargo:rustc-link-lib=static=ggml-vulkan"); + if cfg!(feature = "intel-sycl") { + println!("cargo:rustc-link-lib=ggml-vulkan"); + } else { + println!("cargo:rustc-link-lib=static=ggml-vulkan"); + } } if cfg!(feature = "hipblas") { @@ -299,6 +318,10 @@ fn main() { println!("cargo:rustc-link-lib=static=ggml-blas"); } + if cfg!(feature = "intel-sycl") { + println!("cargo:rustc-link-lib=ggml-sycl"); + } + println!( "cargo:WHISPER_CPP_VERSION={}", get_whisper_cpp_version(&whisper_root) From 9f6b6934159b60fae3e22a3d5941d84c0048ee05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Diez=20Vi=C3=B1uela?= Date: Fri, 4 Jul 2025 12:23:47 +0200 Subject: [PATCH 2/2] Fix wrong type on aarch64 --- Cargo.toml | 3 ++- src/vulkan.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8365e48..26304f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ repository = "https://github.com/tazz4843/whisper-rs" whisper-rs-sys = { path = "sys", version = "0.13" } log = { version = "0.4", optional = true } tracing = { version = "0.1", optional = true } +libc = { version = "0.2", optional = true } [dev-dependencies] hound = "3.5.0" @@ -31,7 +32,7 @@ cuda = ["whisper-rs-sys/cuda", "_gpu"] hipblas = ["whisper-rs-sys/hipblas", "_gpu"] openblas = ["whisper-rs-sys/openblas"] metal = ["whisper-rs-sys/metal", "_gpu"] -vulkan = ["whisper-rs-sys/vulkan", "_gpu"] +vulkan = ["whisper-rs-sys/vulkan", "_gpu", "dep:libc"] openmp = ["whisper-rs-sys/openmp"] _gpu = [] test-with-tiny-model = [] diff --git a/src/vulkan.rs b/src/vulkan.rs index 67456d8..8f8e7ca 100644 --- a/src/vulkan.rs +++ b/src/vulkan.rs @@ -29,7 +29,7 @@ pub fn list_devices() -> Vec { (0..n) .map(|id| { // 256 bytes is plenty (spec says 128 is enough) - let mut tmp = [0i8; 256]; + let mut tmp: [libc::c_char; 256] = [0; 256]; ggml_backend_vk_get_device_description(id as c_int, tmp.as_mut_ptr(), tmp.len()); let mut free = 0usize; let mut total = 0usize;