Когда я пытаюсь хранить и загружать 256 битов в вектор и 256-битный вектор AVX2, я не получаю ожидаемого выхода в режиме деблокирования.
use std::arch::x86_64::*;
fn main() {
let key = [1u64, 2, 3, 4];
let avxreg = unsafe { _mm256_load_si256(key.as_ptr() as *const __m256i) };
let mut back_key = [0u64; 4];
unsafe { _mm256_storeu_si256(back_key.as_mut_ptr() as *mut __m256i, avxreg) };
println!("back_key: {:?}", back_key);
}
В режиме отладки:
back_key: [1, 2, 3, 4]
В режиме выпуска:
back_key: [1, 2, 0, 0]
Задняя половина либо не загружается, либо хранится, и я не могу понять, какой.
Какая странная ориентация на собственный процессор работает. В режиме выпуска + RUSTFLAGS="-C target-Cpu=native"
back_key: [1, 2, 3, 4]
Я даже пытался избавиться от ошибок Clippy, выставив выравнивание безрезультатно (я не уверен, что код ниже считается более правильным).
use std::arch::x86_64::*;
#[repr(align(256))]
#[derive(Debug)]
struct Key([u64; 4]);
fn main() {
let key = Key([1u64, 2, 3, 4]);
let avxreg = unsafe { _mm256_load_si256(&key as *const _ as *const __m256i) };
let mut back_key = Key([0u64; 4]);
unsafe { _mm256_storeu_si256((&mut back_key) as *mut _ as *mut __m256i, avxreg) };
println!("back_key: {:?}", back_key);
}
- Почему это происходит?
- Есть ли исправление для этого конкретного случая использования?
- Может ли это исправление быть обобщено для ввода пользователем (например: если я хотел взять байтовый срез в качестве пользовательского ввода и выполнить ту же процедуру)