Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion .github/workflows/prerelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,28 @@ jobs:
- name: Install Rust toolchain
uses: moonrepo/setup-rust@v1

- name: Build and Test
- name: Install 32-bit target and dependencies
run: |
rustup target add i686-unknown-linux-gnu
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y gcc-multilib g++-multilib libc6-dev-i386

- name: Test default build
run: cargo test

- name: Test with all features
run: cargo test --all-features

- name: Test no-std build (check only)
run: cargo check --no-default-features

- name: Test i686 cross-compilation build
run: cargo build --target i686-unknown-linux-gnu --all-features

- name: Test i686 cross-compilation (no-std)
run: cargo build --target i686-unknown-linux-gnu --no-default-features

# Temporary workaround to run Swift tests on Linux
# Based on: https://github.com/swift-actions/setup-swift/issues/591#issuecomment-1685710678
test_ubuntu_swift:
Expand Down
10 changes: 8 additions & 2 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,16 @@ fn main() -> Result<(), cc::Error> {
.flag_if_supported("-pedantic") // Strict compliance when supported
.warnings(false);

// On 32-bit x86, ensure proper stack alignment for floating-point operations
// See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38534
let target_arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
if target_arch == "x86" {
build.flag_if_supported("-mstackrealign");
build.flag_if_supported("-mpreferred-stack-boundary=4");
}

if let Err(e) = build.try_compile("simsimd") {
print!("cargo:warning=Failed to compile with all SIMD backends...");

let target_arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
let flags_to_try = match target_arch.as_str() {
"arm" | "aarch64" => vec![
"SIMSIMD_TARGET_SVE2",
Expand Down
13 changes: 7 additions & 6 deletions include/simsimd/probability.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,8 @@ SIMSIMD_PUBLIC void simsimd_js_f16_sapphire(simsimd_f16_t const* a, simsimd_f16_
d += ai * SIMSIMD_LOG((ai + epsilon) / (mi + epsilon)); \
d += bi * SIMSIMD_LOG((bi + epsilon) / (mi + epsilon)); \
} \
*result = SIMSIMD_SQRT(((simsimd_distance_t)d / 2)); \
simsimd_distance_t d_half = ((simsimd_distance_t)d / 2); \
*result = d_half > 0 ? SIMSIMD_SQRT(d_half) : 0; \
}

SIMSIMD_MAKE_KL(serial, f64, f64, SIMSIMD_DEREFERENCE, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_kl_f64_serial
Expand Down Expand Up @@ -225,7 +226,7 @@ SIMSIMD_PUBLIC void simsimd_js_f32_neon(simsimd_f32_t const *a, simsimd_f32_t co

simsimd_f32_t log2_normalizer = 0.693147181f;
simsimd_f32_t sum = vaddvq_f32(sum_vec) * log2_normalizer / 2;
*result = _simsimd_sqrt_f32_neon(sum);
*result = sum > 0 ? _simsimd_sqrt_f32_neon(sum) : 0;
}

#pragma clang attribute pop
Expand Down Expand Up @@ -298,7 +299,7 @@ SIMSIMD_PUBLIC void simsimd_js_f16_neon(simsimd_f16_t const *a, simsimd_f16_t co

simsimd_f32_t log2_normalizer = 0.693147181f;
simsimd_f32_t sum = vaddvq_f32(sum_vec) * log2_normalizer / 2;
*result = _simsimd_sqrt_f32_neon(sum);
*result = sum > 0 ? _simsimd_sqrt_f32_neon(sum) : 0;
}

#pragma clang attribute pop
Expand Down Expand Up @@ -403,7 +404,7 @@ SIMSIMD_PUBLIC void simsimd_js_f16_haswell(simsimd_f16_t const *a, simsimd_f16_t
simsimd_f32_t log2_normalizer = 0.693147181f;
simsimd_f32_t sum = _simsimd_reduce_f32x8_haswell(sum_vec);
sum *= log2_normalizer / 2;
*result = _simsimd_sqrt_f32_haswell(sum);
*result = sum > 0 ? _simsimd_sqrt_f32_haswell(sum) : 0;
}

#pragma clang attribute pop
Expand Down Expand Up @@ -498,7 +499,7 @@ SIMSIMD_PUBLIC void simsimd_js_f32_skylake(simsimd_f32_t const *a, simsimd_f32_t
simsimd_f32_t log2_normalizer = 0.693147181f;
simsimd_f32_t sum = _mm512_reduce_add_ps(_mm512_add_ps(sum_a_vec, sum_b_vec));
sum *= log2_normalizer / 2;
*result = _simsimd_sqrt_f32_haswell(sum);
*result = sum > 0 ? _simsimd_sqrt_f32_haswell(sum) : 0;
}

#pragma clang attribute pop
Expand Down Expand Up @@ -591,7 +592,7 @@ SIMSIMD_PUBLIC void simsimd_js_f16_sapphire(simsimd_f16_t const *a, simsimd_f16_
simsimd_f32_t log2_normalizer = 0.693147181f;
simsimd_f32_t sum = _mm512_reduce_add_ph(_mm512_add_ph(sum_a_vec, sum_b_vec));
sum *= log2_normalizer / 2;
*result = _simsimd_sqrt_f32_haswell(sum);
*result = sum > 0 ? _simsimd_sqrt_f32_haswell(sum) : 0;
}

#pragma clang attribute pop
Expand Down
Loading
Loading