Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

19.09.2024

SIMD: оптимізація, але не для нашого коду

В темі прискорення арифметичного коду зʼявляється (принаймні, в мене) ідея застосування інструкцій SIMD: “одна інструкція на багато значень”. Я вже писав, що NumPy їх використовує, але ж так само можна й власноруч оптимізувати код. В теорії…

Проблема перша: що ці інструкції потребують суворого дотримання формату вхідних даних. В деяких випадках це легко. Якщо працюєш з 3D-координатами або з кольорами, то багато операцій легко перекладаються на SIMD (що вже зробили популярні бібліотеки.). Ось гарна стаття. Але в загальному випадку доведеться на кожну арифметичну операцію дивитися окремо. До того ж достатній обсяг пересувань перекриє виграш від SIMD.

Проблема друга: операції SIMD працюють не над всім вашим масивом, а тільки над фіксованою частиною (наприклад, 256 байтів.) Це не так, як з NumPy, де скалярна арифметика “просто” стає векторною. Доведеться думати, як ділити масив та куди зберігати проміжні значення.

Виходить, переписувати програми на SIMD не тільки важко — це ще й робить програму менш зрозумілою. Рідка програма заслуговує на такі зусилля. В деяких випадках SIMD може додати компілятор.

Але здебільшого, SIMD використовується в серйозних бібліотеках для обробки масивів даних. Не тільки математичних — наприклад, є simdjson для розбору JSON. Або будь-який аудіо/відео кодек — саме для кодеків й придумали SIMD, до речі. Або нейронні мережі, бо там все зводиться до множення матриць.

А коли в нас задача на кшталт “виконати більш-менш складний арифметичний вираз над кожним елементом масиву”, то SIMD не допоможе.