for vbuf in src.iter().copied() { if COPY { let out_chunk = out_chunks.next().unwrap();
_mm256_storeu_si256(out_chunk.as_mut_ptr() as *mut __m256i, vbuf);
}
let vs1_sad = _mm256_sad_epu8(vbuf, ZERO); // Sum of abs diff, resulting in 2 x int32's
vs1 = _mm256_add_epi32(vs1, vs1_sad);
vs3 = _mm256_add_epi32(vs3, vs1_0); let v_short_sum2 = _mm256_maddubs_epi16(vbuf, DOT2V); // sum 32 uint8s to 16 shorts let vsum2 = _mm256_madd_epi16(v_short_sum2, DOT3V); // sum 16 shorts to 8 uint32s
vs2 = _mm256_add_epi32(vsum2, vs2);
vs1_0 = vs1;
}
/* Defer the multiplication with 32 to outside of the loop */
vs3 = _mm256_slli_epi32(vs3, 5);
vs2 = _mm256_add_epi32(vs2, vs3);
#[cfg(test)] #[cfg(target_feature = "avx2")] mod test { usesuper::*;
#[test] fn empty_input() { let avx2 = adler32_avx2(0, &[]); let rust = crate::adler32::generic::adler32_rust(0, &[]);
assert_eq!(rust, avx2);
}
quickcheck::quickcheck! { fn adler32_avx2_is_adler32_rust(v: Vec<u8>, start: u32) -> bool { let avx2 = adler32_avx2(start, &v); let rust = crate::adler32::generic::adler32_rust(start, &v);
rust == avx2
}
}
const INPUT: [u8; 1024] = { letmut array = [0; 1024]; letmut i = 0; while i < array.len() {
array[i] = i as u8;
i += 1;
}
array
};
#[test] fn start_alignment() { // SIMD algorithm is sensitive to alignment; for i in0..16 { for start in [crate::ADLER32_INITIAL_VALUE as u32, 42] { let avx2 = adler32_avx2(start, &INPUT[i..]); let rust = crate::adler32::generic::adler32_rust(start, &INPUT[i..]);
let avx2 = adler32_avx2(42, DEFAULT); let rust = crate::adler32::generic::adler32_rust(42, DEFAULT);
assert_eq!(avx2, rust);
}
// TODO: This could use `MaybeUninit::slice_assume_init` when it is stable. unsafefn slice_assume_init(slice: &[MaybeUninit<u8>]) -> &[u8] {
&*(slice as *const [MaybeUninit<u8>] as *const [u8])
}
#[test] fn fold_copy_copies() { let src: Vec<_> = (0..128).map(|x| x as u8).collect(); letmut dst = [MaybeUninit::new(0); 128];
for (i, _) in src.iter().enumerate() {
dst.fill(MaybeUninit::new(0));
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.