← На главную

meshoptimizer протестировал AVX-512 и GFNI, но трюки не пошли в продакшн

17.06.2026 17:43 · hackernews

Автор статьи экспериментировал с ускорением декодирования zigzag-кодированных целых чисел в meshoptimizer с помощью AVX-512 и GFNI. Сам трюк в итоге не пошёл в продакшн, но разобрать его стоит.

Zigzag-кодирование превращает маленькие положительные и отрицательные числа в маленькие положительные: 0 → 0, -1 → 1, 1 → 2, -2 → 3 и так далее. Декодировать можно ветвлением, но быстрее — без него: (v >> 1) ^ -(v & 1). В SSE2 это четыре инструкции: сдвиг, AND с единицей, вычитание из нуля (замена отрицания) и XOR. На Zen 4 это 3 цикла latency.

Первый альтернативный подход — использовать маски AVX-512. Вместо того чтобы вычислять -(v & 1) и потом xor-ить, автор предлагает проверить младший бит через vptestmd, сдвинуть, а затем условно инвертировать результат через _mm_mask_xor_epi32. Получается три инструкции вместо четырёх. Проблема в том, что vptestmd имеет latency 3 цикла, итого 4 цикла — на один больше базового. Однако в throughput-bound сценариях это может быть быстрее, потому что новые инструкции занимают другие исполнительные порты. В meshoptimizer это дало прирост ~3% в одном из циклов, но Clang переоптимизирует такой код обратно в четырёхинструкционную версию, поэтому трюк не пригодился.

Второй вариант — использовать GFNI, а именно инструкцию vgf2p8affineqb. Она выполняет умножение 8x8 матрицы на вектор байта в поле GF(2). Для zigzag-декодирования 8-битных значений автором выведена матрица, которая за одну инструкцию делает сдвиг и условную инверсию. Это даёт одну машинную инструкцию вместо пяти в обычном SSE/AVX. На Zen 4 latency 3 цикла, throughput — 2 на цикл. В meshoptimizer нашлось ровно одно место (декодирование дельт вершин), где это применимо, но там узким местом оказались не вычисления, а накопление суммы и запись. Прирост минимальный. Плюс GFNI — отдельное расширение, не входящее в AVX-512, что создаёт неудобства.

В итоге оба трюка интересные, но в реальном коде meshoptimizer они не сработали из-за особенностей конвейера и компиляторов. Автор отмечает, что AVX-512 даёт много новых возможностей (маски, GFNI, compress/expand), но их применимость ограничена, так как приходится поддерживать несколько инструкционных наборов, включая SVE2, где аналогов часто нет.

Читать оригинал →