Векторизуй это С++

Доклад принят в программу конференции
Андрей Аксенов
Авито, Sphinx

Пишет код на всём подряд, показывает другим, как. В удачные дни код удается сносить, это обязательно показывает другим и заставляет "точно так же" втройне сильнее. Всю сознательную жизнь из этого выходят разные движки, прямо проклятие какое-то.

Тезисы

В докладах про оптимизацию регулярно дело доходит до векторизации при помощи этих ваших SSE, AVX и прочих непонятных аббревиатур, и не зря, так как фронтир CPU-оптимизации неминуемо проходит по ручному SIMD-коду, полная идеальная автоматика компиляторам ещё и близко недоступна. Но при этом ни одного внятного крэш-курса "да что это такое, вообще, и как нормальному человеку их начать использовать" мне не вспоминается. Закроем лакуну!

Что хочется уместить в доклад? Рассказать про общую концепцию SIMD, про MMX/SSE/AVX/FMA. Подробно разобрать "мои первые полторы программы про сложение чисел", плюс как начать использовать это добро, даже если у вас Python (native bindings никто не отменял). Показать, что ассемблер уже давно не нужен, всё выглядит как обычный императивный код. В ходе разбора посмотреть на основные классические маневры (movups/movaps, swizzle/shuffle, hadd, dot product, prefetch, movntq, итп). Показать, для чего ещё, кроме "арифметики и векторов", применим SIMD, показать побольше разных классов задач (обработка строк, хэширование, парсинг, поиск и т.д.). Пробежаться по основным группам инструкций, внести общее понимание, что быстро, что медленно. Показать пару живых примеров, "когда и почему AVX не нужен, а когда таки да". Ну и пару слайдов с котиками показать, если найдутся хорошие котики.

Доклад достигнет своей цели, если следующий раз при возникновении острой потребности что-то заоптимизировать прослушавшему будет уже нестрашно попробовать эту вашу Магическую Векторизацию, и он (или она, или оно) возьмёт, наконец, попробует и даже осилит.

Другие доклады секции С++