четверг, 2 января 2025 г.

В современных процессорах

 В современных процессорах, кроме операций над числами, есть операции над массивами (векторами). В современных Intel за это отвечает технология AVX, а в ARM есть NEON. Называется это SIMD - Single instruction/Multiple data, тоесть процессор всего за один такт может обработать (прибавить-отнять-умножить, их много) вместо одного числа, целый массив, который влазит в векторный регистр.


SIMD - очень крутая штука, например для мультимедии, где нужно на ходу увеличить-уменьшить громкость потока, изменить яркость картинки или наложить какой-то хитрый фильтр. Мультимедией, конечно, задачи не ограничиваются - тут уже зависит только от вашей фантазии.

Для использования SIMD не нужно писать на ассемблере. В Rust есть std::Simd, который пока unstable и доступен только в nightly, зато дает абстракцию над всеми процессорами. Или инструкции для конкретного процессора, которые stable, но доступны только под конкретную платформу. По опыту, Simd оверхеда не дает.

Векторные регистры относительно огромны - вы можете совать до 512 бит информации и процессить, например сразу 64 значения u8, 32 значения u16, 16 значений u32 или f32 и т.д. Например, поиск максимального значения в слайсе выглядит так:

use std::simd::num::SimdUint;
use std::simd::Simd;

let s: Simd<u8, 64> = Simd::from_slice(somedata);
let max = s.reduce_max();

Теоретически, если побить Vec<u8> на слайсы по 64 элемента, вы сможете найти максимальное значение в 64 раза быстрее. Но практически всё еще лучше - поскольку производители процессоров стараются максимально оптимизировать именно мультимедиа и подобные задачи, выигрыш будет исчисляться сотнями раз.

_______
Источник | #psauxww
@F_S_C_P

Комментариев нет:

ad