use crate::simd::get_simd_backend;
#[inline]
pub fn fused_swiglu(gate: &[f32], up: &[f32], out: &mut [f32]) {
get_simd_backend().fused_swiglu(gate, up, out);
}
#[inline]
pub fn silu(x: &[f32], out: &mut [f32]) {
get_simd_backend().silu(x, out);
}
pub fn silu_inplace(x: &mut [f32]) {
for v in x.iter_mut() {
*v = *v / (1.0 + (-*v).exp());
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fused_swiglu() {
let gate = vec![0.0, 1.0, 2.0, -1.0];
let up = vec![1.0, 1.0, 1.0, 1.0];
let mut out = vec![0.0; 4];
fused_swiglu(&gate, &up, &mut out);
assert!((out[0] - 0.0).abs() < 1e-5);
assert!((out[1] - 0.731).abs() < 0.01);
assert!((out[2] - 1.762).abs() < 0.01);
assert!((out[3] - (-0.269)).abs() < 0.01);
}
#[test]
fn test_silu() {
let x = vec![0.0, 1.0, -1.0];
let mut out = vec![0.0; 3];
silu(&x, &mut out);
assert!((out[0] - 0.0).abs() < 1e-5);
assert!((out[1] - 0.731).abs() < 0.01);
assert!((out[2] - (-0.269)).abs() < 0.01);
}
}