ruprim_host/simd/
aligned.rs1use aligned_vec::{AVec, ConstAlign};
7use alloc::vec::Vec;
8
9pub const SIMD_ALIGN: usize = 64;
12
13pub type AlignedVec<T> = AVec<T, ConstAlign<SIMD_ALIGN>>;
15
16#[inline]
18pub fn alloc_aligned<T>(capacity: usize) -> AlignedVec<T> {
19 AVec::with_capacity(SIMD_ALIGN, capacity)
20}
21
22#[inline]
24pub fn alloc_aligned_zeroed<T: bytemuck::Zeroable + Clone>(len: usize) -> AlignedVec<T> {
25 let mut vec = AVec::with_capacity(SIMD_ALIGN, len);
26 vec.resize(len, T::zeroed());
27 vec
28}
29
30#[inline]
34pub fn to_vec<T: Clone>(aligned: AlignedVec<T>) -> Vec<T> {
35 aligned.to_vec()
36}
37
38#[inline]
40pub fn from_slice<T: Clone>(slice: &[T]) -> AlignedVec<T> {
41 let mut vec = AVec::with_capacity(SIMD_ALIGN, slice.len());
42 vec.extend_from_slice(slice);
43 vec
44}
45
46#[cfg(test)]
47mod tests {
48 use super::*;
49
50 #[test]
51 fn test_alignment() {
52 let vec: AlignedVec<f32> = alloc_aligned(1000);
53 assert_eq!(vec.as_ptr() as usize % SIMD_ALIGN, 0);
54 }
55
56 #[test]
57 fn test_zeroed() {
58 let vec: AlignedVec<f32> = alloc_aligned_zeroed(100);
59 assert_eq!(vec.len(), 100);
60 assert!(vec.iter().all(|&x| x == 0.0));
61 }
62
63 #[test]
64 fn test_from_slice() {
65 let data = [1.0f32, 2.0, 3.0, 4.0];
66 let aligned = from_slice(&data);
67 assert_eq!(aligned.as_ptr() as usize % SIMD_ALIGN, 0);
68 assert_eq!(&aligned[..], &data[..]);
69 }
70}