Rust
2.23K subscribers
153 photos
103 videos
2 files
210 links
Полезный контент по программированию на Rust
Download Telegram
🚄 Struct of Arrays (SoA): Пишем для железа

В прошлом посте мы поняли, что массив жирных структур (Vec<Particle>) забивает кэш процессора ненужными данными.

Решение из Data-Oriented Design - вывернуть структуру наизнанку. Это называется Struct of Arrays (SoA).

Вместо массива структур, мы делаем структуру массивов:


struct Particles {
positions: Vec<[f32; 3]>,
velocities: Vec<[f32; 3]>,
colors: Vec<[u8; 4]>,
lifetimes: Vec<f32>,
}


Теперь, чтобы обновить позиции, мы пишем:

for i in 0..count {
positions[i][0] += velocities[i][0];
positions[i][1] += velocities[i][1];
positions[i][2] += velocities[i][2];
}


Почему процессор плачет от счастья?

1. Идеальный кэш: Когда процессор берет 64 байта из positions, он получает ровно позиции. Никаких имен или цветов. Ни байта не тратится впустую.

2. Hardware Prefetcher: У процессора есть умный блок, который видит: "Ага, он читает память линейно!". И он начинает предзагружать следующие позиции в кэш до того, как они понадобятся циклу.

3. SIMD (Автовекторизация): Компилятору в 100 раз проще применить те самые AVX-инструкции к плоскому однородному массиву.

SoA может ускорить математические циклы в 5-10 раз без изменения алгоритма! Но есть минус: удалять или добавлять одну частицу теперь неудобно (надо менять 4 разных вектора).

#rust #dop #soa #memory #optimization

👉 @rust_lib
👍12🔥51🥰1🤔1