Перейти к содержимому

Пост канала

Rust
  1. 🏎️ SIMD для ленивых: Автовекторизация в Rust SIMD - это когда процессор одной инструкцией складывает не два числа, а сразу 4, 8 или 16. Многие думают, что SIMD это сложно и требует unsafe. Но лучший SIMD тот, который LLVM написал за вас. Допустим, у вас есть цикл: pub fn add_arrays(a: &[f32], b: &[f32], out: &mut [f32]) { // Простые смертные пишут так: for i in 0..a.len() { out[i] = a[i] + b[i]; } } Если вы скомпилируете это в релизе для x86_64, компилятор сгенерирует инструкции SSE2 (обрабатывая по 4 числа f32 за раз). Почему? Потому что SSE2 гарантированно есть на всех 64-битных процессорах Intel/AMD. Как сделать еще быстрее? Если вы знаете, что ваш код будет работать на современном железе, разрешите компилятору использовать AVX2 (по 8 чисел f32). RUSTFLAGS="-C target-cpu=native" cargo build --release Но есть нюанс: Компилятор очень осторожен. Он не применит SIMD, если: 1. Есть риск паники. Если срезы разной длины, компилятор вставит проверки границ (bounds check) внутри цикла. Это убивает векторизацию. • Лечение: Используйте итераторы (zip) или явно проверяйте длины до цикла и используйте assert!, чтобы дать хинт оптимизатору. 2. Есть риск алиасинга. Если out пересекается в памяти с a или b. • Лечение: Rust тут молодец, его правила заимствования гарантируют отсутствие мутабельного алиасинга. Всегда смотрите в ассемблер (cargo-show-asm), чтобы убедиться, что цикл развернулся в SIMD-инструкции (ищите что-то вроде vaddps вместо addss). #rust #simd #performance #llvm #autovectorization 👉 @rust_lib

    Открыть в MAX
    Просмотры
    315
    ER
    1,6%
    Реакции
    5