pub const STREAMING_THRESHOLD_BYTES: usize = 1024 * 1024;
pub const STREAMING_THRESHOLD_F32: usize = STREAMING_THRESHOLD_BYTES / 4;
pub const STREAMING_THRESHOLD_F64: usize = STREAMING_THRESHOLD_BYTES / 8;
#[inline]
pub const fn should_stream_f32(len: usize) -> bool {
len >= STREAMING_THRESHOLD_F32
}
#[inline]
pub const fn should_stream_f64(len: usize) -> bool {
len >= STREAMING_THRESHOLD_F64
}
pub const AVX2_ALIGN: usize = 32;
pub const AVX512_ALIGN: usize = 64;
#[inline]
pub fn is_aligned_avx2<T>(ptr: *const T) -> bool {
(ptr as usize).is_multiple_of(AVX2_ALIGN)
}
#[inline]
pub fn is_aligned_avx512<T>(ptr: *const T) -> bool {
(ptr as usize).is_multiple_of(AVX512_ALIGN)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_thresholds() {
assert_eq!(STREAMING_THRESHOLD_F32, 262144);
assert_eq!(STREAMING_THRESHOLD_F64, 131072);
}
#[test]
fn test_should_stream() {
assert!(!should_stream_f32(100));
assert!(!should_stream_f32(262143));
assert!(should_stream_f32(262144));
assert!(should_stream_f32(1_000_000));
assert!(!should_stream_f64(100));
assert!(!should_stream_f64(131071));
assert!(should_stream_f64(131072));
assert!(should_stream_f64(500_000));
}
#[test]
fn test_alignment_check() {
let aligned_64: [f32; 16] = [0.0; 16];
let ptr = aligned_64.as_ptr();
let _is_avx2 = is_aligned_avx2(ptr);
let _is_avx512 = is_aligned_avx512(ptr);
assert!(is_aligned_avx2(std::ptr::null::<f32>()));
assert!(is_aligned_avx512(std::ptr::null::<f32>()));
assert!(is_aligned_avx2(32 as *const f32));
assert!(is_aligned_avx512(64 as *const f32));
assert!(!is_aligned_avx512(32 as *const f32)); }
}